常见技术问题:
在通达信中编写“几天几板”识别公式时,常因忽略涨停判定的严谨性导致误统计——例如未剔除ST股(需涨跌幅≤5%)、未排除新股上市首日(无前一日收盘价)、未处理停牌/一字跌停次日补涨等异常场景;同时,简单用`COUNT(CLOSE=HHV(CLOSE,1),N)=N`无法准确捕捉“连续N日涨停”,因其未校验每日是否真实触及涨停价(应为`CLOSE>=REF(CLOSE,1)*1.098`并考虑小数精度),且未实现动态回溯统计(如当日为第3板,需向前验证第1、2板是否连续)。更关键的是,通达信不支持跨周期状态记忆,难以原生实现“当前K线所属连板序列长度”的实时输出,导致人工数板易出错、选股结果漏信号。如何构建鲁棒、可复用、兼容ST/非ST/新股的连续涨停识别与计数公式,是量化盯盘与龙头战法落地的核心难点。
1条回答 默认 最新
娟娟童装 2026-02-28 14:15关注```html一、常见技术问题:通达信“几天几板”识别的典型误判场景
- ST股混淆:未区分主板(10%)、创业板/科创板(20%)、ST/*ST(5%)差异化涨停阈值,统一用
CLOSE >= REF(CLOSE,1)*1.1导致ST股频繁误标为“涨停”; - 新股首日失效:上市首日无前收盘价(REF(CLOSE,1)为空或0),直接参与计算引发除零错误或逻辑崩塌;
- 停牌续板陷阱:T日停牌→T+1复牌涨停,若简单回溯T-1日,则中断连板序列,但实际应视为“隔日连板”(需结合复牌日是否补涨判定);
- 一字跌停次日“伪连板”:T日一字跌停(CLOSE = LOW = REF(CLOSE,1)*0.9),T+1日高开涨停,表面满足“T+1涨停”,但T日非涨停,逻辑断层;
- 精度漂移误差:浮点乘法如
REF(CLOSE,1)*1.098在通达信中因双精度截断(仅保留小数后3位)导致临界价判定失败(如涨停价应为10.099,系统算为10.098,CLOSE=10.099时判定不通过);
二、深度归因分析:通达信公式的三大底层约束
约束维度 技术本质 对连板识别的影响 状态无记忆性 公式每根K线独立计算,无全局变量/数组/栈结构支持 无法原生记录“上一根K线是否为涨停”、“当前连板起点位置”等状态 函数原子性 所有内置函数(如COUNT、BARSLAST)仅作用于当前周期,不可跨周期累积 无法实现“从今日倒推N天,逐日验证并累计有效涨停日数”的动态回溯 数据稀疏容忍差 对NULL、空值、停牌数据缺乏鲁棒处理机制(如REF(CLOSE,1)在停牌日返回0而非NULL) 导致停牌日被误判为“跌停”或“无效价”,污染连板链 三、工程化解决方案:四层防御式连板识别架构
- 第一层:标的分类预判(TYPE_FLAG)
ST_FLAG := IF(NAMELIKE('ST') OR NAMELIKE('*ST'), 1, 0);
NEW_FLAG := IF(DAY = 1 AND MONTH = 1 AND YEAR = IPOYEAR, 1, 0);
ZT_LIMIT := IF(ST_FLAG, 1.05, IF(INDEXC > 0, 1.1, 1.2)); // 兼容主板/创业板/科创 - 第二层:涨停精确定义(ZT_VALID)
ZT_PRICE := ROUND(REF(CLOSE,1) * ZT_LIMIT, 3); // 强制3位舍入对齐显示精度
ZT_VALID := IF(NEW_FLAG OR ISNULL(REF(CLOSE,1)), 0, CLOSE >= ZT_PRICE AND CLOSE <= ZT_PRICE + 0.005); - 第三层:连板序列重建(DYNAMIC_LB)
利用BARSLAST与REF构造伪状态机:
PREV_ZT := REF(ZT_VALID, 1);
LB_CNT := IF(ZT_VALID, IF(PREV_ZT, REF(LB_CNT,1)+1, 1), 0); // 关键:依赖前值递推,通达信允许单级REF引用 - 第四层:异常熔断校验(SAFETY_CUT)
PAUSE_FLAG := IF(HIGH = LOW AND CLOSE < REF(CLOSE,1)*0.95, 1, 0); // 一字跌停标记
LB_CNT := IF(PAUSE_FLAG AND REF(ZT_VALID,1)=0, 0, LB_CNT); // 熔断:跌停次日若前日非涨停,则清零连板计数
四、可复用主公式:兼容全市场规则的“N板识别器”(支持N=2~7)
{【通达信公式】鲁棒连板计数器 v2.3 —— 支持ST/新股/停牌/精度对齐} ZT_LIMIT := IF(NAMELIKE('ST') OR NAMELIKE('*ST'), 1.05, IF(CODELIKE('300') OR CODELIKE('688'), 1.2, 1.1)); IPO_DAY := IF(DATE = YEAR*10000 + MONTH*100 + DAY AND DATE = IPODATE, 1, 0); ZT_PRICE := ROUND(REF(CLOSE,1) * ZT_LIMIT, 3); ZT_VALID := IF(IPO_DAY OR ISNULL(REF(CLOSE,1)), 0, CLOSE >= ZT_PRICE AND ABS(CLOSE - ZT_PRICE) <= 0.005); {动态连板计数(核心突破)} LB_BASE := IF(ZT_VALID, 1, 0); LB_CNT := IF(ZT_VALID, IF(REF(LB_BASE,1)=1, REF(LB_CNT,1)+1, 1), 0); {熔断保护:剔除一字跌停次日“伪连板”} DT_FLAG := IF(HIGH=LOW AND CLOSE <= REF(CLOSE,1)*0.95, 1, 0); LB_CNT := IF(DT_FLAG AND REF(ZT_VALID,1)=0, 0, LB_CNT); {输出:当日连板数(实时)} DRAWTEXT_FIX(1,0.01,0.01,0,'【连板数】:'+NUMTOSTR(LB_CNT,0)),COLORRED;五、验证流程图:从原始行情到连板信号的完整决策流
flowchart TD A[原始K线数据] --> B{标的类型识别} B -->|ST/*ST| C[ZT_LIMIT=1.05] B -->|创业板/科创板| D[ZT_LIMIT=1.2] B -->|主板| E[ZT_LIMIT=1.1] C --> F[计算ZT_PRICE=ROUND REF*LIMIT 3] D --> F E --> F F --> G{是否新股首日?} G -->|是| H[跳过涨停判定,ZT_VALID=0] G -->|否| I[验证 CLOSE ∈ [ZT_PRICE, ZT_PRICE+0.005]] I --> J[ZT_VALID=1/0] J --> K[动态LB_CNT递推] K --> L{前一日是否一字跌停且非涨停?} L -->|是| M[LB_CNT ← 0 熔断] L -->|否| N[输出LB_CNT] M --> N六、实战增强建议(面向5年+从业者)
- 将
LB_CNT导出为自定义指标(.tni文件),供条件选股平台二次调用,避免公式冗余; - 结合
AMOUNT与VOL构建“量能过滤层”,排除缩量一字板(如:连续3板但单日换手率<2%,则LB_CNT自动降权); - 利用通达信“扩展数据”功能,将IPO日期、ST摘帽日等事件写入本地数据库,替代NAMELIKE硬编码,提升维护性;
- 对科创板股票增加盘中临停逻辑判断(如10:00前涨超30%触发临时停牌),在ZT_VALID中加入
TIME<1000时段权重衰减; - 部署定时任务每日收盘后运行该公式,生成
LB_SIGNAL.csv供Python策略引擎读取,打通通达信与AI模型训练闭环。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- ST股混淆:未区分主板(10%)、创业板/科创板(20%)、ST/*ST(5%)差异化涨停阈值,统一用