- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
cxt_double_zs_V230311是 czsc 项目中一类典型的kline级别"辅助信号"(BS1 辅助),它基于最近 20 笔重建中枢序列,通过比较双中枢的极值关系与后一中枢内部最后两笔的时长比,识别原趋势的衰竭并输出看多/看空方向提示。本文以该信号文档为核心,结合仓库内 Rust 源码(cxt.rs、utils/cxt.rs、zs.rs)逐层拆解其判定规则,并给出可直接套用的参数模板、信号列表示例与边界条件,帮助你在策略中正确调用与解读该信号。
一、信号概览:模块归属与版本语义
| 项目 | 值 |
|---|---|
| 模块 | cxt.rs(crates/czsc-signals/src/cxt.rs) |
| 类别 | kline(K 线级信号) |
| 信号全名 | cxt_double_zs_V230311 |
| 参数模板 | "{freq}_D{di}双中枢_BS1辅助V230311" |
| 对齐说明 | 与 Pythonczsc.signals.cxt_double_zs_V230311保持一致 |
版本号V230311采用"年月日"编码(2023-03-11),是 czsc 信号体系的命名惯例——同一逻辑的迭代通过日期后缀区分。该信号归入kline类别,意味着它以单周期 K 线与笔(BI)、中枢(ZS)结构为输入,在 信号注册表 中与cxt_second_bs_V230320、cxt_third_bs_V230318等买卖点辅助信号并列,注册名即cxt_double_zs_V230311,其宏标注为opcode = "CxtDoubleZsV230311"、param_kind = "CxtDoubleZsV230311"。
二、参数模板与 7 段信号命名规范
参数模板
"{freq}_D{di}双中枢_BS1辅助V230311"{freq}:周期标签,例如60分钟、日线;{di}:取样偏移,从倒数第di笔开始取样,默认1;- 后缀
_BS1辅助V230311是信号第三段(k3),标明"第一类买卖点辅助 + 版本"。
信号列表示例
Signal('60分钟_D1双中枢_BS1辅助V230311_看多_任意_任意_0')Signal('60分钟_D1双中枢_BS1辅助V230311_看空_任意_任意_0')
7 段命名解读
czsc 的 K 线级信号统一为k1_k2_k3_v1_v2_v3_n的 7 段结构。本例中:
| 段 | 内容 | 来源 |
|---|---|---|
| k1 | 60分钟 | 周期(c.freq) |
| k2 | D1双中枢 | format!("D{}双中枢", di) |
| k3 | BS1辅助V230311 | 固定后缀 |
| v1 | 看多 / 看空 / 其他 | 方向判定结果 |
| v2 | 任意 | 该信号不使用 |
| v3 | 任意 | 该信号不使用 |
| n | 0 | 信号周期序号 |
在源码中,信号通过make_kline_signal_v1(utils/sig.rs)构造,该函数把 v2/v3 固定为任意、n固定为0,只输出 v1 一个有效维度,因此该信号本质上是一个单值方向信号。
三、信号逻辑逐层拆解
原文档给出的信号逻辑共三步,结合源码可展开为更精确的五层判定:
- 取样:提取最近 20 笔并重建中枢序列;
- 双中枢有效性检查:最近两个中枢都有效(各自至少包含 2 笔);
- 内部时长比较:比较后一中枢内部最后两笔的时长(笔内 K 线根数);
- 前后中枢极值关系:比较前中枢与后中枢的最高/最低极值;
- 方向映射:向下笔满足衰竭条件判
看多,向上笔满足衰竭条件判看空,否则返回其他。
第一步:取样最近 20 笔
let di = get_usize_param(params, "di", 1); let bis = get_sub_elements(&c.bi_list, di, 20);get_sub_elements(utils/sig.rs)对齐 Python 切片语义:
di == 1时返回最后 20 笔;di > 1时返回[-20-di+1 : -di+1]区间;- 数量不足时返回可用区间,若区间为空则直接返回
其他。
di参数的作用是"跳过最新若干笔",用于规避未完成笔(UBI)的不稳定影响,默认取1即从最新完成笔开始取样。
第二步:重建中枢序列
let zss = get_zs_seq(bis);get_zs_seq(utils/cxt.rs)按如下规则把笔序列切分为中枢序列:
- 逐笔加入当前中枢;
- 若出现"向上笔的高点低于前中枢下沿
zd"或"向下笔的低点高于前中枢上沿zg",判定笔脱离当前中枢,于是收尾当前中枢并开启一个新中枢; - 否则继续延伸当前中枢。
该函数返回按时间顺序排列的中枢列表zss,信号只关心最后两个中枢(zss[zss.len() - 2]与zss[zss.len() - 1])。
第三步:双中枢有效性检查
if zss.len() >= 2 && zss[zss.len() - 2].bis.len() >= 2 && zss[zss.len() - 1].bis.len() >= 2需要满足三个条件:
- 重建出的中枢序列至少有两个中枢;
- 倒数第二个中枢(前中枢
zs1)至少由 2 笔构成; - 最后一个中枢(后中枢
zs2)至少由 2 笔构成。
任何一条不满足,v1 保持其他直接返回。这与文档中"需要至少形成两个有效中枢,否则返回其他"的描述一致。
第四步:内部两笔时长比较
let ts1 = zs2.bis[zs2.bis.len() - 1].bars.len(); // 后中枢最后一笔的 K 线根数 let ts2 = zs2.bis[zs2.bis.len() - 2].bars.len(); // 后中枢倒数第二笔的 K 线根数ts1与ts2分别取后一中枢最后两笔所包含的原始 K 线数量(BI.bars),以此近似度量两笔的"时长"。核心判定为:
ts1 >= ts2 * 2即最后一笔的时长至少是前一笔的2 倍——这是"衰竭"的量化表达:同向的最后一笔被显著拉长,说明原方向动能接近耗尽。
第五步:前后中枢极值关系与方向映射
if last_bi.direction == Direction::Down && ts1 >= ts2 * 2 && zs1.gg > zs2.gg { v1 = "看多"; } if last_bi.direction == Direction::Up && ts1 >= ts2 * 2 && zs1.dd < zs2.dd { v1 = "看空"; }两条判定的完整条件:
| 方向 | 时长条件 | 极值条件 | 输出 |
|---|---|---|---|
| 最后一笔向下 | ts1 >= ts2 * 2 | 前中枢最高点zs1.gg > zs2.gg | 看多 |
| 最后一笔向上 | ts1 >= ts2 * 2 | 前中枢最低点zs1.dd < zs2.dd | 看空 |
极值字段来自中枢结构体ZS(zs.rs):gg为中枢内所有笔的最高点、dd为最低点、zg/zd为中枢上/下沿、zz为中轴。以看多为例,其语义为:最后一笔向下且被显著拉长(衰竭),同时前中枢高点高于后中枢高点(价格重心下移后企稳于更低中枢),二者共振提示向下趋势动能耗尽,故输出看多辅助提示。
四、参数说明与边界条件
| 参数 | 含义 | 默认值 | 说明 |
|---|---|---|---|
freq | 周期标签 | 由调用方指定 | 决定 k1 段,如60分钟、日线 |
di | 从倒数第di笔开始取样 | 1 | 用于跳过最新不稳定笔,di >= 1(get_sub_elements内部有断言) |
返回其他的全部场景(对应 v1 =其他):
- 取样区间为空(笔数不足,或
di超出笔列表长度); - 中枢序列不足两个;
- 前中枢或后中枢不足 2 笔;
- 时长条件或极值条件任一不满足。
值得注意的是,ts1 >= ts2 * 2是必要条件——即使双中枢形态符合,只要最后一笔没有被拉长到前一笔的 2 倍以上,信号也不会触发方向提示,避免在动能未衰竭时提前发出反转信号。
五、源码级实现与工程化细节
函数签名与宏标注
#[signal( category = "kline", name = "cxt_double_zs_V230311", template = "{freq}_D{di}双中枢_BS1辅助V230311", opcode = "CxtDoubleZsV230311", param_kind = "CxtDoubleZsV230311" )] pub fn cxt_double_zs_v230311(c: &CZSC, params: &ParamView, _cache: &mut TaCache) -> Vec<Signal>该函数接收CZSC(缠论结构分析对象,提供bi_list笔列表与freq周期)、ParamView(参数视图)与TaCache(技术指标缓存,本例未使用,故为_cache)。信号通过过程宏#[signal]自动完成注册与元数据绑定。
中枢有效性语义
虽然代码中用的是bis.len() >= 2的"最少笔数"检查,而非调用ZS::is_valid()(zs.rs,判定中枢上沿zg不低于下沿zd且每笔与中枢区间有交集),但两个条件在get_zs_seq的构造逻辑下通常是等价的——能够被独立切分出来的中枢,其构成笔必然与前中枢脱离,天然满足有效性。这一设计让判定更轻量、更贴近文档所述"有效中枢"的口径。
注册与测试验证
该信号在 registry.rs 中被列入 K 线信号注册表,并有对应的批量注册测试test_kline_registry_contains_cxt_batch2_20逐一断言注册表包含cxt_double_zs_V230311等 20 个信号(registry.rs),确保宏注册与测试预期不脱节。
六、在实际量化流程中的定位与使用
cxt_double_zs_V230311属于"辅助信号"(k3 段BS1辅助),设计意图是配合第一类买卖点(BS1)的主信号使用,而非独立下单依据。在使用时有几点建议:
- 与主信号共振:将本信号输出的
看多/看空作为过滤器,与笔、分型或买卖点主信号叠加,降低单信号误报率; - 周期选择:信号对笔的完整度敏感,建议在笔数充足(多于 20 笔)的周期上运行,确保取样窗口完整;
- 参数调优:
di可尝试1/2/3观察稳定性;2 倍时长比为内置硬阈值,若需调整需改动源码(当前仓库该信号不暴露该参数); - Python 生态对齐:Rust 实现与 Python
czsc.signals.cxt_double_zs_V230311保持同名同逻辑,便于跨语言策略迁移与结果对账。
该信号与cxt_zhong_shu_gong_zhen_V221221(大小级别中枢共振,cxt_trader.rs)等中枢类信号同属"以中枢结构为输入"的信号族,但前者只依赖单一周期的最近 20 笔,后者需要跨周期TraderState数据,二者在数据依赖与适用场景上互补,可依据策略的多周期架构选择使用。
结语
cxt_double_zs_V230311用"双中枢极值 + 末笔时长翻倍"两个可量化的条件,把缠论中"背驰/衰竭"的定性判断落成确定性的看多/看空输出。理解它的关键在于把握三层结构:取样窗口(最近 20 笔)→ 中枢序列重建(get_zs_seq 的脱离规则)→ 双中枢内的时长与极值比较。结合 cxt.rs 的源码逐行对照,即可在自己的策略中准确引用、调参与验证该信号。
- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
相关推荐
czsc byi 模块信号详解:缠论笔结构辅助信号的参数模板、判定逻辑与源码实现
czsc byi 模块信号详解:缠论笔结构辅助信号的参数模板、判定逻辑与源码实现 byi 是 czsc(缠中说禅技术分析工具)Rust 信号库中专门围绕 笔(B
金融科技czsc 缠论信号解析:byi_symmetry_zs_V221107 对称中枢识别信号完整指南
czsc 缠论信号解析:byi_symmetry_zs_V221107 对称中枢识别信号完整指南 本篇技术指南聚焦 czsc 项目 Rust 版信号库中的 by
金融科技Windows-universal-samples 摄像头人脸检测示例:用 MediaCapture 与 Face Detection effect 构建完整相机应用
Windows universal samples 摄像头人脸检测示例:用 MediaCapture 与 Face Detection effect 构建完整相
金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考