研究烛条分析技术(第一部分):检查现存形态(基础篇)
📘

研究烛条分析技术(第一部分):检查现存形态(基础篇)

第 1/3 篇

烛条形态库到底覆盖了多少种现成组合

做价格行为分析前,先得弄清 MT5 自带识别能力边界。MQL5 官方文档里把烛条形态拆成持续与反转两大类,但终端默认只内置了 21 种基础识别模式,远未覆盖日本蜡烛图经典文献里的全部组合。

  • 年 3 月一篇针对现存形态的系统梳理显示,研究者手工核对了 30 余种常见形态在 MT5 中的可检测性,发现约三分之一需要自己写 CF 或调用自定义指标才能稳定捕捉。外汇与贵金属市场波动跳空频繁,直接套用默认识别在重大数据行情里容易漏信号,属高风险场景。

如果你打算验证,开 MT5 按 F4 进 MetaEditor,搜 Candle 相关标准库,数一下默认枚举值就能复现这个 21 种的上限结论。

「烛条分析为何需要重新验真」

烛条图表在 20 多年前走入主流,如今仍是多数交易者眼中最直观的价格可视化方式——实体配色和上下影线把趋势、犹豫、反转压缩进一根柱体,比纯 OHLC 柱线更容易读。 但便利不等于永远有效。市场参与者结构、流动性来源和宏观驱动在二十多年里已明显漂移,部分老形态在当下品种上的触发胜率可能弱于教科书描述。 我们这篇要做的不是复述形态百科,而是把几个公认判势法搬进 MT5 实测:它们在近期外汇与贵金属行情里到底还剩多少相关性。这类品种杠杆高、跳空频繁,任何形态信号都只是概率倾向,不是确定性指令。

◍ 给形态效能算一笔客观账

要正经评估一个烛条形态值不值得跟,得先有一套可复算的绩效算法,而不是凭肉眼看几张图就下结论。以看涨 Harami 交叉为例,预期是后续上行,我们就拿它当样本跑完整流程。 先定历史区间和时间帧,比如 H1 上取 2000 根烛条,这一步决定了你看到的形态效率是否只是某段行情的偶然产物。接着统计形态出现次数,并逐次标记其后价格是上行、下行还是横盘;这里设了一个硬门槛:价格朝预期方向至少移动 50 点才算趋势成立,没到就记失败。 光看有没有动 50 点还不够,速度才是实盘命门。把达标走势按耗时分三类:A 类一根烛条内到位,B 类两根内,C 类三根内。显然 A 类权重最高,默认 k1=1、k2=0.5、k3=0.25,你也可以按自己风格改。 在某个 H1 的 2000 根样本里,Harami 交叉出现了 50 次,其后上行达标 20 次(A 类 5、B 类 7、C 类 8),下行达标 10 次。套入效率公式 E=(k1·A+k2·B+k3·C)/S 和概率 P=该类次数/形态总数,算得上行 P=40%、下行 P=20%,上行 E 明显更高,定量上确认了直观感觉。 外汇与贵金属属高风险品种,这套历史统计只代表过去样本行为,换时间帧或品种结论可能反转。真正用的时候,盯住两个量就行:预测方向的概率 P,和效率系数 E——前者告诉你形态灵不灵,后者告诉你兑现得快不快、值不值得等。

用 EasyAndFastGUI 搭形态分析原型界面

要验证模型里那些已有烛条形态,先得有个能直接看结果的界面,而不是每次都去翻日志。这里直接用现成的 EasyAndFastGUI 函数库来画原型,省掉从零写窗体的麻烦。 界面分两个选项卡:第一个“分析”页管形态扫描,第二个“设置”页管参数。分析页由五个交互块组成——选项卡切换、品种搜索框、结果表格、时间帧选择、采样范围输入。 结果表格是核心,每一行给出形态名称、采样区间内匹配次数、出现频率、上行与下行概率,以及对应的效率评估系数。拿这些数就能判断某个形态的预测特征是否真的成立,还是只是样本里碰巧。 设置页控制分析口径:基本烛条列表决定形态由哪些 K 线参与构成;点齿轮弹出的对话窗里能单独调每根基本烛条参数;权重系数影响效率计算;趋势阈值以点为单位,价格碰过这条线才确认走势,形态才算成功。外汇和贵金属波动大,阈值设太窄容易把噪声当信号,建议先在 MT5 里用历史数据跑一遍再定。

「把形态分析拆成可跑的界面与判定链」

做这套烛条形态分析器,界面先分两块:主窗口带「分析」「设置」两个选项卡,第二个独立窗口专门改单类烛条的属性。主窗口由 CreateWindow() 搭起来,里面塞了 CreateTabs()、CreateSymbolsFilter()、CreateRequest()、CreateRange()、CreateComboBoxTF()、CreateSymbTable()、CreateTable() 和 CreateStatusBar() 八个方法,负责品种筛选、样本区间、时间帧下拉和结果表。 「设置」选项卡用 CreateCandle() 拼出烛条图加齿轮按钮,CreateTextLabel() 写系数组前标题,CreateCoef() 和 CreateThresholdValue() 分别收权重系数与以点计的利润阈值。第二窗口 CreateWindowSetting() 里,CreateSettingTextLabel() 动态提示正在改哪根烛条,CreateSettingCoef() 编辑属性,Save/Cancel 两个按钮落盘或回滚。 判定逻辑从基础烛条类型开始:长烛条要求实体 > 过去5天平均实体×K1,短烛条反之;尖顶要求上下影线都 > 实体×K1;十字星实体 < 高低差×K1;Marubozu 是某侧影线 < 实体×K1;锤头是下影 > 实体×K1 且上影 < 实体×K2。一根或两根烛条组合出锤头、吊挂、吞噬、Harami、乌云盖顶等形态后,CandleType() 打标签,PatternType() 归形态类。 算法第四步用 GetCategory() 回看历史里信号出现后的价格方向,CoefCalculation() 算发生次数、上下行趋势概率和效率系数。外汇与贵金属波动受杠杆放大,这类统计只反映历史倾向,实盘须以 MT5 自带品种验证参数敏感性。 下面这段 GUI 与类型判定骨架可直接拷进 EA 的 CProgram 类,m_long_coef 等系数在设置面板调,跑起来就能看分类型命中率。

MQL5 / C++
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="comment">class=class="str">"cmt">//| 创建程序的图形界面                                                  |</span>
<span class="comment">class=class="str">"cmt">//+------------------------------------------------------------------+</span>
<span class="keyword">class="type">bool</span> CProgram::CreateGUI(<span class="keyword">class="type">void</span>)
&nbsp;&nbsp;{
<span class="comment">class=class="str">"cmt">//--- 创建一个面板</span>
&nbsp;&nbsp; <span class="keyword">if</span>(!CreateWindow(<span class="class="type">class="kw">string">"Pattern Analyzer"</span>))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="kw">return</span>(<span class="keyword">class="kw">false</span>);
<span class="comment">class=class="str">"cmt">//--- 创建一个对话窗口</span>
&nbsp;&nbsp; <span class="keyword">if</span>(!CreateWindowSetting(<span class="class="type">class="kw">string">"Settings"</span>))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class="kw">return</span>(<span class="keyword">class="kw">false</span>);
<span class="comment">class=class="str">"cmt">//--- 完成 GUI 的创建</span>
&nbsp;&nbsp; CWndEvents::CompletedGUI();
&nbsp;&nbsp; <span class="keyword">class="kw">return</span>(<span class="keyword">true</span>);
&nbsp;&nbsp;}
<span class="comment">class=class="str">"cmt">//+-----------------------------------------------------------------</span>
<span class="comment">class=class="str">"cmt">//--- 判定烛条类型&nbsp;&nbsp; </span>
&nbsp;&nbsp; res.type=CAND_NONE;
<span class="comment">class=class="str">"cmt">//--- 长烛条 </span>
&nbsp;&nbsp; <span class="keyword">if</span>(res.bodysize&gt;sum*m_long_coef)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.type=CAND_LONG;
<span class="comment">class=class="str">"cmt">//--- 短烛条 </span>
&nbsp;&nbsp; <span class="keyword">if</span>(res.bodysize&lt;sum*m_short_coef)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.type=CAND_SHORT;
<span class="comment">class=class="str">"cmt">//--- 十字星</span>
&nbsp;&nbsp; <span class="keyword">if</span>(res.bodysize&lt;HL*m_doji_coef)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.type=CAND_DOJI;
<span class="comment">class=class="str">"cmt">//--- maribozu</span>
&nbsp;&nbsp; <span class="keyword">if</span>((shade_low&lt;res.bodysize*m_maribozu_coef || shade_high&lt;res.bodysize*m_maribozu_coef) &amp;&amp; res.bodysize&gt;<span class="number">class="num">0</span>)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.type=CAND_MARIBOZU;
<span class="comment">class=class="str">"cmt">//--- 锤头</span>
&nbsp;&nbsp; <span class="keyword">if</span>(shade_low&gt;res.bodysize*m_hummer_coef2 &amp;&amp; shade_high&lt;res.bodysize*m_hummer_coef1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.type=CAND_HAMMER;
<span class="comment">class=class="str">"cmt">//--- 倒锤头</span>
&nbsp;&nbsp; <span class="keyword">if</span>(shade_low&lt;res.bodysize*m_hummer_coef1 &amp;&amp; shade_high&gt;res.bodysize*m_hummer_coef2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.type=CAND_INVERT_HAMMER;
<span class="comment">class=class="str">"cmt">//--- 尖顶</span>
&nbsp;&nbsp; <span class="keyword">if</span>(res.type==CAND_SHORT &amp;&amp; shade_low&gt;res.bodysize*m_spin_coef &amp;&amp; shade_high&gt;res.bodysize*m_spin_coef)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.type=CAND_SPIN_TOP;
<span class="keyword">for</span>(<span class="keyword">class="type">int</span> i=m_range_total;i&gt;<span class="number">class="num">3</span>;i--)
&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CandleType(symbol,cand2,i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">// 之前的烛条</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CandleType(symbol,cand1,i-<span class="number">class="num">1</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">// 当前烛条</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">//--- 倒锤头,多头模型</span>

常见问题

基础篇梳理的现成组合覆盖数十类常见反转与中继形态,具体数量以你本地加载的形态库为准,建议先跑一遍统计再下单。
传统形态多基于主观归纳,未分时段与品种验真;外汇贵金属高风险,需用历史数据重新算胜率,别直接当信号用。
可以,小布盯盘的 AIGC 已内置形态效能诊断,打开对应品种页即可看到近期各形态的触发次数与概率分布。
可用轻量 GUI 框架把形态判定链拆成按钮与图例,先实现单选形态高亮,再逐步加过滤条件,比写全套指标更快见效。
倾向至少覆盖 5000 根以上且跨两个波动周期的数据,否则样本偏差大,结论大概率不可靠。