deepcoin_control.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. # from utils.point_utils import UiFactory
  2. import logging
  3. from plat.base.base_control import AbsControl
  4. class DeepCoinControl(AbsControl):
  5. def __init__(self, serial: str):
  6. super().__init__(serial)
  7. self.point_path = '../../assets/point/deepcoin_point.json'
  8. self.add_func(self.btn_jiao_yi)
  9. self.add_func(self.btn_mairu_kaiduo)
  10. self.add_func(self.btn_shijia_quanping)
  11. def btn_jiao_yi(self):
  12. return self.get_point({
  13. "name": "btn_jiao_yi",
  14. "desc": "交易按钮",
  15. "xpath": '//*[@content-desc="交易"]'
  16. })
  17. def btn_mairu_kaiduo(self):
  18. return self.get_point({
  19. "name": "btn_mairu_kaiduo",
  20. "desc": "买入/开多",
  21. "xpath": '//*[@content-desc="买入/开多"]'
  22. })
  23. def btn_mairu_pingkong(self):
  24. return self.get_point({
  25. "name": "btn_mairu_pingkong",
  26. "desc": "买入/平空",
  27. "xpath": '//*[@content-desc="买入/平空"]'
  28. })
  29. def btn_shijia_quanping(self):
  30. self.to_next_swipe()
  31. return self.get_point({
  32. "name": "btn_shijia_quanping",
  33. "desc": "买入/开多",
  34. "xpath": '//*[@content-desc="市价全平"]'
  35. })
  36. def btn_kaichang(self):
  37. return self.get_point({
  38. "name": "btn_kaichang",
  39. "desc": "开仓",
  40. "xpath": '//*[@content-desc="开仓"]'
  41. })
  42. def btn_gengdan(self):
  43. """
  44. 跟单(n) 按钮 坐标
  45. """
  46. return self.get_point({
  47. "name": "btn_gengdan",
  48. "desc": "跟单",
  49. "xpath": '//*[starts-with(@content-desc, "跟单(")]'
  50. })
  51. def btn_weituo(self):
  52. """
  53. 委托(n) 按钮 坐标
  54. FIXME 委托按钮点击2次回出现切换委托界面
  55. """
  56. return self.get_point({
  57. "name": "btn_weituo",
  58. "desc": "委托",
  59. "xpath": '//*[starts-with(@content-desc, "委托(")]'
  60. })
  61. def btn_yijian_chedan(self):
  62. """
  63. 一键撤单按钮
  64. """
  65. return self.get_point({
  66. "name": "btn_yijian_chedan",
  67. "desc": "一键撤单",
  68. "xpath": '//*[@content-desc="一键撤单"]'
  69. })
  70. def slider_baozhengjin_kaicang(self, offset=0, sleep=0.1):
  71. """
  72. 开仓情况 保证金滑块
  73. :param sleep 休眠
  74. :param offset 价格偏移量 默认取50% x=368 每偏移69 向下多一个 偏移-69向上多一个 取值范围 [-2,2]
  75. 坐标: 0% 230 25% 299 50% 368 75% 437 100% 506
  76. :return: 买入的按钮实例
  77. """
  78. # self.to_top_swipe()
  79. # self.d.sleep(0.1)
  80. # 基于买入按钮相对计算坐标
  81. x, y, btn = self.btn_mairu_kaiduo()
  82. x1 = x + offset * 69
  83. y1 = y - 140
  84. logging.info(f"开多坐标: ({x},{y})")
  85. logging.info(f"保证金50%坐标: ({x1},{y1})")
  86. self.click_point(x1, y1)
  87. self.d.sleep(sleep)
  88. return btn
  89. def slider_baozhengjin_pingcang(self, offset=0, sleep=0.1):
  90. """
  91. 平仓情况 保证金滑块
  92. :param sleep 休眠
  93. :param offset 价格偏移量 默认取50% x=368 每偏移69 向下多一个 偏移-69向上多一个 取值范围 [-2,2]
  94. 坐标: 0% 230 25% 299 50% 368 75% 437 100% 506
  95. :return: 买入的按钮实例
  96. """
  97. # 基于买入按钮相对计算坐标
  98. x, y, btn = self.btn_mairu_pingkong()
  99. x1 = x + offset * 69
  100. y1 = y - 70
  101. logging.info(f"开多坐标: ({x},{y})")
  102. logging.info(f"保证金50%坐标: ({x1},{y1})")
  103. self.click_point(x1, y1)
  104. self.d.sleep(sleep)
  105. return btn
  106. def click_kaicang(self):
  107. """
  108. 开仓
  109. """
  110. self.click_xpath('//*[@content-desc="开仓"]')
  111. def click_pingchang(self, sleep=0.1):
  112. """
  113. 开仓
  114. :param sleep: 等待时间
  115. """
  116. self.click_xpath('//*[@content-desc="平仓"]')
  117. self.d.sleep(sleep)
  118. def select_kaicang_weituo_xianjia(self):
  119. """
  120. 开仓选择限价委托
  121. """
  122. x, y, _ = self.btn_kaichang()
  123. logging.info(f"开仓按钮坐标: ({x},{y})")
  124. x1 = x + 50
  125. y1 = y + 55
  126. logging.info(f"选择委托框: ({x1},{y1})")
  127. self.click_point(x1, y1)
  128. x2 = x1
  129. y2 = y1 + 100
  130. self.d.sleep(0.2)
  131. logging.info(f"选择限价委托: ({x2},{y2})")
  132. self.click_point(x2, y2)
  133. def click_price_red(self, offset=0):
  134. """
  135. 点击价格 开多 平空, 点击红色价格
  136. :param offset 价格偏移量 默认取第5个, 每偏移20 向下多一个 偏移-20 向上多一个 取值范围 [-4,4]
  137. """
  138. x1 = 50
  139. y1 = 330 + offset * 20
  140. logging.info(f"红色部分选择价格: ({x1},{y1})")
  141. self.click_point(x1, y1)
  142. def click_price_green(self, offset=0):
  143. """
  144. 点击价格 开空 平多, 点击红色价格
  145. :param offset 价格偏移量 默认取第5个, 每偏移20 向下多一个,偏移-20 向上多一个
  146. """
  147. # self.select_kaicang_weituo_xianjia()
  148. #
  149. # self.d.sleep(0.1)
  150. x1 = 50
  151. y1 = 515 + offset
  152. logging.info(f"绿色部分选择价格: ({x1},{y1})")
  153. self.click_point(x1, y1)
  154. def click_mairu_kaiduo(self):
  155. """
  156. 买入开多
  157. """
  158. self.click_xpath('//*[@content-desc="买入/开多"]')
  159. self.d.sleep(0.1)
  160. # 弹出了确认框
  161. if self.check_element_exists('//*[@content-desc="开仓确认"]'):
  162. logging.info("弹出了确认框")
  163. self.click_xpath('//*[@content-desc="确认"]')
  164. def click_mairu_pingkong(self):
  165. """
  166. 买入平空
  167. """
  168. self.click_xpath('//*[@content-desc="买入/平空"]')
  169. def click_maichu_kaikong(self):
  170. """
  171. 卖出开空
  172. """
  173. self.click_xpath('//*[@content-desc="卖出/开空"]')
  174. self.d.sleep(0.1)
  175. # 弹出了确认框
  176. if self.check_element_exists('//*[@content-desc="开仓确认"]'):
  177. logging.info("弹出了确认框")
  178. self.click_xpath('//*[@content-desc="确认"]')
  179. def click_maichu_pingduo(self):
  180. """
  181. 卖出平多
  182. """
  183. self.click_xpath('//*[@content-desc="卖出/平多"]')
  184. def click_yijian_chedan(self):
  185. """
  186. 一键撤单
  187. 如果有滑动 ,回导致第一个坐标不准,点不上。 所以要提前滑动,确保第一个坐标点得上
  188. """
  189. self.click_xpath('//*[starts-with(@content-desc, "跟单(")]')
  190. self.d.sleep(0.1)
  191. self.click_xpath('//*[starts-with(@content-desc, "委托(")]')
  192. self.d.sleep(0.1)
  193. b = self.check_element_exists('//*[starts-with(@content-desc, "全部委托(")]')
  194. logging.info("是否弹出了选择框: %s", b)
  195. if b:
  196. self.click_xpath('//*[starts-with(@content-desc, "全部委托(")]')
  197. self.d.sleep(0.2)
  198. self.click_xpath('//*[@content-desc="一键撤单"]')
  199. self.d.sleep(0.1)
  200. x, y, _ = self.get_point({
  201. "name": "btn_yijian_chedan",
  202. "desc": "撤销掉全部委托",
  203. "xpath": '//*[@content-desc="撤销掉全部委托"]'
  204. })
  205. logging.info(f"撤销掉全部委托: ({x},{y})")
  206. # 相对坐标 撤销掉全部委托 点击确定。
  207. x1 = x + 80
  208. y1 = y + 80
  209. logging.info(f"撤销掉全 确定按钮: ({x1},{y1})")
  210. self.click_point(x1, y1)
  211. def text_xiadan_shuliang(self, text):
  212. """
  213. 设置 下单数量
  214. """
  215. x, y, _ = self.get_point({
  216. "name": "btn_baozhengjin",
  217. "desc": "保证金",
  218. "xpath": '//*[@content-desc="保证金"]'
  219. })
  220. logging.info(f"保证金坐标: ({x},{y})"'')
  221. x1 = x - 130
  222. y1 = y + 50
  223. self.input_by_position(x1, y1, str(text), True)
  224. def event_f1(self):
  225. self.click_kaicang()
  226. self.slider_baozhengjin_kaicang()
  227. pass
  228. def event_f2(self):
  229. self.click_kaicang()
  230. self.select_kaicang_weituo_xianjia()
  231. self.d.sleep(0.1)
  232. self.click_price_red()
  233. self.text_xiadan_shuliang(3)
  234. self.click_mairu_kaiduo()
  235. pass
  236. def event_f3(self):
  237. self.to_top_swipe(sleep=0.2)
  238. self.click_pingchang()
  239. self.slider_baozhengjin_pingcang(offset=1)
  240. pass
  241. def event_f4(self):
  242. self.to_top_swipe(sleep=0.2)
  243. self.click_pingchang()
  244. self.select_kaicang_weituo_xianjia()
  245. self.click_price_green()
  246. self.text_xiadan_shuliang(3)
  247. self.click_maichu_pingduo()
  248. pass
  249. def event_f5(self):
  250. self.to_top_swipe(sleep=0.2)
  251. self.click_kaicang()
  252. self.slider_baozhengjin_kaicang()
  253. pass
  254. def event_f6(self):
  255. self.to_top_swipe(sleep=0.1)
  256. self.click_kaicang()
  257. self.select_kaicang_weituo_xianjia()
  258. self.click_price_red()
  259. self.click_maichu_kaikong()
  260. pass
  261. def event_f7(self):
  262. self.to_top_swipe(sleep=0.1)
  263. self.click_pingchang()
  264. self.slider_baozhengjin_pingcang(offset=2)
  265. pass
  266. def event_f8(self):
  267. self.to_top_swipe(sleep=0.2)
  268. self.click_pingchang()
  269. self.click_price_red()
  270. self.text_xiadan_shuliang(3)
  271. self.click_mairu_pingkong()
  272. pass