黄金亚盘区间突破 EA
记录亚盘高低点,欧盘开盘后突破区间进场,止盈是止损的 2 倍
效果示意图 · AI 根据源码绘制
//+------------------------------------------------------------------+
//| AsiaBreakoutEA.mq5 |
//| 突破亚盘区间 EA - 适合 XAUUSD M15 |
//+------------------------------------------------------------------+
#property copyright "Kiro"
#property version "1.00"
#property strict
#include <Trade\Trade.mqh>
//--- 输入参数
input group "=== 亚盘区间设置 ==="
input int InpAsiaStartHour = 1; // 亚盘开始小时(服务器时间,推荐1)
input int InpAsiaEndHour = 7; // 亚盘结束小时(服务器时间,推荐7)
input group "=== 交易设置 ==="
input double InpLotSize = 0.01; // 手数(推荐0.01起)
input double InpTPMultiplier = 2.0; // 止盈倍数(推荐2.0,即盈亏比1:2)
input int InpSLBufferPoints = 50; // 止损缓冲点数(区间外额外加的距离,推荐50点)
input int InpMagicNumber = 888123; // 魔术号(用于识别本EA订单)
input int InpMaxTradesPerDay = 2; // 每天最大下单数(推荐2,做多+做空各1次)
input int InpLatestTradeHour = 20; // 允许交易的最晚小时(推荐20,避免隔夜)
//--- 全局变量
CTrade trade; // 交易类
datetime g_currentTradeDay = 0; // 当前交易日期(用于判断是否新的一天)
double g_asiaHigh = 0.0; // 亚盘区间最高价
double g_asiaLow = 0.0; // 亚盘区间最低价
bool g_buyDoneToday = false; // 今天是否已做多
bool g_sellDoneToday = false; // 今天是否已做空
datetime g_lastBarTime = 0; // 最后处理的K线时间(防止同一根K线重复信号)
int g_todayTradeCount = 0; // 今天已下单数
//+------------------------------------------------------------------+
//| 初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
trade.SetExpertMagicNumber(InpMagicNumber);
trade.SetDeviationInPoints(10);
trade.SetTypeFilling(ORDER_FILLING_FOK);
trade.SetAsyncMode(false);
Print("AsiaBreakoutEA 初始化成功 | 亚盘时段: ", InpAsiaStartHour, ":00 - ", InpAsiaEndHour, ":00");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 主逻辑函数 |
//+------------------------------------------------------------------+
void OnTick()
{
//--- 获取当前服务器时间
datetime serverTime = TimeCurrent();
MqlDateTime timeStruct;
TimeToStruct(serverTime, timeStruct);
int currentHour = timeStruct.hour;
datetime currentDay = StringToTime(TimeToString(serverTime, TIME_DATE)); // 只取日期部分
//--- 检查是否新的一天,重置状态
if(currentDay != g_currentTradeDay)
{
g_currentTradeDay = currentDay;
g_asiaHigh = 0.0;
g_asiaLow = 0.0;
g_buyDoneToday = false;
g_sellDoneToday = false;
g_todayTradeCount = 0;
Print("新交易日开始: ", TimeToString(currentDay, TIME_DATE), " | 状态已重置");
}
//--- 在亚盘时间段内更新区间最高最低价
if(currentHour >= InpAsiaStartHour && currentHour < InpAsiaEndHour)
{
double high = iHigh(_Symbol, PERIOD_CURRENT, 0);
double low = iLow(_Symbol, PERIOD_CURRENT, 0);
if(g_asiaHigh == 0.0 || high > g_asiaHigh)
g_asiaHigh = high;
if(g_asiaLow == 0.0 || low < g_asiaLow)
g_asiaLow = low;
return; // 亚盘时段内只记录区间,不交易
}
//--- 亚盘结束后才开始交易逻辑
if(currentHour < InpAsiaEndHour || g_asiaHigh == 0.0 || g_asiaLow == 0.0)
return;
//--- 检查是否超过允许交易的最晚小时
if(currentHour >= InpLatestTradeHour)
return;
//--- 检查今天是否已达到最大下单数
if(g_todayTradeCount >= InpMaxTradesPerDay)
return;
//--- 防止同一根K线重复信号
datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0);
if(currentBarTime == g_lastBarTime)
return;
//--- 获取当前收盘价(使用上一根K线的收盘价,确保K线已完成)
double closePrice = iClose(_Symbol, PERIOD_CURRENT, 1);
if(closePrice == 0.0)
return;
//--- 计算点值(兼容3位和5位小数报价)
double point = _Point;
if(_Digits == 3 || _Digits == 5)
point = _Point;
double bufferPrice = InpSLBufferPoints * point;
//--- 获取经纪商最小止损距离
long stopsLevel = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
double minStopDistance = stopsLevel * point;
//--- 突破上沿做多逻辑
if(!g_buyDoneToday && closePrice > g_asiaHigh)
{
double entryPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double sl = g_asiaLow - bufferPrice;
double slDistance = entryPrice - sl;
// 检查止损距离是否满足最小要求
if(slDistance < minStopDistance && minStopDistance > 0)
{
Print("做多止损距离不足 | 当前:", slDistance / point, "点 | 最小要求:", minStopDistance / point, "点");
return;
}
double tp = entryPrice + (slDistance * InpTPMultiplier);
if(trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, InpLotSize, entryPrice, sl, tp, "AsiaBreakout_BUY"))
{
Print("做多开仓成功 | 入场:", entryPrice, " | 止损:", sl, " | 止盈:", tp);
g_buyDoneToday = true;
g_todayTradeCount++;
g_lastBarTime = currentBarTime;
}
else
{
Print("做多开仓失败 | 错误码:", GetLastError());
}
}
//--- 突破下沿做空逻辑
if(!g_sellDoneToday && closePrice < g_asiaLow)
{
double entryPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double sl = g_asiaHigh + bufferPrice;
double slDistance = sl - entryPrice;
// 检查止损距离是否满足最小要求
if(slDistance < minStopDistance && minStopDistance > 0)
{
Print("做空止损距离不足 | 当前:", slDistance / point, "点 | 最小要求:", minStopDistance / point, "点");
return;
}
double tp = entryPrice - (slDistance * InpTPMultiplier);
if(trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, InpLotSize, entryPrice, sl, tp, "AsiaBreakout_SELL"))
{
Print("做空开仓成功 | 入场:", entryPrice, " | 止损:", sl, " | 止盈:", tp);
g_sellDoneToday = true;
g_todayTradeCount++;
g_lastBarTime = currentBarTime;
}
else
{
Print("做空开仓失败 | 错误码:", GetLastError());
}
}
}
//+------------------------------------------------------------------+作品说明
思路说明
每天服务器时间 1:00-7:00 记录亚盘区间(最高/最低价),7:00 后收盘价突破上沿则做多、突破下沿则做空,每个方向每天只触发一次。止损设在区间对面+缓冲点数,止盈为止损距离的倍数。用当日日期判断是否新的一天并重置状态,用最后K线时间戳防止同一根K线重复信号。下单前检查止损距离是否满足经纪商最小要求,兼容3位和5位小数报价。
使用说明
将 AsiaBreakoutEA.mq5 保存到 MT5 数据文件夹的 MQL5\Experts\ 目录,在 MetaEditor 中编译,然后在图表上拖拽到 XAUUSD M15 图表启用。
- 安装方法
- 参数调节
- 亚盘时段:默认 1:00-7:00(服务器时间),根据你的经纪商时区调整
- 手数:建议从 0.01 起测试,黄金波动大,需谨慎
- 止盈倍数:默认 2.0(盈亏比 1:2),可根据回测调整到 1.5-3.0
- 止损缓冲:默认 50 点,黄金噪音大,太小容易被扫
- 每天最大下单数:默认 2(做多+做空各1次),避免过度交易
- 最晚交易小时:默认 20 点,避免持仓过夜
- 信号识别
- EA 会在专家日志中打印"新交易日开始"和开仓信息
- 可在图表上看到挂单或持仓的止损止盈线
- 订单备注为
AsiaBreakout_BUY或AsiaBreakout_SELL
- 注意事项
- 必须先在模拟账户回测,验证参数和经纪商兼容性
- 黄金点差较大,建议在流动性好的时段交易
- 周一亚盘可能因跳空导致区间失真,建议观察一周后再实盘
- 确保 MT5 允许自动交易(工具栏绿色"自动交易"按钮已启用)
- 经纪商如果要求最小止损距离,EA 会自动检查并拒绝不合规订单
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个 MetaTrader 5 专用的自动交易 EA,针对黄金(XAUUSD)设计。它每天在亚洲交易时段(默认服务器时间 1:00-7:00)记录价格的最高点和最低点,等欧盘开盘后,如果价格向上突破亚盘高点就自动做多,向下突破亚盘低点就自动做空,每个方向每天只触发一次。
逻辑原理
区间记录阶段:在服务器时间 1:00 到 7:00 之间,EA 持续更新当前看到的最高价和最低价,这段时间不会开仓。
突破进场:7:00 之后,EA 开始监控价格。当上一根 K 线的收盘价突破亚盘最高价,就按当前卖价(Ask)做多;如果收盘价跌破亚盘最低价,就按当前买价(Bid)做空。用的是上一根 K 线收盘价,不是当前未完成 K 线的价格,避免信号反复变化。
止损止盈计算:
- 做多时,止损设在亚盘最低价下方,额外减去缓冲点数(默认 50 点)
- 做空时,止损设在亚盘最高价上方,额外加上缓冲点数
- 止盈距离 = 止损距离 × 止盈倍数(默认 2.0),也就是盈亏比 1:2
风控机制:每天最多开 2 单(做多和做空各 1 次),超过晚上 8 点(服务器时间 20:00)就不再交易。开仓前会检查止损距离是否满足经纪商的最小要求,不够就拒绝下单并在日志里提示。每根 K 线只处理一次信号,不会在同一根 K 线上重复开仓。
每日重置:EA 通过日期判断是否进入新的一天,每天零点后会清空亚盘高低价、重置做多做空标记和交易次数,重新开始记录。
参数说明
- InpAsiaStartHour(默认 1):亚盘开始的小时,根据你的经纪商服务器时区调整,比如有的券商用 UTC+2 或 UTC+3
- InpAsiaEndHour(默认 7):亚盘结束的小时,7 点后才会开始判断突破
- InpLotSize(默认 0.01):每次开仓的手数,黄金波动大,建议从 0.01 手起测试
- InpTPMultiplier(默认 2.0):止盈是止损的几倍,2.0 就是盈亏比 1:2,可以调到 1.5-3.0 之间
- InpSLBufferPoints(默认 50):止损在区间边界外再加多少点,黄金噪音多,太小容易被扫,50 点是个保守值
- InpMagicNumber(默认 888123):魔术号,用来识别这个 EA 开的单,和其他 EA 区分开
- InpMaxTradesPerDay(默认 2):每天最多开几单,默认 2 单就是做多做空各一次
- InpLatestTradeHour(默认 20):允许交易的最晚小时,20 点后不再开新仓,避免持仓过夜
怎么用
把 AsiaBreakoutEA.mq5 文件放到 MT5 数据文件夹的 MQL5\Experts\ 目录下,在 MetaEditor 里打开编译通过,然后打开 XAUUSD 的 M15 图表,从导航器窗口把 EA 拖到图表上,允许自动交易(工具栏的"自动交易"按钮要亮绿灯)。
EA 会在专家日志(工具 → 选项 → 专家顾问)里打印"新交易日开始"和每次开仓的详细信息。图表上能看到持仓的止损止盈线,订单备注会显示 AsiaBreakout_BUY 或 AsiaBreakout_SELL。
建议先在模拟账户跑一周,观察亚盘区间和突破信号是否符合预期,再考虑实盘。
适用场景
适合 XAUUSD(黄金现货)的 M15 周期,也可以试试 M5 或 M30,但 M15 是作者建议的。这个策略假设亚盘是窄幅震荡,欧盘开盘后会选择方向突破,所以在趋势行情或波动率上升的日子表现会好一些。
不适合横盘整理的行情,如果全天都在亚盘区间内来回晃,EA 不会开仓;如果假突破后回抽,止损会被打掉。周一开盘如果跳空,亚盘区间可能失真,建议观察一段时间再决定要不要交易周一。
代码里没有限制品种,理论上可以用在其他货币对或商品,但逻辑是针对黄金设计的,其他品种需要自己回测调参。
风险提示
时区依赖:EA 用的是 MT5 服务器时间,不同经纪商的服务器时区不一样(有的是 UTC+2,有的是 UTC+3),你得确认自己券商的 1:00-7:00 对应的是不是真正的亚洲时段,否则记录的区间就错了。
假突破:如果欧盘开盘瞬间假突破又回抽,止损会被触发,这是突破类策略的通病。缓冲点数可以缓解,但也会让止损变宽。
点差和滑点:黄金点差在新闻或低流动性时段会扩大,实际成交价可能和预期有偏差。EA 设了 10 点滑点容差,但极端行情下可能成交失败。
持仓过夜:虽然默认 20 点后不开新仓,但之前开的仓可能会持仓过夜,遇到跳空或隔夜利息会有额外成本。
单方向限制:每天做多做空各只能触发一次,如果行情反转,EA 不会再进场。这是为了控制过度交易,但也意味着可能错过好机会。
经纪商限制:代码会检查止损距离是否满足券商要求,但不同券商的最小止损、订单类型(FOK / IOC)要求不一样,务必先在模拟盘测试。
常见问题
- 这个 EA 会重绘吗?
- 不会。它用的是上一根 K 线的收盘价(iClose 索引 1)判断突破,K 线已经完成了,信号不会变。同时有时间戳检查,同一根 K 线只处理一次。
- 可以用在 XAUUSD 以外的品种吗?
- 代码里没有限制品种,但逻辑是针对黄金亚盘特性设计的。其他品种的时段特征不同,需要自己回测调整参数,不能直接套用。
- MT4 能用吗?
- 不能。这是 MQL5 代码,只能在 MetaTrader 5 上运行。MT4 用的是 MQL4 语言,语法和交易函数都不一样。
- 参数默认值适合什么周期?
- 作者建议 M15 周期,亚盘时段 1:00-7:00、缓冲 50 点、止盈倍数 2.0 这些默认值是基于 M15 设计的。其他周期可能需要调整缓冲和止盈倍数。
- 为什么有时候明明突破了却没开仓?
- 可能是三种情况:一是当天已经开过这个方向的单了(每天每方向只开一次),二是时间超过晚上 8 点了,三是计算出的止损距离不满足经纪商最小要求,EA 会在日志里提示。
Asia Session Range Breakout EA for XAUUSD MT5
Records Asia session high/low (1:00-7:00 server time), enters long on upside breakout or short on downside breakout after 7:00. Stop loss at opposite boundary plus buffer, take profit at 2× SL distance. Max 2 trades per day, validates broker stop level requirements.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。