a
This commit is contained in:
parent
1adb3137d6
commit
004472bbd4
|
|
@ -41,6 +41,115 @@ async def get_all_configs():
|
||||||
raise HTTPException(status_code=500, detail=str(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)}")
|
||||||
|
|
||||||
|
|
||||||
@router.get("/{key}")
|
@router.get("/{key}")
|
||||||
async def get_config(key: str):
|
async def get_config(key: str):
|
||||||
"""获取单个配置"""
|
"""获取单个配置"""
|
||||||
|
|
@ -174,112 +283,3 @@ async def update_configs_batch(configs: list[ConfigItem]):
|
||||||
}
|
}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(status_code=500, detail=str(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)}")
|
|
||||||
|
|
|
||||||
|
|
@ -170,11 +170,7 @@ INSERT INTO `trading_config` (`config_key`, `config_value`, `config_type`, `cate
|
||||||
('TRAILING_STOP_PROTECT', '0.05', 'number', 'strategy', '移动止损保护利润(保护5%利润,更合理)'),
|
('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分钟,用于同步币安实际持仓与数据库状态'),
|
('POSITION_SYNC_INTERVAL', '60', 'number', 'scan', '持仓状态同步间隔(秒),默认1分钟,用于同步币安实际持仓与数据库状态'),
|
||||||
>>>>>>> Incoming (Background Agent changes)
|
|
||||||
|
|
||||||
|
|
||||||
-- API配置
|
-- API配置
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,10 @@ const ConfigPanel = () => {
|
||||||
}
|
}
|
||||||
// 重新加载配置
|
// 重新加载配置
|
||||||
await loadConfigs()
|
await loadConfigs()
|
||||||
|
// 如果更新的是与可行性相关的配置,重新检查可行性
|
||||||
|
if (['MIN_MARGIN_USDT', 'MIN_POSITION_PERCENT', 'MAX_POSITION_PERCENT', 'LEVERAGE'].includes(key)) {
|
||||||
|
await checkFeasibility()
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorMsg = error.message || '更新失败'
|
const errorMsg = error.message || '更新失败'
|
||||||
setMessage('更新失败: ' + errorMsg)
|
setMessage('更新失败: ' + errorMsg)
|
||||||
|
|
|
||||||
|
|
@ -189,8 +189,12 @@ def _get_trading_config():
|
||||||
'USE_TRAILING_STOP': True,
|
'USE_TRAILING_STOP': True,
|
||||||
'TRAILING_STOP_ACTIVATION': 0.10, # 移动止损激活提高到10%(盈利10%后激活,给趋势更多空间)
|
'TRAILING_STOP_ACTIVATION': 0.10, # 移动止损激活提高到10%(盈利10%后激活,给趋势更多空间)
|
||||||
'TRAILING_STOP_PROTECT': 0.05, # 保护利润提高到5%(保护5%利润,更合理)
|
'TRAILING_STOP_PROTECT': 0.05, # 保护利润提高到5%(保护5%利润,更合理)
|
||||||
|
<<<<<<< Current (Your changes)
|
||||||
<<<<<<< Current (Your changes)
|
<<<<<<< Current (Your changes)
|
||||||
'POSITION_SYNC_INTERVAL': 300, # 持仓状态同步间隔(秒),默认5分钟
|
'POSITION_SYNC_INTERVAL': 300, # 持仓状态同步间隔(秒),默认5分钟
|
||||||
|
=======
|
||||||
|
'POSITION_SYNC_INTERVAL': 60, # 持仓状态同步间隔(秒),缩短到1分钟,确保状态及时同步
|
||||||
|
>>>>>>> Incoming (Background Agent changes)
|
||||||
=======
|
=======
|
||||||
'POSITION_SYNC_INTERVAL': 60, # 持仓状态同步间隔(秒),缩短到1分钟,确保状态及时同步
|
'POSITION_SYNC_INTERVAL': 60, # 持仓状态同步间隔(秒),缩短到1分钟,确保状态及时同步
|
||||||
>>>>>>> Incoming (Background Agent changes)
|
>>>>>>> Incoming (Background Agent changes)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user