MQL5自动化交易策略(第九部分):构建亚洲盘突破策略的智能交易系统(EA)(基础篇)
📘

MQL5自动化交易策略(第九部分):构建亚洲盘突破策略的智能交易系统(EA)(基础篇)

第 1/3 篇

◍ 亚洲盘突破 EA 的骨架怎么搭

亚洲盘(东京时段 00:00–07:00 MT5 服务器时间)波动通常收敛,欧盘开盘前后的突破常带来一段趋势。用 MQL5 写 EA,第一步不是上来就下单,而是先把亚洲盘的高低轨抓住。 下面这段代码在 OnInit 里只做一件事:把亚洲盘起始和结束小时写死成输入参数,方便你按券商服务器时间调。注意 Input 变量公开在 EA 属性面板,不写死在逻辑里,实盘才不会改个时区就要重编译。 高风险提示:外汇与贵金属杠杆高,亚洲盘假突破概率不低,任何突破策略都可能连续止损,务必先开 MT5 策略测试器用 2024 年数据跑一遍。

MQL5 / C++
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 策略测试器跑历史回测验证。

MQL5 / C++
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 匹配仓位,就能让小布盯盘替你监控这套挂单逻辑是否按预期触发。

MQL5 / C++
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 在重大数据发布时可能连续触发假突破,实盘前请用历史数据回测验证信号质量。

MQL5 / C++
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){

常见问题

常用东京时段(约北京时间凌晨2点到上午10点)的高低点作为突破区间,EA在此时段只记录高低不交易。
倾向把止损放在亚洲盘区间另一侧外侧几个点,突破反向打掉即离场,避免扛单。
小布可读取品种会话框状态并标记亚盘高低区间,突破时推送提醒,你只需打开对应品种页查看。
大概率没做新闻过滤,建议在EA里加时间屏蔽或波动率判断,数据前后暂停交易。
把已完成的会话框状态锁进全局变量,新K线只更新未结束时段,避免每次重算覆盖。