CLXS0017 支撑/阻力区间反转(笔级别)¶
模型定位:S0016 的笔级别变种——把「分型区间支撑/阻力反转」从线段级别下沉到笔级别,更早进场、更近观察。
为什么需要笔级别¶
S0016 的交易单位是线段——一个线段至少包含 5 笔,走完需要不短的时间。等线段确认结束、最低价进入历史支撑区间,反弹可能已经启动了一段。
但支撑区间的博弈不是只在线段级别才发生:一笔下跌到达前低附近,同样会遭遇多空争夺,只是尺度更小、反应更快。打个比方:S0016 是看整个战役的攻防线,S0017 是看一场巷战的据点争夺——战场大小不同,「守住据点 = 反转信号」的逻辑是一样的。
一句话说清 S0017 赚什么钱:价格回到历史笔低点支撑区间后反转的钱;不赚趋势延续、不赚突破、不赚震荡市的来回手续费。
形态定义与判定条件¶
S0017 与 S0016 共享同一套核心逻辑框架,区别在操作级别。买入条件:
- 当前是一个向下笔,且包含至少 5 个 SWING(保证这笔下跌不是毛刺,而是充分展开的走势);
- 这笔的最低价,进入了前 2 个向下笔的支撑区间(分型区间)——历史支撑被触及;
- 收盘价高于前序笔的低点——空头没有完全掌控;
- 出现反转确认信号(pinbar、MACD 金叉、MA5 拐头等)——不是到了就买,是等市场确认。
卖出条件完全镜像:向上笔最高价进入前 2 个向上笔的阻力区间,收盘价低于前序笔高点,出现反转信号。
与 S0016 的参数对照¶
| 维度 | S0016(线段级) | S0017(笔级别) |
|---|---|---|
| 操作单位 | 线段(stretch) | 笔(bi) |
| 信号序列 | stretch_sigs | wave_sigs |
| 最少内部结构 | 5 笔 | 5 个 SWING |
| 参考历史 | 前 2 个同方向线段 | 前 2 个同方向笔 |
| 支撑定义 | 分型区间 | 分型区间 |
| 最大回踩次数 | 3 次 | 3 次 |
| 信号确认 | SignalUtils | SignalUtils |
核心逻辑(伪代码)¶
// 收集所有向下笔(包含 ≥5 个 SWING 的才算有效笔)
for each 笔 in down_bis[2:]:
if 笔.swing_count < 5: 跳过 // 下跌不够充分
if not 笔.has_zone: 跳过 // 没找到分型区间
// 对比前 2 个向下笔的支撑区间
for prev in [笔-1, 笔-2]:
if 笔.最低价 > prev.区间上沿: 跳过 // 没进入支撑区
// 从最低价开始,逐根K线检查
for K线 in 笔.最低价..当前:
if 开始向上走: 停止
if 跌破区间下沿-1ATR: 停止(破位)
if 收盘价 <= prev.极端价: 继续(空头仍强)
if 反转确认信号: → 生成买入信号
信号值与参数¶
信号值编码方式与 S0016 一致,occurrence 表示同一区间的第几次回踩(最多 3 次):
信号值 = 方向 × (17 × 1000 + 回踩次数 × 100 + 入场点类型)
| 信号值 | 含义 |
|---|---|
| 17101 | 买入,第 1 次回踩,结构信号 |
| 17207 | 买入,第 2 次回踩,MACD 交叉 |
| 17305 | 买入,第 3 次回踩,MA5 拐头 |
| -17101 ~ -17307 | 卖出侧对称(数值取负) |
三次回踩的信号类型可能不同——第 1 次 pinbar、第 2 次 MACD 金叉、第 3 次 MA5 拐头——市场在用不同的方式说同一件事:这个价位有人守。
参数说明:
| 参数 | 默认值 | 说明 |
|---|---|---|
| WAVEOPT | 1560 | 笔控制参数 |
| STRETCHOPT | 0 | 线段控制参数 |
| TRENDOPT | 0 | 走势控制参数 |
| MODELOPT | 17 | 模型参数,低位数字 17 表示 CLXS0017 |
一个隐蔽 Bug 的修复(2026-05-27)¶
S0017 上线后修复过一个扫描边界的隐蔽 Bug。缠论中笔的形成有两个阶段:信号值 0.5 表示笔已初步成立(半确认),1.0 表示笔完全确认。
修复前的代码在扫描买入信号时,只在向上笔「完全确认」(1.0)时才停止扫描:
// BUG:只在向上笔完全确认时才停止扫描
if (wave_sigs[i] == 1.0f)
break;
这导致向上笔已经初步成立(0.5)但还没走完时,代码不会停止——向上笔已成立的 K 线被错误地当作当前向下笔的延续来检查,可能产生不该出现的买入信号(注意:不是信号缺失,而是多余信号)。修复后停止条件补上半确认状态(卖出侧同理补上 -0.5f):
// FIX:向上笔成立(无论半确认还是全确认)就停止扫描
if (wave_sigs[i] == 1.0f || wave_sigs[i] == 0.5f)
break;
这个 Bug 的教训值得记住:代码只处理了「确认」状态,遗漏了「半确认」状态。单独看确认状态的处理逻辑完全正确,但「逻辑正确」和「业务完整」之间,差了一个中间状态。边界差一格,信号就可能多一个。
适用与失效环境¶
- 适合品种:流动性好、波动有节奏的品种——A 股个股、指数 ETF、商品期货。流动性差的品种笔结构不清晰,分型区间缺乏参考意义。
- 适合周期:30 分钟线以上。太小周期的笔结构太碎,支撑区间反复被穿透,信号质量下降。
- 失效环境一:单边趋势市——笔的低点不断下移,历史支撑区间很快被甩在后面,没有信号(也不该有)。
- 失效环境二:极度窄幅震荡——分型区间重叠模糊,信号频繁但反转幅度极小,赚不到钱白交手续费。
- 失效环境三:跳空缺口频发——缺口直接跳过区间,「进入区间」这个核心条件失效。
与 S0016 怎么选¶
| 维度 | S0016 | S0017 |
|---|---|---|
| 级别 | 线段 | 笔 |
| 信号频率 | 低 | 较高 |
| 进场时机 | 线段确认后 | 笔确认后 |
| 信号可靠性 | 较高(结构更大) | 较灵敏(结构更小) |
| 适合风格 | 稳健、中长线 | 灵活、短中线 |
简单说:看大结构用 S0016,想更早进场用 S0017。两个可以叠加使用——S0017 先出信号试探,S0016 确认后再加仓。
形态示意¶
场景 A:笔级别快速反转——向下笔(7 个 SWING)最低价进入前两个向下笔的分型区间,pinbar 确认触发买入;此时 S0016 还在等线段走完:

场景 C:假信号过滤——向下笔只有 3 个 SWING,虽然价格回到了前低区间,但下跌结构不完整,不触发信号。5 个 SWING 的门槛过滤了大量噪声:

原文另有「场景 B:区间多次测试」(同一区间三次回踩、三种不同确认方式)的示意图,因图床失效未能收录。
调用示例¶
命令行选股:
python -m fqlite.screen.clxs --model-opt 17
fqctl stock screen clxs --model-opt 17
Python 端函数签名与其他 CLXS 模型一致:
highs = stock_day_data.high.to_list()
lows = stock_day_data.low.to_list()
opens = stock_day_data.open.to_list()
closes = stock_day_data.close.to_list()
volumes = stock_day_data.volume.to_list()
length = len(highs)
model_opt = 17 # CLXS0017
sigs: list[float] = fq_clxs(
length, highs, lows, opens, closes, volumes,
wave_opt, stretch_opt, trend_opt, model_opt)
建议先用历史数据回测,观察信号在你关注的品种上的分布和表现,再决定是否用于实盘。量化策略的第一步永远是验证,不是信任。
知识来源¶
- 公众号文章《FqCopilot 新模型 S0017:S0016 的笔级别变种——更早进场,更近观察》(2026-05-10)——判定条件、参数对照、场景示意、适用与失效环境
- 公众号文章《FqCopilot缠论插件:S0017 形态的一个隐蔽 Bug,今天被修了》(2026-05-27)——半确认状态边界修复
- 《fqcopilot 选股模型信号值规范》——信号值编码