摘要
CDLDarkCloudCover 是 RTTA 对乌云盖顶(Dark Cloud Cover) K 线形态
的流式检测器。当前阴线开盘高于前收盘价,收盘向下穿过前一根实体中点,但仍高于
前一根开盘价。
输出遵循 TA-Lib 约定:看涨匹配为 +100,看跌匹配为 -100,
形态未触发时为 0。
更新 API
value = rtta.CDLDarkCloudCover(fillna=True).update(open, high, low, close)
# 看涨匹配为 +100;有方向的看跌匹配为 -100;未匹配为 0
batch = rtta.CDLDarkCloudCover(fillna=True).batch(open, high, low, close)
update(...) 每次接收一根 OHLC K 线。advance(...) 使用相同输入但不返回
Python 值。在新实例上调用标量 batch(open, high, low, close),结果与依次
调用 update 一致。当 fillna=False 时,在至少取得 2 根 K 线前返回 NaN;
当 fillna=True(默认)时,未匹配的 K 线返回 0。
工作原理
K 线形态是根据柱体几何结构产生的短周期因果标签。它们本身并不预测收益,而是
标记犹豫、拒绝、吞没压力、多 K 线反转等结构,可与趋势、波动率或成交量背景
结合使用。
引擎在每根 K 线上计算:
\[\begin{aligned}
\mathrm{body}_t &= |C_t - O_t| \\
\mathrm{range}_t &= H_t - L_t \\
\mathrm{upper}_t &= H_t - \max(O_t, C_t) \\
\mathrm{lower}_t &= \min(O_t, C_t) - L_t \\
\mathrm{top}_t &= \max(O_t, C_t),\quad
\mathrm{bot}_t = \min(O_t, C_t) \\
\mathrm{mid}_t &= \tfrac12(O_t + C_t)
\end{aligned}\]
其中 body 为实体长度,range 为整根 K 线的全幅,upper 和 lower
分别为上影线和下影线。当 \(C_t\ge O_t\) 时为阳线,当 \(C_t<O_t\) 时为
阴线。K 线保存在一个短环形缓冲区中;年龄 \(0\) 表示最新 K 线,年龄
\(1\) 表示前一根,以此类推。
下文使用以下共享谓词:
\[\begin{aligned}
\mathrm{doji}(b) &\iff \mathrm{body} \le 0.1\cdot \mathrm{range}
\quad(\text{或 range}=0) \\
\mathrm{longBody}(b,\overline B,f) &\iff \mathrm{body} \ge f\cdot \overline B \\
\mathrm{shortBody}(b,\overline B,f) &\iff \mathrm{body} \le f\cdot \overline B \\
\mathrm{longLower}(b,m) &\iff \mathrm{lower} \ge m\cdot \mathrm{body} \\
\mathrm{longUpper}(b,m) &\iff \mathrm{upper} \ge m\cdot \mathrm{body} \\
\mathrm{smallUpper}(b,f) &\iff \mathrm{upper} \le f\cdot \mathrm{range} \\
\mathrm{smallLower}(b,f) &\iff \mathrm{lower} \le f\cdot \mathrm{range} \\
\mathrm{engulf}(c,p) &\iff
\mathrm{top}_c \ge \mathrm{top}_p \land
\mathrm{bot}_c \le \mathrm{bot}_p \land
\mathrm{body}_c > \mathrm{body}_p \\
\mathrm{inside}(c,p) &\iff
\mathrm{top}_c \le \mathrm{top}_p \land
\mathrm{bot}_c \ge \mathrm{bot}_p
\end{aligned}\]
\(\overline B\) 是环形缓冲区内最近最多五根 K 线的平均实体长度;
\(\overline R\) 是同一窗口的平均全幅。
对于锤子线家族的形态,轻量级先行趋势判断会比较前收盘价与此前两个收盘价
的 SMA:
\[\tau =
\begin{cases}
+1 & C_{-1} > 1.0001\cdot \mathrm{SMA}(C_{-1},C_{-2}) \\
-1 & C_{-1} < 0.9999\cdot \mathrm{SMA}(C_{-1},C_{-2}) \\
0 & \text{其他情况}
\end{cases}\]
递推公式
将 \((O_t,H_t,L_t,C_t)\) 压入环形缓冲区。只有其中至少已有 2 根 K 线
时才进行检测。
前一根为阳线、当前为阴线,并满足下式时输出 \(-100\):
\[O_c > C_p,\quad
C_c < \mathrm{mid}_p,\quad
C_c > O_p.\]
谓词不成立时输出 \(0\)。C++ 路径每次更新的复杂度为 \(O(1)\):使用固定大小
环形缓冲区,除少数几根 K 线外不重新扫描完整窗口。
实现说明
递推过程实现在 src/rtta/indicator.cpp 的 class CDLDarkCloudCover
中,并建立在共享的 CdlHistory 和 cdl:: 几何辅助函数之上。阈值采用适合
流式计算的几何规则,并非对 TA-Lib 每一张平均实体回看表逐行移植。
参考资料