From 30085590a1f869298e7182be6b50cf4517622136 Mon Sep 17 00:00:00 2001 From: "zhangkun9038@dingtalk.com" Date: Thu, 27 Nov 2025 17:40:46 +0800 Subject: [PATCH] =?UTF-8?q?grid=E7=AE=A1=E7=90=86=E5=99=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user_data/strategies/staticgrid.py | 53 ++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/user_data/strategies/staticgrid.py b/user_data/strategies/staticgrid.py index 53708d4..7654b59 100644 --- a/user_data/strategies/staticgrid.py +++ b/user_data/strategies/staticgrid.py @@ -65,9 +65,27 @@ class StaticGrid(IStrategy): new_lower = current_price * (1 - percent) new_upper = current_price * (1 + percent) - # 动态计算步长:范围 / 50 + # ✅ 处理极端情况:如果上下沿舍入后相同,需要调整 + # 这可能发生在低价币上(如 0.01 * 1.33 = 0.01330... 舍入到 0.01) range_size = new_upper - new_lower - step = range_size / 50 + if range_size <= 0 or abs(range_size) < 1e-8: + # 范围太小,动态扩大:使用固定的小数位精度 + # 计算 current_price 的小数位数 + price_str = f"{current_price:.10f}".rstrip('0') + decimal_places = len(price_str.split('.')[1]) if '.' in price_str else 0 + + # 基于小数位数动态设置步长 + min_step = 10 ** (-decimal_places - 1) # 比最小单位少一位 + # 设置范围:上下各 25 步(总共 50 个网格) + new_lower = max(min_step, current_price - min_step * 25) # 下方 25 步(不低于最小单位) + new_upper = current_price + min_step * 25 # 上方 25 步 + step = min_step + + print(f"[StaticGrid] {pair} 检测到价格范围过小,动态调整 - 小数位: {decimal_places}, 步长: {step:.10f}, 范围: {new_lower:.10f}-{new_upper:.10f}", + file=sys.stderr, flush=True) + else: + # 动态计算步长:范围 / 50 + step = range_size / 50 # 更新 GridManager 的范围 grid_manager.lower_price = new_lower @@ -175,6 +193,37 @@ class StaticGrid(IStrategy): print(f"[StaticGrid] {pair} 已从 Redis 恢复", file=sys.stderr, flush=True) else: print(f"[StaticGrid] {pair} 新建持仓", file=sys.stderr, flush=True) + + # ✅ 新建时,自动填充下沿到当前价格之间的一半网格(50%) + if current_price > 0: + rounded_price = grid_manager._round_to_grid(current_price) + filled_count = 0 + + # 从下沿开始,填充到当前价格(及以上)的网格 + for grid_price in grid_manager.grid_prices: + if grid_price <= rounded_price: + grid_manager.grid_states[grid_price].status = "filled" + grid_manager.grid_states[grid_price].quantity = 1.0 + grid_manager.grid_states[grid_price].entry_price = current_price + grid_manager.grid_states[grid_price].entry_time = 0 + filled_count += 1 + else: + break + + # 更新持仓统计(假设每个网格买 1 个,价格为 current_price) + grid_manager.total_quantity = float(filled_count) + grid_manager.total_invested = grid_manager.total_quantity * current_price + grid_manager.avg_entry_price = current_price + + print(f"[StaticGrid] {pair} 新建网格 - 自动填充下沿到当前价格 - " + f"当前价: {current_price:.2f}, 舍入价: {rounded_price:.2f}, " + f"填充网格数: {filled_count}/{grid_manager.total_grid_levels}, " + f"持仓: {grid_manager.total_quantity:.6f}", + file=sys.stderr, flush=True) + + # 同步到 Redis + if self.redis_available: + grid_manager.sync_grid_state_to_redis() # 初始化 Redis 连接用于后续同步 if self.redis_available: