fix(config_manager, api, database): 添加盈利保护配置项

在配置管理模块中,新增了 `PROFIT_PROTECTION_ENABLED` 和 `LOCK_PROFIT_AT_BREAKEVEN_AFTER_PCT` 配置项,以控制保本和移动止损的执行。同时,更新了数据库初始化脚本以包含这些新配置。这一改动旨在增强风险控制能力,确保在盈利时能够有效保护利润。
This commit is contained in:
薇薇安 2026-02-26 12:07:16 +08:00
parent 432fc85a79
commit 10e6096cc1
5 changed files with 32 additions and 15 deletions

View File

@ -485,6 +485,18 @@ async def get_global_configs(
"category": "scan",
"description": "是否排除主流币BTC、ETH、BNB等专注于山寨币。山寨币策略建议开启。",
},
"PROFIT_PROTECTION_ENABLED": {
"value": True,
"type": "boolean",
"category": "strategy",
"description": "盈利保护总开关True=启用保本+移动止损False=全部关闭(不做保本、不做移动止损)",
},
"LOCK_PROFIT_AT_BREAKEVEN_AFTER_PCT": {
"value": 0.03,
"type": "number",
"category": "strategy",
"description": "盈利达保证金的该比例时移至保本(如 0.03=3%0=关闭保本步骤)",
},
"USE_TRAILING_STOP": {
"value": False,
"type": "boolean",

View File

@ -882,7 +882,10 @@ class ConfigManager:
'MAX_LEVERAGE': eff_get('MAX_LEVERAGE', 20), # 动态杠杆上限 20配合单笔仓位提高收益
'MIN_LEVERAGE': eff_get('MIN_LEVERAGE', 8), # 动态杠杆下限,不低于此值(之前盈利阶段多为 8x避免被压到 24x 导致单笔盈利过少)
'MAX_LEVERAGE_SMALL_CAP': eff_get('MAX_LEVERAGE_SMALL_CAP', 8), # 高波动/小众币最大杠杆,默认 8 与之前盈利阶段一致
# 移动止损:默认关闭(避免过早截断利润,让利润奔跑)
# 盈利保护总开关与保本:关闭后不执行保本、不执行移动止损
'PROFIT_PROTECTION_ENABLED': eff_get('PROFIT_PROTECTION_ENABLED', True), # True=启用保本+移动止损False=全部关闭
'LOCK_PROFIT_AT_BREAKEVEN_AFTER_PCT': eff_get('LOCK_PROFIT_AT_BREAKEVEN_AFTER_PCT', 0.03), # 盈利达保证金比例时移至保本0.03=3%0=关闭)
# 移动止损
'USE_TRAILING_STOP': eff_get('USE_TRAILING_STOP', True), # 默认启用2026-01-27优化启用移动止损保护利润
'TRAILING_STOP_ACTIVATION': eff_get('TRAILING_STOP_ACTIVATION', 0.05), # 默认5%2026-01-27优化更早保护利润避免回吐
'TRAILING_STOP_PROTECT': eff_get('TRAILING_STOP_PROTECT', 0.025), # 默认2.5%2026-01-27优化给回撤足够空间避免被震荡扫出

View File

@ -234,6 +234,8 @@ INSERT INTO `trading_config` (`config_key`, `config_value`, `config_type`, `cate
('LEVERAGE', '10', 'number', 'strategy', '基础杠杆倍数'),
('USE_DYNAMIC_LEVERAGE', 'true', 'boolean', 'strategy', '是否启用动态杠杆(根据信号强度调整杠杆倍数)'),
('MAX_LEVERAGE', '15', 'number', 'strategy', '最大杠杆倍数动态杠杆上限降低到15更保守'),
('PROFIT_PROTECTION_ENABLED', 'true', 'boolean', 'strategy', '盈利保护总开关:启用保本+移动止损'),
('LOCK_PROFIT_AT_BREAKEVEN_AFTER_PCT', '0.03', 'number', 'strategy', '盈利达保证金比例时移至保本0.03=3%0=关闭)'),
('USE_TRAILING_STOP', 'true', 'boolean', 'strategy', '是否使用移动止损'),
('TRAILING_STOP_ACTIVATION', '0.10', 'number', 'strategy', '移动止损激活阈值盈利10%后激活,给趋势更多空间)'),
('TRAILING_STOP_PROTECT', '0.05', 'number', 'strategy', '移动止损保护利润保护5%利润,更合理)'),

View File

@ -2077,7 +2077,7 @@ class PositionManager:
else:
logger.debug(f"{symbol} [移动止损] 已禁用USE_TRAILING_STOP=False跳过移动止损检查")
if use_trailing:
trailing_activation = config.TRADING_CONFIG.get('TRAILING_STOP_ACTIVATION', 0.01) # 相对于保证金
trailing_activation = config.TRADING_CONFIG.get('TRAILING_STOP_ACTIVATION', 0.10) # 相对于保证金,默认 10%
trailing_protect = config.TRADING_CONFIG.get('TRAILING_STOP_PROTECT', 0.01) # 相对于保证金
# ⚠️ 关键修复:配置值格式转换(兼容百分比形式和比例形式)

View File

@ -664,28 +664,28 @@ class RiskManager:
effective_max = config.get_effective_config('MAX_POSITION_PERCENT', 0.20)
base_position_percent = effective_max * signal_multiplier
max_position_percent = effective_max * signal_multiplier
min_position_percent = config.TRADING_CONFIG['MIN_POSITION_PERCENT']
min_position_percent = config.TRADING_CONFIG['MIN_POSITION_PERCENT']
# 涨跌幅超过5%时,可以适当增加保证金占比,但必须遵守 MAX_POSITION_PERCENT 上限
if abs(change_percent) > 5:
position_percent = min(
base_position_percent * 1.5,
if abs(change_percent) > 5:
position_percent = min(
base_position_percent * 1.5,
max_position_percent
)
logger.info(f" 涨跌幅 {change_percent:.2f}% > 5%,使用增强仓位比例: {position_percent*100:.1f}%")
else:
position_percent = base_position_percent
logger.info(f" 涨跌幅 {change_percent:.2f}%,使用标准仓位比例: {position_percent*100:.1f}%")
)
logger.info(f" 涨跌幅 {change_percent:.2f}% > 5%,使用增强仓位比例: {position_percent*100:.1f}%")
else:
position_percent = base_position_percent
logger.info(f" 涨跌幅 {change_percent:.2f}%,使用标准仓位比例: {position_percent*100:.1f}%")
# 计算保证金与名义价值
margin_value = available_balance * position_percent
notional_value = margin_value * actual_leverage
logger.info(f" 计算保证金: {margin_value:.4f} USDT ({position_percent*100:.1f}% of {available_balance:.2f})")
logger.info(f" 计算名义价值: {notional_value:.2f} USDT (保证金 {margin_value:.4f} × 杠杆 {actual_leverage}x)")
# 计算数量
quantity = notional_value / current_price
logger.info(f" 计算数量: {quantity:.4f}")
# 计算名义价值和保证金(如果还未计算)