deepcoin_control.py 9.8 KB

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