改进初始建仓逻辑:每个网格投入金额一致(40/25=1.6 USDT),并添加强制平仓机制

This commit is contained in:
zhangkun9038@dingtalk.com 2025-11-27 22:13:34 +08:00
parent 5a927de07c
commit ec58de1559

View File

@ -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)
# ✅ 检查自监测:如果已完结,返回负数来强制平仓所有持仓
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