资讯动态

通达信BS主图源码解析:无未来函数的均线交叉买卖点与选股改造

发布时间:2026/9/18 22:06:03 来源:尧图企业网站定制
简介通达信BS主图指标公式源码主要面向使用通达信进行技术分析的股民与量化爱好者重点解决行情研判中买卖点识别不准、指标滞后漂移等问题。压缩包内为1个doc文档共186KB包含完整的BS主图源码及附赠的B点选股公式可直接复制到通达信公式管理器中使用。公式以MA(CLOSE,3)、MA(CLOSE,6)、MA(CLOSE,12)、MA(CLOSE,24)的均值作为基准再通过SMA快线与该基准的CROSS交叉捕捉买点信号逻辑清晰且采用“不漂移、无未来函数”设计避免未来数据干扰使买卖点更真实可靠。已有2925人浏览学习适合具备一定技术分析基础、希望优化主图指标并辅助决策的交易者研究参考。1. 为什么说“无未来”才是主图指标的及格线见过太多复盘里“完美”的买卖点最低点画个红箭头最高点画个绿箭头切到实盘立刻变脸。原因很简单这类指标用了未来函数也就是在计算当前K线信号时偷偷引用了之后才产生的价格数据。你在图上看到的“精准”是事后修补出来的。而通达信BS主图源码的核心卖点恰恰是“不漂移、无未来”——它只用当前及之前已确认的收盘价做计算信号一旦在历史K线上确定就不会随着后面的行情回补或消失。对于做波段和复盘训练的人来说这类指标才有真正的参考价值因为它回答的是“我在当时那个位置依据已有信息能不能做出这个决策”而不是“事后看哪里是底”。这份源码虽然很短但组合了四条不同周期的均线、一条带权重的SMA和CROSS交叉触发逻辑实际是一套完整的多周期趋势过滤系统。整篇博文会从公式逐行拆解开始讲清楚每条线在干什么然后给出参数选型的边界和实战中的调整方法最后落到如何验证“无未来”这个属性以及怎么把主图信号改造成可用的选股条件。下面直接进源码。2. 拆开 BS 主图源码四条均线、一条SMA、一个CROSS2.1 买入线的构造逻辑四周期均线的等权平均源码第一部分是这样的买入:(MA(CLOSE,3)MA(CLOSE,6)MA(CLOSE,12)MA(CLOSE,24))/4,COLOR0000FF;这一行定义了变量“买入”它取了四个不同周期的简单移动平均线然后做算术平均。MA(CLOSE, 3)3日收盘价均线反应最快贴近短期价格波动。MA(CLOSE, 6)6日均线对应一周半左右的交易周期。MA(CLOSE, 12)12日均线大约两周半用于确认中期方向。MA(CLOSE, 24)24日均线约一个多月是这条合成线的“底盘”。四条线被赋予相同的权重各25%之后求平均值。等价于先分别求四条不同周期的均线再取它们的平均数。这样做的实际效果是短期信号被中期和长期均线“拉着”不会因为一两根大阳线就立刻翻多。这里要特别注意一个容易误读的点(MA(CLOSE,3)MA(CLOSE,6)MA(CLOSE,12)MA(CLOSE,24))/4并不等于MA(CLOSE, (361224)/4)也就是不等于MA(CLOSE, 11.25)。因为简单移动平均是线性算子四线等权平均确实等价于对四个窗口的收盘价序列各取平均后再平均但这不是单条均线的效果。它等价于一个带有特定权重分布的线性滤波器——近3日的价格出现了4次分别出现在4条均线里第4到第6日的价格出现3次第7到第12日的价格出现2次第13到第24日的价格只出现1次。也就是说它对最近3天的数据赋予了4倍的权重但又不完全抛弃24天前的价格信息比直接用单一短周期均线平滑又比单一长周期均线灵敏。理解这一点后面调参数时心里才有数。2.2 MA1 的深层含义SMA 的权重衰减特性源码第二行MA1:SMA(C,3,1),COLORGREEN;这里用的是 SMA不是 MA两者在通达信里计算方式完全不同。MA(CLOSE, 3) 的公式是(C C1 C2) / 3即当天及前两天收盘价的算术平均三天权重完全相等。而 SMA(C, 3, 1) 的算法是 Y (X * M Y * (N - M)) / N展开来看在 N3、M1 的情况下当前值 (收盘价 × 1 前一日SMA值 × 2) / 3。也就是说SMA 并不会把三天价格一视同仁而是给当天收盘价 1/3 权重给昨天SMA值 2/3 权重而昨天的SMA值里又包含了前天的SMA值如此递推。越早的价格权重以指数形式衰减但永远不会完全归零。翻译成直白的话MA1 这条线在数学上等价于一个带遗忘因子的“趋势估计器”它对最近的价格变化反应较快同时天然带有惯性——不会因为某天收盘价突然跳涨就立刻大幅转向。如果把这个 SMA 换成 EMA行为会稍有不同。EMA 的平滑系数是 2/(N1)对当日价格的权重更高SMA(C,3,1) 的递归系数是 2/3本质上更接近“慢速”的平滑。在行情震荡时EMA 更容易钻牛角尖SMA 则钝一些更适合做趋势确认而不是抢反弹。COLORGREEN 只是把这条线在图上显示为绿色不影响计算但主图上可以借此分辨两条线蓝色的是买入线绿色的是 MA1 快线。2.3 CROSS 触发机制上穿是唯一买入条件源码第三行CROSS(MA1,买入);CROSS(A, B) 表示 A 从下方穿越到 B 的上方即满足两个条件前一根K线上 A ≤ B当前K线上 A B。这里的 A 是 MA1B 是买入线。CROSS 只在穿越发生的当根K线返回 1其余时间为 0这意味着你得到的是一组成离散的脉冲信号而不是连续状态。从交易逻辑上讲其实隐含了“快线上穿慢线做多”的经典双均线思想。MA1 是带有权重衰减的 3 日快线买入线是 3/6/12/24 四周期均线合成后的“慢线”。当MA1上穿买入线说明短期价格动能已经强过由四条均线构成的中期趋势基准。由于买入线本身包含24日长周期数据单日脉冲行情很难触发交叉信号天然过滤掉了一部分“假突破”。但是有一个细节很容易被忽略CROSS(MA1, 买入) 没有保留“下穿”信号它只输出一个买入点。这意味着主图上只画买点不画卖点。如果你直接拿这个源码做主图所有K线都会“孤零零”地标出向上箭头卖出位置需要自己结合价格跌破买入线或者其他逻辑另外处理。这是这个公式的一个短板后面会讲到如何处理。3. 周期参数为什么是3/6/12/24手工调优经验与边界3.1 周期组合的倍数关系与斐波那契之外的另一种选择3、6、12、24 这四个数字是严格的 2 倍递进关系分别对应 3 个交易日、1周、2周、1个月按5个交易日/周粗算。为什么要用倍数递进而非斐波那契3、5、13、21或等间隔5、10、20、30核心原因是均线周期的间距决定了它对“趋势拐点”的分辨率。如果相邻周期差距太小比如 3 日和 5 日两条均线几乎重叠合成的买入线就趋于一条更平滑的短期均线失去了“跨周期确认”的意义。如果差距太大比如 3 日和 60 日短期波动会被长周期彻底淹没交叉信号极度稀疏可能一年到头只给出两三次买点。而 3/6/12/24 的倍数递进保证每一条相邻均线之间都有足够的相位差同时又不至于跨度太大导致响应迟钝。实际训练中这个组合在日线级别上大致覆盖了一周到一个月的时间窗口恰好匹配A股短线波段和中线趋势的分界区间。如果你操作的是周线级别行情可以整体乘以 5 变成 15/30/60/120如果做 30 分钟级别的日内波段可以整体除以 4 变成 1/2/3/6。3.2 调参数的三个约束条件信号数量、滞后程度、胜率分布在通达信公式管理器里直接改这行代码的数字即可买入:(MA(CLOSE,5)MA(CLOSE,10)MA(CLOSE,20)MA(CLOSE,60))/4; MA1:SMA(C,5,1); CROSS(MA1,买入);上面改成了一个常见的双倍均线组适合做中长线波段。但要注意改动任何一个参数都会同时影响两个东西信号产生的频率和信号发生的位置。调大 S 参数比如把 SMA 的 N 从 3 改成 5MA1 变得更平滑上穿发生的时机更晚信号数量大幅减少但噪音更小。调大买入线的周期买入线滞后增强交叉点位整体向右偏移买点位置“看起来”更安全但实际成交价会比之前高出一截。所有周期同时等比例缩放信号的形态不变但时间尺度拉长或压缩适合切到不同级别K线。调参的验证标准建议用三组数据对比把参数改成 5/10/20/60 和 2/4/8/16分别在 20 只不同行业股票上跑一遍回测统计买点出现次数和买点后5日、20日的平均收益。如果参数变化后信号数量出现断崖式下跌说明长周期均线过长已经脱离了原本的短线逻辑如果信号数量暴增说明某条均线过短过滤作用失效。3.3 参数在不同行情状态下的表现差异买入线本质上是一个多周期均线滤波器它在单边上涨行情中表现最好——因为MA1会快速抬升并持续位于买入线上方在横盘震荡市中表现最差——均线反复纠缠CROSS信号会频繁出现但又频繁失效。这一点不是说公式有缺陷而是任何基于均线的系统都绕不开的固有特性均线是趋势跟踪工具不是震荡市场工具。实操中如果你发现某个阶段信号质量明显下降通常不是参数出了问题而是行情状态已经变了。可借助这个公式之外的指标来观察当价格与买入线的乖离率持续在正负3%以内窄幅波动说明均线在粘合此时不要依据CROSS开仓当乖离率快速放大时说明趋势加速CROSS信号的有效性反而更高。4. 验证“不漂移”三种实测方法与取数边界4.1 为什么很多指标会“漂移”问题出在哪个环节指标漂移的本质是在计算序列中某个时间点的值时引用了该时间点之后的数据。最常见的两类写法{ 危险使用了未来数据 } DRAWICON(ISLASTBAR, LOW, 1);ISLASTBAR 是最后一根K线的判断函数把信号强制画在最后一根K线上这就属于典型的未来函数。另一种隐蔽的情况是屏蔽了 DYNAINFO 或者用了 ZIG、PEAK、TROUGH 这类“之字转向”函数它们的计算需要先确定拐点位置而拐点确认依赖后续K线因此在历史回看时会“自动修正”信号位置表现出来就是“漂移”。BS主图源码里只用到了四个函数MA、SMA、CROSS 和收盘价。MA 和 SMA 都是递归型函数当前位置的值只依赖当前及过去的价格CROSS 只是对两根K线的状态做逻辑判断同样只用到当前和前一根K线。从函数层面看这个公式不具备调用未来数据的能力。4.2 方法一通达信自带的“数据回放”逐根验证打开通达信在工具栏找到“系统”里的“训练模式”或者按快捷键 47 进入数据回放选一支票从任意一个历史位置开始逐根K线向后播放把主图指标切换为 BS 主图。观察每一根K线出现时指标的信号标记是否会“凭空消失”或“突然移动”。记录出现信号的K线然后继续播放回看这根K线上的信号是否在后续K线出现后仍然固定在原位。如果一根K线原本没有信号后来出现了一个箭头或者原有的箭头在后续K线刷新后位置改变就说明存在未来函数。BS主图在这个测试下应该是稳定的——信号一旦画出就不再变动。对于CROSS触发的那根K线它可能会在一开始显示信号随后保持不动。4.3 方法二用 Python 复算相同逻辑做交叉验证通达信是闭源商业软件如果它的 MA 或 SMA 实现和标准算法有细微差异肉眼观察很难察觉。可以用一段简单的 Python 代码基于同一份行情数据算出同样的信号序列再与通达信主图上的买点做比对import pandas as pd def sma_tdx(series, n, m): # 通达信中的SMA(X,N,M)按 Y(X*M Y_prev*(N-M))/N 递推 vals [] y 0.0 for x in series: y (x * m y * (n - m)) / n vals.append(y) return pd.Series(vals, indexseries.index) def bs_signal(df): close df[close] ma_buy (close.rolling(3).mean() close.rolling(6).mean() close.rolling(12).mean() close.rolling(24).mean()) / 4.0 ma1 sma_tdx(close, 3, 1) cross (ma1 ma_buy) (ma1.shift(1) ma_buy.shift(1)) return cross.astype(int)这段代码复现了三条逻辑rolling(3) 对应 MA(CLOSE, 3)sma_tdx 用递推公式严格对齐通达信的 SMA最后一行用“当前大于买入线且前一根小于等于买入线”表示上穿。导入同一只股票的日线数据之后输出的 1 所在的位置应该和通达信主图上的买点一一对应。这个验证方法的优势在于完全独立于通达信环境能排除软件本身绘图误差。注意这里 rolling().mean() 默认取的是窗口内数据均值和通达信 MA 对缺失值的处理有细微差别。正常情况下交易日数据是连续完整的不会有问题但如果你导入的数据中间有停牌空行需要在计算前把空值行剔除否则信号会错位。4.4 方法三观察信号是否被“回补”第三种方法不需要额外工具直接从源码层面检查搜索整个公式里有没有 ZIG、PEAK、TROUGH、BACKSET、FILTER、ISLASTBAR、DRAWICON 搭配 CONST、DYNAINFO 这类函数。如果出现了 ZIG 或 BACKSET几乎可以断定存在未来函数回补如果出现 ISLASTBAR则是把结果画在最终K线位置同样属于信号漂移。BS主图源码只包含四行代码从函数清单上看是干净的。不过有一个边界要说清楚“无未来”不等于“准确”。指标只是把历史上每个决策时刻的真实信号原样保存下来如果买入线之上买入、跌破卖出这个策略在震荡市里连续亏损信号依然是完全无漂移的但它的盈亏表现并不好。无未来保证的是“信号可复现”不保证“信号盈利”。这个区别在复盘时尤其重要——别再拿漂移指标复盘出的完美曲线自欺欺人了。5. B 点选股公式的实战化改造与辅助过滤技巧5.1 把主图信号改造成“当日选股”条件原始公式里 CROSS(MA1, 买入) 只是主图上的一个画线条件不能直接在选股器里用。要变成选股公式需要把输出明确为一个逻辑结果买入:(MA(CLOSE,3)MA(CLOSE,6)MA(CLOSE,12)MA(CLOSE,24))/4; MA1:SMA(C,3,1); B点:CROSS(MA1,买入) AND 成交量0;这个改造只做了两件事把原来的分号逻辑改成了冒号输出让 B 点成为公式的最终输出项加上成交量0过滤掉停牌或集合竞价未成交的无效状态。在通达信的“条件选股”里加载这个公式执行选股出来的就是当天满足 MA1 上穿买入线的全部股票。选股时建议加一个“当日涨幅”的前置观察上穿当天如果涨幅超过 5%追高成本太高回撤风险大如果涨幅为负但 MA1 仍然上穿说明价格在收盘前被拉起这种信号反而值得关注。5.2 增加成交量确认真实买卖点的辅助过滤裸的CROSS信号在缩量阴跌行情里会频繁误报一个简单有效的过滤是叠加量能确认——上穿当天成交量必须大于前5日均量的一定比例买入:(MA(CLOSE,3)MA(CLOSE,6)MA(CLOSE,12)MA(CLOSE,24))/4; MA1:SMA(C,3,1); 量比:VOL/MA(VOL,5); B点:CROSS(MA1,买入) AND 量比1.2;量比 1.2 意味着当天成交量至少是前5日平均值的1.2倍。这个阈值的作用是筛选出“有资金参与”的上穿。如果行情极端缩量均线虽然金叉但成交清淡说明市场没有形成共识跟进去很容易经历钝刀子割肉。量比参数可以根据你的操作风格调整保守的可以用1.5激进的可以用1.1。注意量比是辅助条件不可替代主信号。这个公式还有一个隐性的使用方式——把它和原版主图并行加载。原版主图画出所有CROSS位置选股公式只输出放量上穿的位置两相对比就能看出“量能过滤”到底过滤掉了哪些信号、又保留了哪些信号对理解行情结构非常有帮助。5.3 用“线偏离度”回避均线粘合期的假信号成交量过滤能解决缩量假突破但对付不了“放量假突破”——股价在上穿完成后第二天立刻跌回买入线下方。这类情况通常发生在均线粘合期多条均线距离极近MA1 略微抬头就能上穿缺乏趋势支撑。可以通过计算买入线的斜率来过滤买入:(MA(CLOSE,3)MA(CLOSE,6)MA(CLOSE,12)MA(CLOSE,24))/4; MA1:SMA(C,3,1); 斜率:买入/REF(买入,3)-1; B点:CROSS(MA1,买入) AND 斜率0.005;REF(买入, 3)取的是三天前的买入线数值把买入线相对三天前的涨幅定义为斜率。阈值 0.005 表示买入线在三天内抬升了至少 0.5%这代表均线束整体开始向上发散而不是水平缠绕。这里的 0.5% 是一个起点经验值你在查看公式结果时可以根据每只股票的波动率把它放宽到 0.3% 或收紧到 0.8%。波动小的蓝筹股阈值要低一些波动大的题材股可以高一些。这里提供一个快速的自检方法用通达信的“程序交易评测”功能选一支你熟悉的股票把 B 点公式作为买入条件卖出条件设为“买入后 5 天收盘价卖出”跑一遍历史评测。看两点一是胜率即盈利交易的占比二是盈亏比即平均盈利和平均亏损的比值。如果加入某个过滤条件后胜率没明显变化但信号数量少了 60%说明这个过滤条件过滤掉了无效信号如果胜率没变但信号数量少了很多说明它把有效信号也一起过滤掉了阈值需要回调。5.4 配套主图把B点画在K线上方选股公式只能在选股器里用作为单独的副图或主图指标会显示为纯数字信号。如果你希望每次打开个股主图时直接看到历史所有B点位置可以把这个公式原封不动放进主图指标文件里以 DRAWICON 或 STICKLINE 方式标出DRAWICON(B点, LOW*0.98, 1);LOW*0.98把图标放在K线下方约 2% 的位置图标类型 1 是通达信内置的红色向上箭头。不需要额外输出变量只靠 DRAWICON 完成画图。把这一行追加到原BS主图的最后一行之后主图上买点就会以箭头形式呈现方便和后面的价格走势对照复盘。注意 DRAWICON 不能单独放在选股公式里作为输出条件选股逻辑仍然以 CROSS 为核心。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价