deepcoin_control.py 9.8 KB

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