您应当知道的 MQL5 向导技术(第 46 部分):Ichimoku(基础篇)
📘

您应当知道的 MQL5 向导技术(第 46 部分):Ichimoku(基础篇)

第 1/3 篇

用向导把 Ichimoku 塞进 EA 骨架

MT5 的 MQL5 向导能直接把 Ichimoku 指标挂进 EA 模板,省掉手写信号类的重复劳动。实际在 MetaEditor 里选「Expert Advisor (generate)」后勾选 Ichimoku Kinko Hyo,向导会产出带 iIchimoku 句柄的框架代码,Tenkan-sen、Kijun-sen、Senkou Span A/B、Chikou Span 五个缓冲一次就位。 外汇与贵金属波动受杠杆放大,Ichimoku 云层翻转只代表概率上的多空倾向,不构成必然方向。拿到向导代码后先别急着跑实盘,开 MT5 策略测试器用 2023—2024 年 XAUUSD 的 M15 数据回测一遍,看云层厚度对假突破的过滤效果。 默认参数(9,26,52)在贵金属上容易过度敏感,把 Kijun 调到 34 常能压住噪音。这一步改的是向导生成文件里的宏定义,不用动信号逻辑本身。

「一眼均衡图的五条线与云层逻辑」

Ichimoku Kinko Hyo 在1930年代后期成形,日语直译是“一眼均衡图”,核心意图是用一张图把趋势、支撑阻力和动量同时摊开。它不像均线系统只给一条参考,而是由五条缓冲线和一片 Kumo(云)组成,各自抓价格行为的不同切面。 五条线分别是:Tenkan-sen 转折线,取过去9个周期最高价与最低价的均值,反映短期节奏;Kijun-sen 基线,用过去26个周期高低均值,代表中期趋势;Senkou Span A 领先跨度A,是前两线的平均并前移26周期;Senkou Span B 领先跨度B,取过去52个周期高低均值也前移26周期;Chikou Span 滞后跨度,把当前收盘价后移26周期画回图上做历史对照。 云由 Span A 与 Span B 之间的区域构成,是前置的支撑阻力带。经验上云越厚,该区域的阻挡倾向越强;云越薄,价格穿破的概率偏高。看涨云一般是 Span A 在 Span B 之上(常显绿),看跌则反之(常显红),这是读云的第一个直觉开关。 我们后续会逐个拆 11 种 Ichimoku 形态,用整数输入 Signal_Ichimoku_PatternsUsed 控制 EA 只测哪一组。这个输入上限是 2^11−1 = 2047,能覆盖全部形态组合。当前测试窗口锁定 GBPJPY 的 2022 年 H1,仅做了该短期样本内的优化,未做前向或交叉验证,外汇与贵金属杠杆品种高风险,结论仅作 MT5 内复核的起点。

◍ 转换线与基准线的交叉陷阱

Ichimoku 里最常被拿来说事的就是 Tenkan-sen 上穿或下穿 Kijun-sen:前者偏看涨信号,后者偏看跌信号。本质上它约等于一条快均线和一条慢均线的金叉死叉,只是周期参数带随机性,对行情切换的灵敏度常显不足。 在 GBPJPY 的 2022 年 H1 周期回测中,这类交叉信号暴露出明显短板——低时间帧里对微小波动反应过激,盘整段容易反复打脸。没有清晰趋势时,交叉频繁触发却无方向延续,交易成本和无产出持仓损耗会悄悄吃掉账户。 外汇与贵金属属高风险品种,这种交叉在趋势市才更值得参考;横盘或震荡市里,它给出的进出场倾向往往互相矛盾。 下面这段 MT5 逻辑直接判交叉形态,可复制到自己的信号类里跑: //+------------------------------------------------------------------+

//Check for Pattern 0.

//+------------------------------------------------------------------+ bool CSignalIchimoku::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Tankensen(X()+1) < Kijunsen(X()+1) && Tankensen(X()) > Kijunsen(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Tankensen(X()+1) > Kijunsen(X()+1) && Tankensen(X()) < Kijunsen(X())) { return(true); } return(false); } 逐行看:函数接收持仓方向 T;买权条件是上一根转换线低于基准线、当前根反超,即金叉;卖权对称,上一根转换线高于基准线、当前根跌破,即死叉;都不满足返回 false。X() 是当前偏移,改这个数就能调信号滞后。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">0.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalIchimoku::IsPattern_0(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Tankensen(X()+class="num">1) < Kijunsen(X()+class="num">1) && Tankensen(X()) > Kijunsen(X()))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Tankensen(X()+class="num">1) > Kijunsen(X()+class="num">1) && Tankensen(X()) < Kijunsen(X()))
   {  class="kw">return(true);
   }
   class="kw">return(class="kw">false);
}

用 Kijun-Sen 交叉做价格行为信号

Kijun-Sen 周期比 Tenkan-Sen 长,默认是 26 根 K 线的平均价,所以价格从一侧穿越它的收盘信号,往往比短周期均线交叉更具过滤意义。看多情形是收盘价从基线下方走到上方,看空则反过来从上方收破下方。 下面的 MQL5 片段就是这类形态-1 的判断核心: //+------------------------------------------------------------------+

//Check for Pattern 1.

//+------------------------------------------------------------------+ bool CSignalIchimoku::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()+1) < Kijunsen(X()+1) && Close(X()) > Kijunsen(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()+1) > Kijunsen(X()+1) && Close(X()) < Kijunsen(X())) { return(true); } return(false); } 逐行拆解:函数接收持仓方向 T;买权情形要求前一根收盘低于 Kijun、当前收盘高于 Kijun,即上穿;卖权情形对称,前根高于、当前低于,即下破;都不满足则返回 false。把形态输入赋值为 2、用类似设置跑一轮短优化测试,形态-1 在回测里显出一些希望,但样本外表现需自行在 MT5 验证。 基线交叉不报趋势动量,26 周期均值只标定方向,不提示强度衰减。若趋势恢复或转横盘,单纯跟这根线的交易者可能错过动量减弱的早期警示,持仓容易被动。 它也给不出离场线索。Kijun-Sen 在辨主流方向时尚可一用,但止盈、止损位置它一概不管,外汇与贵金属波动剧烈、杠杆高风险大,只靠这一个信号进出场并不稳妥。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">1.                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalIchimoku::IsPattern_1(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Close(X()+class="num">1) < Kijunsen(X()+class="num">1) && Close(X()) > Kijunsen(X()))
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL && Close(X()+class="num">1) > Kijunsen(X()+class="num">1) && Close(X()) < Kijunsen(X()))
   {  class="kw">return(true);
   }
   class="kw">return(class="kw">false);
}

「云层突破的时效与确认陷阱」

Kumo 云由 Senkou Span A/B 两条线夹出,本质是动态支撑阻力带。价格收线站上云层视为看涨突破,跌穿且收线在下方视为看跌突破,这是 Ichimoku 里最直接的形态信号之一。 把形态参数设为 4(对应形态-2 的云突破逻辑)跑回测,报告里数字不算难看,但该信号对时间帧极度敏感。短周期里市场噪音和瞬时波动会诱发频繁假突破;大周期虽滤了噪,信号却滞后,可能错过较优入场位。 云突破不能孤立看。可靠突破需其他分量佐证:滞后线位置、基线同转折线的相对关系应指向同一趋势。仅盯 Kumo 而忽略宏观基本面,遇到重大数据行情可能直接被扫。外汇与贵金属自带高杠杆风险,任何云信号都只是概率倾向。 下面这段 MT5 代码即形态-2 的判定函数,可原样丢进 CSignalIchimoku 类里验证: //+------------------------------------------------------------------+

//Check for Pattern 2.

//+------------------------------------------------------------------+ bool CSignalIchimoku::IsPattern_2(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && ((Close(X()+1) < SenkouSpanA(X()+1) && Close(X()) > SenkouSpanA(X()) && SenkouSpanA(X()) > SenkouSpanB(X()))

(Close(X()+1) < SenkouSpanB(X()+1) && Close(X()) > SenkouSpanB(X()) && SenkouSpanB(X()) > SenkouSpanA(X()))) ) { return(true); } else if(T == POSITION_TYPE_SELL && ((Close(X()+1) > SenkouSpanA(X()+1) && Close(X()) < SenkouSpanA(X()) && SenkouSpanA(X()) < SenkouSpanB(X()))

(Close(X()+1) > SenkouSpanB(X()+1) && Close(X()) < SenkouSpanB(X()) && SenkouSpanB(X()) < SenkouSpanA(X()))) ) { return(true); } return(false); } 逐行拆一下:函数接收持仓方向 T;买权判定里,前一根收线在 A 云或 B 云之下、当前收线已穿越该云、且当前云 A 在 B 上(或 B 在 A 上)才返回 true,即要求穿越的是上层云。卖权对称处理,穿透的是下层云。最后无匹配统一返回 false。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Check for Pattern class="num">2.                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CSignalIchimoku::IsPattern_2(class="type">ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && 
    ((Close(X()+class="num">1) < SenkouSpanA(X()+class="num">1) && Close(X()) > SenkouSpanA(X()) && SenkouSpanA(X()) > SenkouSpanB(X()))
    ||
    (Close(X()+class="num">1) < SenkouSpanB(X()+class="num">1) && Close(X()) > SenkouSpanB(X()) && SenkouSpanB(X()) > SenkouSpanA(X())))
   )
   {  class="kw">return(true);
   }
   else if(T == POSITION_TYPE_SELL &&
    ((Close(X()+class="num">1) > SenkouSpanA(X()+class="num">1) && Close(X()) < SenkouSpanA(X()) && SenkouSpanA(X()) < SenkouSpanB(X()))
    ||
    (Close(X()+class="num">1) > SenkouSpanB(X()+class="num">1) && Close(X()) < SenkouSpanB(X()) && SenkouSpanB(X()) < SenkouSpanA(X())))
   )
   {  class="kw">return(true);
   }
   class="kw">return(class="kw">false);
}

常见问题

在策略生成向导里选 Ichimoku 作为信号源,绑定到EA交易逻辑后导出代码即可,无需手敲指标计算。
转换线、基准线、延展线看方向,领先云A/B构成云层厚度,价格穿云代表支撑阻力切换,重点看云层颜色与位置。
小布可加载品种页的均衡图,结合云层状态和波动过滤交叉噪音,提示哪次交叉概率更高、哪次该跳过。
基准线交叉滞后明显,单独用易吃假突破;需叠加云层方向和实体确认,且外汇贵金属属高风险,信号仅作倾向参考。
看收盘价站稳云层另一侧且次根不收回,时效上宜等1~2根确认;突破当根追单被打回概率偏大。