From 004472bbd4e4be2632f8935f51f6745a77683366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sat, 17 Jan 2026 18:58:53 +0800 Subject: [PATCH] a --- backend/api/routes/config.py | 218 ++++++++++++------------ backend/database/init.sql | 4 - frontend/src/components/ConfigPanel.jsx | 4 + trading_system/config.py | 4 + 4 files changed, 117 insertions(+), 113 deletions(-) diff --git a/backend/api/routes/config.py b/backend/api/routes/config.py index 26d83b4..28182f9 100644 --- a/backend/api/routes/config.py +++ b/backend/api/routes/config.py @@ -41,6 +41,115 @@ async def get_all_configs(): raise HTTPException(status_code=500, detail=str(e)) +@router.get("/feasibility-check") +async def check_config_feasibility(): + """ + 检查配置可行性,基于当前账户余额和杠杆倍数计算可行的配置建议 + """ + try: + # 获取账户余额 + try: + from api.routes.account import get_realtime_account_data + account_data = await get_realtime_account_data() + available_balance = account_data.get('available_balance', 0) + total_balance = account_data.get('total_balance', 0) + except Exception as e: + logger.warning(f"获取账户余额失败: {e},使用默认值") + available_balance = 0 + total_balance = 0 + + if available_balance <= 0: + return { + "feasible": False, + "error": "无法获取账户余额,请检查API配置", + "suggestions": [] + } + + # 获取当前配置 + min_margin_usdt = TradingConfig.get_value('MIN_MARGIN_USDT', 5.0) + min_position_percent = TradingConfig.get_value('MIN_POSITION_PERCENT', 0.02) + max_position_percent = TradingConfig.get_value('MAX_POSITION_PERCENT', 0.08) + leverage = TradingConfig.get_value('LEVERAGE', 10) + + # 计算最小保证金要求对应的最小仓位价值 + required_position_value = min_margin_usdt * leverage + required_position_percent = required_position_value / available_balance if available_balance > 0 else 0 + + # 检查是否可行 + is_feasible = required_position_percent <= max_position_percent + + suggestions = [] + + if not is_feasible: + # 不可行,给出建议 + # 方案1:降低最小保证金 + suggested_min_margin = (available_balance * max_position_percent) / leverage + suggestions.append({ + "type": "reduce_min_margin", + "title": "降低最小保证金", + "description": f"将 MIN_MARGIN_USDT 调整为 {suggested_min_margin:.2f} USDT(当前: {min_margin_usdt:.2f} USDT)", + "config_key": "MIN_MARGIN_USDT", + "suggested_value": round(suggested_min_margin, 2), + "reason": f"当前配置需要 {required_position_percent*100:.1f}% 的仓位价值,但最大允许 {max_position_percent*100:.1f}%" + }) + + # 方案2:增加账户余额 + required_balance = required_position_value / max_position_percent + suggestions.append({ + "type": "increase_balance", + "title": "增加账户余额", + "description": f"将账户余额增加到至少 {required_balance:.2f} USDT(当前: {available_balance:.2f} USDT)", + "config_key": None, + "suggested_value": round(required_balance, 2), + "reason": f"当前余额不足以满足最小保证金 {min_margin_usdt:.2f} USDT 的要求" + }) + + # 方案3:降低杠杆倍数 + suggested_leverage = int((available_balance * max_position_percent) / min_margin_usdt) + if suggested_leverage >= 1: + suggestions.append({ + "type": "reduce_leverage", + "title": "降低杠杆倍数", + "description": f"将 LEVERAGE 调整为 {suggested_leverage}x(当前: {leverage}x)", + "config_key": "LEVERAGE", + "suggested_value": suggested_leverage, + "reason": f"降低杠杆可以减少所需仓位价值" + }) + else: + # 可行,显示当前配置信息 + actual_min_position_value = available_balance * min_position_percent + actual_min_margin = actual_min_position_value / leverage if leverage > 0 else actual_min_position_value + + suggestions.append({ + "type": "info", + "title": "配置可行", + "description": f"当前配置可以正常下单。最小仓位价值: {actual_min_position_value:.2f} USDT,对应保证金: {actual_min_margin:.2f} USDT", + "config_key": None, + "suggested_value": None, + "reason": None + }) + + return { + "feasible": is_feasible, + "account_balance": available_balance, + "leverage": leverage, + "current_config": { + "min_margin_usdt": min_margin_usdt, + "min_position_percent": min_position_percent, + "max_position_percent": max_position_percent + }, + "calculated_values": { + "required_position_value": required_position_value, + "required_position_percent": required_position_percent * 100, + "max_allowed_position_percent": max_position_percent * 100 + }, + "suggestions": suggestions + } + except Exception as e: + logger.error(f"检查配置可行性失败: {e}", exc_info=True) + raise HTTPException(status_code=500, detail=f"检查配置可行性失败: {str(e)}") + + @router.get("/{key}") async def get_config(key: str): """获取单个配置""" @@ -174,112 +283,3 @@ async def update_configs_batch(configs: list[ConfigItem]): } except Exception as e: raise HTTPException(status_code=500, detail=str(e)) - - -@router.get("/feasibility-check") -async def check_config_feasibility(): - """ - 检查配置可行性,基于当前账户余额和杠杆倍数计算可行的配置建议 - """ - try: - # 获取账户余额 - try: - from api.routes.account import get_realtime_account_data - account_data = await get_realtime_account_data() - available_balance = account_data.get('available_balance', 0) - total_balance = account_data.get('total_balance', 0) - except Exception as e: - logger.warning(f"获取账户余额失败: {e},使用默认值") - available_balance = 0 - total_balance = 0 - - if available_balance <= 0: - return { - "feasible": False, - "error": "无法获取账户余额,请检查API配置", - "suggestions": [] - } - - # 获取当前配置 - min_margin_usdt = TradingConfig.get_value('MIN_MARGIN_USDT', 5.0) - min_position_percent = TradingConfig.get_value('MIN_POSITION_PERCENT', 0.02) - max_position_percent = TradingConfig.get_value('MAX_POSITION_PERCENT', 0.08) - leverage = TradingConfig.get_value('LEVERAGE', 10) - - # 计算最小保证金要求对应的最小仓位价值 - required_position_value = min_margin_usdt * leverage - required_position_percent = required_position_value / available_balance if available_balance > 0 else 0 - - # 检查是否可行 - is_feasible = required_position_percent <= max_position_percent - - suggestions = [] - - if not is_feasible: - # 不可行,给出建议 - # 方案1:降低最小保证金 - suggested_min_margin = (available_balance * max_position_percent) / leverage - suggestions.append({ - "type": "reduce_min_margin", - "title": "降低最小保证金", - "description": f"将 MIN_MARGIN_USDT 调整为 {suggested_min_margin:.2f} USDT(当前: {min_margin_usdt:.2f} USDT)", - "config_key": "MIN_MARGIN_USDT", - "suggested_value": round(suggested_min_margin, 2), - "reason": f"当前配置需要 {required_position_percent*100:.1f}% 的仓位价值,但最大允许 {max_position_percent*100:.1f}%" - }) - - # 方案2:增加账户余额 - required_balance = required_position_value / max_position_percent - suggestions.append({ - "type": "increase_balance", - "title": "增加账户余额", - "description": f"将账户余额增加到至少 {required_balance:.2f} USDT(当前: {available_balance:.2f} USDT)", - "config_key": None, - "suggested_value": round(required_balance, 2), - "reason": f"当前余额不足以满足最小保证金 {min_margin_usdt:.2f} USDT 的要求" - }) - - # 方案3:降低杠杆倍数 - suggested_leverage = int((available_balance * max_position_percent) / min_margin_usdt) - if suggested_leverage >= 1: - suggestions.append({ - "type": "reduce_leverage", - "title": "降低杠杆倍数", - "description": f"将 LEVERAGE 调整为 {suggested_leverage}x(当前: {leverage}x)", - "config_key": "LEVERAGE", - "suggested_value": suggested_leverage, - "reason": f"降低杠杆可以减少所需仓位价值" - }) - else: - # 可行,显示当前配置信息 - actual_min_position_value = available_balance * min_position_percent - actual_min_margin = actual_min_position_value / leverage if leverage > 0 else actual_min_position_value - - suggestions.append({ - "type": "info", - "title": "配置可行", - "description": f"当前配置可以正常下单。最小仓位价值: {actual_min_position_value:.2f} USDT,对应保证金: {actual_min_margin:.2f} USDT", - "config_key": None, - "suggested_value": None, - "reason": None - }) - - return { - "feasible": is_feasible, - "account_balance": available_balance, - "leverage": leverage, - "current_config": { - "min_margin_usdt": min_margin_usdt, - "min_position_percent": min_position_percent, - "max_position_percent": max_position_percent - }, - "calculated_values": { - "required_position_value": required_position_value, - "required_position_percent": required_position_percent * 100, - "max_allowed_position_percent": max_position_percent * 100 - }, - "suggestions": suggestions - } - except Exception as e: - logger.error(f"检查配置可行性失败: {e}", exc_info=True) - raise HTTPException(status_code=500, detail=f"检查配置可行性失败: {str(e)}") diff --git a/backend/database/init.sql b/backend/database/init.sql index 3697397..84653a5 100644 --- a/backend/database/init.sql +++ b/backend/database/init.sql @@ -170,11 +170,7 @@ INSERT INTO `trading_config` (`config_key`, `config_value`, `config_type`, `cate ('TRAILING_STOP_PROTECT', '0.05', 'number', 'strategy', '移动止损保护利润(保护5%利润,更合理)'), -- 持仓同步 -<<<<<<< Current (Your changes) -('POSITION_SYNC_INTERVAL', '300', 'number', 'scan', '持仓状态同步间隔(秒),默认5分钟,用于同步币安实际持仓与数据库状态'), -======= ('POSITION_SYNC_INTERVAL', '60', 'number', 'scan', '持仓状态同步间隔(秒),默认1分钟,用于同步币安实际持仓与数据库状态'), ->>>>>>> Incoming (Background Agent changes) -- API配置 diff --git a/frontend/src/components/ConfigPanel.jsx b/frontend/src/components/ConfigPanel.jsx index e7e1e56..470b870 100644 --- a/frontend/src/components/ConfigPanel.jsx +++ b/frontend/src/components/ConfigPanel.jsx @@ -111,6 +111,10 @@ const ConfigPanel = () => { } // 重新加载配置 await loadConfigs() + // 如果更新的是与可行性相关的配置,重新检查可行性 + if (['MIN_MARGIN_USDT', 'MIN_POSITION_PERCENT', 'MAX_POSITION_PERCENT', 'LEVERAGE'].includes(key)) { + await checkFeasibility() + } } catch (error) { const errorMsg = error.message || '更新失败' setMessage('更新失败: ' + errorMsg) diff --git a/trading_system/config.py b/trading_system/config.py index aeca233..0e4fbdf 100644 --- a/trading_system/config.py +++ b/trading_system/config.py @@ -189,8 +189,12 @@ def _get_trading_config(): 'USE_TRAILING_STOP': True, 'TRAILING_STOP_ACTIVATION': 0.10, # 移动止损激活提高到10%(盈利10%后激活,给趋势更多空间) 'TRAILING_STOP_PROTECT': 0.05, # 保护利润提高到5%(保护5%利润,更合理) +<<<<<<< Current (Your changes) <<<<<<< Current (Your changes) 'POSITION_SYNC_INTERVAL': 300, # 持仓状态同步间隔(秒),默认5分钟 +======= + 'POSITION_SYNC_INTERVAL': 60, # 持仓状态同步间隔(秒),缩短到1分钟,确保状态及时同步 +>>>>>>> Incoming (Background Agent changes) ======= 'POSITION_SYNC_INTERVAL': 60, # 持仓状态同步间隔(秒),缩短到1分钟,确保状态及时同步 >>>>>>> Incoming (Background Agent changes)