MT5指标编译通过 · EX5 31KB 自动发布 3 1

黄金变色通道非多即空EA

zhuo2026·1 小时前发布

跟随变色通道箭头自动反手,固定0.01手、无止损止盈,始终保持非多即空持仓。

黄金变色通道非多即空EA

MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子

挂到 MT5 上运行时终端报了错

编译通过了,但真挂到图表上时终端记录了下面的错误。指标一报错就会被终端停掉,图上可能只剩半截线甚至一片空白—— 这就是「装上去和预期不一样」的原因。把报错连同代码丢给 AI 工作台,让它改好重新发布,截图会自动更新。

cannot load custom indicator 'XAUUSD_ColorChannel_Trend' (XAUUSD.n) [4802]
加载指标失败,请确认指标已编译:XAUUSD_ColorChannel_Trend
XAUUSD_ColorChannel_FlipEA.mq5137 行
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
#property copyright "XAUOF 指标工坊"
#property version   "1.00"
#property strict

#include <Trade\Trade.mqh>

//-------------------- 可调参数 --------------------
input string         InpIndicatorName = "XAUUSD_ColorChannel_Trend"; // 配套指标文件名(不含.mq5),须已编译放在Indicators目录
input int            InpFastPeriod = 14;    // 通道中轨(快均线)周期,须与指标一致,推荐14
input ENUM_MA_METHOD InpFastMethod = MODE_EMA;  // 快均线算法,须与指标一致
input int            InpSlowPeriod = 60;    // 慢均线周期,须与指标一致,推荐60
input ENUM_MA_METHOD InpSlowMethod = MODE_SMA;  // 慢均线算法,须与指标一致
input int            InpAtrPeriod  = 14;    // ATR周期,须与指标一致,推荐14
input double         InpAtrMult    = 1.2;   // ATR倍数(通道半宽),须与指标一致,推荐1.2
input int            InpArrowGap   = 30;    // 箭头偏移(点),仅用于与指标参数对齐,不影响交易
input double         InpLots       = 0.01;  // 固定下单手数,本EA要求0.01手
input ulong          InpMagic      = 20261007; // 魔术号,用于识别本EA的持仓
input bool           InpAlwaysHold = true;  // 非多即空开关:true=空仓时按通道颜色自动进场,保持始终持仓

CTrade trade;          // 交易对象
int    hInd = INVALID_HANDLE;  // 配套指标的句柄
datetime lastBarTime = 0;      // 上一根已处理K线的时间,用于"只在收盘时行动"

int OnInit()
{
   // 加载配套指标(参数顺序必须与指标input声明顺序一致)
   hInd = iCustom(_Symbol, PERIOD_CURRENT, InpIndicatorName,
                  InpFastPeriod, InpFastMethod, InpSlowPeriod, InpSlowMethod,
                  InpAtrPeriod, InpAtrMult, InpArrowGap);
   if(hInd == INVALID_HANDLE)
   {
      Print("加载指标失败,请确认指标已编译:", InpIndicatorName);
      return INIT_FAILED;
   }
   trade.SetExpertMagicNumber(InpMagic);
   trade.SetDeviationInPoints(30);
   trade.SetTypeFillingBySymbol(_Symbol);
   lastBarTime = 0;
   return INIT_SUCCEEDED;
}

void OnDeinit(const int reason)
{
   if(hInd != INVALID_HANDLE) IndicatorRelease(hInd);
}

// 查询本EA当前持仓方向:1=多,-1=空,0=空仓
int GetCurrentDirection()
{
   int dir = 0;
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(ticket == 0) continue;
      if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
      if(PositionGetInteger(POSITION_MAGIC) != (long)InpMagic) continue;
      long t = PositionGetInteger(POSITION_TYPE);
      if(t == POSITION_TYPE_BUY)  dir = 1;
      if(t == POSITION_TYPE_SELL) dir = -1;
   }
   return dir;
}

// 平掉本EA全部持仓,返回是否全部成功
bool CloseAllPositions()
{
   bool ok = true;
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(ticket == 0) continue;
      if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
      if(PositionGetInteger(POSITION_MAGIC) != (long)InpMagic) continue;
      if(!trade.PositionClose(ticket)) ok = false;
   }
   return ok;
}

// 市价开仓,dir=1买 / dir=-1卖;不设止损止盈(sl/tp传0)
bool OpenPosition(int dir)
{
   double lots = InpLots;
   double minL = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   double maxL = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
   if(minL > 0.0 && lots < minL) lots = minL;   // 手数下限保护
   if(maxL > 0.0 && lots > maxL) lots = maxL;   // 手数上限保护
   if(dir > 0)  return trade.Buy(lots, _Symbol, 0.0, 0.0, 0.0, "ColorChannel Buy");
   if(dir < 0)  return trade.Sell(lots, _Symbol, 0.0, 0.0, 0.0, "ColorChannel Sell");
   return false;
}

void OnTick()
{
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) return;  // 终端不允许交易
   if(!MQLInfoInteger(MQL_TRADE_ALLOWED)) return;            // EA不允许交易

   // 只在新K线出现(即上一根收盘)时判断一次,避免盘中反复反手
   datetime bt = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(bt == lastBarTime) return;
   lastBarTime = bt;

   int bars = iBars(_Symbol, PERIOD_CURRENT);
   if(bars < 5) return;
   if(BarsCalculated(hInd) < bars) return;   // 指标还没算完,等下一tick

   // 复制最近两根已收盘K线的信号:非series数组中 [1]=刚收盘那根,[0]=再前一根
   double buyArr[2], sellArr[2], clrArr[2];
   if(CopyBuffer(hInd, 5, 1, 2, buyArr)  < 2) return;  // 缓冲5=买箭头
   if(CopyBuffer(hInd, 6, 1, 2, sellArr) < 2) return;  // 缓冲6=卖箭头
   if(CopyBuffer(hInd, 2, 1, 2, clrArr)  < 2) return;  // 缓冲2=通道颜色 0=红(多) 1=绿(空)

   bool buySig  = (buyArr[1]  != EMPTY_VALUE);
   bool sellSig = (sellArr[1] != EMPTY_VALUE);

   // 目标方向:有箭头跟箭头;无箭头且允许"非多即空"时跟通道当前颜色
   int desired = 0;
   if(buySig && !sellSig)       desired = 1;
   else if(sellSig && !buySig)  desired = -1;
   else if(InpAlwaysHold)       desired = (clrArr[1] <= 0.5) ? 1 : -1;
   if(desired == 0) return;

   int cur = GetCurrentDirection();
   if(desired == cur) return;          // 方向已正确,不动

   if(cur != 0)                        // 方向相反:先平仓再反手
   {
      if(!CloseAllPositions())
      {
         Print("平仓失败,本根K线放弃反手");
         return;
      }
   }
   if(OpenPosition(desired))
      Print("反手成功:", (desired > 0 ? "做多" : "做空"), " ", DoubleToString(InpLots, 2), " 手");
   else
      Print("开仓失败,错误码:", GetLastError());
}
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
黄金变色通道非多即空EA 在 MT5 上的真实截图

作品说明

思路:EA 通过 iCustom 加载上一节的变色通道指标,直接读取其缓冲区——5号=买箭头、6号=卖箭头、2号=通道红绿颜色索引。每根K线收盘确认一次:出现买箭头就平空开多,出现卖箭头就平多开空;无信号且空仓时按通道当前颜色进场,保证"非多即空"始终持仓。固定0.01手、市价单、不设止损止盈,用 CTrade 执行。

使用说明

  • 安装:先确保 XAUUSD_ColorChannel_Trend.mq5 已编译并放在 MQL5/Indicators 目录;再把本EA放入 MQL5/Experts 编译,拖到 XAUUSD 图表(建议与截图一致的 M1/M5),勾选"允许算法交易"。
  • 参数调节:InpFastPeriod/InpSlowPeriod/InpAtrPeriod/InpAtrMult 必须与图表上指标的参数完全一致,否则EA读到的信号和图上箭头对不上;InpLots 固定0.01;InpAlwaysHold=true 保证空仓时也按通道红绿自动进场,实现"非多即空",改 false 则只在箭头出现时才持仓。
  • 信号逻辑:每根K线收盘判定一次——红上箭头=平空开多,绿下箭头=平多开空;无箭头的K线维持原持仓不动;持仓方向始终与通道颜色一致。
  • 注意事项:①本EA不设止损止盈、不限制持仓时间,波动剧烈时浮亏可能较大,仅适合小仓位或模拟盘验证;②反手=先平后开,若平仓失败本根K线会放弃开仓,避免裸奔;③请确保账户为净持仓模式(对冲模式下本EA只认自己魔术号的净方向);④指标参数修改后需同时修改EA输入参数或重新拖挂EA。

AI 解读根据源码逐行分析写成,供参考,以实际运行为准

这是什么

这是一个运行在MT5上的自动化交易程序(EA),专门配合「XAUUSD_ColorChannel_Trend」变色通道指标使用。它的核心逻辑很简单:跟着通道的箭头信号做反手,并且始终保持持仓状态——要么做多,要么做空,绝不空仓。

逻辑原理

EA通过iCustom函数加载配套的变色通道指标,每根K线收盘时读取一次数据。它主要看三个东西:5号缓冲区的买箭头、6号缓冲区的卖箭头、2号缓冲区的通道颜色索引。

当刚收盘的K线上出现买箭头时,如果当前持有空单,就先平空再开多;出现卖箭头时,先平多再开空。这就是所谓的「反手」。反手动作是先平仓后开仓,如果平仓失败,这根K线就会放弃开仓,防止账户处于无保护状态。

如果没有出现箭头,但参数里开启了「非多即空」开关,EA会去读通道颜色:颜色索引小于等于0.5视为红色(代表多头方向),大于0.5视为绿色(代表空头方向)。只要当前持仓方向和通道颜色不一致,它就会立刻反手。

仓位方面,固定使用0.01手市价单进场,代码里没有写任何止损和止盈逻辑,也不限制持仓时间。所有订单都带有专属魔术号,只管理自己的单子。

参数说明

  • InpIndicatorName("XAUUSD_ColorChannel_Trend"):配套指标的文件名,不含.mq5后缀。必须确保该指标已编译并放在Indicators目录。
  • InpFastPeriod(14):通道中轨快均线的周期,必须与图表上指标的参数完全一致。
  • InpFastMethod(MODE_EMA):快均线的计算算法,须与指标一致。
  • InpSlowPeriod(60):慢均线周期,须与指标一致。
  • InpSlowMethod(MODE_SMA):慢均线计算算法,须与指标一致。
  • InpAtrPeriod(14):ATR周期,用于计算通道宽度,须与指标一致。
  • InpAtrMult(1.2):ATR倍数,决定通道半宽,须与指标一致。
  • InpArrowGap(30):箭头偏移点数,仅用于和指标参数对齐,不影响实际交易逻辑。
  • InpLots(0.01):固定下单手数。代码里有最小和最大手数保护,但默认就是0.01。
  • InpMagic(20261007):魔术号,用来识别本EA开的仓位。
  • InpAlwaysHold(true):非多即空开关。设为true时空仓也会按通道颜色自动进场;设为false则只在出现箭头时才交易。

怎么用

首先把配套的变色通道指标编译好,放进MT5的MQL5/Indicators目录。然后把本EA放进MQL5/Experts目录并编译。打开XAUUSD图表(建议用M1或M5周期),把EA拖上去,勾选「允许算法交易」。

最关键的一步:EA面板里的均线周期、算法、ATR参数,必须和你图表上挂的那个指标的参数一模一样,否则EA读到的信号和图上画的箭头会对不上。信号不需要你手动盯,K线收盘后EA会自动判定和执行。

适用场景

从设计初衷和默认参数来看,它适合XAUUSD(黄金)的M1或M5小周期,在通道指标能明确区分红绿颜色的单边趋势行情里表现较好。因为始终持仓且没有止损,它不适合震荡剧烈、通道频繁变色的行情。0.01手的固定仓位意味着它更适合小资金测试或模拟盘验证策略逻辑。

风险提示

这个EA最大的风险在于无止损无止盈。黄金波动大,一旦遇到反向单边行情,浮亏会持续扩大,直到下一个反向箭头出现才会反手。其次,它是基于K线收盘确认信号的,盘中价格刺穿通道不会触发交易,存在滞后性。另外,如果修改了图表上指标的参数,必须同步修改EA的参数或者重新拖挂EA,否则信号会错乱。最后,代码是按净持仓模式设计的,如果在对冲模式下运行,它只认自己魔术号的净方向,可能产生预期外的行为。

常见问题

这个EA会重绘吗?
EA只在每根K线收盘后才读取指标缓冲区的数据进行判断,不会在K线未走完时反复改变交易动作。但配套指标本身是否重绘取决于指标的源码。
可以用在XAUUSD以外的品种吗?
代码里没有限制交易品种,使用的是_Symbol变量。但默认参数是针对黄金小周期设置的,用在其他品种需要自行测试和调整参数。
MT4能用吗?
不能。这是MQL5编写的程序,使用了CTrade类和MT5特有的缓冲区读取方式,只能在MetaTrader 5上运行。
为什么一定要把指标参数填得和EA一样?
因为EA是通过iCustom函数在后台独立计算指标的。如果两边参数不同,EA算出来的箭头位置和你在图表上看到的箭头位置就不一样,会导致乱下单。
可以设置止损止盈吗?
当前源码中没有编写止损止盈逻辑,开仓时传入的SL和TP都是0。如果需要,必须自行修改源码添加相关功能。

Color Channel Reversal EA for MT5

This MT5 Expert Advisor follows a custom color channel indicator to trade XAUUSD. It reverses positions on arrow signals and maintains a constant long or short exposure using fixed 0.01 lots without stop loss or take profit.

Source code is shown above. Compiled EX5 files are available to VIP members.

评论

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

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