- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
导读
pos_fx_stop_V230414是 czsc(缠中说禅技术分析工具)信号库中一个典型的trader 类别持仓管理信号,核心思路是:以某仓位最近一次开仓点为基准,取开仓前最近n个分型(底分型/顶分型)构造止损参考位,用最新价与参考位比较来触发「多头止损/空头止损」判定。本文基于该信号的官方文档,结合其 Rust 源码实现,完整讲解参数模板、判定逻辑、7 段信号格式、调参含义与底层调用链,读者可据此在策略中直接引用该信号或参照实现同类止损逻辑。
信号定位:模块与类别
该信号归属于pos.rs模块,类别为trader(交易员级信号,区别于kline级信号)。它不直接分析单根 K 线,而是依赖「仓位状态 + 缠论结构(分型)」进行持仓管理,与同一模块下的pos_ma_V230414(均线持有状态)、pos_bar_stop_V230524(按 K 线极值止损)、pos_stop_V240331(N 根 K 线追踪止损)等共同构成策略的止损/出场信号族。
参数模板:"{freq1}_{pos_name}N{n}_止损V230414"
参数模板定义了信号名的三段式结构(对应 7 段信号字符串中的k1_k2_k3):
| 占位符 | 含义 | 示例值 |
|---|---|---|
freq1 | K线周期(信号观察级别) | 日线、60分钟 |
pos_name | 仓位名称(策略中的持仓标识) | 日线三买多头 |
n | 向前取分型数量,默认3 | 1、3、5 |
止损V230414 | 固定后缀(版本标记) | 固定不变 |
注意参数模板的书写顺序与最终信号名一致:{freq1}_{pos_name}N{n}_止损V230414,例如日线_日线三买多头N1_止损V230414。其中版本号V230414必须出现在模板中,这是#[signal]过程宏的强制校验规则之一(见下文「宏约束」)。
信号逻辑:用开仓前分型极值构造止损参考位
该信号的核心判定分多头、空头两条分支,其余场景一律记其他:
- 多头(LO):取开仓时间之前最近
n个底分型,计算其中最低的分型低点ll;若最新价跌破ll,记多头止损; - 空头(SO):取开仓时间之前最近
n个顶分型,计算其中最高的分型高点hh;若最新价突破hh,记空头止损; - 其余场景(未持仓、最近操作是平仓、数据不足等)记
其他。
语义上,这是典型的「开仓点附近结构位止损」:把开仓前最近的一簇分型极值当作市场在该位置形成的关键支撑/压力位,一旦价格反向穿越,则认为开仓逻辑失效。
信号列表示例
官方文档给出的两个完整信号字符串(7 段格式k1_k2_k3_v1_v2_v3_score):
Signal('日线_日线三买多头N1_止损V230414_多头止损_任意_任意_0') Signal('日线_日线三买多头N1_止损V230414_空头止损_任意_任意_0')逐段拆解第一个信号:
| 段 | 值 | 来源 |
|---|---|---|
| k1 | 日线 | freq1 |
| k2 | 日线三买多头N1 | pos_name+N+n |
| k3 | 止损V230414 | 固定后缀 |
| v1 | 多头止损 | 判定结果(或空头止损/其他) |
| v2 / v3 | 任意 | 该信号只填充 v1 |
| score | 0 | 固定默认值 |
该信号只输出 v1 一个判定值,v2、v3 固定为任意,score 固定为0,因此策略侧通常只需按v1 == "多头止损"或v1 == "空头止损"进行匹配即可。
参数说明
pos_name:仓位名称。信号通过last_open_operate(cat, pos_name)在TraderState中按名称查询该仓位的最近一次开仓操作(Operate::LO/SO);若仓位不存在或最近操作为平仓(LE/SE),直接返回其他。因此pos_name必须与策略中实际建立的仓位名严格一致。freq1:K线周期。信号通过cat.get_czsc(freq1)获取该周期对应的 CZSC 缠论解析器(crates/czsc-core/src/analyze/mod.rs),进而读取其分型列表与最新价。周期名需与解析器中注册的级别一致(如日线、60分钟)。n:向前取分型数量,默认3。控制止损参考位的「松紧」:n越小,参考位越贴近开仓点,止损越敏感;n越大,参考位越远,止损越宽松。实际应用中常取 1~5。
源码级实现:核心判定逐行拆解
信号在 crates/czsc-signals/src/pos.rs 中实现为pos_fx_stop_v230414(cat: &dyn TraderState, params: &ParamView) -> Vec<Signal>,函数签名恰好两个参数(TraderState+ParamView),满足#[signal]宏对 trader 类信号「必须有 2 个参数」的编译期约束。
1. 参数解析
let pos_name = get_str_param(params, "pos_name", ""); let freq1 = get_str_param(params, "freq1", ""); let n = get_usize_param(params, "n", 3); let k1 = freq1.to_string(); let k2 = format!("{}N{}", pos_name, n); let k3 = "止损V230414"; let mut v1 = "其他";get_str_param/get_usize_param定义于 crates/czsc-signals/src/utils/sig.rs,支持从ParamView中读取字符串或数字(含数字字符串)参数,缺失时回退默认值。由此可确认n的默认值为3。
2. 前置校验:无开仓或无解析器直接返回「其他」
let op = match last_open_operate(cat, pos_name) { Some(op) => op, None => return make_signal_v1(&k1, &k2, k3, v1), }; let c = match cat.get_czsc(freq1) { Some(c) => c, None => return make_signal_v1(&k1, &k2, k3, v1), };last_open_operate(sig.rs)取仓位操作记录的最后一条,若为SE(平空)或LE(平多)则视为无开仓,返回None。这是「其余场景记其他」的第一道闸门。
3. 最新价与分型列表
let latest = latest_price(cat, freq1).unwrap_or(0.0); let fxs = c.get_fx_list();latest_price(sig.rs)优先取TraderState::latest_price()(通常为CzscTrader维护的基础周期最新 close),否则回退到指定级别最后一根 K 线收盘价,见 crates/czsc-trader/src/trader.rs 中CzscTrader对TraderState的实现。get_fx_list(crates/czsc-core/src/analyze/mod.rs)聚合笔内分型与未完成笔分型(bars_ubi),返回带时间戳dt与高低点的FX序列。
4. 多头分支:底分型最低低点
if op.op == Operate::LO { let all: Vec<_> = fxs.iter() .filter(|x| x.mark == Mark::D && x.dt < op.dt) .collect(); let start = all.len().saturating_sub(n); if !all.is_empty() { let ll = all[start..].iter() .fold(f64::INFINITY, |acc, x| acc.min(x.low)); if latest < ll { v1 = "多头止损"; } } }- 只保留底分型(
Mark::D,见 crates/czsc-core/src/objects/mark.rs 枚举定义,序列化值为「底分型」)且时间早于开仓点(x.dt < op.dt)的分型; saturating_sub(n)保证窗口不会越界,all[start..]即开仓前最近n个底分型;- 对窗口内所有底分型的
low取最小值ll(初始化为正无穷),作为多头止损参考位; - 最新价
latest < ll时触发多头止损。
5. 空头分支:顶分型最高高点
if op.op == Operate::SO { let all: Vec<_> = fxs.iter() .filter(|x| x.mark == Mark::G && x.dt < op.dt) .collect(); let start = all.len().saturating_sub(n); if !all.is_empty() { let hh = all[start..].iter() .fold(f64::NEG_INFINITY, |acc, x| acc.max(x.high)); if latest > hh { v1 = "空头止损"; } } }与多头分支完全镜像:取开仓前最近n个顶分型(Mark::G,序列化值「顶分型」),对high取最大值hh作为空头止损参考位,最新价突破(latest > hh)时记空头止损。
6. 信号构造
make_signal_v1(&k1, &k2, k3, v1)make_signal_v1(sig.rs)最终调用make_signal7,将k1_k2_k3_v1_v2_v3_score拼为完整字符串并经Signal::from_str严格校验(必须恰好 7 段、score 在 0~100 之间,见 crates/czsc-core/src/objects/signal.rs),故所有输出的信号字符串都是格式合法的。
宏约束与注册:信号如何被纳入系统
pos_fx_stop_v230414通过过程宏#[signal]声明元信息:
#[signal( category = "trader", name = "pos_fx_stop_V230414", template = "{freq1}_{pos_name}N{n}_止损V230414", opcode = "PosFxStopV230414", param_kind = "PosFxStop" )]宏实现见 crates/czsc-signal-macros/src/lib.rs,编译期强制校验:
category必须是kline或trader;name/template/opcode/param_kind均不能为空;- 函数名必须包含
_v<版本号>且与name的版本后缀一致(pos_fx_stop_v230414↔pos_fx_stop_V230414); template必须包含版本数字(230414)。
注册层面,该信号已进入 trader 信号注册表,crates/czsc-signals/src/registry.rs 中的单元测试test_pos_signal_registry_contains_all_python_pos_functions明确断言pos_fx_stop_V230414已注册,保证其可被策略引擎按名称检索、解析和执行。
使用建议与调参视角
- 接入方式:在策略配置中以参数模板形式引用该信号,例如为
日线三买多头仓位配置日线_日线三买多头N1_止损V230414,并监听多头止损/空头止损两个 v1 值作为平仓触发条件。 - n 的取舍:
n=1只取开仓前最近一个同向分型,参考位最紧、最敏感,适合快节奏出场;n增大后参考位外移,止损空间放宽,适合给趋势更多容错。可结合同模块的pos_bar_stop_V230524(按 K 线极值,n 默认 3、有效范围 1~20)、pos_stop_V240331(N 根 K 线追踪,n 默认 10)等信号横向对比后按品种波动特性选择。 - 前置条件:信号依赖仓位中存在未平仓的开仓记录,且指定周期解析器可用;未满足时输出
其他,策略侧需对「其他」做兜底处理,避免漏掉止损。
- 金融科技
【免费下载链接】czsc
缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易
相关推荐
改一行配置不用重打镜像:docker-minecraft-server 环境变量动态配置从入门到排坑
改一行配置不用重打镜像:docker minecraft server 环境变量动态配置从入门到排坑 部署时才确定的值,别写死在配置文件里 插件的配置文件躺在
金融科技shadcn-svelte Toggle 组件实战:双状态按钮的安装、样式变体与源码解析
shadcn svelte Toggle 组件实战:双状态按钮的安装、样式变体与源码解析 Toggle(开关按钮)是一种可切换"开/关"两种状态的按钮控件,常见
金融科技为什么Awesome Bootstrap Checkbox是前端开发必备工具?
为什么Awesome Bootstrap Checkbox是前端开发必备工具? 在现代前端开发中,表单元素的美观性与用户体验直接影响网站质量。 Awesome
金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考