From ec58de1559a62fd363cdb99be34da02e6b5cc67a Mon Sep 17 00:00:00 2001 From: "zhangkun9038@dingtalk.com" Date: Thu, 27 Nov 2025 22:13:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B=E5=88=9D=E5=A7=8B=E5=BB=BA?= =?UTF-8?q?=E4=BB=93=E9=80=BB=E8=BE=91=EF=BC=9A=E6=AF=8F=E4=B8=AA=E7=BD=91?= =?UTF-8?q?=E6=A0=BC=E6=8A=95=E5=85=A5=E9=87=91=E9=A2=9D=E4=B8=80=E8=87=B4?= =?UTF-8?q?=EF=BC=8840/25=3D1.6=20USDT=EF=BC=89=EF=BC=8C=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=BC=BA=E5=88=B6=E5=B9=B3=E4=BB=93=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user_data/strategies/staticgrid.py | 44 ++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/user_data/strategies/staticgrid.py b/user_data/strategies/staticgrid.py index 65daeb5..f2d0260 100644 --- a/user_data/strategies/staticgrid.py +++ b/user_data/strategies/staticgrid.py @@ -28,7 +28,8 @@ class StaticGrid(IStrategy): "SOL/USDT": {"percent": 0.33}, # 上下 33% "TRX/USDT": {"percent": 0.33}, # 上下 33% } - STAKE = 40.0 # 每个网格的投资额 + STAKE = 40.0 # 每个持仓周期的总投资额(会分散到25个网格) + GRIDS_PER_CYCLE = 25 # 每个持仓周期的网格数 def __init__(self, config: dict) -> None: super().__init__(config) @@ -183,12 +184,15 @@ class StaticGrid(IStrategy): file=sys.stderr, flush=True) # 创建新的 GridManager + # ✅ stake_per_grid = 总投资额 / 网格数,保证每个网格投入一致 + stake_per_grid = self.STAKE / self.GRIDS_PER_CYCLE + grid_manager = GridManager( pair=pair, lower_price=lower_price, upper_price=upper_price, step=step, - stake_per_grid=self.STAKE + stake_per_grid=stake_per_grid ) # 如果 Redis 中有持仓数据,进行恢复 @@ -386,4 +390,38 @@ class StaticGrid(IStrategy): print(f"[StaticGrid] {pair} 无加仓建议,返回 None", file=sys.stderr, flush=True) - return None \ No newline at end of file + # ✅ 检查自监测:如果已完结,返回负数来强制平仓所有持仓 + if grid_manager.is_completed and trade.amount > 0: + print(f"[StaticGrid] {pair} GridManager 已完结,强制平仓 - 理由: {grid_manager.completion_reason}", + file=sys.stderr, flush=True) + # 返回负数来平仓所有持仓 + return -trade.amount + + return None + + def custom_stake_amount(self, pair: str, current_rate: float, proposed_stake: float, + min_stake: float, max_stake: float, trade_number: int, + time_in_market: int, **kwargs) -> float: + """ + 自定义初始建仓金额,使每个网格投入金额一致 + + 对于网格交易,初次建仓也应该只投入一个网格的金额,保持一致性 + """ + if pair not in self.grid_managers: + # 如果还没有 GridManager,创建一个 + self._init_grid_manager(pair) + + grid_manager = self.grid_managers[pair] + + # 每个网格的投入金额 + grid_stake = grid_manager.stake_per_grid + + print(f"[StaticGrid] {pair} custom_stake_amount - proposed: {proposed_stake:.2f}, " + f"grid_stake: {grid_stake:.2f}, min: {min_stake:.2f}, max: {max_stake:.2f}", + file=sys.stderr, flush=True) + + # 返回每个网格的投入金额(确保在 min_stake 和 max_stake 之间) + actual_stake = max(min_stake, min(grid_stake, max_stake)) + print(f"[StaticGrid] {pair} custom_stake_amount 返回: {actual_stake:.2f}", + file=sys.stderr, flush=True) + return actual_stake \ No newline at end of file