分析烛的图案(基础篇)
📘

分析烛的图案(基础篇)

第 1/3 篇

用历史烛形给当下信号找参照

很多交易者看裸K只盯当前一根,却忽略同一形态在近期出现过的后续走势。把过去 20~50 根蜡烛按形态聚类,能快速判断眼前这根属于哪种“已知剧本”。 在 MT5 里可以用数组缓存近期收盘价与高低点,写个简单比对逻辑就能跑。下面这段代码把最近 30 根蜡烛的实体长度存进数组,方便后续做形态相似度计算。 外汇与贵金属波动受消息面驱动,相似烛形后走势仅“可能”重复,实盘仍需结合风控。

MQL5 / C++
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 线快得多。

MQL5 / C++
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 用历史数据跑一遍验证阈值在你的品种上是否过拟合。

MQL5 / C++
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 上锤线后不等一根阳线收稳就接多,被扫的概率明显偏高,至少看一根同向烛再动手。

MQL5 / C++
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">// 射击之星熊势模型

常见问题

均线滞后且易被震荡洗掉,烛形直接反映多空博弈结果;老手常用历史相似烛形给当下信号找参照,减少指标噪音。
取收盘减开盘得实体,最高减上限得影线,比值超阈值即判为长影线;可写函数输出烛形类型标签供回测。
小布可基于品种页的AIGC分析,自动比对历史烛形结构并标注当前可能的反转参照,省去手动翻图。
锤子线看末端抛压衰竭,晨星需三根确认趋势停顿与反攻;多根形态过滤假信号但入场稍晚。
调小均值周期或提高倍数阈值,先用样本外数据跑识别函数,避免把常态波动误标为关键烛。