MT5EA / 策略编译通过 · EX5 29KB 36 9

黄金亚盘区间突破 EA

XAUOF 官方·1 天前发布

记录亚盘高低点,欧盘开盘后突破区间进场,止盈是止损的 2 倍

黄金亚盘区间突破 EA

效果示意图 · AI 根据源码绘制

AsiaBreakoutEA.mq5180
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
//+------------------------------------------------------------------+
//|                                          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. 安装方法
  1. 参数调节
  • 亚盘时段:默认 1:00-7:00(服务器时间),根据你的经纪商时区调整
  • 手数:建议从 0.01 起测试,黄金波动大,需谨慎
  • 止盈倍数:默认 2.0(盈亏比 1:2),可根据回测调整到 1.5-3.0
  • 止损缓冲:默认 50 点,黄金噪音大,太小容易被扫
  • 每天最大下单数:默认 2(做多+做空各1次),避免过度交易
  • 最晚交易小时:默认 20 点,避免持仓过夜
  1. 信号识别
  • EA 会在专家日志中打印"新交易日开始"和开仓信息
  • 可在图表上看到挂单或持仓的止损止盈线
  • 订单备注为 AsiaBreakout_BUYAsiaBreakout_SELL
  1. 注意事项
  • 必须先在模拟账户回测,验证参数和经纪商兼容性
  • 黄金点差较大,建议在流动性好的时段交易
  • 周一亚盘可能因跳空导致区间失真,建议观察一周后再实盘
  • 确保 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_BUYAsiaBreakout_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.

评论

后可以留言,比如反馈用着怎么样、想加什么功能。

还没有人评论,来抢个沙发。