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