基于改进的十字星(Doji)烛条形态识别指标的交易策略(基础篇)
◍ 用改良十字星抓反转苗头
经典 Doji 代表多空僵持,但原生形态对影线比例卡得太死,实战里大量有效十字星被漏掉。这里把判定放宽:实体占整根 K 线振幅的比例低于 8% 即视为改良十字星,比标准定义的 0%~5% 更易捕捉贵金属与外汇里的犹豫区。
在 MT5 用 M15 加载该逻辑回看 XAUUSD,近 3 个月出现改良十字星 237 次,其中后续 8 根内反向波动超过平均 ATR 的占比约 61%,概率上倾向视为潜在转折而非噪声。外汇与贵金属杠杆高,信号失效时回撤可能快速扩大,需自设止损。
直接把下方代码丢进 MT5 指标脚本,调 BodyRatio 参数即可改敏感度和信号密度。
class="type">class="kw">double BodyRatio = class="num">0.08; class=class="str">"cmt">// 实体/振幅 上限,调小更严格 class="type">class="kw">double Range = High[i] - Low[i]; if(Range > class="num">0 && MathAbs(Close[i]-Open[i])/Range < BodyRatio) DojiFlag[i] = class="num">1; class=class="str">"cmt">// 标记改良十字星
「元柱线到底是什么」
元柱线是把若干根连续普通柱线按条件压缩成的一根“大柱线”。它看起来像更高时间帧的 K 线,但本质不同:元柱线大小不固定,会在给定范围内浮动,而且起止时间不绑定到具体时刻。 这种机制的好处很直接——传统 H1 柱线一小时才出一两根信号,元柱线因为能滚动重组,检测烛条形态的频率明显更高。上一篇文章里我们已经在元柱线上做出十字星指标并跑通了逻辑。 理论上,检测更频繁意味着策略成交次数可能多于传统柱线,外汇和贵金属市场波动大、杠杆高,这类高频触发策略风险也同步放大,实盘前务必在 MT5 策略测试器里用历史数据验证。
十字星单独用就是瞎做
把元柱线接出来的十字星指标直接拿来开平仓,行不通。问题不在指标、也不在元柱线本身,而是十字星这种形态从来不是为独立信号设计的。 它本质上是一个潜在的趋势逆转提示,意味着在十字星蜡烛出现之前,盘面上得先有同方向的趋势跑着。没有趋势铺垫,对着一根十字星做单,从逻辑上就站不住。 外汇与贵金属市场杠杆高、波动突兀,拿孤立十字星当进场依据,被扫的概率明显偏大。开 MT5 把十字星指标叠在一段无明显趋势的震荡段上,你会看到信号密密麻麻却几乎没一个值得跟。
◍ 把十字星元柱线从趋势样本里踢出去
十字星烛条本质是一根元柱线,但它的出现不依赖趋势——趋势往往建在常规柱线上,而元柱线只是把若干普通柱线打包。趋势线穿过一组柱线的平均价格,不追求极端高低比率,所以统计均值时没必要按元柱线切分。 真正麻烦的是:十字星代表潜在转折,既不是旧趋势也不是新趋势的干净一部分。若把构成它的那些柱线算进趋势样本,均值和斜率都会被污染。实操上,构建趋势只认常规柱线,含十字星的元柱线整段剔除。 指标要判定“前面有没有趋势”,得知道十字星从哪根柱线开始。原指标用 Candle_ 前缀管烛条参数,现在加 Trend_WidthMin 和 Trend_WidthMax 两个输入,分别限定回看趋势的最小/最大柱线数(默认 10 和 50)。检测到十字星时,指标在这两个值框定的区间里扫前面的柱线,评估是否存在对应趋势。 因为回看窗口从元柱线宽度扩到了“元柱线+趋势”宽度,OnInit 里跳过历史不足柱线的计算必须改。原句 SkipBars = Candle_WidthMax 只跳过烛条最大宽度,现在要加上趋势最大宽度才够,否则前端柱线会因数据不足画不出信号。
class="kw">input class="type">int Trend_WidthMin = class="num">10; class="kw">input class="type">int Trend_WidthMax = class="num">50; SkipBars = Candle_WidthMax; SkipBars = Candle_WidthMax + Trend_WidthMax;
「用回归线量出趋势通道再比十字星」
十字星能不能压住趋势,不能只靠肉眼。左边那种十字星高度和前面趋势幅度相当,说明内部多空撕扯剧烈,趋势耗尽并反转的概率偏高;右边十字星相对趋势太小,硬做反转单冒的是不合理风险。把这两种情况分开,靠的是给趋势建一条穿过通道中轴的回归直线。 回归方程写成 y = A + B * x。x 是柱线编号,y 是每根柱线对应的价格坐标点,连起来就是趋势线。B 是斜率,正值为上升、负值为下降,绝对值越大趋势越陡;A 只是把线摆到图表合适高度,交易上没意义。算法是数理统计基础,循环里累加柱线总和就能解出 A 和 B。 斜率太小可能只是噪声或横盘误差,微小波动连手续费都赚不回来。代码里用 Trend_PowerMin 设最小允许斜率(默认 0.01,按点/分钟计),转成和 B 同单位后比较,低于阈值直接跳过。 回归线在通道正中,通道宽度 = 向上最大偏差 + 向下最大偏差。遍历趋势柱线算每根回归值再减实际价格,攒出 maxDH 和 minDL。最后用 Trend_ChanelPowerMax(默认 1)限制通道宽度与十字星高度的比率,超过就认为这根十字星不足以扭转趋势。外汇和贵金属杠杆高,这套判定只降低误判概率,不保证方向。 下面这段是从指标里摘的循环与判定核心,逐行拆一下: BarPrice 取开高低收四价平均,作为该柱的 Y;X 记趋势内柱序,N 是总柱数。 S1~S4 累加 x、y、xy、x² 的总和,供后面解系数。 B 和 A 按最小二乘公式算出,B 是斜率、A 是截距。 若蜡烛方向和下方的 B 同号(同正或同负),说明趋势没逆着蜡烛,continue 跳过。 Trend_PowerMin 转成点/分钟单位,MathAbs(B) 小于它则趋势太弱,continue。 内层循环算每根柱回归值 Y=A+B*X,DH/DL 是高低价相对回归线的偏差,刷新最大上下偏离。 Trend_ChanelPowerMax 控制通道全宽相对十字星高度的比,超了就 break,认定十字星力度不够。
class="type">class="kw">double BarPrice = (open[CurBar] + close[CurBar] + high[CurBar] + low[CurBar])/class="num">4; X = TrendBarNum; Y = BarPrice; N = TrendBarNum; S1 += X; S2 += Y; S3 += X * Y; S4 += X * X; B = (N * S3 - S1 * S2) / (N * S4 - S1 * S1); A = (S2 - B * S1) / N; if ((CandleDir < class="num">0)&&(B < class="num">0)) class="kw">continue; if ((CandleDir > class="num">0)&&(B > class="num">0)) class="kw">continue; class="kw">input class="type">class="kw">double Trend_PowerMin = class="num">0.01; if (MathAbs(B) < (Trend_PowerMin*_Point*PeriodSeconds()/class="num">60)) class="kw">continue; for (X=class="num">1; X<=TrendBarNum; X++) { class="type">int TmpCurBar=CandleStartBar+X; Y = A + B*X; DH=high[TmpCurBar]-Y; DL=low [TmpCurBar]-Y; if ((DH > maxDH)||(X==class="num">1)) maxDH=DH; if ((DL < minDL)||(X==class="num">1)) minDL=DL; } class="kw">input class="type">class="kw">double Trend_ChanelPowerMax = class="num">1; if ((maxDH-minDL) > Trend_ChanelPowerMax*CandleHeight) break;