deepcoin_control.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. # from utils.point_utils import UiFactory
  2. import datetime
  3. import logging
  4. import tkinter as tk
  5. from control.base.base_control import AbsControl
  6. class DeepCoinControl(AbsControl):
  7. def __init__(self, serial: str, *args, **kwargs):
  8. super().__init__(serial, *args, **kwargs)
  9. self.package_name = 'com.niocpeed.dna'
  10. # self.add_func(self.btn_jiao_yi)
  11. # self.add_func(self.btn_mairu_kaiduo)
  12. # self.add_func(self.btn_shijia_quanping)
  13. def btn_jiao_yi(self):
  14. return self.get_point({
  15. "name": "btn_jiao_yi",
  16. "desc": "交易按钮",
  17. "xpath": '//*[@content-desc="交易"]'
  18. })
  19. def btn_mairu_kaiduo(self):
  20. return self.get_point({
  21. "name": "btn_mairu_kaiduo",
  22. "desc": "买入/开多",
  23. "xpath": '//*[@content-desc="买入/开多"]'
  24. })
  25. def btn_mairu_pingkong(self):
  26. return self.get_point({
  27. "name": "btn_mairu_pingkong",
  28. "desc": "买入/平空",
  29. "xpath": '//*[@content-desc="买入/平空"]'
  30. })
  31. def btn_shijia_quanping(self):
  32. self.to_next_swipe()
  33. return self.get_point({
  34. "name": "btn_shijia_quanping",
  35. "desc": "买入/开多",
  36. "xpath": '//*[@content-desc="市价全平"]'
  37. })
  38. def btn_kaichang(self):
  39. return self.get_point({
  40. "name": "btn_kaichang",
  41. "desc": "开仓",
  42. "xpath": '//*[@content-desc="开仓"]'
  43. })
  44. def btn_gengdan(self):
  45. """
  46. 跟单(n) 按钮 坐标
  47. """
  48. return self.get_point({
  49. "name": "btn_gengdan",
  50. "desc": "跟单",
  51. "xpath": '//*[starts-with(@content-desc, "跟单(")]'
  52. })
  53. def btn_weituo(self):
  54. """
  55. 委托(n) 按钮 坐标
  56. FIXME 委托按钮点击2次回出现切换委托界面
  57. """
  58. return self.get_point({
  59. "name": "btn_weituo",
  60. "desc": "委托",
  61. "xpath": '//*[starts-with(@content-desc, "委托(")]'
  62. })
  63. def btn_yijian_chedan(self):
  64. """
  65. 一键撤单按钮
  66. """
  67. return self.get_point({
  68. "name": "btn_yijian_chedan",
  69. "desc": "一键撤单",
  70. "xpath": '//*[@content-desc="一键撤单"]'
  71. })
  72. def slider_baozhengjin_kaicang(self, offset=0, sleep=0.1):
  73. """
  74. 开仓情况 保证金滑块
  75. :param sleep 休眠
  76. :param offset 价格偏移量 默认取50% x=368 每偏移69 向下多一个 偏移-69向上多一个 取值范围 [-2,2]
  77. 坐标: 0% 230 25% 299 50% 368 75% 437 100% 506
  78. :return: 买入的按钮实例
  79. """
  80. # self.to_top_swipe()
  81. # self.d.sleep(0.1)
  82. # 基于买入按钮相对计算坐标
  83. x, y, btn = self.btn_mairu_kaiduo()
  84. x1 = x + offset * 69
  85. y1 = y - 155
  86. logging.info(f"开多坐标: ({x},{y})")
  87. logging.info(f"保证金50%坐标: ({x1},{y1})")
  88. self.click_point(x1, y1)
  89. self.d.sleep(sleep)
  90. return btn
  91. def slider_baozhengjin_pingcang(self, offset=0, sleep=0.1):
  92. """
  93. 平仓情况 保证金滑块
  94. :param sleep 休眠
  95. :param offset 价格偏移量 默认取50% x=368 每偏移69 向下多一个 偏移-69向上多一个 取值范围 [-2,2]
  96. 坐标: 0% 230 25% 299 50% 368 75% 437 100% 506
  97. :return: 买入的按钮实例
  98. """
  99. # 基于买入按钮相对计算坐标
  100. x, y, btn = self.btn_mairu_pingkong()
  101. x1 = x + offset * 69
  102. y1 = y - 70
  103. logging.info(f"开多坐标: ({x},{y})")
  104. logging.info(f"保证金50%坐标: ({x1},{y1})")
  105. self.click_point(x1, y1)
  106. self.d.sleep(sleep)
  107. return btn
  108. def click_kaicang(self):
  109. """
  110. 开仓
  111. """
  112. self.click_xpath('//*[@content-desc="开仓"]')
  113. def click_pingchang(self, sleep=0.1):
  114. """
  115. 开仓
  116. :param sleep: 等待时间
  117. """
  118. self.click_xpath('//*[@content-desc="平仓"]')
  119. self.d.sleep(sleep)
  120. def select_kaicang_weituo_xianjia(self):
  121. """
  122. 开仓选择限价委托
  123. """
  124. x, y, _ = self.btn_kaichang()
  125. logging.info(f"开仓按钮坐标: ({x},{y})")
  126. x1 = x + 100
  127. y1 = y + 70
  128. logging.info(f"选择委托框: ({x1},{y1})")
  129. self.click_point(x1, y1)
  130. x2 = x1
  131. y2 = y1 + 150
  132. self.d.sleep(0.2)
  133. logging.info(f"选择限价委托: ({x2},{y2})")
  134. self.click_point(x2, y2)
  135. def click_price_red(self, offset=0):
  136. """
  137. 点击价格 开多 平空, 点击红色价格
  138. :param offset 价格偏移量 默认取第5个, 每偏移20 向下多一个 偏移-20 向上多一个 取值范围 [-4,4]
  139. """
  140. x1 = 50
  141. y1 = 450 + offset * 20
  142. logging.info(f"红色部分选择价格: ({x1},{y1})")
  143. self.click_point(x1, y1)
  144. def click_price_green(self, offset=0):
  145. """
  146. 点击价格 开空 平多, 点击红色价格
  147. :param offset 价格偏移量 默认取第5个, 每偏移20 向下多一个,偏移-20 向上多一个
  148. """
  149. # self.select_kaicang_weituo_xianjia()
  150. #
  151. # self.d.sleep(0.1)
  152. x1 = 50
  153. y1 = 515 + offset
  154. logging.info(f"绿色部分选择价格: ({x1},{y1})")
  155. self.click_point(x1, y1)
  156. def click_mairu_kaiduo(self):
  157. """
  158. 买入开多
  159. """
  160. self.click_xpath('//*[@content-desc="买入/开多"]')
  161. self.d.sleep(0.1)
  162. # 弹出了确认框
  163. if self.check_element_exists('//*[@content-desc="开仓确认"]'):
  164. logging.info("弹出了确认框")
  165. self.click_xpath('//*[@content-desc="确认"]')
  166. def click_mairu_pingkong(self):
  167. """
  168. 买入平空
  169. """
  170. self.click_xpath('//*[@content-desc="买入/平空"]')
  171. def click_maichu_kaikong(self):
  172. """
  173. 卖出开空
  174. """
  175. self.click_xpath('//*[@content-desc="卖出/开空"]')
  176. self.d.sleep(0.1)
  177. # 弹出了确认框
  178. if self.check_element_exists('//*[@content-desc="开仓确认"]'):
  179. logging.info("弹出了确认框")
  180. self.click_xpath('//*[@content-desc="确认"]')
  181. def click_maichu_pingduo(self):
  182. """
  183. 卖出平多
  184. """
  185. self.click_xpath('//*[@content-desc="卖出/平多"]')
  186. def text_xiadan_shuliang(self, text):
  187. """
  188. 设置 下单数量
  189. """
  190. x, y, _ = self.get_point({
  191. "name": "btn_baozhengjin",
  192. "desc": "保证金",
  193. "xpath": '//*[@content-desc="保证金"]'
  194. })
  195. logging.info(f"保证金坐标: ({x},{y})"'')
  196. x1 = x - 130
  197. y1 = y + 50
  198. self.input_by_position(x1, y1, str(text), True)
  199. def event_1(self):
  200. self.click_kaicang()
  201. self.slider_baozhengjin_kaicang()
  202. pass
  203. def event_2(self, **kwargs):
  204. """
  205. 开仓情况 保证金滑块
  206. :return:
  207. """
  208. self.to_top_swipe(sleep=0.2)
  209. self.click_kaicang()
  210. self.select_kaicang_weituo_xianjia()
  211. self.d.sleep(0.1)
  212. self.click_price_red()
  213. self.text_xiadan_shuliang(kwargs["shuliang"])
  214. # self.slider_baozhengjin_kaicang()
  215. self.click_mairu_kaiduo()
  216. pass
  217. def event_3(self, **kwargs):
  218. self.to_top_swipe(sleep=0.2)
  219. self.click_pingchang()
  220. self.slider_baozhengjin_pingcang(offset=1)
  221. pass
  222. def event_4(self, **kwargs):
  223. self.to_top_swipe(sleep=0.2)
  224. self.click_pingchang()
  225. self.select_kaicang_weituo_xianjia()
  226. self.click_price_green()
  227. self.text_xiadan_shuliang(kwargs["shuliang"])
  228. self.to_next_swipe(y=0.6)
  229. # self.slider_baozhengjin_pingcang(offset=1)
  230. self.click_maichu_pingduo()
  231. pass
  232. def event_5(self, **kwargs):
  233. self.to_top_swipe(sleep=0.2)
  234. self.click_kaicang()
  235. self.slider_baozhengjin_kaicang()
  236. pass
  237. def event_6(self, **kwargs):
  238. self.to_top_swipe(sleep=0.1)
  239. self.click_kaicang()
  240. self.select_kaicang_weituo_xianjia()
  241. self.click_price_red()
  242. # self.slider_baozhengjin_kaicang()
  243. self.text_xiadan_shuliang(kwargs["shuliang"])
  244. self.to_next_swipe(y=0.6)
  245. self.click_maichu_kaikong()
  246. pass
  247. def event_7(self, **kwargs):
  248. self.to_top_swipe(sleep=0.1)
  249. self.click_pingchang()
  250. self.slider_baozhengjin_pingcang(offset=2)
  251. pass
  252. def event_8(self, **kwargs):
  253. self.to_top_swipe(sleep=0.2)
  254. self.click_pingchang()
  255. self.click_price_red()
  256. self.text_xiadan_shuliang(kwargs["shuliang"])
  257. # self.slider_baozhengjin_pingcang(offset=2)
  258. self.click_mairu_pingkong()
  259. pass
  260. def event_9(self):
  261. """
  262. 一键撤单
  263. 如果有滑动 ,会导致第一个坐标不准,点不上。 所以要提前滑动,确保第一个坐标点得上
  264. """
  265. self.to_top_swipe(sleep=0.1)
  266. self.to_next_swipe(sleep=0.1)
  267. logging.info("点击跟单")
  268. self.click_xpath('//*[starts-with(@content-desc, "跟单(")]')
  269. self.d.sleep(0.1)
  270. logging.info("点击委托")
  271. self.click_xpath('//*[starts-with(@content-desc, "委托(")]')
  272. self.d.sleep(0.1)
  273. b = self.check_element_exists('//*[starts-with(@content-desc, "全部委托(")]')
  274. logging.info("是否弹出了选择框: %s", b)
  275. if b:
  276. self.click_xpath('//*[starts-with(@content-desc, "全部委托(")]')
  277. self.d.sleep(0.2)
  278. self.click_xpath('//*[@content-desc="一键撤单"]')
  279. self.d.sleep(0.1)
  280. b = self.check_element_exists('//*[@content-desc="撤销掉全部委托"]')
  281. if b:
  282. x, y, _ = self.get_point({
  283. "name": "btn_yijian_chedan",
  284. "desc": "撤销掉全部委托",
  285. "xpath": '//*[@content-desc="撤销掉全部委托"]'
  286. })
  287. logging.info(f"撤销掉全部委托: ({x},{y})")
  288. # 相对坐标 撤销掉全部委托 点击确定。
  289. x1 = x + 80
  290. y1 = y + 80
  291. logging.info(f"撤销掉全 确定按钮: ({x1},{y1})")
  292. self.click_point(x1, y1)
  293. def event_10(self, **kwargs):
  294. logging.info(f"检查交易结果")
  295. self.to_top_swipe(sleep=0.2)
  296. self.to_next_swipe(sleep=0.2)
  297. log = kwargs.get("log")
  298. action = kwargs.get("action", "")
  299. # 获取持仓
  300. t1 = self.get_content_desc('//*[starts-with(@content-desc, "持仓(")]')
  301. logging.info(f"获取持仓:{t1}")
  302. # 获取委托
  303. t2 = self.get_content_desc('//*[starts-with(@content-desc, "委托(")]')
  304. logging.info(f"获取委托:{t2}")
  305. # 获取跟单
  306. t3 = self.get_content_desc('//*[starts-with(@content-desc, "跟单(")]')
  307. logging.info(f"获取跟单:{t3}")
  308. # 获取策略
  309. t4 = self.get_content_desc('//*[starts-with(@content-desc, "策略(")]')
  310. logging.info(f"获取策略:{t4}")
  311. # 获取当前日期和时间
  312. now = datetime.datetime.now()
  313. # 格式化日期和时间为 "年月日-月月-日日 时时:分分:秒秒"
  314. formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
  315. log.insert(tk.INSERT, f"======执行结果============\n"
  316. f"手机:{self.ctx['name']}\n"
  317. f"操作:{action}\n"
  318. f"时间:{formatted_time}\n"
  319. f"持仓:{t1}\n"
  320. f"委托:{t2}\n"
  321. f"跟单:{t3}\n"
  322. f"策略:{t4}\n"
  323. f"===========================\n")
  324. log.see(tk.END)
  325. self.to_top_swipe()
  326. def event_11(self, **kwargs):
  327. """
  328. 一键全平
  329. :param kwargs:
  330. :return:
  331. """
  332. self.to_top_swipe(sleep=0.1)
  333. self.to_next_swipe(sleep=0.1)
  334. logging.info("点击跟单")
  335. self.click_xpath('//*[starts-with(@content-desc, "跟单(")]')
  336. self.d.sleep(0.1)
  337. logging.info("点击委托")
  338. self.click_xpath('//*[starts-with(@content-desc, "持仓(")]')
  339. self.d.sleep(0.1)
  340. self.click_xpath('//*[@content-desc="一键全平"]')
  341. self.d.sleep(0.1)
  342. self.click_xpath('//*[@content-desc="确认"]')
  343. self.d.sleep(0.1)