From 609c7d172d0d7833992c307180fdf0877b8ad3bf Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 1 Feb 2026 01:24:50 +0800 Subject: [PATCH] =?UTF-8?q?bitmart=E4=BC=98=E5=8C=96=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- telegram/8619211027341.session | Bin 45056 -> 45056 bytes telegram/bhaha_session.session | Bin 40960 -> 40960 bytes telegram/bot_session.session | Bin 69632 -> 69632 bytes 交易/bitmart-三分之一策略交易.py | 56 ++++++++++++++++++++++++------- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/telegram/8619211027341.session b/telegram/8619211027341.session index cd2d2a7a8af65f7aff0d7cb9173df324ea9abbec..d81aa211d847c34d16c9c0b4d4d95374dcf6ef85 100644 GIT binary patch delta 73 zcmZp8z|`=7X@V3}V(mm3Cm^{oVM#8R)pf^P@hy%Qcnl}=Ok5&T-?u!llk-KX=Rpa|z}tU8eGOFzKdw%vn>P(cfJ0^p`aD(jj2<`de3_7F!I^6CG1CS3DRC)lj%jPo`)viiM4vaIF?cS;amd^XDU_fvh4B z9Cd1ZF}z!KcwB)KD9fuzLJiHmy^9MTbtSOq9B}`c{7z)|%dbN<=y(XLQz;6iak}bv zrMc!_wuI#Zz@UH3u>{qCA{2!t@tDKVsMw^z^)N?OH@v@m++vTMuI#iFR z7vK2v@@7`#0fJv{DVQI3<*AB{Q-nct2()>cyRurxlj;NP>N<7)a_v!-mey-9MKlJz zAyg4iJhIa^H)-PR`L{I<(O6AZ2uz2LBwjx}+_8<*6*hbK?)yAgxw-b%oN&>*A^dWV zpcA=;9EUX-EpSKt_*VoLgfF`-Ym^yfABfy!L4xhFNzy@SyEIoAC3;VaN*4+{`Q^;p zd2a;qpE++84m$@qPm?^6TogQ)lu1mI7|A=rSrQj_Gtk**`ECpB3`>~`y zIC3_##(CY}Zm`7JODaMLHHE4jU7F@;d1@++V?iHKzPkUY^?`IdMr=>j!e=9sF$zMF zGc0+hZYqUF$C&U31=L5A{#f-EhG`Svi6ol=OsjR+aXhUZHLczgc0s!AEyGQIJWOqH zR6w+zoeZ`Sf6K8$)u}8L0v>$Y(h{0+#W@Tmi2vn(C3J=9x78~xh2QlUm#~@upndbm zbGPd!gF{J*l_*xDdYET}qX*0V%zs@doy?L;!9)J_L$x8!*Iw_zP?FHYS94UiEymZH zn_aYlRV)Pll_LdZ1ttCe?ZGHA4kwJTNFX1qwC0!I<4nY&iIMwvosge|jYw%RI5*%p z2v0)^hqH&5rM9WV$dbN5eyL*3Plkj<6-7IqBZ^GN2)1vods)j0YhSh3M)S~`dk=pU z!r_CCrz?uoLAR=;C@-sRXl%T*eL=7Fu4;c@V`m8QYEDq30mfJH$j4&eRXyH@fne82 z&;gHq?rn~oV+J-n_|!P2g_f|ihl{?2rCniT>WdHZ=t`PdWiE#QWz3+t8}1J??UtEv Ry?`0CTyP9;d!u!w(?2!nx^Vyi delta 443 zcmV;s0Yv_Qzyg540+1R4Fp7~JLIN;~v0!&^J9t==0Lu}F!;tfJ1^@#H2M7R(P(j*W z7R+UuP5=M^4FL!Q2?J?p!siVD002h>ga8l04}cF(4?GVNlN4}n9tI=@`vuGer3HKi zR|PQz2?X8*v;>3%T?9D<5(DkCo^VD3lRrNP0_g*jzlWETMm#aIwRD#X19)38lQBLq zlYoCd19(`Jlfi#O7EuG#00=J#3j~n|yz!R{|yh`~lVht^tXY#DL_J zESW0wv5;y4v+|d`0|Ra7)-N+FPu`t8 zH{XZLs23)``E&jqKIY0(3X=_N4JR|#?_jPx`C#(CdVA)|LyVgmx_Fo?t3o#S_83}$ SBsL#B_SOg_vw7oBe=z_|3o>T_ delta 123 zcmZozz|ydQWr7sbw`UV&oPgxU1m%3GYR6k~V&?=7PZnfgV_;-qVUjm4vVNIa5z#w& zZoUtfVFgTn^XL3Ke9RTm7LyHZ4JR|#?_jP7<(j;&-k!N4Bym$i7Y}nqVC&}I9z!dT S#O8y?-Wq{qHgEjtF9rZ~2{2;- diff --git a/交易/bitmart-三分之一策略交易.py b/交易/bitmart-三分之一策略交易.py index b986f81..db71287 100644 --- a/交易/bitmart-三分之一策略交易.py +++ b/交易/bitmart-三分之一策略交易.py @@ -73,7 +73,7 @@ class BitmartOneThirdStrategy: self.min_body_size = 0.1 # 最小实体大小 self.kline_step = 5 # K线周期(5分钟) self.kline_count = 20 # 获取的K线数量,用于向前查找有效K线 - + # 实时监测参数 self.check_interval = 3 # 检测间隔(秒) self.last_trigger_kline_id = None # 记录上次触发信号的K线ID,避免同一K线重复触发 @@ -137,7 +137,7 @@ class BitmartOneThirdStrategy: return None, None # 基于收盘价的双向触发价格 - long_trigger = p_close + body / 3 # 从收盘价往上涨1/3触发做多 + long_trigger = p_close + body / 3 # 从收盘价往上涨1/3触发做多 short_trigger = p_close - body / 3 # 从收盘价往下跌1/3触发做空 return long_trigger, short_trigger @@ -423,6 +423,7 @@ class BitmartOneThirdStrategy: direction_str = "做多" if marketPriceLongOrder == 1 else "做空" logger.info(f"执行{direction_str}操作,金额: {size}") + size = 25 try: if marketPriceLongOrder == -1: self.click_safe('x://button[normalize-space(text()) ="市价"]') @@ -504,12 +505,33 @@ class BitmartOneThirdStrategy: self.click_safe('x://button[normalize-space(text()) ="市价"]') logger.info(f"开始实时监测,检测间隔: {self.check_interval}秒") - + # 用于定时发送持仓信息(每5分钟发一次) last_report_time = 0 report_interval = 300 # 5分钟报告一次持仓 while True: + # 1. 打开浏览器 + for i in range(5): + if self.openBrowser(): + break + + time.sleep(5) + else: + self.ding("打开浏览器失败!", error=True) + return + logger.info("浏览器打开成功") + + if self.close_extra_tabs_in_browser(): + logger.info('关闭多余标签页成功') + else: + logger.info('关闭多余标签页失败') + + self.page.get("https://derivatives.bitmart.com/zh-CN/futures/ETHUSDT") + time.sleep(2) + + self.click_safe('x://button[normalize-space(text()) ="市价"]') + try: # 获取K线数据 kline_data = self.get_klines() @@ -526,13 +548,13 @@ class BitmartOneThirdStrategy: # 获取当前K线信息用于日志 curr = kline_data[-1] curr_time_str = datetime.datetime.fromtimestamp(curr['id']).strftime('%H:%M:%S') - + # ========== 实时信号检测 ========== direction, trigger_price, valid_prev, curr_kline = self.check_realtime_trigger(kline_data) if direction: curr_kline_id = curr_kline['id'] - + # 检查是否在同一K线内已经交易过(防止频繁反手) if self.last_trade_kline_id == curr_kline_id: logger.debug(f"同一K线内已交易,跳过本次{direction}信号") @@ -541,7 +563,7 @@ class BitmartOneThirdStrategy: self.last_trigger_direction = direction time.sleep(self.check_interval) continue - + # 获取持仓状态 if not self.get_position_status(): logger.warning("获取仓位信息失败") @@ -560,10 +582,12 @@ class BitmartOneThirdStrategy: time.sleep(self.check_interval) continue - logger.info(f"{'='*50}") + logger.info(f"{'=' * 50}") logger.info(f"🚨 检测到{direction}信号!触发价格: {trigger_price:.2f}") - logger.info(f" 有效前一根[{prev_time}]: {prev_type} 实体={prev_body:.2f} O={valid_prev['open']:.2f} C={valid_prev['close']:.2f}") - logger.info(f" 当前K线: H={curr_kline['high']:.2f} L={curr_kline['low']:.2f} C={curr_kline['close']:.2f}") + logger.info( + f" 有效前一根[{prev_time}]: {prev_type} 实体={prev_body:.2f} O={valid_prev['open']:.2f} C={valid_prev['close']:.2f}") + logger.info( + f" 当前K线: H={curr_kline['high']:.2f} L={curr_kline['low']:.2f} C={curr_kline['close']:.2f}") logger.info(f" 当前持仓: {self.start} (1=多, -1=空, 0=无)") # ========== 执行交易逻辑 ========== @@ -600,7 +624,7 @@ class BitmartOneThirdStrategy: # 记录本次触发 self.last_trigger_kline_id = curr_kline_id self.last_trigger_direction = direction - + if executed: # 记录交易K线,防止同一K线内频繁反手 self.last_trade_kline_id = curr_kline_id @@ -609,11 +633,12 @@ class BitmartOneThirdStrategy: self._send_position_message(curr_kline) last_report_time = time.time() - logger.info(f"{'='*50}") + logger.info(f"{'=' * 50}") else: # 没有信号时,显示实时价格 - logger.debug(f"[{curr_time_str}] 现价: {curr['close']:.2f} H={curr['high']:.2f} L={curr['low']:.2f}") + logger.debug( + f"[{curr_time_str}] 现价: {curr['close']:.2f} H={curr['high']:.2f} L={curr['low']:.2f}") # ========== 定时发送持仓信息 ========== current_time = time.time() @@ -629,6 +654,10 @@ class BitmartOneThirdStrategy: logger.error(f"主循环异常: {e}") time.sleep(self.check_interval) + time.sleep(15) + self.page.close() + time.sleep(15) + def _send_position_message(self, latest_kline): """发送持仓信息到钉钉""" current_price = float(latest_kline["close"]) @@ -638,7 +667,8 @@ class BitmartOneThirdStrategy: if self.start != 0: open_avg_price = float(self.open_avg_price) if self.open_avg_price else 0.0 current_amount = float(self.current_amount) if self.current_amount else 0.0 - position_cross = float(self.position_cross) if hasattr(self, 'position_cross') and self.position_cross else 0.0 + position_cross = float(self.position_cross) if hasattr(self, + 'position_cross') and self.position_cross else 0.0 # 计算浮动盈亏 if self.start == 1: # 多头