学习如何基于 Ichimoku 设计交易系统·进阶篇
📘

学习如何基于 Ichimoku 设计交易系统·进阶篇

第 2/3 篇

把云图五线直接打印到图表上

做 Ichimoku 系统第一步,不是急着写交易逻辑,而是先把转换线、基准线、延展A/B、滞后线这五个数值实时抓出来贴在图上。这样你肉眼核对策略信号时,不用反复切窗口看指标缓冲区。 核心做法是在 OnInit 里 new 一个 CiIchimoku 对象,然后分别用 TenkanSen(0)、KijunSen(0) 取当前柱,SenkouSpanA(-26)、SenkouSpanB(-26) 取未来第26柱(云带前置),ChinkouSpan(26) 取滞后26柱。最后用 Comment 一行一个值刷到图表左上角。 编译后它出现在导航器“智能系统”里,双击或拖上图就跑。实测你会发现:SpanA 和 SpanB 取偏移 -26 才和视觉云带对齐,若写成 0 会和价格重叠错位,这是 MT5 云图类最容易踩的坑。 下面这段是最小可用骨架,去掉了版权头只留调用逻辑,复制进 .mq5 就能在 EURUSD 的 H1 上看到五条数值滚动。外汇和贵金属波动大,云图参数默认 9/26/52,实盘前先在策略测试器跑历史确认数值刷新节奏。

MQL5 / C++
class="macro">#include <Indicators/Trend.mqh>
CiIchimoku*Ichimoku;

class="type">void OnInit()
  {
   Ichimoku = new CiIchimoku();
   Ichimoku.Refresh(-class="num">1);
   class="type">class="kw">double TenkanVal = Ichimoku.TenkanSen(class="num">0);
   class="type">class="kw">double KijunVal = Ichimoku.KijunSen(class="num">0);
   class="type">class="kw">double SpanAVal = Ichimoku.SenkouSpanA(-class="num">26);
   class="type">class="kw">double SpanBVal = Ichimoku.SenkouSpanB(-class="num">26);
   class="type">class="kw">double ChikouVal = Ichimoku.ChinkouSpan(class="num">26);
   Comment("Tenkan Sen Value is: ",TenkanVal,"\n",
           "Kijun Sen Value is: ",KijunVal,"\n",
           "Senkou Span A Value is: ", SpanAVal,"\n",
           "Senkou Span B Value is: ",SpanBVal,"\n",
           "Chikou Span Value is: ",ChikouVal);
  }

「用 CiIchimoku 把五条线抓出来」

在 MT5 里直接调系统自带的 CiIchimoku 类,比手写指标缓冲省事得多。先在 OnInit 里 new 一个指针,用 Create(_Symbol, PERIOD_CURRENT, 9, 26, 52) 把转换线、基准线、先行Span的周期钉死,这是标准 ichimoku 参数组合。 OnTick 中第一句必须是 Ichimoku.Refresh(-1),否则取到的线是上一根甚至更老的缓存值。之后用 TenkanSen(0)、KijunSen(0) 拿当前柱的转换线与基准线;SenkouSpanA(-26)、SenkouSpanB(-26) 取的是 26 根前的云带边界,ChikouSpan(26) 才是滞后 26 根的收盘价追踪线。 下面这段是可直接贴进 EA 骨架的取数核心,跑起来后用 Comment 把五条值打印到图表左上,肉眼核对和指标窗口是否一致。外汇与贵金属波动剧烈,云带只是概率参考,不构成方向保证。 别把 Refresh 漏掉 很多脚本复制完发现数值不动,八成是忘了 Refresh(-1)。这个类不自动跟随实时 tick 更新内部缓冲,不刷就一直读旧柱,回测和实盘会差出整根 K 线。

MQL5 / C++
class="type">void OnInit()
  {
   Ichimoku = new CiIchimoku();
   Ichimoku.Create(_Symbol,PERIOD_CURRENT,class="num">9,class="num">26,class="num">52);
  }
class="type">void OnTick()
  {
   Ichimoku.Refresh(-class="num">1);
   class="type">class="kw">double TenkanVal= Ichimoku.TenkanSen(class="num">0);
   class="type">class="kw">double KijunVal= Ichimoku.KijunSen(class="num">0);
   class="type">class="kw">double SpanAVal= Ichimoku.SenkouSpanA(-class="num">26);
   class="type">class="kw">double SpanBVal= Ichimoku.SenkouSpanB(-class="num">26);
   class="type">class="kw">double ChikouVal= Ichimoku.ChinkouSpan(class="num">26);
   Comment("Tenkan Sen Value is: ",TenkanVal,"\n",
           "Kijun Sen Value is: ",KijunVal,"\n",
           "Senkou Span A Value is: ", SpanAVal,"\n",
           "Senkou Span B Value is: ",SpanBVal,"\n",
           "Chikou Span Value is: ",ChikouVal);
  }

◍ 用云带与迟行线给趋势贴标签

在 MT5 里给 Ichimoku 状态做可视化,最直接的方式是抓当前收盘价和云带两线(SpanA、SpanB)的位置关系。收盘价同时站上 SpanA 与 SpanB,倾向判为多头环境;同时跌破两者,则倾向空头环境。 下面这段逻辑先把 ChikouSpan(26) 取出来,再用 PArray[0].close 和云带双线比大小,命中条件就通过 Comment() 把各组件数值刷到图表左上角。注意 Chikou 取的是 26 根前的收盘价偏移,这是 Ichimoku 默认参数。 double ChikouVal= Ichimoku.ChinkouSpan(26); if(PArray[0].close>SpanBVal&&PArray[0].close>SpanAVal) { Comment("The trend is up","\n", "Close Value is: ",PArray[0].close,"\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); } if(PArray[0].close<SpanBVal&&PArray[0].close<SpanAVal) { Comment("The trend is down","\n", "Close Value is: ",PArray[0].close,"\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); } MqlRates PArray[]; int Data=CopyRates(_Symbol,_Period,0,1,PArray); 代码里 CopyRates 只拉 1 根 K 线(参数 0,1),所以 PArray[0] 就是当前柱。外汇与贵金属杠杆高,云带判定只是状态描述,实际进场仍要结合动量衰减与风控,价格穿越云带后反转的概率并不低。 开 MT5 把这段塞进 OnCalculate 末尾,切到 XAUUSD 的 H1,你能立刻看到图表左上角随柱闭合刷新各线数值;若 Chikou 与价格在云同侧,趋势延续的可能性更高,但别把它当唯一信号。

MQL5 / C++
class="type">class="kw">double ChikouVal= Ichimoku.ChinkouSpan(class="num">26);
if(PArray[class="num">0].close>SpanBVal&&PArray[class="num">0].close>SpanAVal)
  {
    Comment("The trend is up","\n",
            "Close Value is: ",PArray[class="num">0].close,"\n",
            "Tenkan Sen Value is: ",TenkanVal,"\n",
            "Kijun Sen Value is: ",KijunVal,"\n",
            "Senkou Span A Value is: ", SpanAVal,"\n",
            "Senkou Span B Value is: ",SpanBVal,"\n",
            "Chikou Span Value is: ",ChikouVal);
  }
if(PArray[class="num">0].close<SpanBVal&&PArray[class="num">0].close<SpanAVal)
  {
    Comment("The trend is down","\n",
            "Close Value is: ",PArray[class="num">0].close,"\n",
            "Tenkan Sen Value is: ",TenkanVal,"\n",
            "Kijun Sen Value is: ",KijunVal,"\n",
            "Senkou Span A Value is: ", SpanAVal,"\n",
            "Senkou Span B Value is: ",SpanBVal,"\n",
            "Chikou Span Value is: ",ChikouVal);
  }

class="type">MqlRates PArray[];
class="type">int Data=CopyRates(_Symbol,_Period,class="num">0,class="num">1,PArray);

用 CiIchimoku 类抓强势趋势信号

在 MT5 里不想手算云图各线,可以直接用标准库里的 CiIchimoku 类。下面这段把一目均衡表的五条线一次性抓出来,并在云层扩张时给盘面贴字。 初始化时 Create(_Symbol, PERIOD_CURRENT, 9, 26, 52) 把转换线、基准线、先行跨度周期按经典参数设好;之后每个 tick 用 Refresh(-1) 拉最新缓冲,再分别取 TenkanSen(0)、KijunSen(0)、SenkouSpanA(-26)、SenkouSpanB(-26)、ChinkouSpan(26)。 判定逻辑很直白:当 SpanA 当前值大于前一柱的 SpanA 且同时高于 SpanB,倾向认为多头动能走强;反过来 SpanA 低于前值和 SpanB,则空方可能占优。外汇与贵金属杠杆高,这类信号只是概率倾斜,实盘须自担回撤风险。 把代码丢进 EA 跑一小时,你会看到 Comment 在 EURUSD 15M 上大约每几百 tick 才翻一次「strong」字样——说明云层转向比价格慢,用它过滤噪音而不是追单。

MQL5 / C++
class="macro">#include <Indicators/Trend.mqh>
CiIchimoku*Ichimoku;
class="type">void OnInit()
  {
   Ichimoku = new CiIchimoku();
   Ichimoku.Create(_Symbol,PERIOD_CURRENT,class="num">9,class="num">26,class="num">52);
  }
class="type">void OnTick()
  {
   Ichimoku.Refresh(-class="num">1);
   class="type">class="kw">double TenkanVal= Ichimoku.TenkanSen(class="num">0);
   class="type">class="kw">double KijunVal= Ichimoku.KijunSen(class="num">0);
   class="type">class="kw">double SpanAVal= Ichimoku.SenkouSpanA(-class="num">26);
   class="type">class="kw">double SpanAPrevVal= Ichimoku.SenkouSpanA(-class="num">25);
   class="type">class="kw">double SpanBVal= Ichimoku.SenkouSpanB(-class="num">26);
   class="type">class="kw">double ChikouVal= Ichimoku.ChinkouSpan(class="num">26);
   if(SpanAVal>SpanAPrevVal&&SpanAVal>SpanBVal)
     {
      Comment("The trend is up and strong","\n",
              "Tenkan Sen Value is: ",TenkanVal,"\n",
              "Kijun Sen Value is: ",KijunVal,"\n",
              "Senkou Span A Prev. Value is: ", SpanAPrevVal,"\n",
              "Senkou Span A Value is: ", SpanAVal,"\n",
              "Senkou Span B Value is: ",SpanBVal,"\n",
              "Chikou Span Value is: ",ChikouVal);
     }
   if(SpanAVal<SpanAPrevVal&&SpanAVal<SpanBVal)
     {
      Comment("The trend is down and strong","\n",
              "Tenkan Sen Value is: ",TenkanVal,"\n",
              "Kijun Sen Value is: ",KijunVal,"\n",

「用云层斜率给趋势强度下定义」

这段逻辑把一目均衡表的「强势」判断压成两条硬规则:当前云带上线(Senkou Span A)既要高于上一根 K 线的云带上线,又要高于云带下线(Senkou Span B),才判为上行强趋势;反过来低于前值与下线,则判为下行强趋势。 代码里 SpanAVal>SpanAPrevVal&&SpanAVal>SpanBVal 触发 Comment("The trend is up and strong"),同时把转换线、基准线、前后云上线、云下线、迟行线全打印到图表左上角;下行分支仅把比较符号反过来。 实盘里这种判定只解决「现在云有没有在张开」一个问题。外汇与贵金属杠杆高,云层扩张仅代表过去 26~52 根 K 线的中轴偏移,不代表下一根一定延续,MT5 里把 PERIOD_CURRENT 换成 M15 跑一遍,能直接看到强趋势信号在震荡市会频繁闪现又消失。

MQL5 / C++
   if(SpanAVal>SpanAPrevVal&&SpanAVal>SpanBVal)
   {
      Comment("The trend is up and strong","\n",
               "Tenkan Sen Value is: ",TenkanVal,"\n",
               "Kijun Sen Value is: ",KijunVal,"\n",
               "Senkou Span A Prev. Value is: ", SpanAPrevVal,"\n",
               "Senkou Span A Value is: ", SpanAVal,"\n",
               "Senkou Span B Value is: ",SpanBVal,"\n",
               "Chikou Span Value is: ",ChikouVal);
   }
   if(SpanAVal<SpanAPrevVal&&SpanAVal<SpanBVal)
   {
      Comment("The trend is down and strong","\n",
               "Tenkan Sen Value is: ",TenkanVal,"\n",
               "Kijun Sen Value is: ",KijunVal,"\n",
               "Senkou Span A Prev. Value is: ", SpanAPrevVal,"\n",
               "Senkou Span A Value is: ", SpanAVal,"\n",
               "Senkou Span B Value is: ",SpanBVal,"\n",
               "Chikou Span Value is: ",ChikouVal);
   }

常见问题

在指标初始化时调用 iIchimoku 获取句柄,OnCalculate 里用 CopyBuffer 把五条线数据拷到数组,再用 PlotIndexSetInteger 绑定画线即可。
声明 CiIchimoku 对象后调用 Create 绑定品种周期参数,循环里用 GetHandle 拿句柄,再用 GetData 或缓冲数组读取各线当前值。
可以。小布会按云带与迟行线关系自动贴趋势标签,并提示价格相对云层的强弱状态,打开对应品种页就能看到。
价格位于云层之上且迟行线在价格上方倾向多头标签;反之为空头。云层厚度和颜色辅助过滤假信号。
取领先1与领先2在 N 根 K 线的垂直位移差除以 N,差值越大斜率越陡,趋势强度越高,可设百分比阈值区分强弱。