从新手到专家:对K线进行编程·综合运用
(3/3)·肉眼判形态易错且回测费力,用MQL5把著名形态写成可复用函数才是终点
把前两步攒下的K线数理和形态集合真正跑起来,才算走完编程化分析的全链路。很多人卡在写完后不敢测,或测完不会收口成自己的库,这一篇补上最后两块拼图。
「K线缓冲与形态箭头的落地写法」
在自定义指标里把高、低、收以及 ATR 缓冲拉进数组,是画形态箭头的前置动作。下面这段直接从 OnCalculate 尾部截取,能让你在 MT5 里复刻射击之星与锤子线的标记逻辑。 先批量拷贝当前周期数据:CopyHigh / CopyLow / CopyClose 任一返回 ≤0 就直接 return,避免空数组越界;随后用 ArraySetAsSeries(..., true) 把序列倒排,使索引 0 对应最新一根 K 线。ATR 缓冲也按同样方式倒排,供后续形态函数判定波动阈值。 主循环从 rates_total-2 跑到 0,跳过最新未闭合的 K 线。IsShootingStar 命中则在 High[i] 画供给箭头(Buffer1),否则写 EMPTY_VALUE;IsHammer 命中在 Low[i] 画需求箭头(Buffer2)。外汇与贵金属波动大,这类形态信号仅代表概率倾向,实盘须自担高风险。 复制时留意 atrHandle 必须提前用 iATR 创建并校验,否则 CopyBuffer 会持续返回 0 导致指标不输出。
if(CopyHigh(Symbol(), PERIOD_CURRENT, class="num">0, rates_total, High) <= class="num">0) class="kw">return(rates_total); ArraySetAsSeries(High, true); if(CopyLow(Symbol(), PERIOD_CURRENT, class="num">0, rates_total, Low) <= class="num">0) class="kw">return(rates_total); ArraySetAsSeries(Low, true); if(CopyClose(Symbol(), PERIOD_CURRENT, class="num">0, rates_total, Close) <= class="num">0) class="kw">return(rates_total); ArraySetAsSeries(Close, true); if(CopyBuffer(atrHandle, class="num">0, class="num">0, rates_total, atr) <= class="num">0) class="kw">return(rates_total); ArraySetAsSeries(atr, true); ArraySetAsSeries(Buffer1, true); ArraySetAsSeries(Buffer2, true); class=class="str">"cmt">// Main loop for(class="type">int i = rates_total-class="num">2; i >= class="num">0; i--) { class=class="str">"cmt">// Sell Supply(Shooting Star) if(IsShootingStar(Open, High, Low, Close, atr, i)) Buffer1[i] = High[i]; class=class="str">"cmt">// Arrow at high else Buffer1[i] = EMPTY_VALUE; class=class="str">"cmt">// Buy Supply(Hammer) if(IsHammer(Open, High, Low, Close, atr, i)) Buffer2[i] = Low[i]; class=class="str">"cmt">// Arrow at low else Buffer2[i] = EMPTY_VALUE; } class="kw">return(rates_total);
◍ 在MT5图表上验证形态识别
库集成完成后,直接把 锤子线&射击之星 指标拖到 MetaTrader 5 图表就能跑。实际加载后,K线形态被准确标注并高亮,说明这套识别逻辑在真实报价下可用。 在 Volatility 75 (1s) Index.0,5 品种上做了一轮测试,指标对锤子线与射击之星的抓取没有漏标明显的结构。外汇与贵金属类品种波动更不规则,此类指数化合约节奏极快,实盘验证时仍需注意滑点与重报价的高风险。 建议读者自己开 MT5 加载同品种,把指标周期切到秒级,观察高亮位置是否和裸K目测一致;若不一致再回库里查判定阈值。
别急着下结论
锤子线与射击之星这类形态的信号,在 MT5 里已经可以靠 infinity_candlestick_pattern.mqh 直接调布尔函数算出来,不再需要肉眼扫图。附件里 Hammer&ShootingStar.mq5 只有 3.58 KB,接上 13.91 KB 的头文件就能在副图跑出形态标记,ATR 也由算法顺手算完。 但形态本身只是概率倾向,不是进场依据。实盘里外汇与贵金属波动受新闻和流动性影响极大,信号常需叠加波动率或时段过滤才够稳。 想扩功能就去翻代码库文档,别照抄就上真仓。先把示例指标加载到 EURUSD 的 M15 跑一周,看误报集中在哪些时段,再决定加什么过滤器。