feat: 适应度门槛95+swing_point策略+多项改进

- 新增适应度门槛: min_backtest_fitness=95, 适应度<95暂停开仓
- 新增 SwingPointRetest 策略替代 Turtle
- 新增 monday_reset.py 周重置脚本
- exit_rules: 拖尾止损相对回撤模式
- market_state: 趋势检测优化
- position: 一票制并发锁+合约规格缓存
- optimize: Optuna 替代 DEAP 遗传算法
- realtime_trader: 适应度门槛+同向递增
- weights: 动态权重管理
- cron_optimize: PYTHONPATH 修复
- .gitignore: 排除生成文件
This commit is contained in:
silencesdg
2026-05-21 20:26:55 +08:00
parent 218efef538
commit e1691c3c41
14 changed files with 699 additions and 449 deletions
+114 -94
View File
@@ -1,4 +1,10 @@
# MT5 代理服务配置
import importlib as _importlib, sys as _sys
def reload():
"""★ 热重载配置 — 运行时调用,无需重启 EA"""
_importlib.reload(_sys.modules[__name__])
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5555
@@ -29,7 +35,7 @@ USE_DATE_RANGE = False # 设置为False可强制使用数据量模式
# 兼容性配置 (如果日期配置不可用,则使用数据量)
BACKTEST_COUNT = 30000 # 回测数据量
OPTIMIZER_COUNT = 50000 # 优化器数据量
OPTIMIZER_COUNT = 6000 # 优化器数据量(约4天M1,更快响应行情)
RISK_CONFIG_CONST = {
'enable_time_based_exit': False # 关闭超时平仓,让止盈/止损/跟踪止损接管
@@ -62,8 +68,8 @@ BACKTEST_CONFIG = {
REALTIME_CONFIG = {
"update_interval": 5, # 更新间隔(秒)
"daily_reset_time": "00:00", # 每日重置时间
"max_long_positions": 1, # 同方向只持一单,避免重复开仓
"max_short_positions": 1, # 同方向只持一
"max_long_positions": 10, # 同方向最多10单
"max_short_positions": 10, # 同方向最多10
"min_trade_interval": 0, # 最小交易间隔(分钟),0表示无限制
"enable_auto_trading": True, # 是否启用自动交易
"dry_run": False, # 是否为模拟运行(不实际下单)
@@ -104,8 +110,8 @@ DATA_CONFIG = {
# 遗传算法优化器配置
GENETIC_OPTIMIZER_CONFIG = {
# 算法参数
"population_size": 50, # 种群大小
"generations": 10, # 进化代数
"population_size": 20, # 种群大小(精简化,6000bar快速收敛)
"generations": 6, # 进化代数
"crossover_probability": 0.7, # 交叉概率
"mutation_probability": 0.3, # 变异概率
@@ -135,57 +141,68 @@ GENETIC_OPTIMIZER_CONFIG = {
# 信号阈值配置(优化器结果 2026-05-10,5万根M1数据)
SIGNAL_THRESHOLDS = {
"buy_threshold": 1.0315663601353515,
"sell_threshold": -2.312867704316165
"buy_threshold": 2.087211936631902,
"sell_threshold": -0.6594468309213586
}
# 风险管理参数(优化器结果 2026-05-105万根M1数据
# 风险管理参数(手动设定,优化器不宜优化 — 保证金% 基础值,杠杆自适应缩放
RISK_CONFIG = {
# ★ 以下百分比均为保证金%开仓成本%),非金价涨跌%
# 杠杆统一 2000x0.01手保证金≈$2.33
# -50%保证金 = -$1.17 ≈ 1.2点(很紧,但2000x下正常
"risk_leverage": 0, # 0=自动读MT5杠杆(2000x)
"stop_loss_pct": -0.50, # -50% 保证金
"profit_retracement_pct": 0.35, # 35% 保证金(拖尾回撤容忍
"min_profit_for_trailing": 0.70, # +70% 保证金后激活拖尾
"take_profit_pct": 1.00, # +100% 保证金
# ★ 以下百分比均为保证金%100x基准),实盘按 (MT5杠杆/100) 缩放
# 2000x下:-0.70 → -14×杠杆 → -1400%保证金 = -$32 ≈ 32点
"risk_leverage": 100, # 100x基准计算保证金%(不改实际杠杆
"stop_loss_pct": -0.10, # -10% 保证金 ←手动设定,不进优化器
"profit_retracement_pct": 0.03, # ★ 3% 回撤容忍(相对!3%×峰值利润) ←手动设定
"retracement_mode": "relative", # ★ 回撤模式从绝对值改为相对(利润的3%
"min_profit_for_trailing": 0.10, # +10% 后激活拖尾 ←手动设定
"take_profit_pct": 0.15, # +15% 止盈 ←手动设定
"max_daily_loss": -0.3,
"max_holding_minutes": 133,
"min_profit_for_time_exit": 0.010,
"max_holding_minutes": 0, # 0=不启用时间平仓
"min_profit_for_time_exit": 0.05,
"cooldown_bars": 30,
# ★ 同向加仓门槛递增:第N单需要的信号 = 基础阈值 × α^(N-1)
"entry_escalation_alpha": 1.2, # 递增系数(1.2=每单信号强20%)
# ★ 波动率自适应拖尾:激活点数 = 基础点数 × (当前ATR / 长周期ATR)
"vol_adaptive_trailing": True, # 启动波动率自适应拖尾
"trailing_atr_period": 14, # ATR短周期
"trailing_atr_baseline": 100, # ATR长周期(基准)
# ★ 硬止损倍率:MT5 服务器端 SL/TP = 软止损 × 倍率(兜底,仅 EA 挂掉时触发)
"hard_sl_multiplier": 1.5, # 硬 SL = 软 SL × 1.5-1.5%→-2.25%账户)
"hard_tp_multiplier": 1.3, # 硬 TP = 软 TP × 1.3+3.0%→+3.9%账户)
"hard_sl_multiplier": 1.5, # 硬 SL = 软 SL × 1.5
"hard_tp_multiplier": 1.3, # 硬 TP = 软 TP × 1.3
# ★ 回测适应度门槛:低于此值不开新单(适应度≈回测总盈亏$)
"min_backtest_fitness": 95, # 适应度<95 → 不开仓(低于95说明市场难做)
}
# ★ 最近优化适应度(daily_optimize.py 写入,EA 热加载读取)
LAST_OPTIMIZATION_FITNESS = 58.63
# 市场状态分析参数
MARKET_STATE_CONFIG = {
"trend_period": 83,
"retracement_tolerance": 0.15567164907853615,
"volume_period": 29,
"volume_ma_period": 23
"trend_period": 60,
"retracement_tolerance": 0.3857733104065197,
"volume_period": 42,
"volume_ma_period": 30
}
# 策略参数配置(优化器结果 2026-05-10,5万根M1数据)
STRATEGY_CONFIG = {
"ma_cross": {
"short_window": 13,
"long_window": 17
"short_window": 7,
"long_window": 18
},
"rsi": {
"period": 30,
"overbought": 68,
"oversold": 32
"period": 19,
"overbought": 75,
"oversold": 31
},
"bollinger": {
"period": 20,
"std_dev": 2.4663422649047333
"std_dev": 2.2757986281351896
},
"macd": {
"fast_ema": 14,
"slow_ema": 24,
"signal_period": 9
"fast_ema": 19,
"slow_ema": 23,
"signal_period": 13
},
"mean_reversion": {
"period": 29,
@@ -193,105 +210,108 @@ STRATEGY_CONFIG = {
},
"momentum_breakout": {
"period": 15,
"momentum_period": 13
"momentum_period": 19
},
"kdj": {
"period": 21
},
"turtle": {
"period": 42
"swing_point": {
"left_bars": 4,
"right_bars": 3,
"tolerance_pct": 0.0006056955205083707,
"num_swings": 2
},
"daily_breakout": {
"bars_count": 2008
"bars_count": 1392
},
"wave_theory": {
"ema_short": 3,
"ema_short": 8,
"ema_medium": 11,
"ema_long": 46,
"wave_period": 11,
"range_period": 35,
"adx_period": 20,
"ema_long": 39,
"wave_period": 19,
"range_period": 15,
"adx_period": 24,
"momentum_period": 10,
"range_threshold": 0.01,
"adx_threshold": 21
"range_threshold": 0.0023249568571626195,
"adx_threshold": 28
}
}
# 市场趋势判断权重配置
TREND_INDICATOR_WEIGHTS = {
"price_breakout": 0.1504199442999585,
"volume_confirmation": 0.12782205952949638,
"price_breakout": 0.2506453627492913,
"volume_confirmation": 0.2851951176719032,
"momentum oscillator": 0.3677,
"moving_average": 0.4092273363154768
"moving_average": 0.353451489159348
}
# 趋势判断阈值
TREND_THRESHOLDS = {
"strong_trend": 0.7940886082643032,
"weak_trend": 0.4565953163045441,
"volume_spike": 2.7329673335105396,
"oversold": 32,
"overbought": 68
"strong_trend": 0.4040165929726079,
"weak_trend": 0.2963326526031991,
"volume_spike": 1.5234871986051206,
"oversold": 31,
"overbought": 75
}
# 动态权重配置(优化器结果 2026-05-10,5万根M1数据)
DEFAULT_WEIGHTS = {
"ma_cross": 0.32048324544087786,
"rsi": 1.906009222972592,
"bollinger": 0.9232444456662969,
"mean_reversion": 1.1649306516234597,
"momentum_breakout": 0.8769099086178171,
"macd": 0.748930985323352,
"kdj": 1.4647470623067596,
"turtle": 1.637931136008917,
"daily_breakout": 1.478598649389487,
"wave_theory": 0.818283180489803
"ma_cross": 0.4771175228437661,
"rsi": 0.478479356771334,
"bollinger": 1.3391582231825303,
"mean_reversion": 1.9958459833789346,
"momentum_breakout": 0.7567594572894596,
"macd": 1.170771336653618,
"kdj": 0.013296663814979182,
"swing_point": 0.5194535227966377,
"daily_breakout": 0.6506588091889913,
"wave_theory": 1.6765424080384428
}
# 市场状态策略权重配置
MARKET_STATE_WEIGHTS = {
"uptrend": {
"ma_cross": 0.32048324544087786,
"momentum_breakout": 0.8769099086178171,
"turtle": 1.637931136008917,
"macd": 0.748930985323352,
"daily_breakout": 1.478598649389487,
"rsi": 1.906009222972592,
"bollinger": 0.9232444456662969,
"kdj": 1.4647470623067596,
"mean_reversion": 1.1649306516234597,
"wave_theory": 0.818283180489803
"ma_cross": 0.4771175228437661,
"momentum_breakout": 0.7567594572894596,
"swing_point": 0.5194535227966377,
"macd": 1.170771336653618,
"daily_breakout": 0.6506588091889913,
"rsi": 0.478479356771334,
"bollinger": 1.3391582231825303,
"kdj": 0.013296663814979182,
"mean_reversion": 1.9958459833789346,
"wave_theory": 1.6765424080384428
},
"downtrend": {
"ma_cross": 0.32048324544087786,
"momentum_breakout": 0.8769099086178171,
"turtle": 1.637931136008917,
"macd": 0.748930985323352,
"daily_breakout": 1.478598649389487,
"rsi": 1.906009222972592,
"bollinger": 0.9232444456662969,
"kdj": 1.4647470623067596,
"mean_reversion": 1.1649306516234597,
"wave_theory": 0.818283180489803
"ma_cross": 0.4771175228437661,
"momentum_breakout": 0.7567594572894596,
"swing_point": 0.5194535227966377,
"macd": 1.170771336653618,
"daily_breakout": 0.6506588091889913,
"rsi": 0.478479356771334,
"bollinger": 1.3391582231825303,
"kdj": 0.013296663814979182,
"mean_reversion": 1.9958459833789346,
"wave_theory": 1.6765424080384428
},
"ranging": {
"rsi": 1.906009222972592,
"bollinger": 0.9232444456662969,
"mean_reversion": 1.1649306516234597,
"kdj": 1.4647470623067596,
"wave_theory": 0.818283180489803,
"ma_cross": 0.32048324544087786,
"macd": 0.748930985323352,
"turtle": 1.637931136008917,
"momentum_breakout": 0.8769099086178171,
"daily_breakout": 1.478598649389487
"rsi": 0.478479356771334,
"bollinger": 1.3391582231825303,
"mean_reversion": 1.9958459833789346,
"kdj": 0.013296663814979182,
"wave_theory": 1.6765424080384428,
"ma_cross": 0.4771175228437661,
"macd": 1.170771336653618,
"swing_point": 0.5194535227966377,
"momentum_breakout": 0.7567594572894596,
"daily_breakout": 0.6506588091889913
},
"none": DEFAULT_WEIGHTS
}
# 市场趋势置信度阈值配置
CONFIDENCE_THRESHOLDS = {
"high_confidence": 0.6813641209473742,
"medium_confidence": 0.6336441706563001
"high_confidence": 0.5050416445534804,
"medium_confidence": 0.6102467437388168
}