ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

伦敦欧洲亚洲区间交易ea

伦敦欧洲亚洲区间交易ea 三合一单文件EA不再依赖mqh头文件全部代码写在一个mq5里功能亚盘箱体 / 欧盘箱体 / 伦敦ORB 三个策略集成到同一个EA输入面板可勾选启用哪几个策略Magic各自独立互不干扰。统一规则不变采集时段收集高低点20:30后才允许开仓北京时间0点自动平掉本EA所有策略持仓不留隔夜趋势过滤H4 SMA50 与 H1 SMA50方向必须一致震荡不交易突破确认M15收盘突破箱体 M5收盘站稳突破Pivot过滤开关靠近R1不做多靠近S1不做空自带最小止损距离校验防止130报错三个策略独立状态可单独开启/关闭mq5//±-----------------------------------------------------------------//| MultiSessionBreakout.mq5 |//| 三合一EA亚盘箱体 欧盘箱体 伦敦ORB突破单文件无外部头文件 |//±-----------------------------------------------------------------#property copyright “Copyright 2026”#property link “”#property version “1.00”#property strict//【策略开关 输入参数面板】input bool EnableAsia true; //启用亚盘箱体策略(07:00-20:00采集)input bool EnableEur true; //启用欧盘箱体策略(16:00-20:30采集)input bool EnableLondonORB true; //启用伦敦ORB策略(15:00-16:00采集)input double LotSize 0.1; //统一交易手数input int RR_Ratio 15; //盈亏比 x0.1 例151.5倍input int StopBuffer 3; //止损缓冲点数input int MA_Period_H1 50; //H1均线周期input int MA_Period_H4 50; //H4均线周期input bool UsePivotFilter true; //启用Pivot阻力支撑过滤input double PivotOffsetPct 0.001; //Pivot距离阈值(相对价格)//三个策略独立Magicinput ulong MagicAsia 123456;input ulong MagicEur 123457;input ulong MagicLondon 123458;//【全局结构体】struct PIVOT_DATA{double P;double R1;double R2;double S1;double S2;};struct SessionData{double high;double low;bool locked;int lastDay;};//三个策略独立数据SessionData asiaData;SessionData eurData;SessionData londonData;PIVOT_DATA pivotData;//【时间工具服务器时间转北京时间】datetime GetBeijingTime(){return TimeCurrent() 3600 * (8 - _ServerTimeZone);}int BJ_Hour(){MqlDateTime dt;TimeToStruct(GetBeijingTime(),dt);return dt.hour;}int BJ_Minute(){MqlDateTime dt;TimeToStruct(GetBeijingTime(),dt);return dt.min;}int BJ_Day(){MqlDateTime dt;TimeToStruct(GetBeijingTime(),dt);return dt.day;}//【计算日线Pivot】void CalcDailyPivot(PIVOT_DATA pd){double H iHigh(_Symbol,PERIOD_D1,1);double L iLow(_Symbol,PERIOD_D1,1);double C iClose(_Symbol,PERIOD_D1,1);pd.P (HLC)/3.0;pd.R1 2pd.P - L;pd.R2 pd.P (H-L);pd.S1 2pd.P - H;pd.S2 pd.P - (H-L);}//【获取趋势1多头-1空头0震荡】int GetTrend(ENUM_TIMEFRAMES tf,int maPeriod){double maVal iMA(_Symbol,tf,maPeriod,0,MODE_SMA,PRICE_CLOSE,1);double closeVal iClose(_Symbol,tf,1);if(closeVal maVal) return 1;if(closeVal maVal) return -1;return 0;}//【判断是否在开仓窗口20:30 ~ 24:00】bool IsTradeWindow(){int hBJ_Hour();int mBJ_Minute();if(h20) return false;if(h20 m30) return false;if(h24) return false;return true;}//【按Magic强制平仓该策略所有持仓】void ForceCloseByMagic(ulong magic){for(int iPositionsTotal()-1; i0; i–){if(!PositionSelectByIndex(i)) continue;if(PositionGetString(POSITION_SYMBOL)!_Symbol) continue;if(PositionGetInteger(POSITION_MAGIC)!magic) continue;ulong ticket PositionGetTicket(); ENUM_POSITION_TYPE posType (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); double vol PositionGetDouble(POSITION_VOLUME); MqlTradeRequest req{0}; MqlTradeResult res{0}; req.action TRADE_ACTION_DEAL; req.symbol _Symbol; req.volume vol; req.position ticket; req.deviation30; req.type_fillingORDER_FILLING_FOK; req.type (posTypePOSITION_TYPE_BUY) ? ORDER_TYPE_SELL : ORDER_TYPE_BUY; if(!OrderSend(req,res)) Print(平仓失败 magic,magic, retcode,res.retcode); else Print(平仓成功 magic,magic);}}//【检查该Magic是否已有同方向持仓】bool HasPosition(bool isBuy,ulong magic){for(int i0; iPositionsTotal(); i){if(!PositionSelectByIndex(i)) continue;if(PositionGetString(POSITION_SYMBOL)!_Symbol) continue;if(PositionGetInteger(POSITION_MAGIC)!magic) continue;ENUM_POSITION_TYPE t (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);if(isBuy tPOSITION_TYPE_BUY) return true;if(!isBuy tPOSITION_TYPE_SELL) return true;}return false;}//【开仓函数带最小止损距离校验】bool OpenPosition(bool isBuy,double sl,double tp,double lot,ulong magic){MqlTradeRequest req{0};MqlTradeResult res{0};double point SymbolInfoDouble(_Symbol,SYMBOL_POINT);int minStop (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);req.action TRADE_ACTION_DEAL;req.symbol _Symbol;req.volume lot;req.magic magic;req.type isBuy ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;req.price isBuy ? SymbolInfoDouble(_Symbol,SYMBOL_ASK) : SymbolInfoDouble(_Symbol,SYMBOL_BID);req.sl sl;req.tp tp;req.deviation30;req.type_fillingORDER_FILLING_FOK;//最小止损距离校验if(isBuy){if((req.price - sl)/point minStop){Print(“做多止损距离不足”);return false;}}else{if((sl - req.price)/point minStop){Print(“做空止损距离不足”);return false;}}if(!OrderSend(req,res)){Print(“开仓失败错误码:”,res.retcode);return false;}return true;}//【更新 亚盘箱体数据 07:00~20:00】void UpdateAsia(SessionData sd){int h BJ_Hour();int d BJ_Day();if(h7 d ! sd.lastDay){sd.high iHigh(_Symbol,PERIOD_M15,1);sd.low iLow(_Symbol,PERIOD_M15,1);sd.locked false;sd.lastDay d;CalcDailyPivot(pivotData);Print(“亚盘箱体重置”);}if(h 20){sd.locked true;return;}if(h7 h20){sd.high fmax(sd.high,iHigh(_Symbol,PERIOD_M15,1));sd.low fmin(sd.low,iLow(_Symbol,PERIOD_M15,1));sd.locked false;}}//【更新 欧盘箱体数据 16:00~20:30】void UpdateEur(SessionData sd){int h BJ_Hour();int m BJ_Minute();int d BJ_Day();if(h16 d ! sd.lastDay){sd.high iHigh(_Symbol,PERIOD_M15,1);sd.low iLow(_Symbol,PERIOD_M15,1);sd.locked false;sd.lastDay d;CalcDailyPivot(pivotData);Print(“欧盘箱体重置”);}if(h20 || (h20 m30)){sd.locked true;return;}if( (h16 h20) || (h20 m30) ){sd.high fmax(sd.high,iHigh(_Symbol,PERIOD_M15,1));sd.low fmin(sd.low,iLow(_Symbol,PERIOD_M15,1));sd.locked false;}}//【更新 伦敦ORB箱体数据 15:00~16:00】void UpdateLondon(SessionData sd){int h BJ_Hour();int d BJ_Day();if(h15 d ! sd.lastDay){sd.high iHigh(_Symbol,PERIOD_M15,1);sd.low iLow(_Symbol,PERIOD_M15,1);sd.locked false;sd.lastDay d;CalcDailyPivot(pivotData);Print(“伦敦ORB箱体重置”);}if(h 16){sd.locked true;return;}if(h15 h16){sd.high fmax(sd.high,iHigh(_Symbol,PERIOD_M15,1));sd.low fmin(sd.low,iLow(_Symbol,PERIOD_M15,1));sd.locked false;}}//【策略执行函数复用给三个市场】void RunStrategy(SessionData sd, ulong magic, string name){if(!sd.locked) return;if(!IsTradeWindow()) return;int tH4 GetTrend(PERIOD_H4,MA_Period_H4);int tH1 GetTrend(PERIOD_H1,MA_Period_H1);if(tH4 ! tH1 || tH4 0) return;double m15Close iClose(_Symbol,PERIOD_M15,1);double m5Close iClose(_Symbol,PERIOD_M5,1);double ask SymbolInfoDouble(_Symbol,SYMBOL_ASK);double bid SymbolInfoDouble(_Symbol,SYMBOL_BID);double point SymbolInfoDouble(_Symbol,SYMBOL_POINT);double range sd.high - sd.low;if(range point) return;//做多信号if(tH4 1 !HasPosition(true,magic)){if(m15Close sd.high m5Close sd.high){bool oktrue;if(UsePivotFilter){double ratio (pivotData.R1 - ask)/ask;if(ratio PivotOffsetPct){Print(name,“做多过滤靠近R1阻力”);okfalse;}}if(ok){double sl sd.high - StopBuffer * point;double tp sd.high range * RR_Ratio * 0.1;OpenPosition(true,sl,tp,LotSize,magic);}}}//做空信号if(tH4 -1 !HasPosition(false,magic)){if(m15Close sd.low m5Close sd.low){bool oktrue;if(UsePivotFilter){double ratio (bid - pivotData.S1)/bid;if(ratio PivotOffsetPct){Print(name,“做空过滤靠近S1支撑”);okfalse;}}if(ok){double sl sd.low StopBuffer * point;double tp sd.low - range * RR_Ratio * 0.1;OpenPosition(false,sl,tp,LotSize,magic);}}}}//【EA入口 OnTick】void OnTick(){int hour BJ_Hour();//北京时间0点平掉所有启用策略的持仓if(hour 0){if(EnableAsia) ForceCloseByMagic(MagicAsia);if(EnableEur) ForceCloseByMagic(MagicEur);if(EnableLondonORB) ForceCloseByMagic(MagicLondon);return;}//更新箱体if(EnableAsia) UpdateAsia(asiaData);if(EnableEur) UpdateEur(eurData);if(EnableLondonORB) UpdateLondon(londonData);//执行策略if(EnableAsia) RunStrategy(asiaData,MagicAsia,“【亚盘】”);if(EnableEur) RunStrategy(eurData,MagicEur,“【欧盘】”);if(EnableLondonORB) RunStrategy(londonData,MagicLondon,“【伦敦ORB】”);}//±----------------------------------------------------------------- 详细使用说明一、安装方法打开MetaEditorMT5按F4新建专家顾问命名 MultiSessionBreakout.mq5把上面全部代码完整粘贴进去编译F7确认0错误回到MT5导航器找到EA拖到任意品种图表上黄金/外汇都可以✅ 单文件不需要任何mqh头文件三个策略全部打包在一个EA内。二、输入参数说明参数 说明EnableAsia 开启亚盘箱体策略北京时间07:00~20:00采集高低点EnableEur 开启欧盘箱体策略北京时间16:00~20:30采集高低点EnableLondonORB 开启伦敦ORB北京时间15:00~16:00一小时箱体LotSize 所有策略统一开仓手数RR_Ratio 盈亏比 15 代表1.5倍目标利润箱体高度 × RR×0.1StopBuffer 止损向箱体内部回撤多少点防止毛刺扫损MA_Period_H1 / MA_Period_H4 双周期SMA均线周期默认50UsePivotFilter Pivot过滤开关价格靠近R1不做多靠近S1不做空PivotOffsetPct 距离阈值0.001代表0.1%小于这个距离就过滤信号MagicAsia / MagicEur / MagicLondon 三个策略独立魔术码不可重复防止互相平仓三、交易逻辑详解箱体采集阶段亚盘北京时间7点开始采集M15已收盘K线高低点20点锁定箱体伦敦ORB北京时间15点开始采集16点锁定经典ORB一小时开盘区间欧盘北京时间16点采集20:30锁定箱体采集时段只记录高低不会开仓。开仓时间窗口只有北京时间 20:30 ~ 24:00 才允许开仓其余时间只更新箱体不触发交易。趋势过滤核心H4 SMA 和 H1 SMA 的方向必须同时多头 或 同时空头只要任意一根K线在均线之上/之下不一致或者价格刚好在均线上震荡直接放弃当日所有信号突破确认防假突破无未来函数全部使用 shift1 已经收盘完成的K线不会出现K线没走完信号闪烁、消失重绘。做多M15收盘 箱体上沿 并且 M5收盘 箱体上沿做空M15收盘 箱体下沿 并且 M5收盘 箱体下沿Pivot过滤可选开关Pivot由前一日日线高低收盘价计算做多如果当前Ask距离R1阻力很近小于PivotOffsetPct放弃做多避免直接撞阻力做空如果当前Bid距离S1支撑很近放弃做空止损止盈计算做多SL 箱体上沿 - StopBuffer × Point做多TP 箱体上沿 箱体高度 × RR_Ratio ×0.1做空SL 箱体下沿 StopBuffer × Point做空TP 箱体下沿 - 箱体高度 × RR_Ratio ×0.1风控规则每个Magic同一方向只允许1张持仓不会重复加仓北京时间0点强制平仓所有策略不留隔夜单开仓前校验平台最小止损距离不足直接跳过开仓避免报错130四、使用建议推荐品种XAUUSD、EURUSD、GBPUSD等流动性好的品种图表周期随便EA内部会自动读取M5/M15/H1/H4/D1数据不依赖图表周期回测MT5策略测试器直接回测勾选对应策略即可单独回测亚盘/欧盘/伦敦ORB实盘先跑模拟盘观察日志确认时区、箱体采集、平仓逻辑正常再上实盘五、日志查看MT5底部「专家」标签会打印箱体重置信息信号被Pivot过滤提示开仓成功/失败原因平仓记录
返回列表