From cda8612eb7d63f20405d4dd7705863c938607e65 Mon Sep 17 00:00:00 2001 From: 27942 <1313123@342> Date: Fri, 6 Feb 2026 02:35:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=8C=E7=BE=8E=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E4=BC=98=E5=8C=96=E8=AE=A1=E7=AE=97=E7=9B=88?= =?UTF-8?q?=E4=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bitmart/四分之一,五分钟,反手条件充足.py | 43 +++++++++++++++++++---- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/bitmart/四分之一,五分钟,反手条件充足.py b/bitmart/四分之一,五分钟,反手条件充足.py index 65a28fb..cf50f33 100644 --- a/bitmart/四分之一,五分钟,反手条件充足.py +++ b/bitmart/四分之一,五分钟,反手条件充足.py @@ -39,6 +39,10 @@ class BitmartFuturesTransaction: self.open_type = "cross" # 全仓模式 self.risk_percent = 0 # 每次开仓使用可用余额的 1% self.take_profit_usd = 5 # 仓位盈利达到此金额(美元)时平仓止盈 + self.stop_loss_usd = -3 # 固定止损:亏损达到 3 美元平仓 + self.trailing_activation_usd = 2 # 盈利达到此金额后启动移动止损 + self.trailing_distance_usd = 1.5 # 从最高盈利回撤此金额则平仓 + self.max_unrealized_pnl_seen = None # 持仓期间见过的最大盈利(用于移动止损) self.open_avg_price = None # 开仓价格 self.current_amount = None # 持仓量 @@ -441,6 +445,7 @@ class BitmartFuturesTransaction: # 验证开仓是否成功 if self.verify_position_direction(1): + self.max_unrealized_pnl_seen = None # 新仓位重置移动止损记录 logger.success("开多成功") return True else: @@ -463,6 +468,7 @@ class BitmartFuturesTransaction: # 验证开仓是否成功 if self.verify_position_direction(-1): + self.max_unrealized_pnl_seen = None # 新仓位重置移动止损记录 logger.success("开空成功") return True else: @@ -482,6 +488,7 @@ class BitmartFuturesTransaction: # 验证开仓是否成功 if self.verify_position_direction(1): + self.max_unrealized_pnl_seen = None # 新仓位重置移动止损记录 logger.success("反手做多成功") self.last_reverse_time = time.time() time.sleep(20) # 额外等待避免频繁交易 @@ -503,6 +510,7 @@ class BitmartFuturesTransaction: # 验证开仓是否成功 if self.verify_position_direction(-1): + self.max_unrealized_pnl_seen = None # 新仓位重置移动止损记录 logger.success("反手做空成功") self.last_reverse_time = time.time() time.sleep(20) # 额外等待避免频繁交易 @@ -574,14 +582,37 @@ class BitmartFuturesTransaction: logger.debug(f"当前持仓状态: {self.start} (0=无, 1=多, -1=空)") - # 3.5 止盈:仓位盈利达到 take_profit_usd 则平仓,下一轮循环再根据K线信号开仓 + # 3.5 止损/止盈/移动止损 if self.start != 0: pnl_usd = self.get_unrealized_pnl_usd() - if pnl_usd is not None and pnl_usd >= self.take_profit_usd: - logger.info(f"仓位盈利 {pnl_usd:.2f} 美元 >= {self.take_profit_usd} 美元,执行止盈平仓") - self.平仓() - time.sleep(3) - continue # 下一轮循环将无持仓,会按K线信号重新判断是否开仓 + if pnl_usd is not None: + # 固定止损:亏损达到 3 美元平仓 + if pnl_usd <= self.stop_loss_usd: + logger.info(f"仓位亏损 {pnl_usd:.2f} 美元 <= 止损 {self.stop_loss_usd} 美元,执行止损平仓") + self.平仓() + self.max_unrealized_pnl_seen = None + time.sleep(3) + continue + # 更新持仓期间最大盈利(用于移动止损) + if self.max_unrealized_pnl_seen is None: + self.max_unrealized_pnl_seen = pnl_usd + else: + self.max_unrealized_pnl_seen = max(self.max_unrealized_pnl_seen, pnl_usd) + # 移动止损:盈利曾达到 activation 后,从最高盈利回撤 trailing_distance 则平仓 + if self.max_unrealized_pnl_seen >= self.trailing_activation_usd: + if pnl_usd < self.max_unrealized_pnl_seen - self.trailing_distance_usd: + logger.info(f"移动止损:当前盈利 {pnl_usd:.2f} 从最高 {self.max_unrealized_pnl_seen:.2f} 回撤 >= {self.trailing_distance_usd} 美元,平仓") + self.平仓() + self.max_unrealized_pnl_seen = None + time.sleep(3) + continue + # 止盈:盈利达到 take_profit_usd 平仓 + if pnl_usd >= self.take_profit_usd: + logger.info(f"仓位盈利 {pnl_usd:.2f} 美元 >= {self.take_profit_usd} 美元,执行止盈平仓") + self.平仓() + self.max_unrealized_pnl_seen = None + time.sleep(3) + continue # 4. 检查信号 signal = self.check_signal(current_price, prev_kline, current_kline)