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