分析烛的图案(基础篇)
用历史烛形给当下信号找参照
很多交易者看裸K只盯当前一根,却忽略同一形态在近期出现过的后续走势。把过去 20~50 根蜡烛按形态聚类,能快速判断眼前这根属于哪种“已知剧本”。 在 MT5 里可以用数组缓存近期收盘价与高低点,写个简单比对逻辑就能跑。下面这段代码把最近 30 根蜡烛的实体长度存进数组,方便后续做形态相似度计算。 外汇与贵金属波动受消息面驱动,相似烛形后走势仅“可能”重复,实盘仍需结合风控。
class="type">class="kw">double bodySize[class="num">30]; for(class="type">int i=class="num">0;i<class="num">30;i++) { bodySize[i]=MathAbs(iOpen(NULL,class="num">0,i)-iClose(NULL,class="num">0,i)); }
「为什么老手离不开烛形图」
烛形图把开盘、收盘、最高、最低四个价位压进一根实体加影线的图形里,让你直接看到多空在一段时间内的拉扯过程,而不是冷冰冰的折线。它本质上是一段交易心理的快照:实体长短说力量对比,影线长短说拒绝方向,组合形态说情绪转折。 外汇与贵金属市场里,这种图形对所有品种都通用,EURUSD 的 H1 和 XAUUSD 的 M15 读图逻辑没有区别。但杠杆市场波动剧烈,单看形态不做风控,亏损概率会显著放大。 练过几百根 K 线后,你大概率会把烛形当成 MT5 主图默认武器——它给的「市场当下感」,是均线或布林带单独给不了的。
◍ 单根烛形的结构与语义
最早的系统化价格记忆来自 Munehisa Homma 的米市交易原则,后来演变成现在常说的日本烛形图。一根烛由主体和影线构成:矩形主体是开盘到收盘的价差区间,影线则延伸到该周期内的高低点。主体长,说明某一侧(买或卖,看颜色)压住了对手;主体短,往往意味着牛熊拉扯不激烈。 按形态粗分有几类值得记住:长烛没有绝对像素标准,得看最近 5~10 根的平均体长来定“相对长”;无影烛(Marubozu)主体光头光脚,长黑无影常出现在下降趋势里,是空头大胜的痕迹,长白无影则是极强的单边推进;十字星要求开收几乎同价,严格同价极少见,差几个最小变动单位也算;陀螺是影线明显长于短主体的犹豫形态;锤线/上吊都是下影长、主体缩在顶部的样子,趋势不同含义反转;星形线是短主体相对前一根长主体跳空开的迟疑信号。 把这些单根形态拆开看,是在读市场心理的碎片。等把它们按先后拼成组合,趋势是否延续或反转的概率才稍微看得清一点。外汇和贵金属波动大,单根烛不能直接当入场指令,只适合拿去 MT5 上调出影线显示验证。
用代码给单根烛定性
要把价格行为写成可跑的程序,第一步不是找形态,而是先让函数认出「这根烛到底是什么」。原文给出的 RecognizeCandle 就是干这个的:传入品种、周期、开盘时间和平均周期,它回填一个结构,里面装着 OHLC、趋势方向、牛熊、主体长度和烛类型枚举。 趋势判定没用什么玄学,就是 L. Morris 书里用的 10 期收盘价均线思路——收盘价站上均值倾向判为上行,跌破则倾向下行。代码里用 aver_period 根烛的 CopyRates 取数,注意数组顺序是远到近,填结构时别写反。 烛类型的硬阈值值得直接抄进 MT5 验证:长烛要求主体 > 近 aver_period 平均主体 *1.3;短烛是 > 平均 *0.5;十字星主体 < 全幅 *0.03;锤线下影 > 主体 *2 且上影 < 主体 *0.1;射击之星反过来。这些系数在外汇和贵金属上只是概率性参考,杠杆品种跳空常让影线失真,高风险。 附带指标 Candlestick Type Color 会把类型直接画在图上,EURUSD H1 加载后你能立刻看到长无影烛和陀螺的分布密度,比肉眼翻 K 线快得多。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 烛形类型识别函数 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool RecognizeCandle(class="type">class="kw">string symbol,ENUM_TIMEFRAMES period, class="type">class="kw">datetime time,class="type">int aver_period,CANDLE_STRUCTURE &res) class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| CANDLE_STRUCTURE 结构 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="kw">struct CANDLE_STRUCTURE { class="type">class="kw">double open,high,low,close; class=class="str">"cmt">// OHLC class="type">class="kw">datetime time; class=class="str">"cmt">//时间 TYPE_TREND trend; class=class="str">"cmt">//趋势 class="type">bool bull; class=class="str">"cmt">//是否为牛市烛形 class="type">class="kw">double bodysize;class=class="str">"cmt">//主体高度 TYPE_CANDLESTICK type; class=class="str">"cmt">//烛形类型 }; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| TYPE_CANDLESTICK 枚举 | class=class="str">"cmt">//+------------------------------------------------------------------+ enum TYPE_CANDLESTICK { CAND_NONE, class=class="str">"cmt">//未识别 CAND_MARIBOZU, class=class="str">"cmt">//无影烛 CAND_MARIBOZU_LONG, class=class="str">"cmt">//长无影烛 CAND_DOJI, class=class="str">"cmt">//十字星 CAND_SPIN_TOP, class=class="str">"cmt">//陀螺 CAND_HAMMER, class=class="str">"cmt">//锤线 CAND_INVERT_HAMMER, class=class="str">"cmt">//反转锤线 CAND_LONG, class=class="str">"cmt">//长烛 CAND_SHORT, class=class="str">"cmt">//短烛 CAND_STAR class=class="str">"cmt">//星形线 }; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| TYPE_TREND | class=class="str">"cmt">//+------------------------------------------------------------------+ enum TYPE_TREND { UPPER, class=class="str">"cmt">//向上 DOWN, class=class="str">"cmt">//向下
「用均值锚定烛形分类的识别函数」
这段识别逻辑先把目标烛形之前 aver_period 根 K 线的收盘均值算出来,用均值和目标收盘的比价判定趋势方向:均值低于收盘记 UPPER,高于收盘记 DOWN,相等记 LATERAL。 随后函数抓取目标烛形的开高低收,并用 MathAbs 取主体高度绝对值 bodysize,再根据牛熊分别重算上下影线长度,避免把牛烛和熊烛的影线算法搞反。 分类阈值全部挂在「前 aver_period 根平均主体高度 sum」和「当前 HL 波幅」上:bodysize 大于 sum*1.3 判长烛,小于 sum*0.5 判短烛,小于 HL*0.03 判十字星;影线极短且主体非零时叠加 MARIBOZU 标记,下影超主体 2 倍且上影不足 0.1 倍判锤线,反向则判反转锤线。 外汇与贵金属波动随机性强、杠杆风险高,这类形态识别只给出概率倾向,实盘前务必在 MT5 用历史数据跑一遍验证阈值在你的品种上是否过拟合。
class="type">bool RecognizeCandle(class="type">class="kw">string symbol,ENUM_TIMEFRAMES period, class="type">class="kw">datetime time,class="type">int aver_period,CANDLE_STRUCTURE &res) { class="type">MqlRates rt[]; class=class="str">"cmt">//--- 读取前面烛形的数据 if(CopyRates(symbol,period,time,aver_period+class="num">1,rt)<aver_period) { class="kw">return(false); } res.open=rt[aver_period].open; res.high=rt[aver_period].high; res.low=rt[aver_period].low; res.close=rt[aver_period].close; res.time=rt[aver_period].time; class=class="str">"cmt">//--- 定义趋势方向 class="type">class="kw">double aver=class="num">0; for(class="type">int i=class="num">0;i<aver_period;i++) { aver+=rt[i].close; } aver=aver/aver_period; if(aver<res.close) res.trend=UPPER; if(aver>res.close) res.trend=DOWN; if(aver==res.close) res.trend=LATERAL; class=class="str">"cmt">//--- 定义它是牛势还是熊势 res.bull=res.open<res.close; class=class="str">"cmt">//--- 取得烛形主体高度的绝对值 res.bodysize=MathAbs(res.open-res.close); class=class="str">"cmt">//--- 取得影线高度 class="type">class="kw">double shade_low=res.close-res.low; class="type">class="kw">double shade_high=res.high-res.open; if(res.bull) { shade_low=res.open-res.low; shade_high=res.high-res.close; } class="type">class="kw">double HL=res.high-res.low; class=class="str">"cmt">//--- 计算前面烛形的平均主体高度 class="type">class="kw">double sum=class="num">0; for(class="type">int i=class="num">1; i<=aver_period; i++) sum=sum+MathAbs(rt[i].open-rt[i].close); sum=sum/aver_period; class=class="str">"cmt">//--- 长烛 if(res.bodysize>sum*class="num">1.3) res.type=CAND_LONG; class=class="str">"cmt">//--- 短烛 if(res.bodysize<sum*class="num">0.5) res.type=CAND_SHORT; class=class="str">"cmt">//--- 十字星 if(res.bodysize<HL*class="num">0.03) res.type=CAND_DOJI; class=class="str">"cmt">//--- 无影烛 if((shade_low<res.bodysize*class="num">0.01 || shade_high<res.bodysize*class="num">0.01) && res.bodysize>class="num">0) { if(res.type==CAND_LONG) res.type=CAND_MARIBOZU_LONG; else res.type=CAND_MARIBOZU; } class=class="str">"cmt">//--- 锤线 if(shade_low>res.bodysize*class="num">2 && shade_high<res.bodysize*class="num">0.1) res.type=CAND_HAMMER; class=class="str">"cmt">//--- 反转锤线 if(shade_low<res.bodysize*class="num">0.1 && shade_high>res.bodysize*class="num">2) res.type=CAND_INVERT_HAMMER; class=class="str">"cmt">//--- 陀螺 if(res.type==CAND_SHORT && shade_low>res.bodysize && shade_high>res.bodysize) res.type=CAND_SPIN_TOP; }
◍ 单根与多根烛的反转形态识别逻辑
烛形反转形态按构成数量分三类:单根、双根、三根,实际套路里很少超过五到六根。识别前先判趋势方向——图形左侧两条短垂线只标示此前趋势,不表示形态间有递进关系。 单根里,锤线要求下影线≥实体2倍且≤3倍、上影线短于烛范围10%,出现在下降趋势倾向看涨但需确认;上吊线镜像条件在上升趋势可能转空。射击之星虽常被画成一根,但识别时吃了前一根收盘价,实质是两根烛的活。 双根组合中,看涨吞没是第二白实体完全盖住第一黑实体,外汇里黑收白开同价;穿刺形态要求白烛收进黑实体并覆盖超50%,经典股市免确认但外汇必须等确认。孕线、十字胎则看次根是否被首根实体包裹。 三根起步的弃婴等形态,引擎用循环从倒数第二根往前扫,先调 RecognizeCandle 拿结构,再按 trend 与 type 分支画信号。下面这段就是 MT5 里跑单根反转识别的核心循环,逐行拆完你直接能抄进 EA 改参数。 别把「确认」当可选项 外汇品种波动跳空频繁,原文里经典模型免确认、Forex 要确认的差异不是废话。欧美兑美元 M15 上锤线后不等一根阳线收稳就接多,被扫的概率明显偏高,至少看一根同向烛再动手。
class=class="str">"cmt">//--- 烛形图案计算 for(class="type">int i=limit;i<rates_total-class="num">1;i++) { CANDLE_STRUCTURE cand1; if(!RecognizeCandle(_Symbol,_Period,time[i],InpPeriodSMA,cand1)) class="kw">continue; class=class="str">"cmt">/* 检查一个烛形的图案 */ class=class="str">"cmt">//------ class=class="str">"cmt">// 反转锤线牛势模型 if(cand1.trend==DOWN && class=class="str">"cmt">// 检查趋势方向 cand1.type==CAND_INVERT_HAMMER) class=class="str">"cmt">// 检查反转锤线 { comment=_language?"反转锤线"; DrawSignal(prefix+"反转锤线牛势模型"+class="type">class="kw">string(objcount++),cand1,InpColorBull,comment); } class=class="str">"cmt">// 上吊熊势模型 if(cand1.trend==UPPER && class=class="str">"cmt">// 检查趋势方向 cand1.type==CAND_HAMMER) class=class="str">"cmt">// 检查 "锤线" { comment=_language?"上吊"; DrawSignal(prefix+"上吊熊势模型"+class="type">class="kw">string(objcount++),cand1,InpColorBear,comment); } class=class="str">"cmt">//------ class=class="str">"cmt">// 锤线牛势模型 if(cand1.trend==DOWN && class=class="str">"cmt">//检查趋势方向 cand1.type==CAND_HAMMER) class=class="str">"cmt">// 检查锤线 { comment=_language?"锤线"; DrawSignal(prefix+"锤线牛势模型"+class="type">class="kw">string(objcount++),cand1,InpColorBull,comment); } class=class="str">"cmt">//------ class=class="str">"cmt">// 射击之星熊势模型