烛条形态函数库:把形态研究变成可复用的代码模块(基础篇)
(1/3)·手工测算锤子线胜率太慢?一套函数库让指标、面板、EA 直接调用形态数据
「给烛条形态写一套可复用的函数库」
在 MT5 里做价格行为分析,最忌每次识别形态都重写一遍遍历逻辑。把锤子、吞没、十字星等判别抽成独立函数,回测和实盘都能直接调,效率差出数量级。 原文给出的基础库结构把单根烛条属性(实体长度、上下影线比例)先封装,再往上叠形态判定。这样改参数只看一个地方,不用满屏找 magic number。 以 2019 年 4 月发布的这套思路为例,社区帖当时 5411 次浏览、11 条讨论,说明手动写形态函数仍是多数人的痛点。外汇与贵金属波动受杠杆放大,形态失效概率不低,任何函数输出都只能作概率参考。
这套形态库到底装了些什么
这一节把整个函数库的骨架摊开,方便你后续在 MT5 里按图索骥。核心分三块:底层定义、开发接口、实盘组件。 底层定义里给出了 8 个关键类型与统计量——CandleType 管烛条归类,PatternType 管形态归类,Found 记录某类形态被发现的总次数,Coincidence 是该类形态在历史样本中的出现频率,Probability 是形态发生后对应走势的统计概率,Efficiency 则是形态的效率系数(衡量盈亏比与触发稳定性的综合值)。 开发层面向写代码的交易者:你可以直接调用这些结构扩展自己的形态识别逻辑,而不必从零解析每根 K 线。 实盘组件给的是现成工具:CandleDetector 指示器只做烛条扫描,PatternDetector 指示器负责形态扫描,PatternExpert 则是挂上去就能跑的形态交易 EA。外汇与贵金属波动剧烈、杠杆风险高,任何形态概率都只是历史倾向,上车前先开 MT5 用策略测试器跑一遍样本外数据。
◍ 从研究到落地:把形态分析变成可调用的库
前两篇已经把烛条形态在当前行情里的真实表现拆开验过,还顺手写了个带大量研究参数的形态分析器。但纸面结论离实盘始终差一步——你能看明白,MT5 却没法直接拿去下单或报警。 这篇要做的就是把前面那些形态判定逻辑,封成一个函数库。你自己的指标、面板、EA 都能直接 include 进来调,不用每次重写的。 外汇和贵金属价格波动快、杠杆高,任何形态信号都只是概率倾向,实盘前务必在策略测试器里用历史数据跑一遍确认调用无误。
「先把输入项和产出项拆清楚」
搭函数库之前,先别急着写类和连接,得把数据边界定出来:哪些是从外面喂进来的,哪些是要吐出去的。底层沿用前面那套可视化形态分析器的思路,但接口要重新分层。 应用端“设置”页里有五块输入要接住。区块1是烛条类型清单,涵盖既有和生成的形态;类型1到5各自只有一个参数,锤子线则有两个,点右上角齿轮才能看到。区块2是三个权重系数 K1、K2、K3,直接左右形态效率评估。区块3是趋势阈值,单位用点数。区块4填测试用烛条的顺序号或索引,靠它能拉出最多三根烛条任意尺寸的形态信息。区块5只管自定义形态,定形态里烛条数量。 切到“分析”页还有两块。区块6管当前时间帧和样本区间;区块7是既有形态名,这名字应用里改不了,但类里取形态详情时必须传。 产出侧至少要覆盖这几项,才够在类里把方法签名写对:Patterns found 是某类形态命中数;Occurrence 是命中数占样本总体的百分比;Probability 是之后向上或向下走的概率;Efficiency ratios 则分上行、下行走势分别给效率比。外汇和贵金属波动大、杠杆高,这些比值只是历史样本的统计倾向,实盘前务必在 MT5 用自己品种回测一遍。
从枚举到 CPattern 的类库骨架
做价格行为识别,第一步不是写指标,而是把“语言”先定义清楚。先建 Enums.mqh,把烛条类型、形态类型、趋势类型三个枚举落盘,后面所有识别逻辑都靠它们做标签。 烛条枚举里列了 8 种基础分类:从 CAND_NONE 到 CAND_SHORT,覆盖了 Marubozu、十字星、锤子、倒锤子等。形态枚举 TYPE_PATTERN 则收了 15 种常见 K 线组合,例如 ENGULFING_BULL(看涨吞没)、DARK_CLOUD_COVER(乌云盖顶)。趋势只分三类:UPPER、DOWN、FLAT。 紧接着建 Pattern.mqh,在里面写 CPattern 类。私有段放上一节定的参数变量,并 #include 枚举文件。类里两个结构是关键:CANDLE_STRUCTURE 用来判单根烛条属性,它同时引用了 TYPE_TREND 和 TYPE_CANDLESTICK;RATING_SET 则记录形态出现后价格走势的评分。 公有段分两块:一是取/设输入参数的方法,二是对外暴露形态属性与特征接口。构造函数里把“设置”页的默认参数写死,方便直接在 MT5 里挂上就能跑。想自己扩展形态,照着枚举加一项、在类里补对应判断即可。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Enums.mqh | class=class="str">"cmt">//| 版权所有 class="num">2018, MetaQuotes 软件公司 | class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 烛条类型 | class=class="str">"cmt">//+------------------------------------------------------------------+ enum TYPE_CANDLESTICK { CAND_NONE, class=class="str">"cmt">// 未定义 CAND_MARIBOZU, class=class="str">"cmt">// Marubozu CAND_DOJI, class=class="str">"cmt">// 十字星 CAND_SPIN_TOP, class=class="str">"cmt">// 尖顶 CAND_HAMMER, class=class="str">"cmt">// 锤子 CAND_INVERT_HAMMER, class=class="str">"cmt">// 倒锤子 CAND_LONG, class=class="str">"cmt">// 长体 CAND_SHORT class=class="str">"cmt">// 短体 }; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 形态类型 | class=class="str">"cmt">//+------------------------------------------------------------------+ enum TYPE_PATTERN { NONE, HUMMER, INVERT_HUMMER, HANDING_MAN, SHOOTING_STAR, ENGULFING_BULL, ENGULFING_BEAR, HARAMI_BULL, HARAMI_BEAR, HARAMI_CROSS_BULL, HARAMI_CROSS_BEAR, DOJI_STAR_BULL, DOJI_STAR_BEAR, PIERCING_LINE, DARK_CLOUD_COVER }; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 趋势类型 | class=class="str">"cmt">//+------------------------------------------------------------------+ enum TYPE_TREND { UPPER, class=class="str">"cmt">//上行趋势 DOWN, class=class="str">"cmt">//下行趋势 FLAT class=class="str">"cmt">//横盘 }; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Pattern.mqh | class=class="str">"cmt">//| 版权所有 class="num">2018, MetaQuotes 软件公司 |
◍ 把烛条形态装进一个类里
价格行为分析若想自动化,第一步是把杂乱的 K 线识别收敛成一个可复用的结构。下面这段 MT5 代码定义了一个 CPattern 类,把趋势阈值、各类烛条系数和概率字段全塞进私有成员,调用方只需关心输出,不必重写判定逻辑。 类里用 m_threshold_value(点数为单位)和 m_trend_period 控制趋势判定粒度;m_long_coef、m_doji_coef、m_hummer_coef1/2 等则分别给长体、十字星、锤子烛条设权重。回测时若把 m_threshold_value 从 50 点调到 30 点,样本内形态命中数可能抬升约 40%,但外推到黄金 1H 图表时假信号概率倾向同步放大。 内嵌的 CANDLE_STRUCTURE 结构体只存 OHLC 与趋势枚举,轻量到能直接拿来做形态滑动窗口采样。外汇与贵金属杠杆高、滑点跳空频繁,这类识别只是概率辅助,实盘前务必在策略测试器跑够不同年份数据。
class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#include "Enums.mqh" class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| | class=class="str">"cmt">//+------------------------------------------------------------------+ class CPattern { class="kw">private: class=class="str">"cmt">//--- 权重 class="type">class="kw">double m_k1; class="type">class="kw">double m_k2; class="type">class="kw">double m_k3; class=class="str">"cmt">//--- 以点数为单位的趋势阈值 class="type">int m_threshold_value; class=class="str">"cmt">//--- 长体烛条设置系数 class="type">class="kw">double m_long_coef; class=class="str">"cmt">//--- 短体烛条设置系数 class="type">class="kw">double m_short_coef; class=class="str">"cmt">//--- 十字星烛条设置系数 class="type">class="kw">double m_doji_coef; class=class="str">"cmt">//--- Marubozu 烛条设置系数 class="type">class="kw">double m_maribozu_coef; class=class="str">"cmt">//--- 尖顶烛条设置系数 class="type">class="kw">double m_spin_coef; class=class="str">"cmt">//--- 锤子烛条设置系数 class="type">class="kw">double m_hummer_coef1; class="type">class="kw">double m_hummer_coef2; class=class="str">"cmt">//--- 预设形态的采样范围 class="type">int m_range_total; class=class="str">"cmt">//--- 判定趋势的周期 class="type">int m_trend_period; class=class="str">"cmt">//--- 已发现形态 class="type">int m_found; class=class="str">"cmt">//--- 形态发生 class="type">class="kw">double m_coincidence; class=class="str">"cmt">//--- 上行或下行走势的概率 class="type">class="kw">double m_probability1; class="type">class="kw">double m_probability2; class=class="str">"cmt">//--- 效率 class="type">class="kw">double m_efficiency1; class="type">class="kw">double m_efficiency2; class=class="str">"cmt">//--- 简单的烛条形态 class="kw">struct CANDLE_STRUCTURE { class="type">class="kw">double m_open; class="type">class="kw">double m_high; class="type">class="kw">double m_low; class="type">class="kw">double m_close; class=class="str">"cmt">// OHLC TYPE_TREND m_trend; class=class="str">"cmt">// 趋势