ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

通达信主图自动标注指标:无未来函数识别MACD背离与金叉死叉

2026/10/8 16:20:15 拓冰建站 浏览量
通达信主图自动标注指标:无未来函数识别MACD背离与金叉死叉 盯盘盯到眼神涣散、复盘复盘到鼠标冒烟的日子我过了大概两年多。形态识别这件事看多了真的会麻金叉死叉来回切换、MACD柱子翻红翻绿、缩量放量堆在一起每次都得把副图指标切来切去再回到主图上手动标记位置。后来我干脆花了两周时间写了一个通达信主图自动标注指标让底背离、顶背离、金叉死叉、缩倍量这些信号直接显示在K线图上一眼扫过去就清楚。这篇内容把设计思路、无未来函数的写法、完整源码和排错经验都整理出来了适合盯盘时间有限、想减少主观判断、或者刚学形态但总看错位置的朋友你可以直接复制到通达信里跑起来看效果。1. 主图自动标注公式到底在解决什么问题1.1 手工标注的三个痛点戳中你就该看下去先说最现实的问题手工复盘形态到底哪里烦。第一个痛点是漏看。一张日线图上同时存在价格均线、成交量、MACD柱你要在某一根K线上同时确认“价格创低点但MACD没创新低”不把副图拉大、不来回切换光标位置肉眼很容易漏掉。特别是背离这种东西属于跨多个指标块的结构性比较看漏一两次很正常。第二个痛点是主观不一致。同一段双底昨天你觉得是W底今天再看又觉得只是普通反弹不同时间打开同一张图得出的结论不一样。形态识别本身就有模糊性人脑的判断基准不稳定这是天然劣势。第三个痛点是时间成本。一个票复盘5分钟一百个票就是五百分钟而且大部分时间花在“找”而不是“判”。信号明明在那里但你得一个个翻。自动标注主图解决的就是这三件事把模糊的视觉判断改成明确的规则判断把“人找信号”变成“信号找人”把跨指标的复杂比较压缩成一行文字、一个图标。你做的是写规则剩下的交给公式去算规则一致了主观偏差自然就消失了。1.2 主图公式和副图指标的根本区别很多人第一次写主图指标会直接照搬副图写法算完MACD然后画线、画柱状图出来的效果无非是在主图上多叠了几条曲线。这其实没有理解主图标注公式的核心逻辑。副图指标的核心任务是展示连续数值比如DIF、DEA、KDJ的K值D值你通过曲线的相对位置和形态去做判断主图标注公式的核心任务是把离散事件变成可视化标记。它更关心的是“什么时候发生了金叉”“什么时候出现了背离”而不是“DIF现在等于多少”。所以主图公式里绘图函数才是主角DRAWTEXT负责写文字DRAWICON负责画图标STICKLINE负责画柱段DRAWLINE负责连线所有的算法运算都只是为这些绘图函数服务。这个定位想清楚之后公式结构就不会写歪。我见过不少人把大段指标计算堆进主图结果又是均线又是通道又是MACD柱主图乱成蜘蛛网信号反而看不清楚。主图自动标注讲究的是克制只把最终结论类的事件展示出来中间过程一律不画。2. 无未来函数的形态识别思路与核心函数2.1 未来函数是什么为什么信号会“漂移”如果要问自动标注指标最容易翻车的地方在哪答案一定是未来函数。这个概念新手容易忽略老手也偶尔踩坑。未来函数简单说就是“用未来数据改变过去判断”的函数。通达信里的BACKSET就是典型BACKSET(条件,N)会把条件成立之前N根K线全部标记为1。比如第100根K线出现底部信号用了BACKSET之后第95根到第99根也会显示这个信号。复盘的时候看历史信号完美得一塌糊涂实盘的时候信号根本没有提前出现等你真按历史信号去操作亏都亏完了。更隐蔽的还有ZIG、PEAK、TROUGH这一类它们需要先知道整段走势的转折点才能确定波峰波谷所以天然带未来属性。HHVBARS和LLVBARS虽然本身是固定窗口的回看函数但如果窗口设置太长在新数据加入时历史高点的位置也可能发生跳变使用时要非常谨慎。判断你的公式有没有未来函数最直接的办法是删掉最新的几根K线数据看历史信号位置有没有变化。我实测下来只要信号会漂移、会消失十有八九就是未来函数在作怪。2.2 无未来写法只认REF和BARSLAST无未来函数的写法本质上只有一条原则只用“已经发生”的数据只用“固定回看窗口”的数据不依赖整段走势的最终形态。REF是回看指定周期数的历史值比如REF(CLOSE,5)取5根K线前的收盘价这是纯历史数据安全。BARSLAST是计算某个条件上一次满足到现在隔了多少根K线比如BARSLAST(CROSS(MA5,MA10))返回0表示当前就是金叉返回3表示金叉已经过去3根K线了这也是纯历史数据安全。HHV(HIGH,20)和LLV(LOW,20)分别是最近20根K线的最高价和最低价窗口固定同样安全。用这些函数构建形态识别的思路就是先锁定一个“事件锚点”再往前回溯若干个周期然后比较两段的数据关系。以MACD底背离为例锚点就是“DIF上穿DEA”这个金叉瞬间然后向前找上一次金叉的位置比较两次金叉点的价格和DIF。整个过程完全依赖已经收盘的K线不涉及任何未来信息。这里要特别强调一点“无未来”不等同于“信号提前”。它保证的是信号一旦出现就不会漂移但形态确认本身需要等到K线走完有些结构类信号甚至要等后面一两根K线做确认这是无未来写法的正常代价不能反过来用BACKSET去“美化”信号。2.3 标形态必会的函数清单表格虽然枯燥但函数这玩意儿列出来查起来最快。上面这些是我写自动标注公式最常用的几个绘图和控制函数全都验证过。函数作用典型用法注意事项DRAWTEXT在指定位置显示文字DRAWTEXT(金叉,LOW*0.98,金叉)条件为真时只在该K线显示DRAWICON在指定位置画图标DRAWICON(底背离,LOW,1)图标编号有范围不同版本样式不同STICKLINE画柱状线段STICKLINE(底背离,LOW,LOW*0.95,3,0)第4参数是柱宽像素第5参数0实心1空心FILTER信号过滤FILTER(金叉,5)信号出现后5周期内不再重复输出BARSLAST条件最近满足位置BARSLAST(CROSS(DIF,DEA))返回0表示当前K线满足条件DRAWLINE连接两个条件点DRAWLINE(条件1,价格1,条件2,价格2,1)会从条件1位置连到条件2位置DRAWTEXT和DRAWICON的坐标参数特别关键很多人画不出来就是栽在坐标上。你写DRAWTEXT(金叉,LOW,金叉)文字会压在最低价的位置K线实体和影线一多就遮住了所以实际用的都是LOW0.98或HIGH1.02之类的偏移坐标让文字浮在K线外面。DRAWICON也一样图标坐标要留出空间不然出来的效果就是K线和图标糊在一起完全没法看。3. 从零手写自动标注主图完整源码拆解3.1 第一步画趋势骨架与高低点标记写主图指标之前先把骨架搭好。骨架的作用不是输出最终信号而是给后续标注提供参考系同时把当前趋势状态可视化。{ 主图自动标注形态 骨架部分 } N:20; MA5:MA(CLOSE,5),COLORWHITE; MA10:MA(CLOSE,10),COLORYELLOW; MA20:MA(CLOSE,20),COLORMAGENTA; 前高:HHV(HIGH,N); 前低:LLV(LOW,N); 创新高:HIGH前高 AND HIGHHHV(HIGH,20); 创新低:LOW前低 AND LOWLLV(LOW,10); DRAWICON(创新高,HIGH,2); DRAWICON(创新低,LOW,1);这里面N是高低点回溯窗口默认20根K线。20这个值是我在日线上反复试出来的均衡点太小的话一段趋势里会打出超多个高低点看图全是图标太大的话信号太稀疏一周可能都触发不了一次。如果是日内短线N建议缩到10到15后面第4章会专门讲参数问题。创新高条件我特意加了HIGHHHV(HIGH,20)这个等式意思是“当前K线的最高价等于最近20根的最高价”才算创新高这样能过滤掉那种盘中冲高但收盘回落的假突破。如果你只想标记真正的收盘突破可以把比较基准换成CLOSE或者把HHV窗口改成你想要的周期。3.2 第二步金叉死叉自动标注骨架搭好之后加金叉死叉标注。金叉死叉是最基础的形态信号适合拿来练手DRAWTEXT和DRAWICON的坐标控制。{ 金叉死叉标注 } MA5:MA(CLOSE,5); MA10:MA(CLOSE,10); 金叉:CROSS(MA5,MA10); 死叉:CROSS(MA10,MA5); 金叉过滤:FILTER(金叉,3); 死叉过滤:FILTER(死叉,3); DRAWTEXT(金叉过滤,LOW*0.98,金叉),COLORRED; DRAWTEXT(死叉过滤,HIGH*1.02,死叉),COLORGREEN; DRAWICON(金叉过滤,LOW*0.95,1); DRAWICON(死叉过滤,HIGH*1.05,2);FILTER(金叉,3)的意思是金叉出现之后3个周期内不再重复输出金叉信号。这在实际行情里非常重要均线粘合的时候短周期均线可能来回穿越金叉死叉连续触发如果不加过滤图上会像弹幕一样铺满文字。3个周期的过滤足够滤掉大部分黏连信号又不会让有效信号被过滤掉。文字坐标这块我在LOW下方0.98倍的位置写“金叉”在HIGH上方1.02倍位置写“死叉”这样文字不会遮挡K线实体。图标我放在了更外侧一点用0.95和1.05两个系数让图标和文字错开位置不会叠在一起。3.3 第三步MACD底背离与顶背离自动标注这一步是全文的核心也是当初写这套公式花最多时间调试的部分。MACD背离的自动识别难点在于如何用无未来写法定位“前一次金叉”和“前一次死叉”。直接给代码逐行解释。{ MACD顶底背离自动标注 } DIF:(EMA(CLOSE,12)-EMA(CLOSE,26)); DEA:EMA(DIF,9); 金叉:CROSS(DIF,DEA); 死叉:CROSS(DEA,DIF); 近金叉:BARSLAST(金叉); 远金叉:REF(BARSLAST(金叉),近金叉1); 当前金叉价:REF(CLOSE,近金叉); 当前金叉DIF:REF(DIF,近金叉); 前次金叉价:REF(CLOSE,近金叉远金叉1); 前次金叉DIF:REF(DIF,近金叉远金叉1); 底背离:金叉 AND 当前金叉价前次金叉价 AND 当前金叉DIF前次金叉DIF; 近死叉:BARSLAST(死叉); 远死叉:REF(BARSLAST(死叉),近死叉1); 当前死叉价:REF(CLOSE,近死叉); 当前死叉DIF:REF(DIF,近死叉); 前次死叉价:REF(CLOSE,近死叉远死叉1); 前次死叉DIF:REF(DIF,近死叉远死叉1); 顶背离:死叉 AND 当前死叉价前次死叉价 AND 当前死叉DIF前次死叉DIF; 底背离F:FILTER(底背离,5); 顶背离F:FILTER(顶背离,5); DRAWTEXT(底背离F,LOW*0.95,底背离),COLORRED; DRAWTEXT(顶背离F,HIGH*1.05,顶背离),COLORGREEN; DRAWICON(底背离F,LOW*0.90,1); DRAWICON(顶背离F,HIGH*1.10,2);逻辑链条是这样的当DIF和DEA在当前K线发生金叉时用BARSLAST(金叉)得到当前K线距离这个金叉的周期数此时BARSLAST返回0说明金叉就在本根。然后我用REF(BARSLAST(金叉),近金叉1)去取“上一次金叉距离上上根K线有多远”也就是往回数到当前金叉的前一根再计算那根K线到前一次金叉的距离。这样近金叉和远金叉两个数加起来就能从当前K线准确回推到前一次金叉的位置。为什么用金叉做底背离的锚点而不是用MACD柱翻红因为MACD柱每根K线都在变化用它做锚点柱从绿变红的那一刻可能有连续两根都满足条件锚点不稳定金叉是一个单点事件一个位置只触发一次锚点干净利落。顶背离我用死叉做锚点因为顶背离对应的结构转折发生在动能衰竭的死叉阶段逻辑是对称的。比较时我用的是前后两次金叉点的收盘价和DIF值。价格比较用CLOSE不用LOW或HIGH是因为收盘价是已经确认的一致基准影线容易被个别极端K线干扰。DIF的比较直接反映动能价格创新低但DIF没有创新低说明下跌动能在衰竭底背离成立价格创新高但DIF没有创新高说明上涨动能在衰减顶背离成立。这套代码跑在历史数据上不会漂移因为每一步都只用已经发生的K线数据。实测下来底背离的信号会有1根K线的确认延迟这是无未来写法的正常现象千万不要为了消除延迟去用BACKSET。3.4 第四步缩量放量事件标注与信号过滤背离和均线金叉属于结构信号量能属于事件信号。把量能事件也标出来配合结构信号用能过滤掉一大批假信号。{ 量能异常标注 } 缩半量:VOLREF(VOL,1)*0.5 AND CLOSEOPEN AND VOLHHV(VOL,20); 倍量:VOLREF(VOL,1)*2 AND CLOSEOPEN; DRAWTEXT(缩半量,LOW*0.88,缩量),COLORCYAN; DRAWTEXT(倍量,HIGH*1.08,倍量),COLORMAGENTA;缩半量条件里我加了CLOSEOPEN要求当天收阳因为下跌途中的缩量也经常出现但那种缩量只是没人卖不代表有人愿意买参考价值不大。同时我用VOLHHV(VOL,20)限制了它必须创20日内量能新低这样筛选出来的是真正的地量。倍量条件我只要求相对昨日放量2倍以上且收阳放量突破的时候看到“倍量”两个字的概率明显增加。量能标注配合背离信号有个经典用法底背离出现的当根如果同时出现缩量说明抛压已经衰竭背离的可靠性大幅提升顶背离出现的当根如果伴随倍量阴线说明有资金在出货则更要警惕。这就是我说的信号过滤思路第4章会展开讲。4. 参数调优、误报过滤与公式瘦身4.1 不同周期的参数怎么选同样的公式在不同周期上参数不能一刀切尤其是MACD和高低点回溯窗口。我实测下来的经验参数放到下面这张表里供你参考。使用周期高低点窗口NMACD快慢线信号过滤周期适用场景1分钟/5分钟日内10-155,13,53-5期货日内高低点波段、分时短线15分钟/30分钟15-208,17,95日内波段、短线进出日线20-3012,26,95-8常规日线复盘、波段选股周线30-4012,26,98中期趋势判断、大级别背离日内周期最大的问题是默认MACD参数太钝12,26,9放在1分钟图上DIF和DEA的来回穿越频率低得可怜可能一整天都等不到一次金叉。我实际测下来1分钟和5分钟周期用5,13,5这类缩短参数效果更合适信号出现的节奏跟盘口节奏能对上。高低点窗口N在日内也一定要缩不然日内价格来回震荡20根K线的前高前低早就被突破又突破图标会打成一串。日线周期反而是最省心的12,26,9就是MACD经典参数高低点窗口20也足够覆盖一波日线级别的波段。周线周期高低点窗口建议放到30到40周线本身K线数量少窗口太小的话找出来的高低点都是中级别波动内的临时转折不具备参考意义。4.2 三招压住误报率误报率是自动标注公式能不能实盘用的关键。我总结出三招按效果排序你可以在公式里叠加使用。第一招是量能确认。以底背离为例在原始底背离条件后面追加缩量条件。下跌末端出现缩量说明砸盘力量已经减弱背离的含金量远高于带量下跌中的背离。代码写成底背离:金叉 AND 当前金叉价前次金叉价 AND 当前金叉DIF前次金叉DIF AND VOLREF(VOL,1) AND REF(VOL,1)REF(VOL,2);意思就是金叉当天缩量而且不是突然的偶发缩量是连续缩量收敛的状态。第二招是趋势过滤。我把趋势状态定义成20日均线的斜率方向让底背离只在下跌趋势中出现让顶背离只在上升趋势中出现。看似奇怪实则有逻辑下跌趋势中的底背离才是真正意义上的底部信号上升趋势中的DIF短暂下穿DEA再上穿很难构成结构级别的大底同理顶背离挂在上升趋势里才有参考价值。趋势向上:MA(CLOSE,20)REF(MA(CLOSE,20),3); 趋势向下:MA(CLOSE,20)REF(MA(CLOSE,20),3); 底背离F:FILTER(底背离 AND 趋势向下,5); 顶背离F:FILTER(顶背离 AND 趋势向上,5);第三招是限制信号密度。FILTER(条件,5)之后同一个方向上5根K线内最多出一次信号宁可少标也不让它反复横跳。信号太密的公式看起来热闹实际决策时反而不知道听谁的这一点是在实测里踩出来的教训。4.3 公式卡顿和后处理主图公式的卡顿往往不是因为算法复杂而是因为绘图语句太多。我测过一个主图公式里挂30个DRAWTEXT在5000根K线数据上加载大概需要0.5秒如果把绘图语句堆到100个以上加载时间直接翻倍翻页的时候肉眼可见地卡。解决办法有三个方向。第一减少绘图函数调用次数把多个信号合并到同一个DRAWTEXT里去比如用字符串拼接把“倍量突破”和“金叉”写在同一个位置第二用FILTER控制输出密度避免无意义的重复绘图第三删掉公式里调试用的临时输出很多人在调试阶段习惯性地写一堆临时变量和画线语句改完逻辑就忘了删这是卡顿的隐形元凶。另外提一个很容易被忽略的问题跨周期引用。如果你在分钟图上用#DAY或者#WEEK引用日线数据通达信每次刷新都要重新对齐两个周期的K线数据几百只股票同时刷的时候性能下降会非常明显。不是必须用跨周期就别用手动切到目标周期看效果更稳妥。5. 常见问题排查与选股联动5.1 标注晚一根K线是怎么回事最早写完这套公式我在实盘翻页的时候总觉得信号比感觉上晚了一根K线后来想明白了DRAWTEXT的条件是当根K线收盘以后才成立的。比如金叉信号盘中DIF和DEA可能已经在纠缠但只有等到收盘确立CROSS文字才会显示你看到的时候自然就是“晚”了。这种情况怎么处理如果你希望信号更快显示可以用前一根收盘数据来做条件比如把金叉条件改成REF(CROSS(DIF,DEA),1)这样信号会在条件成立的后一根K线开盘时就显示但代价是信号整体后移一根并不会“更早”。我自己的做法是接受这个延迟并且在公式里加一个确认偏移参数默认等于1。也就是说我在信号成立当根不画故意等到下一根K线开盘再画用多等一根的代价换信号的稳定性。道理很简单当根收盘确认的信号收盘价本身已经定格不会盘中反复消失多等一根的延迟对日线级别操作几乎没有影响对日内操作也只需要习惯开盘一瞬间的确认。5.2 历史信号一刷新就变怎么揪出未来函数这是自动标注公式最隐蔽的坑信号刷新后变了位置基本可以断定公式里存在未来函数。排查步骤依次来。第一步把公式源码复制到记事本搜索这几个关键词BACKSET、ZIG、PEAK、TROUGH、HHVBARS、LLVBARS。出现任何一个都要高度警惕。第二步手动删掉最新3根K线数据再看之前的信号位置有没有变化。有变化就是未来函数在作怪没变化基本可以放心。第三步盘中刷新看信号行为如果信号在盘中频繁出现又消失大概率也是未来函数因为实时行情下未来数据还没到齐信号只能反复横跳。我自己踩过的典型例子是用HHVBARS判断突破新高。当时想让公式标注“创20日新高”的位置用了HHVBARS(HIGH,20)结果盘中每次价格刷新这个函数标记的位置都在变删掉最后的K线就发现历史信号对不上了。后来改成HIGHHHV(HIGH,20)这个等式判断信号马上就稳定了。这个教训我一直记着现在写公式只要涉及高低点一律用HHV加等式不用HHVBARS。5.3 文字和图标画不出来的四个原因DRAWTEXT用得好好的突然画不出来或者整个公式加进去一点反应没有这个问题我收到过不少次。按出现频率排主要有四个原因。第一条件不成立。听起来像废话但确实是最常见的原因。特别是底背离这类条件本来就少叠加了趋势过滤和量能过滤之后可能翻完整段历史一个信号都没有。排查方法很简单把条件单独输出成一条线看看有没有任何位置等于1。我通常会把底背离F直接画成副图曲线一眼就能看到信号分布。第二坐标被K线遮住。DRAWTEXT的第二个参数写的是LOW文字默认从最低价的位置开始写结果K线实体把文字盖住大半看着就像没画出来。解决办法就是第3章说的坐标写成LOW0.95或者HIGH1.05把文字顶出去。第三DRAWICON图标编号不在有效范围内。通达信不同版本的图标编号范围不一样有些版本一共就几十个编号你写了个超范围的编号图就画不出来。稳妥起见图标编号从1到10之间挑这是各版本都稳定的区间。第四变量名重复覆盖。通达信公式里变量名不能重复定义如果你已经定义了“背离”这个变量后面又用“背离:”重新赋值系统会直接报错或出现奇怪结果。排查方法是看公式输出窗口的报错提示这类语法错误通常都有明确说明。5.4 自动标注条件直接转成选股和预警主图公式画出来之后最大的福利就是这些条件可以直接复用成选股公式不用另写一遍逻辑。做法很简单。在公式末尾加一行输出选股信号:底背离F OR 顶背离F OR 金叉过滤 OR 缩半量;然后在通达信的条件选股公式编辑器新建一个公式把上面整段逻辑粘贴进去最后加一行XG:选股信号;选股条件选“XG1”就能在历史行情里扫描出所有触发信号的自选票。我每天收盘后用条件选股扫一遍全市场把出现底背离或者缩倍量突破的票加进自选再人工复核图形工作量瞬间小了很多。盯盘预警也是同样的逻辑。把选股公式挂到通达信的预警系统里设置实时刷新盘中信号一触发就弹窗提醒。预警系统支持一次挂多只票我通常把自选股全挂进去配合1分钟或者5分钟周期使用日内高低点波段行情基本能覆盖住。如果你后续要把选股结果导出到数据库做统计有一点要留意多值形态筛选在SQL里的写法。很多人会把多个形态塞进一个字段写出WHERE 形态IN(底背离,顶背离)结果里却没有数据原因是你存的是单值字段一个记录只有一个形态值。正确做法是先做一次UNION或者用子查询把多值拆成多行再去做IN匹配否则匹配永远为空。写公式这些年我最大的体会有两点。第一公式只是把规则写清楚它不会替你判断自动标注省下来的是机械识别的时间而不是决策的思考量。第二信号不是越多越好这套主图公式写完之后我反而一直在做减法把不重要的、重复的标注删掉最后图上留下的信号才真的有参考价值。写完之后你还得花时间做一件事把历史K线翻一遍找一个信号密集的票用键盘逐根走一遍看看每个信号出现的环境是不是你想要的。这一步做完你才算真正了解自己的公式。