分析烛的图案·进阶篇
(2/3)· 接上篇基础概念,这一篇把长烛、无影烛、十字星与陀螺的实战辨识讲透
双K线形态识别的分支逻辑
这段逻辑在 MT5 脚本里专门处理两根相邻蜡烛的组合判定,先盯趋势方向再盯单根类型,外汇和贵金属以外的品种会走另一套分离条件。 射击之星熊势模型要求两根 K 线都处于 UPPER 趋势且第二根为反转锤线(CAND_INVERT_HAMMER)。外汇品种下,若前一根收盘 ≤ 当前开盘才会触发 DrawSignal;非外汇则要求前收 < 今开且前收 < 今收,也就是第二根和第一根明显脱离。 执带线部分只看非外汇:牛势需 cand2 处 DOWN 趋势、cand2 为阳长无影(CAND_MARIBOZU_LONG)、cand1 为阴且主体更小、cand2 收盘低于 cand1 收盘;熊势对称翻转。吞噬牛势则要求 cand1、cand2 同在 DOWN 趋势,cand1 阴、cand2 阳且主体更大。 开 MT5 把下面代码塞进你的形态扫描 EA,把 _forex 设为 true 跑 EURUSD,再改成 false 跑 XAUUSD,能直接看到两类品种触发条件的差异。外汇与贵金属波动剧烈,信号仅代表概率倾向,实盘需自担风险。
if(cand1.trend==UPPER && cand2.trend==UPPER && class=class="str">"cmt">//检查趋势方向 cand2.type==CAND_INVERT_HAMMER) class=class="str">"cmt">// 检查反转锤线 { comment=_language?"射击之星"; if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close<=cand2.open) class=class="str">"cmt">// 收盘价小于等于开盘价 { DrawSignal(prefix+"射击之星熊势模型"+class="type">class="kw">string(objcount++),cand2,InpColorBear,comment); } } else { if(cand1.close<cand2.open && cand1.close<cand2.close) class=class="str">"cmt">// 第二个烛形与第一个分离 { DrawSignal(prefix+"射击之星熊势模型"+class="type">class="kw">string(objcount++),cand2,InpColorBear,comment); } } } class=class="str">"cmt">//------ class=class="str">"cmt">// 执带线牛势模型 if(cand2.trend==DOWN && cand2.bull && !cand1.bull &&class=class="str">"cmt">// 检查趋势的方向和烛形的方向 cand2.type==CAND_MARIBOZU_LONG && class=class="str">"cmt">// 检查 "长" 无影烛 cand1.bodysize<cand2.bodysize && cand2.close<cand1.close) class=class="str">"cmt">// 第一个烛形的主体比第二个烛形的主体短,第二个烛形的收盘价比第一个烛形收盘价低 { comment=_language?"执带线"; if(!_forex)class=class="str">"cmt">// 如果不是外汇交易 { DrawSignal(prefix+"执带线牛势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } } class=class="str">"cmt">// 执带线熊势模型 if(cand2.trend==UPPER && !cand2.bull && cand1.bull && class=class="str">"cmt">// check the trend direction and direction of the candlestick cand2.type==CAND_MARIBOZU_LONG && class=class="str">"cmt">// 检查 "长" 无影烛 cand1.bodysize<cand2.bodysize && cand2.close>cand1.close) class=class="str">"cmt">// 第一个烛形的主体高度比第二个烛形短,第二个烛形的收盘价比第一个烛形收盘价高 { comment=_language?"执带线"; if(!_forex)class=class="str">"cmt">// 如果不是外汇交易 { DrawSignal(prefix+"执带线熊势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } class=class="str">"cmt">/* 检查两个烛形的图案 */ CANDLE_STRUCTURE cand2; cand2=cand1; if(!RecognizeCandle(_Symbol,_Period,time[i-class="num">1],InpPeriodSMA,cand1)) class="kw">continue; class=class="str">"cmt">//------ class=class="str">"cmt">// 吞噬牛势模型 if(cand1.trend==DOWN && !cand1.bull && cand2.trend==DOWN && cand2.bull && class=class="str">"cmt">// 检查趋势方向和烛形的方向 cand1.bodysize<cand2.bodysize) class=class="str">"cmt">// 第二个烛形的主体高于第一个烛形 { comment=_language?"吞噬";
◍ 吞噬与十字胎的判定分叉点
外汇和其余品种(如贵金属、指数)在 K 线主体包容关系上用了两套阈值:外汇允许烛形主体边界刚好接触(>=、<=),非外汇则要求严格穿入(>、<)。这一差别直接决定信号会不会被画出来,在 MT5 里跑同一段逻辑,EURUSD 和 XAUUSD 可能给出不同数量的标注。 下面这段是牛势吞噬的核心分支。外汇条件下,前一根收盘 ≥ 后一根开盘且前一根开盘 < 后一根收盘,即视为前烛主体被后烛包容;非外汇则把等号去掉。 if(_forex)// 如果是外汇交易 { if(cand1.close>=cand2.open && cand1.open<cand2.close) // 第一个烛形的主体在第二个烛形主体之内 { DrawSignal(prefix+"吞噬牛势模型"+string(objcount++),cand1,cand2,InpColorBull,comment); } } else { if(cand1.close>cand2.open && cand1.open<cand2.close) // 第一个烛形的主体在第二个烛形主体之内 { DrawSignal(prefix+"吞噬牛势模型"+string(objcount++),cand1,cand2,InpColorBull,comment); } } 熊势吞噬在趋势与多空方向之外,额外卡了 bodysize:后一根实体必须大于前一根(cand1.bodysize<cand2.bodysize),才认定吞没有效。十字胎则换思路——下跌长实体后接 Doji,且 Doji 全落在前烛实体内部(外汇下 cand1.close<=cand2.open && cand1.close<=cand2.close && cand1.open>cand2.close)才触发。 外汇与贵金属均属高杠杆品种,这类形态只提示概率倾向,实盘前先在策略测试器用历史数据核对信号密度,再决定是否接警报。
if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close>=cand2.open && cand1.open<cand2.close) class=class="str">"cmt">// 第一个烛形的主体在第二个烛形主体之内 { DrawSignal(prefix+"吞噬牛势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } } else { if(cand1.close>cand2.open && cand1.open<cand2.close) class=class="str">"cmt">// 第一个烛形的主体在第二个烛形主体之内 { DrawSignal(prefix+"吞噬牛势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } } class=class="str">"cmt">// 吞噬熊市模型 if(cand1.trend==UPPER && cand1.bull && cand2.trend==UPPER && !cand2.bull && class=class="str">"cmt">// 检查趋势的方向和烛形的方向 cand1.bodysize<cand2.bodysize) class=class="str">"cmt">// 第二个烛形的主体高于第一个烛形 { comment=_language?"吞噬"; if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close<=cand2.open && cand1.open>cand2.close) class=class="str">"cmt">//第一个烛形的主体在第二个烛形主体之内 { DrawSignal(prefix+"吞噬熊势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } else { if(cand1.close<cand2.open && cand1.open>cand2.close) class=class="str">"cmt">// 第一个烛形收盘价小于等于第二个烛形开盘价,或者第一个烛形开盘价大于等于第二个烛形收盘价 { DrawSignal(prefix+"吞噬熊势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } } class=class="str">"cmt">//------ class=class="str">"cmt">// 十字胎牛势模型 if(cand1.trend==DOWN && !cand1.bull && class=class="str">"cmt">// 检查趋势的方向和烛形的方向 (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU_LONG) && cand2.type==CAND_DOJI) class=class="str">"cmt">// 检查第一个是否为 "长烛" 及第二个是否为十字星 { comment=_language?"""十字胎"; if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close<=cand2.open && cand1.close<=cand2.close && cand1.open>cand2.close) class=class="str">"cmt">// 十字星在第一个烛形主体之内 { DrawSignal(prefix+"十字胎牛势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } } else {
「十字胎与孕线的判定分支」
在 MT5 自定义指标里,十字胎(Harami Cross)和孕线(Harami)的识别靠前后两根烛形的位置关系硬判,不依赖任何指标缓冲。外汇品种因为点差和报价精度,判定阈值比普通品种放宽了一档:外汇模式下用 >= / <= 包容边界,非外汇则用严格大小比较。
以十字胎牛势为例,前置条件是前一根为下降趋势中的阴线长烛或光头光脚阴长烛,后一根为十字星;外汇分支要求后一根十字星的 open、close 均不高于前一根 close,且前一根 open 高于后一根 close,即十字星主体被包进前一根实体。
孕线牛势进一步要求后一根不是十字星,且前一根 bodysize 严格大于后一根 bodysize——这是过滤掉“假孕”的关键数值约束。实盘里黄金 XAUUSD 的 M15 上,这类形态出现后 3~5 根内反转的概率偏高,但外汇和贵金属杠杆高,信号失效时回撤可能吞掉前段利润,验证时请先用策略测试器跑历史样本。
下面这段是熊势十字胎的外汇与非外汇双分支,可直接拷进 EA 的 OnCalculate 后面做参照:
if(cand1.trend==UPPER && cand1.bull && class=class="str">"cmt">// 检查趋势的方向和烛形的方向 (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU_LONG) && cand2.type==CAND_DOJI) class=class="str">"cmt">// 检查 "长烛" 和十字星 { comment=_language?"":"Harami Cross"; if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close>=cand2.open && cand1.close>=cand2.close && cand1.close>=cand2.close) class=class="str">"cmt">// 十字星在第一个烛形主体之内 { DrawSignal(prefix+"十字胎熊势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } else { if(cand1.close>cand2.open && cand1.close>cand2.close && cand1.open<cand2.close) class=class="str">"cmt">// 十字星在第一个烛形主体之内 { DrawSignal(prefix+"十字胎熊势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } }
孕线与十字星模型的判定分支
这段逻辑在趋势方向上区分了两类反转雏形:一是孕线(第二根非十字星且实体更小),二是标准十字星(第二根 type 为 CAND_DOJI)。两者都要求第一根是长实体或光头长实体(CAND_LONG / CAND_MARIBOZU_LONG),用 cand1.bodysize>cand2.bodysize 卡掉实体不占优的干扰组合。 外汇品种(_forex==true)和非外汇品种对“包含关系”的容差不同。外汇里孕线熊势只要求 cand1.close>=cand2.open 且收在次根收盘之上,等于放宽了边界;非外汇则要求 cand1.close>cand2.open、cand1.open<cand2.close,必须真正吞没次根主体。 十字星牛势模型在下降趋势(trend==DOWN)触发,外汇判定仅需 cand1.close>=cand2.open,非外汇额外要求 cand1.close>cand2.close。熊势镜像里外汇要求 cand1.close<=cand2.open。这种阈值分裂说明:直接把非外汇的 K 线包含算法搬进 EURUSD 可能漏掉一批有效信号,外汇的高杠杆与跳空特性让边界条件必须更松。 实盘验证时建议把 _forex 开关和 DrawSignal 的 color 参数分开跑,统计两种阈值下 XAUUSD 与 GBPJPY 的触发密度差异,贵金属与交叉盘的高波动可能让非外汇分支的吞没条件过于苛刻。
if(cand1.trend==UPPER && cand1.bull && !cand2.bull && class=class="str">"cmt">// 检查趋势的方向和烛形的方向 (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU_LONG) && class=class="str">"cmt">// 检查第一个烛形是否为“长烛” cand2.type!=CAND_DOJI && cand1.bodysize>cand2.bodysize) class=class="str">"cmt">// 第二个烛形不是十字星并且第一个烛形主体大于第二个烛形主体 { comment=_language?"":"孕线"; if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close>=cand2.open && cand1.close>=cand2.close && cand1.close>=cand2.close) class=class="str">"cmt">// 十字星在第一个烛形主体之内 { DrawSignal(prefix+"孕线熊势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } else { if(cand1.close>cand2.open && cand1.close>cand2.close && cand1.open<cand2.close) class=class="str">"cmt">//十字星在第一个烛形主体之内 { DrawSignal(prefix+"孕线熊势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } } class=class="str">"cmt">//------ class=class="str">"cmt">// 十字星牛势模型 if(cand1.trend==DOWN && !cand1.bull && class=class="str">"cmt">// 检查趋势的方向和烛形的方向 (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU_LONG) && cand2.type==CAND_DOJI) class=class="str">"cmt">// 检查第一个“长烛”和第二个十字星 { comment=_language?"""十字星"; if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close>=cand2.open) class=class="str">"cmt">// 十字星开盘价小于等于第一个烛形收盘价 { DrawSignal(prefix+"十字星牛势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } } else { if(cand1.close>cand2.open && cand1.close>cand2.close) class=class="str">"cmt">// 十字星主体在第一个烛形主体之外 { DrawSignal(prefix+"十字星牛势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } } } class=class="str">"cmt">// 十字星熊市模型 if(cand1.trend==UPPER && cand1.bull && class=class="str">"cmt">// 检查趋势的方向和烛形的方向 (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU_LONG) && cand2.type==CAND_DOJI) class=class="str">"cmt">// 检查第一个“长烛”和第二个十字星 { comment=_language?"""十字星"; if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close<=cand2.open) class=class="str">"cmt">// // 十字星开盘价大于等于第一个烛形收盘价 {
◍ 穿刺线与乌云盖顶的判定分支
在双烛形扫描里,穿刺线牛势要求两段都处于 DOWN 趋势且首根为空头长烛(CAND_LONG 或 CAND_MARIBOZU_LONG),次根转为多头长烛,且次根收盘越过首根实体中点 (open+close)/2。这套条件在外汇品种上会再收紧:次根开盘必须不高于首根收盘、收盘不低于首根开盘,命中才画「云中闪烁」信号;非外汇品种则看次根开盘低于首根最低价且收盘不高于首根开盘,命中画「穿刺线」。
乌云盖顶是镜像逻辑:两段 UPPER 趋势、首根多头长烛、次根空头长烛,且次根收盘跌破首根实体中点。外汇与贵金属波动跳空频繁,这类形态在 M15 以上周期出现时反转概率倾向更高,但滑点可能吃掉形态边界,属高风险识别。
下面这段是原文里穿刺线分支的骨架,注意 _forex 分流后两套坐标约束完全不同:
if(cand1.trend==DOWN && !cand1.bull && cand2.trend==DOWN && cand2.bull &&
| (cand1.type==CAND_LONG | cand1.type==CAND_MARIBOZU_LONG) && (cand2.type==CAND_LONG | cand2.type==CAND_MARIBOZU_LONG) && |
|---|
cand2.close>(cand1.close+cand1.open)/2) { comment=_language?"穿刺线"; if(_forex) { if(cand1.close>=cand2.open && cand2.close<=cand1.open) DrawSignal(prefix+"云中闪烁"+string(objcount++),cand1,cand2,InpColorBull,comment); } else { if(cand2.open<cand1.low && cand2.close<=cand1.open) DrawSignal(prefix+"穿刺线"+string(objcount++),cand1,cand2,InpColorBull,comment); } }
if(cand1.trend==DOWN && !cand1.bull && cand2.trend==DOWN && cand2.bull && (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU_LONG) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU_LONG) && cand2.close>(cand1.close+cand1.open)/class="num">2) { comment=_language?"穿刺线"; if(_forex) { if(cand1.close>=cand2.open && cand2.close<=cand1.open) DrawSignal(prefix+"云中闪烁"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } else { if(cand2.open<cand1.low && cand2.close<=cand1.open) DrawSignal(prefix+"穿刺线"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } }
「外汇与期货的乌云盖顶判定分叉」
同一套蜡烛识别逻辑,在外汇和带有跳空属性的品种上要拆成两套条件。外汇里乌云盖顶只看两根蜡烛的收开盘包含关系:前一根收盘小于等于后一根开盘、且后一根收盘大于等于前一根开盘,就触发空头标记。 到了非外汇品种,因为存在跳空,条件换成前一根最高价低于后一根开盘、且后一根收盘大于等于前一根开盘,才画信号。这个差异直接决定你在黄金或股指上会不会漏掉跳空形成的乌云盖顶。 相逢线模型则只在非外汇分支里出信号:两根都处下行趋势、都是长实体或光头长实体、收盘价相等、前一根实体短于后一根、且前一根最低价高于后一根开盘,才标牛势;熊势反过来要求上行趋势且后一根开盘高于前一根最高价。 最低价相同模型不卡趋势方向里的牛熊标记,只要求两根同处下行、都非多头、收盘价相等且前一根实体长于后一根,便归入「最低价相同」注释。外汇贵金属波动剧烈,这类形态只提示概率倾向,实盘前务必在 MT5 用历史数据回看触发密度。
if(_forex)class=class="str">"cmt">// 如果是外汇交易 { if(cand1.close<=cand2.open && cand2.close>=cand1.open) { DrawSignal(prefix+"乌云盖顶"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } else { if(cand1.high<cand2.open && cand2.close>=cand1.open) { DrawSignal(prefix+"乌云盖顶"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } class=class="str">"cmt">// 相逢线牛势模型 if(cand1.trend==DOWN && !cand1.bull && cand2.trend==DOWN && cand2.bull && class=class="str">"cmt">// 检查趋势方向和烛形方向 (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU_LONG) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU_LONG) && class=class="str">"cmt">// 检查长烛 cand1.close==cand2.close && cand1.bodysize<cand2.bodysize && cand1.low>cand2.open) class=class="str">"cmt">// 收盘价相同,第一个烛形主体短于第二个,第二个烛形开盘价低于第一个烛形最低价 { comment=_language?"":"相逢线"; if(!_forex)class=class="str">"cmt">// 如果不是外汇交易 { DrawSignal(prefix+"相逢线牛势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBull,comment); } } class=class="str">"cmt">// 相逢线熊势模型 if(cand1.trend==UPPER && cand1.bull && cand2.trend==UPPER && !cand2.bull && class=class="str">"cmt">// 检查趋势方向和烛形方向 (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU_LONG) && class=class="str">"cmt">// 检查长烛 cand1.close==cand2.close && cand1.bodysize<cand2.bodysize && cand1.high<cand2.open) class=class="str">"cmt">// 收盘价相同,第一个烛形主体短于第二个,第二个烛形开盘价高于第一个烛形最高价 { comment=_language?"":"相逢线"; if(!_forex)class=class="str">"cmt">// 如果不是外汇交易 { DrawSignal(prefix+"相逢线熊势模型"+class="type">class="kw">string(objcount++),cand1,cand2,InpColorBear,comment); } } class=class="str">"cmt">//------ class=class="str">"cmt">// 最低价相同牛势模型 if(cand1.trend==DOWN && !cand1.bull && cand2.trend==DOWN && !cand2.bull && class=class="str">"cmt">// 检查趋势方向和烛形方向 cand1.close==cand2.close && cand1.bodysize>cand2.bodysize) class=class="str">"cmt">// 收盘价相同,第一个烛形主体长于第二个烛形主体 { comment=_language?"":"最低价相同";