ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

通达信双针探底主图指标源码与选股公式源码实战

通达信双针探底主图指标源码与选股公式源码实战 简介这是一份面向通达信用户的技术文档聚焦“双针探底”这一经典底部形态的主图指标与选股公式实现适合具备一定公式编写基础、希望把形态识别落地为可执行代码的股票技术分析学习者与量化选股爱好者参考。资源为单个doc文档压缩包约161KB内容以源码与说明文字为主便于直接复制到通达信公式管理器中使用。文档围绕核心逻辑展开前30天内出现两根最低价一致、且带有长下影的K线通过TJ、T1、T2、T3等变量完成条件判定主图部分用DRAWLINE绘制双针连线并标注“双针探底”配合DRAWICON与DRAWTEXT进行信号提示选股部分则在同一条件基础上筛选出尚未大幅反弹的标的形成主图与选股两套可用代码。目前已有一百七十余人学习适合希望通过源码理解形态判定、并据此搭建自选股监控的读者借鉴与二次修改。1. 双针探底在通达信里到底要解决什么问题盘中经常出现这样的画面一只票连续两天砸出长下影第二根针的低点跟第一根几乎齐平第三天收阳。事后看是标准的支撑确认可当下要么没注意要么看到了不敢动手。双针探底要做的事就是把这套肉眼判断翻译成通达信公式语言——收盘后自动把两根针标在主图上同时用同一套条件把全市场符合条件的票筛出来。标题里的三个词对应三件事源码是判定逻辑本体主图是把信号画回 K 线图上选股是把信号变成可执行的筛选条件。三者共用一套判定只是输出方式不同。适合手上有通达信、想把自己盯盘经验固化下来、又不打算从零啃公式语法的人。下面从判定逻辑讲起一路落到能直接粘进通达信公式管理器的源码。2. 双针探底主图指标源码先教会公式认出一根针2.1 判定一根针要用到的四个量实体、下影、全幅、回溯任何探底针的判定本质都是比较三个长度之间的关系K 线实体、下影线、当日全幅。通达信公式里这三个量都不需要额外数据源直接由 OHLC 算出来。实体长度ABS(C-O)收开价差的绝对值阳线阴线都适用。下影线长度MIN(C,O)-L收开价里较小的那个减去最低价。当日全幅H-L最高价减最低价。针的形态要求下影线足够长既要比实体长出一截也要在当日全幅里占主导。前者保证它是锤而不是实心大阴线后者保证它是扎下去又拉回而不是普通震荡。要把两根针串起来还得知道上一根针离今天有多远。通达信提供BARSLAST(X)返回上一次条件 X 成立到现在经过的周期数当日成立时返回 0昨天成立时返回 1。配合REF(X,N)就能把上一根针的位置换算成具体周期。最小可跑的判定片段长这样{ 单根针的最小判定 } BODY:ABS(C-O); SHADOW:MIN(C,O)-L; RANGE:H-L0.0001; { 加极小值防一字板全幅为 0 } PIN:SHADOW1.5*MAX(BODY,0.01) { 下影至少是实体的 1.5 倍 } AND SHADOW0.5*RANGE; { 下影至少占当日全幅的一半 }这里有两处小写法值得说清楚。MAX(BODY,0.01)是给实体兜底十字星的实体接近 0除法比较会失真H-L0.0001是给全幅兜底一字板当天HL不做处理会得到 0 分母。这两个兜底值不影响正常 K 线的判定结果但能让公式在极端行情里不报错、不抽风。PIN这个变量在通达信里用:赋值表示只做中间计算、不输出到图上。真正要画线或输出结果时才用:。这一条区分整个公式体系都成立后面主图转选股也靠它。2.2 把两根针连起来双针探底主图公式完整源码单根针只是原料双针才是形态。判定链是四步当前是针 → 找到上一根针的位置 → 两者的低点足够接近 → 位置处于相对低位。写成通达信主图叠加公式如下{ 双针探底 · 主图叠加 } N:20; { 两根针之间允许的最大间隔 } K:1.5; { 下影线 / 实体 的最小倍数 } R:0.5; { 下影线 / 当日全幅 的最小占比 } TOL:1.02; { 两根针低点的价格容差1.02 表示允许 2% } BODY:ABS(C-O); SHADOW:MIN(C,O)-L; RANGE:H-L0.0001; { 第一步定义单根针 } PIN:SHADOWK*MAX(BODY,0.01) AND SHADOWR*RANGE; { 第二步当日为针时回溯上一根针的周期数 } LAST:REF(BARSLAST(PIN),1)1; { 第三步两根针的低点落在容差带内 } NEARHIGH:LREF(L,LAST)*TOL; NEARLOW :LREF(L,LAST)/TOL; NEAR:NEARHIGH AND NEARLOW; { 第四步位置过滤20 日均线之下才算低位探底 } LOWZONE:CMA(C,20); XG:PIN AND LASTN AND NEAR AND LOWZONE; { 绘图所有针画绿色下箭头成立的双针画红色上箭头并加文字 } DRAWICON(PIN, L*0.98, 2); DRAWICON(XG, L*0.97, 1); DRAWTEXT(XG, L*0.955, 双针探底), COLORRED;逐段说明判定逻辑。LAST:REF(BARSLAST(PIN),1)1是整段代码的关键BARSLAST(PIN)在昨天那一根 K 线上的取值等于从昨天往回数最近一根针的间隔加 1 就换算到今天的位置。当日PIN成立时才使用LAST所以不会出现拿不到参照物的情况。NEAR用上下两条不等式夹出一个容差带而不是写ABS(L-REF(L,LAST))0.01。原因有两个一是不同价位的股票绝对差值没有可比性容差必须用比例二是分两行写方便单独调一侧——只想允许第二针略高、不允许破位就把NEARLOW改成LREF(L,LAST)。LOWZONE:CMA(C,20)这条过滤不能省。长下影在高位同样会出现那往往是冲高回落留下的痕迹跟探底不是一回事。把位置约束加上信号数量会明显下降但剩下的样本干净得多。绘图部分DRAWICON(COND, PRICE, TYPE)的第二个参数是画图位置的纵坐标。主图叠加公式的坐标系就是价格所以用L*0.98把图标放在当日最低价下方一点不会跟 K 线重叠。DRAWTEXT同理位置再往下压一档给文字留空间末尾加, COLORRED单独指定颜色。2.3 主图公式的四个参数默认值与调节方向参数含义默认值调大后的效果调小后的效果N两根针之间的最大间隔交易日20信号变多形态变松散容易出现隔月双针只认近距离双针信号少但更紧凑K下影线相对实体的倍数1.5要求更长的针信号变少略带下影就算噪声明显上升R下影线占当日全幅的比例0.5要求下影主导全天接近标准锤子线长十字星也会被算进针TOL两根针低点的价格容差1.02允许第二针比第一针低 2%容错更强接近 1.00 时要求两点几乎齐平这四个值在公式管理器里都可以拖成参数控件不必每次都改源码。实操中我一般把 N 和 TOL 留在参数框里调K 和 R 写死在源码中——形态的松紧是审美问题位置和间隔才是策略问题。另外要注意一点主图叠加公式必须在公式管理器的画线方法里选主图叠加否则这套带DRAWICON的公式会被塞进副图价格坐标全乱。3. 双针探底选股公式源码同一套逻辑换个输出口3.1 主图公式改选股公式哪些语句必须删主图和选股共用判定段但后半截完全不能混。通达信选股公式运行在条件选股引擎里没有坐标轴、没有画布凡是涉及绘图的函数一律不认。具体要删掉的是这几类DRAWICON、DRAWTEXT、DRAWNUMBER绘图与标注。STICKLINE、DRAWBAND、PARTLINE画柱、画带、画分段线。DRAWKLINE、DRAWLINE画 K 线和连线。所有带颜色后缀的输出语句比如, COLORRED。还有一条硬规则选股公式必须有且只有一个用冒号:输出的结果多一个冒号输出条件选股引擎会取第一个后面的白写。中间变量一律用:正文里最后一行写XG: 条件 AND 条件;。顺带说下命名。热词里常能看到金针探底选股公式源码那说的是单针版本判定结束在一根 K 线上双针多了一层两根针低点接近的约束信号量大约只剩单针的三分之一到五分之一但胜在要求了二次确认。两者不冲突可以都建成公式在不同的行情阶段换着用。3.2 选股公式完整源码与逐行对照{ 双针探底 · 选股 } N:20; K:1.5; R:0.5; TOL:1.02; BODY:ABS(C-O); SHADOW:MIN(C,O)-L; RANGE:H-L0.0001; PIN:SHADOWK*MAX(BODY,0.01) AND SHADOWR*RANGE; LAST:REF(BARSLAST(PIN),1)1; NEARHIGH:LREF(L,LAST)*TOL; NEARLOW :LREF(L,LAST)/TOL; NEAR:NEARHIGH AND NEARLOW; LOWZONE:CMA(C,20); { 量能过滤当日量不低于 5 日均量的八成说明有承接 } VOLOK:VMA(V,5)*0.8; { 唯一输出 } XG:PIN AND LASTN AND NEAR AND LOWZONE AND VOLOK;从上往下读前半段跟主图公式一字不差这是刻意保留的——两份源码共用同一套判定主图上看到的信号选股结果里一定能找到不会出现图上有、选不出的错位。这种错位在改了主图参数却忘了同步选股公式时非常常见属于最容易踩的坑之一。LAST那一行的行为和主图完全一致只有当日为针时才取值非针日算出来的数字无意义但因为输出条件里带了PIN无意义的值永远不会被用到。VOLOK是新增的量能条件。探底针的有效性跟成交量绑得很紧缩量探底往往只是没人卖放量探底才说明有人在低位接。这里只要求当日量不低于 5 日均量的 80%属于宽松档如果想把标准提到明显放量可以改成VMA(V,5)*1.5。这个系数的绝对值不重要重要的是保持和你的持仓周期匹配——做隔日短打用严格档做波段留宽松档。最后一行XG:是唯一输出点。条件之间用AND串联任意一条不满足该股就直接被过滤不会出现在选股结果里。3.3 加一层趋势结构把逆势针和顺势回踩分开只靠形态和位置选出来的票里仍然混着一类下跌中继股价在下降通道里连续出新低每次探底都留长下影形态上完全符合双针但趋势没走完接进去就是下一段下跌的开始。这类信号很难靠单根 K 线过滤掉得看更长周期的结构。一个实用做法是加均线排列约束要求 20 日线不再陡峭下行SLOPE20:(MA(C,20)-REF(MA(C,20),5))/REF(MA(C,20),5)*100; TRENDOK:SLOPE20-1; { 20 日线 5 日内跌幅不超过 1% } XG:PIN AND LASTN AND NEAR AND LOWZONE AND VOLOK AND TRENDOK;SLOPE20算的是 20 日均线在最近 5 个交易日的百分比变化-1允许它小幅下行但不允许加速下跌。这个门槛比必须拐头向上宽容能保住相当一部分刚见底的票如果改成SLOPE200信号量会砍掉一半以上更适合右侧交易者。另一条可以并行验证的约束是股价与 60 日线的距离。CMA(C,60)*0.85 AND CMA(C,60)*1.05这一条能把深跌反弹的票和中枢震荡的票分开跌破 60 日线太多说明趋势已坏离得太近则说明还在高位没真正探底。这两条可以做成注释需要时再打开。3.4 在通达信公式管理器里建公式并跑一次盘后选股从源码到能用的信号中间有五步固定的操作快捷键打开公式管理器选择条件选股公式→其他类型→新建。公式名填SZTAN_DOUBLEPIN中文描述写双针探底选股。把上面 3.2 的源码整段粘进编辑区。点测试公式确认底部提示编译通过。报错信息通常会指到具体行号最常见的错误是漏了分号或是把:写成了:导致多输出。保存后回到主界面走功能→选股器→条件选股在公式列表里找到刚建的公式选加入条件。选股范围选全部 A 股选股周期保持日线点执行选股。盘后跑一次结果会落在条件选股结果板块里。用通达信实时行情刷新时这个板块会跟着更新但要注意选股公式用的是当日快照盘中跑出来的信号在收盘前会变——探底针的下影线在尾盘被吃掉是常事。稳妥的节奏是收盘后跑一遍第二天开盘再复核一次。4. 双针探底公式的调参、回检与排错4.1 从信号数量倒推参数三个必须先定下来的值参数不是凭感觉调的得先明确你这套信号一天想看到多少个结果。全市场四千多只票双针探底属于低频形态合理的区间是这样的期望日信号数NKTOL说明30~80 只301.21.03宽松档适合做池子初筛再人工看图8~25 只201.51.02默认档兼顾覆盖率和形态质量0~6 只152.01.005严格档要求两根针几乎齐平适合盯少数票调参顺序建议是先固定 K 和 TOL用 N 把数量拉到目标区间再动 K 收紧形态最后微调 TOL。反过来调会很难收敛——TOL 一松形态立刻泛滥你分不清是哪个参数在起作用。有一点要提醒把 K 调到 2.0 以上后很多票会直接消失在结果里原因不是形态不好而是下影线长度赶不上实体的两倍。这种情况下不要急着判定公式坏了先拿一只明显有双针的票把PIN、LAST、NEAR分别用:输出到副图逐层看是哪一步没通过。这比反复改参数有效得多。4.2 用导出数据做一次可复现的信号回检通达信自带的信号测试能给出粗略统计但如果想看清信号出现后 5 日、10 日的分布导数据到 Python 里算更快。公式逻辑可以一比一翻译import pandas as pd def double_pin(df, n20, k1.5, r0.5, tol1.02, ma_len20): df 需包含 open/high/low/close/volume按时间升序 body (df[close] - df[open]).abs() shadow df[[close, open]].min(axis1) - df[low] rng df[high] - df[low] 1e-4 pin (shadow k * body.clip(lower0.01)) (shadow r * rng) # 复现 BARSLAST记录每根 K 线距离上一根针的周期数 last pd.Series(indexdf.index, dtypefloat) gap None for i, flag in enumerate(pin): last.iloc[i] gap if gap is not None else 9999 gap 0 if flag else (gap 1 if gap is not None else None) prev_low df[low].shift(last.astype(int)) near (df[low] prev_low * tol) (df[low] prev_low / tol) lowzone df[close] df[close].rolling(ma_len).mean() return pin (last n) near lowzone df pd.read_csv(sh600000.csv) # 从通达信导出的日线数据 sig double_pin(df) df.loc[sig, [close]].assign( ret5df[close].shift(-5) / df[close] - 1, ret10df[close].shift(-10) / df[close] - 1 ).describe()这段代码的价值在于把BARSLAST显式还原成一次循环。通达信里BARSLAST是黑盒函数Python 里展开后可以清楚看到last记录的是截至当前 K 线距离上一根针过了多少根。prev_low用shift取到那根针的最低价near就复现了容差带判定。拿着导出的历史数据跑一遍再对照通达信公式在图上标出的位置两边信号应当完全重合如果对不上多半是复权方式不一致——通达信导数据时要选和前复权一致的选项否则除权日的价格断层会让NEAR判定全乱。4.3 双针探底源码最常见的五个问题公式编译通过但图上没图标。十有八九是画线方法选错了。主图叠加公式被当成副图公式价格坐标和副图坐标差了几个数量级图标画到了看不见的地方。检查公式管理器中该公式的画线方法是否为主图叠加。选股结果和主图标记对不上。通常是主图加了量能、趋势条件选股公式没同步。把过滤条件抽出来单独维护两份源码要么完全一致要么在注释里写明差异。信号全挤在暴跌日。LOWZONE:CMA(C,20)这条约束在普跌行情里会失效因为几乎所有票都在均线下方。可以再加绝对值约束例如CMA(C,60)*0.8把跌幅过深的票剔掉。BARSLAST返回 0 导致的误判。如果忘记加PIN作为输出前置条件非针日算出来的LAST会指向一个很远的周期REF(L,LAST)可能取到几十天前的低点恰好和当日形成容差内的巧合。XG里必须有PIN AND这不是可选项。参数改了以后结果没变化。通达信公式管理器里的参数控件值和源码里写死的常量会打架。如果在源码开头写了N:20;参数控件里又设了 30实际生效的是源码里的 20。要么把:改成参数声明INPUT:N(20,5,60,1);要么彻底不用控件。5. 把双针探底扩成可复用的多针模板双针是最容易肉眼记忆的版本但真实走势里更常见的是三根、四根长下影挤在同一价位带。这套逻辑稍微改一改就能泛化而且泛化之后信号质量往往更高——多根针意味着这个价位被反复测试、反复承接。改法是把上一根针换成最近 M 根针里至少 K 根落在同一价位带。通达信没有直接的滚动计数用COUNT加条件就能近似{ 近 20 日内至少 3 根针且这些针的低点都落在 6% 的区间内 } PINC:COUNT(PIN,20)3; LOWMIN:LLV(IF(PIN,L,9999),20); LOWMAX:HHV(IF(PIN,L,0),20); BANDOK:PIN AND (LOWMAX-LOWMIN)/LOWMIN0.06; { 当日必须是针且当日低点落在历史针群区间内 } XG3:PIN AND PINC AND BANDOK AND LLOWMAX*1.01 AND LLOWMIN/1.01;这里IF(PIN,L,9999)和IF(PIN,L,0)分别把非针日的价格推向两端LLV/HHV取出来的就是针群里最低的那根和最高的那根。(LOWMAX-LOWMIN)/LOWMIN0.06要求这组针压缩在 6% 的价格带里带宽越窄支撑越明确。6% 这个数不必死守小盘股波动大可以放到 10%大盘股收到 4% 也不为过。另一个值得做的是跨周期确认。日线选出双针后切到周线看这根针落在什么位置如果周线同样处在长期均线附近甚至本身也是一根长下影信号权重会高一档。通达信支持在条件选股里指定周期也可以用#WEEK引用跨周期数据把周线的C和MA(C,10)拉进日线公式做联合判定。这一步会拖慢选股速度但换来的是把日内噪声和级别支撑区分开对于持仓周期超过一周的人这笔开销值。最后一个手感上的技巧双针成立当天不必急着进场。这类形态的第二根针经常在次日早盘被再试探一次把当日低点打掉一点点再拉回。把选股结果放进自定义板块观察开盘后 30 分钟的表现如果低点没有明显跌破前一日的那根针再考虑动手。这个再确认动作用公式很难写死但用自选股盯两天就能形成习惯。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进