多策略并行 · 自适应动量捕捉 · 三重信号共振过滤
专为高波动市场设计的量化交易解决方案
基于布林带收缩后的波动率爆发捕捉,结合成交量确认的M1周期突破策略。
基于RSI极值偏离与VWAP锚定的M5均值回归策略,在超买超卖区域进行逆向交易。
基于多时间框架EMA排列与OBV背离检测的趋势跟踪策略。
做多入场条件(同时满足):
做空入场条件(同时满足):
出场规则:
做多入场条件(同时满足):
做空入场条件(同时满足):
出场规则:
做多入场条件(同时满足):
做空入场条件(同时满足):
出场规则:
| 风控层级 | 规则 | 参数 | 触发动作 | 优先级 |
|---|---|---|---|---|
| L1 单笔风控 | 单笔最大亏损占账户净值比例 | ≤ 2% | 强制止损平仓 | 最高 |
| L1 单笔风控 | 单笔最大持仓时间 | 策略A:15M1 / B:25M5 / C:50M1 | 时间止损强平 | 最高 |
| L2 策略风控 | 单策略同时最大持仓数 | ≤ 3 笔 | 禁止新开仓 | 最高 |
| L2 策略风控 | 单策略连续亏损次数上限 | 5 次 | 暂停该策略30分钟 | 高 |
| L3 组合风控 | 全策略总持仓保证金占比 | ≤ 净值的60% | 禁止所有新开仓 | 高 |
| L3 组合风控 | 同方向总仓位上限 | ≤ 总仓位的70% | 反向单优先入场 | 高 |
| L4 日度风控 | 当日最大回撤 | ≤ 净值的10% | 当日全部停止交易 | 最高 |
| L4 日度风控 | 当日最大交易次数 | ≤ 80 次 | 当日停止交易 | 中 |
| L5 系统熔断 | 周度最大回撤 | ≤ 净值的25% | 系统熔断48小时 | 最高 |
| L5 系统熔断 | 价差(Spread)异常检测 | > 正常值的3倍 | 暂停交易至价差恢复 | 高 |
| L5 系统熔断 | 滑点异常检测 | 连续3笔滑点>5点 | 暂停交易15分钟 | 高 |
Lots = (Equity × RiskPct) / (SL_Points × TickValue × TickSize)
盈利加仓、亏损减仓,与传统马丁格尔相反。
//+------------------------------------------------------------------+ //| TripleMomentum_EA.mq4 | //| 三倍动量高频交易系统 - MT4版 | //| 策略:闪电突破 + 弹性回归 + 量价共振 | //+------------------------------------------------------------------+ #property copyright "TripleMomentum Quant Lab" #property version "3.00" #property strict //=== 全局参数 === extern string Sep1 = "===== 通用参数 ====="; extern double RiskPercent = 2.0; // 单笔风险% extern int MaxDailyTrades = 80; // 日最大交易次数 extern double MaxDailyDD = 10.0; // 日最大回撤% extern double MaxWeeklyDD = 25.0; // 周最大回撤% extern int MaxSameDir = 70; // 同向仓位上限% extern int MaxSpreadPts = 30; // 最大允许点差 extern int MagicBase = 300000; // Magic基数 extern string Sep2 = "===== 策略A 闪电突破 ====="; extern bool EnableStratA = true; extern int A_BBPeriod = 20; extern double A_BBDeviation = 2.0; extern int A_ATRPeriod = 14; extern double A_VolMulti = 1.5; extern double A_SL_ATR = 1.5; // 止损ATR倍数 extern double A_TP_ATR = 3.0; // 止盈ATR倍数 extern double A_TrailATR = 1.0; // 追踪止损ATR倍数 extern int A_MaxBars = 15; // 最大持仓K线数 extern int A_MaxPositions = 3; extern string Sep3 = "===== 策略B 弹性回归 ====="; extern bool EnableStratB = true; extern int B_RSIPeriod = 7; extern double B_RSILow = 15.0; extern double B_RSIHigh = 85.0; extern int B_StochK = 5; extern int B_StochD = 3; extern int B_StochSlow = 3; extern double B_SL_ATR = 2.0; extern int B_MaxBars = 25; extern int B_MaxPositions = 3; extern string Sep4 = "===== 策略C 量价共振 ====="; extern bool EnableStratC = true; extern int C_EMAFast = 5; extern int C_EMAMid = 13; extern int C_EMASlow = 34; extern int C_MACDFast = 6; extern int C_MACDSlow = 13; extern int C_MACDSignal = 4; extern double C_SL_ATR = 0.5; extern int C_MaxBars = 50; extern int C_MaxPositions = 3; //=== 全局变量 === int g_todayTrades = 0; double g_dayStartEquity = 0; double g_weekStartEquity = 0; int g_consecutiveWins = 0; int g_consecutiveLoss = 0; int g_lastTradeDay = 0; bool g_dayHalted = false; bool g_weekHalted = false; //+------------------------------------------------------------------+ //| 初始化 | //+------------------------------------------------------------------+ int OnInit() { g_dayStartEquity = AccountEquity(); g_weekStartEquity = AccountEquity(); g_lastTradeDay = DayOfYear(); Print("[TripleMomentum] 系统初始化完成 | 净值: ", AccountEquity()); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 每Tick核心逻辑 | //+------------------------------------------------------------------+ void OnTick() { // 日期重置 if(DayOfYear() != g_lastTradeDay) { g_todayTrades = 0; g_dayStartEquity = AccountEquity(); g_dayHalted = false; g_lastTradeDay = DayOfYear(); if(DayOfWeek() == 1) { g_weekStartEquity = AccountEquity(); g_weekHalted = false; } } // 系统级风控检查 if(g_dayHalted || g_weekHalted) return; if(!CheckRiskLimits()) return; if(MarketInfo(Symbol(), MODE_SPREAD) > MaxSpreadPts) return; // 管理已有持仓(追踪止损 + 时间止损) ManageOpenPositions(); // 只在新K线开始时检测信号 static datetime lastBar = 0; if(Time[0] == lastBar) return; lastBar = Time[0]; // 三策略并行扫描 if(EnableStratA) CheckStrategyA(); if(EnableStratB) CheckStrategyB(); if(EnableStratC) CheckStrategyC(); } //+------------------------------------------------------------------+ //| 风控检查 | //+------------------------------------------------------------------+ bool CheckRiskLimits() { // 日度回撤检查 double dayDD = (g_dayStartEquity - AccountEquity()) / g_dayStartEquity * 100; if(dayDD >= MaxDailyDD) { g_dayHalted = true; Print("[风控] 日回撤达限 ", DoubleToStr(dayDD,2), "% — 当日停止交易"); return false; } // 周度回撤检查 double weekDD = (g_weekStartEquity - AccountEquity()) / g_weekStartEquity * 100; if(weekDD >= MaxWeeklyDD) { g_weekHalted = true; Print("[风控] 周回撤达限 ", DoubleToStr(weekDD,2), "% — 本周停止交易"); return false; } // 日交易次数 if(g_todayTrades >= MaxDailyTrades) return false; return true; } //+------------------------------------------------------------------+ //| 仓位计算(基于风险百分比 + 反马丁格尔) | //+------------------------------------------------------------------+ double CalcLots(double slPoints) { if(slPoints <= 0) return MarketInfo(Symbol(), MODE_MINLOT); double tickVal = MarketInfo(Symbol(), MODE_TICKVALUE); double tickSize = MarketInfo(Symbol(), MODE_TICKSIZE); double equity = AccountEquity(); double riskAmt = equity * RiskPercent / 100.0; // 反马丁格尔系数 double multi = 1.0; if(g_consecutiveWins >= 4) multi = 1.6; else if(g_consecutiveWins >= 2) multi = 1.3; else if(g_consecutiveLoss >= 2) multi = 0.7; multi = MathMin(multi, 2.0); double lots = (riskAmt * multi) / (slPoints / tickSize * tickVal); lots = NormalizeDouble(lots, 2); lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT)); lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT)); //仅展示部分
//+------------------------------------------------------------------+ //| TripleMomentum_EA.mq5 | //| 三倍动量高频交易系统 - MT5版 | //+------------------------------------------------------------------+ #property copyright "TripleMomentum Quant Lab" #property version "3.00" #include <Trade\Trade.mqh> #include <Trade\PositionInfo.mqh> #include <Indicators\Indicators.mqh> //=== 输入参数 === input group "===== 通用参数 =====" input double InpRiskPct = 2.0; // 单笔风险% input int InpMaxDailyTrades = 80; // 日最大交易次数 input double InpMaxDailyDD = 10.0; // 日最大回撤% input double InpMaxWeeklyDD = 25.0; // 周最大回撤% input int InpMaxSpread = 30; // 最大允许点差 input ulong InpMagicBase = 300000; // Magic基数 //仅展示部分