From 9ee9e57114dc29be364e319732b1c93f5fa07b45 Mon Sep 17 00:00:00 2001 From: "zhangkun9038@dingtalk.com" Date: Fri, 28 Nov 2025 00:37:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=8D=E5=BF=85=E8=A6=81?= =?UTF-8?q?=E7=9A=84min=5Fgrids=5Ffor=5Fexit=E6=9D=A1=E4=BB=B6=20-=20?= =?UTF-8?q?=E6=AD=A2=E7=9B=88=E5=8F=AA=E7=94=B1ROI=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E5=86=B3=E5=AE=9A=EF=BC=8C=E4=B8=8E=E5=8A=A0=E4=BB=93=E6=AC=A1?= =?UTF-8?q?=E6=95=B0=E6=97=A0=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user_data/strategies/grid_manager.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/user_data/strategies/grid_manager.py b/user_data/strategies/grid_manager.py index fdbf740..66f2f7a 100644 --- a/user_data/strategies/grid_manager.py +++ b/user_data/strategies/grid_manager.py @@ -260,7 +260,7 @@ class GridManager: ) self.is_completed = False # GridManager 是否完结 self.completion_reason: Optional[str] = None # 完结原因 (take_profit / stop_loss) - self.min_grids_for_exit = 20 # 至少加仓到约20个网格才能触发止盈,保证按照预与加仓足够次 + # ❌ 删除min_grids_for_exit - 止盈与加仓次数无关,只由ROI信号决定 # ✅ GridManager 不变量:沉求下来就不改了(除非网格范围更新) # 便于 Redis 序列化保存 @@ -301,18 +301,17 @@ class GridManager: file=sys.stderr, flush=True) # ✅ 自监测:检查是否需要止盈/止损 - # 仅在加仓超过最低网格数时才触发,保证有足够的持仓 + # 只要有持仓,就检查是否触发止盈/止损条件 if not self.is_completed and self.total_quantity > 0: - filled_count = sum(1 for gs in self.grid_states.values() if gs.status == "filled") - if filled_count >= self.min_grids_for_exit: - exit_reason = self.monitor.get_exit_reason(current_price, self.avg_entry_price) - if exit_reason: - self.is_completed = True - self.completion_reason = exit_reason - profit_pct = (current_price - self.avg_entry_price) / self.avg_entry_price * 100 - print(f"[GridManager] {self.pair} 自监测触发✅ - 原因: {exit_reason}, " - f"利润: {profit_pct:.2f}%, 当前价: {current_price:.2f}, 网格数: {filled_count}", - file=sys.stderr, flush=True) + exit_reason = self.monitor.get_exit_reason(current_price, self.avg_entry_price) + if exit_reason: + self.is_completed = True + self.completion_reason = exit_reason + profit_pct = (current_price - self.avg_entry_price) / self.avg_entry_price * 100 + filled_count = sum(1 for gs in self.grid_states.values() if gs.status == "filled") + print(f"[GridManager] {self.pair} 自监测触发✅ - 原因: {exit_reason}, " + f"利润: {profit_pct:.2f}%, 当前价: {current_price:.2f}, 网格数: {filled_count}", + file=sys.stderr, flush=True) def apply_adjustment(self, adjustment: PositionRecord) -> None: """