学习如何基于 Ichimoku 设计交易系统·进阶篇
把云图五线直接打印到图表上
做 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,实盘前先在策略测试器跑历史确认数值刷新节奏。
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 线。
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 与价格在云同侧,趋势延续的可能性更高,但别把它当唯一信号。
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」字样——说明云层转向比价格慢,用它过滤噪音而不是追单。
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 跑一遍,能直接看到强趋势信号在震荡市会频繁闪现又消失。
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); }