📘

「用十字星验证改良形态识别思路」

「用十字星验证改良形态识别思路」

在 MT5 里做形态识别,最容易被误导的就是把经典 Doji 定义当成铁律:实体极小、上下影线明显。实际行情里,不同品种的最小跳动点和平均波幅差异极大,用固定点数去判定「实体极小」会漏掉很多有效信号。 以 EURUSD 为例,日线常态平均实体约 30~50 点,而 XAUUSD 常态平均实体常超 1000 点;若统一用 5 点内算 Doji,黄金几乎永远不出现十字星,识别逻辑就失真了。 改进方向是按品种近期 N 根 K 线的 ATR 或中位数实体做相对阈值,再结合影线比例过滤。这样在同一套代码里切换品种,才不会把高波动贵金属的常态误判成无意义噪声。 打开 MT5 新建指标,把下面这段相对阈值判定接进 OnCalculate,就能直接看改良后的 Doji 标记是否贴合你常做的品种节奏。

MQL5 / C++
class="type">int OnCalculate(class="kw">const class="type">int rates_total,
                 class="kw">const class="type">int prev_calculated,
                 class="kw">const class="type">class="kw">datetime &time[],
                 class="kw">const class="type">class="kw">double &open[],
                 class="kw">const class="type">class="kw">double &high[],
                 class="kw">const class="type">class="kw">double &low[],
                 class="kw">const class="type">class="kw">double &close[],
                 class="kw">const class="type">long &tick_volume[],
                 class="kw">const class="type">long &volume[],
                 class="kw">const class="type">int &spread[])
{
   class="type">int start = prev_calculated > class="num">0 ? prev_calculated - class="num">1 : class="num">1;
   for(class="type">int i = start; i < rates_total; i++)
   {
      class="type">class="kw">double body = MathAbs(close[i] - open[i]);
      class="type">class="kw">double range = high[i] - low[i];
      class=class="str">"cmt">// 相对阈值:实体小于近期平均波幅的 class="num">10% 视为十字星候选
      class="type">class="kw">double avg_range = class="num">0;
      class="type">int period = class="num">20;
      for(class="type">int j = i; j > i - period && j >= class="num">0; j--)
         avg_range += high[j] - low[j];
      avg_range /= period;
      if(body < avg_range * class="num">0.1 && range > class="num">0)
         BufferDoji[i] = low[i]; class=class="str">"cmt">// 标记十字星
   }
   class="kw">return rates_total;
}

◍ 烛条形态为何轻量却藏着硬伤

烛条形态最容易被接受的一点就是轻:描述往往几句话就能说清,实战里盯两三根甚至一根柱线就能做判断,新手也能直接上手。 它不挑设备也是事实。分析过程不加载任何吃算力的指标,几十年前电脑远不如现在时,这点尤为关键——不少经典形态恰恰是在那个算力贫瘠的年代被定义出来的。 但轻量背后有个绕不开的瑕疵:形态有效性被柱线数量死死限制住,也就是只对特定市况下的少数几根 K 线敏感,一旦波动结构拉长或变形,交易效率就会明显打折。 这个瑕疵靠人脑很难系统性抵消,但用 MT5 的自动遍历把几十年前的形态放到现在多品种、多周期里去回测,就有机会把它的适用边界量出来。外汇与贵金属杠杆高、滑点随机,这类统计结论只代表概率倾向,不等于可无脑跟。

同一波走势为何在图表上长不一样

标准烛条把行情切成固定的 4 小时(或别的周期)一段,起点和终点都是硬编码的。但真实的价格事件常常跨越多根柱线,比如一段从 H4 第 2 根中间发起、延续到第 5 根才结束的波动,在 H4 图表上完全看不出结构,切到更低周期却清清楚楚。 拿墓碑 Doji 说事最直观:开盘收平价平、上影极长、下影几乎为零,传统上视作趋势衰竭的潜在反转信号。H4 图表里你找不到这种烛条,但把同一时段切到 H1,会看到编号 1–5 的柱线收盘价与次根开盘价基本吻合,拼起来就是一根标准墓碑 Doji;编号 6–9、7–9 同理。这类跨周期拼出来的形态,可称为「元柱线」。 关键在边界:H4 柱线起点锁死在整点,若把周期偏移 1 小时或长度差 1 小时,拼出的元柱线形态就完全不同。实测中仅上述 H1 片段就能还原出至少 3 组隐藏 Doji,说明标准时间帧让我们漏掉的不止一两个信号,漏形态等于漏掉潜在的入场提示。外汇和贵金属波动受数据面驱动,这类错失在重大数据夜概率更高,属高风险场景。 手动翻小周期拼图不现实,几组下来就耗掉半天。能让 MT5 自己扫全周期、把符合条件的元柱线标出来的指标,才是能立刻用上的解法。

「用相对强度过滤掉噪音 Doji」

基础版 Doji 指标会把任何满足实体/影线比例阈值的元柱线都标出来,但形态尺寸差异极大。实测中,宽度 1~4 根普通柱线拼出的元柱线,总高度可能只有 2*h(h 为单根柱线统计平均高度),这类微型形态往往只是噪音,作为趋势转折信号的实际价值为 0。 若直接设绝对高度下限 Candle_HeightMin = 2*h,对单柱线有效,但对元柱线会失真:4 根中等高度柱拼出的 2*h 元柱线会被误判为有效,而强制设 4*h 又会漏掉宽度 1 时的 2*h、3*h 好形态。 解法是把高度阈值改为相对值——单位时间高度,即 Candlestick Height/Width,用点数表达后可脱离具体货币对。这样无论元柱线由 1 根还是 4 根柱组成,强度过滤器都等价可用。 下方代码给出了输入参数与 OnCalculate 内的筛选判断:BodyPowerMax、ShadowPowerMax 默认 0.2,WidthMin/Max 控制回溯根数,HeightPowerMin 以点数/分钟衡量强度,低于阈值直接判非 Doji。外汇与贵金属波动剧烈,此类形态仅作辅助参考,信号失效概率不低。

MQL5 / C++
class="kw">input class="type">class="kw">double  Candle_BodyPowerMax      = class="num">0.2;    class=class="str">"cmt">// Maximum body height relative to the candlestick height
class="kw">input class="type">class="kw">double  Candle_ShadowPowerMax   = class="num">0.2;    class=class="str">"cmt">// Maximum shadow height relative to the candlestick height
class="kw">input class="type">int     Candle_WidthMin         = class="num">1;      class=class="str">"cmt">// Minimum candlestick width in bars
class="kw">input class="type">int     Candle_WidthMax         = class="num">2;      class=class="str">"cmt">// Maximum candlestick width in bars
SkipBars = Candle_WidthMax;
PlotIndexSetInteger(class="num">0, PLOT_DRAW_BEGIN, SkipBars);
class="kw">input class="type">class="kw">double  Candle_HeightMin        = class="num">0.01;   class=class="str">"cmt">// Minimum candlestick height(in absolute prices)
class="kw">input class="type">class="kw">double  Candle_HeightPowerMin   = class="num">0.5;    class=class="str">"cmt">// Candlestick power = Height/Width, points per minute
if ((CandleHeight/CandleWidth/_Point) < (Candle_HeightPowerMin*PeriodSeconds()/class="num">60)) DojiExists = class="kw">false;

◍ 元柱线把 Doji 检出率拉高六倍

在 EURUSD H4 上先跑经典单根版本:Candle_WidthMin/Max 都设 1,实体与影线占比阈值 0.2,高度过滤归零。这样只抓单根 Doji,两个月图表里总共只有 9 个信号。 把时间帧切到 H1,宽度参数改成 4,等于用四根 H1 拼出和 H4 等宽的元柱线,但起点从整 4 小时变成每小时滚动。同价格区间两个月检出 54 个 Doji,是单根写法的 6 倍,差异来自起点灵活度而非宽度本身。 宽度放宽到 3–5 根 H1 后信号更多,且出现了终端根本没有的 H5 等价形态。进一步下沉到 M1,宽度设 180–300,等价于 3–5 个 H1 但起点精确到分钟,能拼出 199 M1(约 3.32 H1)这类非整数时间帧,单图叠加数百种传统交易者从不用的时间尺度,信号量级冲到数千。 噪音随之爆炸:因为没开高度过滤,很多形态只是波动杂讯,同一段价格可同时是向上和向下 Doji 的一部分。把 Candle_HeightPowerMin 调到 2 后,只剩强形态,序列方向统一。M1 宽元柱线打开的是传统静态形态研究不到的动态维度,值得在 MT5 里自己加载验证。

元柱线还能往哪挖

实验数据已经说明,元柱线(Meta-Candle)相比传统 H4 固定边界,能在偏移 1 小时或长度差 1 小时的重构里多出一批原本看不见的 Doji 形态;评论区有人指出,仅 1 小时边界位移就会令结果产生明显差异,这意味着标准 TF 下漏掉的信号量可能不小。 这套方法并不只服务于 Doji:把 5、4、3 小时真实价格运动重排后,其他经典形态也能获得同样的「生存期跟踪」视角,在 M1 上甚至能连续刷出同一形态的不同阶段指示。 不过得泼点冷水——文章没拿它实盘跑过,元柱线也不是交易信号;外汇和贵金属市场高波动、高杠杆,直接跟单风险很大,真要下单还得叠常规柱线分析做二次确认。 若后续想验证,把附带的 MetaDoji.mq5 拖进 MT5 看历史重绘,数数你常用品种上「多出来」的 Doji 有几个成了之后的拐点,比空谈更有用。

常见问题

同一波走势因图表周期和报价源不同,烛条形态会呈现差异。验证时固定周期与品种再比对,别跨周期硬套。
单纯看影线实体易把噪音当信号。用相对强度先过滤低波动区的十字星,能明显减少无效触发。
小布可基于当前品种波动与相对强度,自动标注高检出质量的十字星,省去你手动翻图过滤。
先从欧美、黄金这类流动性高、影线结构清晰的品种试。回看最近两周元柱线标记,统计假信号比例。
用历史数据跑检出率与后续反转比例,记录每笔触发后的实际走向。只信可重复的数字,不靠感觉。