黄金变色通道非多即空EA
跟随变色通道箭头自动反手,固定0.01手、无止损止盈,始终保持非多即空持仓。
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
挂到 MT5 上运行时终端报了错
编译通过了,但真挂到图表上时终端记录了下面的错误。指标一报错就会被终端停掉,图上可能只剩半截线甚至一片空白—— 这就是「装上去和预期不一样」的原因。把报错连同代码丢给 AI 工作台,让它改好重新发布,截图会自动更新。
cannot load custom indicator 'XAUUSD_ColorChannel_Trend' (XAUUSD.n) [4802] 加载指标失败,请确认指标已编译:XAUUSD_ColorChannel_Trend
#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());
}作品说明
思路: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.
评论
还没有人评论,来抢个沙发。