MQL5自动化交易策略(第九部分):构建亚洲盘突破策略的智能交易系统(EA)(基础篇)
◍ 亚洲盘突破 EA 的骨架怎么搭
亚洲盘(东京时段 00:00–07:00 MT5 服务器时间)波动通常收敛,欧盘开盘前后的突破常带来一段趋势。用 MQL5 写 EA,第一步不是上来就下单,而是先把亚洲盘的高低轨抓住。 下面这段代码在 OnInit 里只做一件事:把亚洲盘起始和结束小时写死成输入参数,方便你按券商服务器时间调。注意 Input 变量公开在 EA 属性面板,不写死在逻辑里,实盘才不会改个时区就要重编译。 高风险提示:外汇与贵金属杠杆高,亚洲盘假突破概率不低,任何突破策略都可能连续止损,务必先开 MT5 策略测试器用 2024 年数据跑一遍。
input class="type">int AsiaStartHour = class="num">0; class=class="str">"cmt">// 亚洲盘开始小时(MT5服务器时间) input class="type">int AsiaEndHour = class="num">7; class=class="str">"cmt">// 亚洲盘结束小时 class="type">int OnInit() { class=class="str">"cmt">// 仅初始化参数,具体轨道计算放OnTick class="kw">return(INIT_SUCCEEDED); }
「从蝴蝶谐波切到亚盘突破」
上篇我们用 MQL5 写了一套蝴蝶谐波 EA,靠斐波那契比例抓反转。这一篇换赛道,盯亚洲盘突破:用亚盘高低点框出突破区间,再叠均线做趋势过滤,配上动态风控。 这套打法覆盖四块:策略设计、MQL5 落地、回测优化、结论。做完你手里会有一只全自动 EA,能直接上 MT5 实盘测。外汇和贵金属波动大、杠杆高,跑之前先想清楚自己能扛多少回撤。
亚洲盘区间突破EA的骨架怎么搭
核心思路是把 GMT 23:00–03:00 的亚洲交易时段当成区间发生器:这段时间内取最高价与最低价,框出一块盘整带,后续突破大概率从这条带子边缘走出来。时间窗口不是死参数,你可以按自己盯的经纪商时区改,但样本里用 4 小时窗。 边界挂单走双向:先用 50 周期 MA 做趋势过滤器,均线向上就在区间顶上方一点挂 Buy Stop,向下就在区间底下方一点挂 Sell Stop。这样无论哪边破,EA 都能在突破瞬间接上动量。 风控三件套不能省——止损放在区间边界外侧防假突破;止盈按预设风险回报比推;再加时间退出:持仓到 GMT 13:00 还没平,系统强平所有未结单。把时段识别、趋势过滤、退出机制拼起来,就是一个能抓显著突破的 EA 原型。外汇与贵金属杠杆高,假突破频率不低,实盘前请在 MT5 策略测试器用历史数据跑一遍再上。
◍ MT5里把亚盘区间EA搭起来
打开 MetaEditor,在导航器「指标」目录点新建,生成文件后先写全局声明。引入 <Trade\Trade.mqh> 交易库并建 obj_Trade 对象,maHandle 初始化为 INVALID_HANDLE;输入参数覆盖手数、突破偏移点数、区间框架(ENUM_TIMEFRAMES)、MA 周期/方法/应用价、风险回报比、MagicNumber,以及以小时分钟描述的交易时段与退出时间。 OnInit 里先 obj_Trade.SetExpertMagicNumber(MagicNumber) 打标签,再用 iMA 按用户输入建均线句柄;若 maHandle==INVALID_HANDLE 就 Print 错误并返回 INIT_FAILED,否则 INIT_SUCCEEDED。OnDeinit 检查有效后 IndicatorRelease(maHandle) 释放资源,避免闲置占用。 OnTick 先用 TimeCurrent 取服务器时间,TimeToStruct 拆出时分,与 SessionEndHour/Minute 比对;跨过会话结束就重算区间并重置 boxCalculated、ordersPlaced。ComputeBox 用 Bars+CopyRates 捞 K 线,highVal 从 -DBL_MAX、lowVal 从 DBL_MAX 起扫,记录 BoxHighTime/BoxLowTime,空数据则报错。DrawSessionObjects 按 CHART_SCALE(0–5)算字体 7+scale*1、线宽 MathRound 插值到 scale=5 时宽 3,画 OBJ_RECTANGLE 填 clrThistle 置底,再画蓝顶红底水平线并标右侧价格文本。 挂单前用 TradeExitHour/Minute 组 exitTimeStruct,条件为区间已算、无挂单、未到退出时间。CopyBuffer 取 MA 最新值(ArraySetAsSeries 倒序),与 SymbolInfoDouble 买价比方向:看涨用 obj_Trade.BuyStop、看跌用 SellStop,入场止损止盈由 BreakoutOffsetPips 推算。超时则 CloseOpenPositions 按 MagicNumber 平掉持仓、CancelPendingOrders 删 BUY_STOP/SELL_STOP 挂单,随后复位标志位。外汇与贵金属杠杆高,实盘前务必在 MT5 策略测试器跑历史回测验证。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Copyright class="num">2025, Forex Algo-Trader, Allan. | class=class="str">"cmt">//| "https://t.me/Forex_Algo_Trader" | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Forex Algo-Trader, Allan"
「亚盘突破 EA 的参数骨架」
下面这段声明定义了亚盘突破策略 EA 的核心输入与全局对象。直接复制到 MT5 的 EA 源码头部就能编译,参数含义逐行标在注释里。 #property link "https://t.me/Forex_Algo_Trader" #property version "1.00" #property description "This EA trades based on ASIAN BREAKOUT Strategy" #property strict #include <Trade\Trade.mqh> // 引入 MT5 标准交易库,封装下单/改单接口 CTrade obj_Trade; // 创建全局交易对象,后续挂单、平仓都调它 // 全局移动平均句柄 int maHandle = INVALID_HANDLE; // 初始化为无效句柄,真正取值在 OnInit 里 //==== 输入参数 input double LotSize = 0.1; // 每单手数,默认 0.1,按账户净值自调 input double BreakoutOffsetPips = 10; // 突破挂单偏移 10 点,避免毛刺假突破 input ENUM_TIMEFRAMES BoxTimeframe = PERIOD_M15; // 箱体计算周期,M15 或 M30 input int MA_Period = 50; // 趋势过滤用 50 周期均线 input ENUM_MA_METHOD MA_Method = MODE_SMA; // 均线类型:简单移动平均 input ENUM_APPLIED_PRICE MA_AppliedPrice = PRICE_CLOSE; // 取收盘价算均线 input double RiskToReward = 1.3; // 盈亏比 1:1.3,止盈=止损*1.3 input int MagicNumber = 12345; // 订单魔数,区分本 EA 与其他程序单 // 会话时间(GMT,含分钟) input int SessionStartHour = 23; // 亚盘箱体起点:23:00 GMT input int SessionStartMinute = 00; // 起点分钟 input int SessionEndHour = 03; // 箱体终点:03:00 GMT input int SessionEndMinute = 00; // 终点分钟 input int TradeExitHour = 13; // 最晚 13:00 GMT 强平离场 几个数值得盯紧:默认箱体横跨 23:00–03:00 GMT 共 4 小时,盈亏比锁在 1.3,突破偏移 10 点。外汇与贵金属杠杆高,实盘前务必在策略测试器用 2020–2024 年数据回测验证,参数可能需按品种波动率重调。 把 SessionStartHour 改成你经纪商冬令时对应的本地亚盘时段,再改 LotSize 匹配仓位,就能让小布盯盘替你监控这套挂单逻辑是否按预期触发。
class="macro">#class="kw">property link "https:class=class="str">"cmt">//t.me/Forex_Algo_Trader" class="macro">#class="kw">property version "class="num">1.00" class="macro">#class="kw">property description "This EA trades based on ASIAN BREAKOUT Strategy" class="macro">#class="kw">property strict class="macro">#include <Trade\Trade.mqh> class=class="str">"cmt">//--- Include trade library CTrade obj_Trade; class=class="str">"cmt">//--- Create global trade object class=class="str">"cmt">//--- Global indicator handle for the moving average class="type">int maHandle = INVALID_HANDLE; class=class="str">"cmt">//--- Global MA handle class=class="str">"cmt">//==== Input parameters class=class="str">"cmt">//--- Trade and indicator settings input class="type">class="kw">double LotSize = class="num">0.1; class=class="str">"cmt">//--- Trade lot size input class="type">class="kw">double BreakoutOffsetPips = class="num">10; class=class="str">"cmt">//--- Offset in pips for pending orders input ENUM_TIMEFRAMES BoxTimeframe = PERIOD_M15; class=class="str">"cmt">//--- Timeframe for box calculation(class="num">15 or class="num">30 minutes) input class="type">int MA_Period = class="num">50; class=class="str">"cmt">//--- Moving average period for trend filter input ENUM_MA_METHOD MA_Method = MODE_SMA; class=class="str">"cmt">//--- MA method(Simple Moving Average) input ENUM_APPLIED_PRICE MA_AppliedPrice = PRICE_CLOSE; class=class="str">"cmt">//--- Applied price for MA(Close price) input class="type">class="kw">double RiskToReward = class="num">1.3; class=class="str">"cmt">//--- Reward-to-risk multiplier(class="num">1:class="num">1.3) input class="type">int MagicNumber = class="num">12345; class=class="str">"cmt">//--- Magic number(used for order identification) class=class="str">"cmt">//--- Session timing settings(GMT) with minutes input class="type">int SessionStartHour = class="num">23; class=class="str">"cmt">//--- Session start hour input class="type">int SessionStartMinute = class="num">00; class=class="str">"cmt">//--- Session start minute input class="type">int SessionEndHour = class="num">03; class=class="str">"cmt">//--- Session end hour input class="type">int SessionEndMinute = class="num">00; class=class="str">"cmt">//--- Session end minute input class="type">int TradeExitHour = class="num">13; class=class="str">"cmt">//--- Trade exit hour
把会话框状态锁进全局变量
这段初始化逻辑把「会话框」的核心状态全塞进全局变量,而不是每次 tick 都重算。lastBoxSessionEnd 记上一根框的收盘时间,boxCalculated 和 ordersPlaced 两个布尔量用来避免重复计算与重复挂单,BoxHigh / BoxLow 连同各自的时间戳一并留存,后续突破判断直接读这些变量即可。 OnInit 里先给交易对象绑魔术码,再用 iMA 按传入的周期、方法、价格类型建均线句柄。若返回 INVALID_HANDLE 就打印失败并终止加载,正常则回 INIT_SUCCEEDED。把这段抄进 EA,开 MT5 用零周期(0=当前图表)跑一遍,若日志没报「Failed to create MA handle」说明句柄参数没填错。 外汇与贵金属波动受杠杆放大,这类会话框 EA 在重大数据发布时可能连续触发假突破,实盘前请用历史数据回测验证信号质量。
input class="type">int TradeExitMinute = class="num">00; class=class="str">"cmt">//--- Trade exit minute class=class="str">"cmt">//--- Global variables for storing session box data class="type">class="kw">datetime lastBoxSessionEnd = class="num">0; class=class="str">"cmt">//--- Stores the session end time of the last computed box class="type">bool boxCalculated = false; class=class="str">"cmt">//--- Flag: true if session box has been calculated class="type">bool ordersPlaced = false; class=class="str">"cmt">//--- Flag: true if orders have been placed for the session class="type">class="kw">double BoxHigh = class="num">0.0; class=class="str">"cmt">//--- Highest price during the session class="type">class="kw">double BoxLow = class="num">0.0; class=class="str">"cmt">//--- Lowest price during the session class=class="str">"cmt">//--- Variables to store the exact times when the session&class="macro">#x27;s high and low occurred class="type">class="kw">datetime BoxHighTime = class="num">0; class=class="str">"cmt">//--- Time when the highest price occurred class="type">class="kw">datetime BoxLowTime = class="num">0; class=class="str">"cmt">//--- Time when the lowest price occurred class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Expert initialization function | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">int OnInit(){ class=class="str">"cmt">//--- Set the magic number for all trade operations obj_Trade.SetExpertMagicNumber(MagicNumber); class=class="str">"cmt">//--- Set magic number globally for trades class=class="str">"cmt">//--- Create the Moving Average handle with user-defined parameters maHandle = iMA(_Symbol, class="num">0, MA_Period, class="num">0, MA_Method, MA_AppliedPrice); class=class="str">"cmt">//--- Create MA handle if(maHandle == INVALID_HANDLE){ class=class="str">"cmt">//--- Check if MA handle creation failed Print("Failed to create MA handle."); class=class="str">"cmt">//--- Print error message class="kw">return(INIT_FAILED); class=class="str">"cmt">//--- Terminate initialization if error occurs } class="kw">return(INIT_SUCCEEDED); class=class="str">"cmt">//--- Return successful initialization } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Expert deinitialization function | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnDeinit(const class="type">int reason){