烛条形态函数库:把形态研究变成可复用的代码模块(基础篇)
📚

烛条形态函数库:把形态研究变成可复用的代码模块(基础篇)

(1/3)·手工测算锤子线胜率太慢?一套函数库让指标、面板、EA 直接调用形态数据

含代码示例 第 1/3 篇
很多交易者把烛条形态研究停留在截图数K线,结果换周期就得重算一遍。用自定义工具把形态信息数组化,才能在新品种上秒级复用。外汇贵金属波动剧烈,手工统计容易漏掉关键反转信号。

「给烛条形态写一套可复用的函数库」

在 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 里挂上就能跑。想自己扩展形态,照着枚举加一项、在类里补对应判断即可。

MQL5 / C++
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 与趋势枚举,轻量到能直接拿来做形态滑动窗口采样。外汇与贵金属杠杆高、滑点跳空频繁,这类识别只是概率辅助,实盘前务必在策略测试器跑够不同年份数据。

MQL5 / C++
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">// 趋势
让小布替你跑这套
这些形态诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到效率系数和发生频率,不必自己编译函数库也能先验证想法。

常见问题

CandleType 定义单根烛条的分类如锤子线,PatternType 则是多根烛条组合的形态类别,二者是输入与组合的关系。
目前小布内置的是形态频率和概率的可视化结果,若你想用自己的 EA 调用,可参考本文函数库结构自行桥接。
它们分别调节不同评估维度的占比,改变后效率系数会重算,建议在历史样本上对比再固定参数。
趋势阈值过滤掉无方向震荡,点数界定有效波动,避免把噪音当成形态信号,提升后续概率参考价值。