十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

通达信多空概率系统源码:四因子加权与Python回测

通达信多空概率系统源码:四因子加权与Python回测 简介这份通达信指标公式源码文档面向有一定基础的量化交易爱好者与股票技术分析学习者围绕多空概率判断这一核心问题给出可直接导入通达信的公式代码与指标思路。资源为单个doc文件压缩包约283KB正文以公式源码、变量注释和指标说明为主涵盖主买主卖量能拆解、DD日差额、DDX1至DDX3的多周期均线组合以及JRH、JRL、MA3、YTSL与VAR系列条件判断的写法与含义并用STICKLINE对不同多空状态分色绘制K线便于直观识别趋势强弱。读者可据此理解EMA、MA、STICKLINE等函数在实战指标中的组合方式掌握买卖信号的构造逻辑并学会按不同市场环境调整参数、与其他指标配合使用。文档同时提示该体系依赖历史数据、需持续更新参数且要求使用者具备一定交易经验与风险意识。目前已有587人学习适合作为指标编写与策略复盘的参考素材。1. 多空概率系统不是玄学它只是把四路因子压成一个 0~100 的数很多人搜“通达信指标公式源码 量化交易多空概率系统”真正想要的不是一句“金叉买死叉卖”而是副图上那根能一眼看出强弱、还能被程序复算的曲线。它的本质很朴素把趋势位置、动量强弱、量能方向和资金落点这四个因子各自归一化到 0~100再按权重加权成一个综合概率值。高于强势线偏多低于弱势线偏空中间是震荡区。它解决的是“指标各说各话”的问题——MACD 说多头、KDJ 说超买、量能说衰竭你没法同时看十个副图。这套系统把这些信号压缩成一个可比较、可回测、可调参的数值。适合两类人一类是写通达信公式源码做副图的人一类是想把同一套逻辑搬到 Python 里做量化交易策略验证的人。难点不在公式怎么写而在归一化方式和权重怎么定这两点决定了它是有效信号还是漂亮噪声。2. 通达信指标公式源码的语法骨架与多空概率系统的因子拆分2.1 先分清通达信公式的五种类型别把副图源码写成选股源码通达信公式管理器里建公式时必须先选类型选错类型会直接导致编译报错或加载不上去。多空概率系统通常落在“技术指标”这一类但如果要盘后跑股票池就需要同一套逻辑再写一份“条件选股”。两者的语法几乎一致差别在输出和取值方式。公式类型典型输出取值语义多空概率系统的用法技术指标名称:表达式画线可为任意数值副图画概率曲线主力形态条件选股名称:条件0 或 1概率上穿强势线的股票池交易系统ENTERLONG/EXITLONG入场出场信号粗糙的买卖点回测五彩K线STICKLINE着色不改数值只改颜色多头区间给 K 线染色组合公式调用其他公式引用返回值把四条因子拆成独立公式复用变量赋值符号必须分清:是中间变量只参与计算不画线:是输出变量会画在副图上。多空概率系统里所有因子中间量都用:只有最终的概率曲线、分界线和标注用:或绘图函数输出。写错一个冒号副图上就会多出七八条乱七八糟的线。通达信公式是向量化序列语言没有for循环也没有数组下标。所有运算都是整条序列同时计算所以任何“逐根 K 线判断”的需求都得用REF()、BARSLAST()、CROSS()这类函数改写。这点和 Python 的 pandas 向量化思路一致也是后面能用 pandas 复算公式结果的前提。2.2 四路因子的选型理由与归一化方向因子不是越多越好四路是权衡。少于四路判断维度太窄容易在某一类行情里集体失效多于四路权重被稀释等于随机。下面这张表是多空概率系统的因子定义、数据来源和归一化方向也是第 3 章源码的对照表。因子计算依据原始取值范围归一化映射权重默认值趋势位置收盘价对长期均线的偏离率约 -30% ~ 30%线性放大后截断到 0~1000.30动量强弱KDJ 的 K 值0 ~ 100直接使用0.25量能方向量比与当根涨跌方向0 ~ 100以 50 为中性0.20资金落点收盘位置对成交量的加权0 ~ 100直接使用0.25趋势位置用均线偏离而不是均线金叉是因为金叉是离散事件归一化后不连续加权时会制造跳变。偏离率是连续量天然适合做概率输入。动量用 K 值而不是 MACD 柱是因为 K 值本身就被压缩在 0~100不需要再做映射少一次归一化就少一层参数误差。量能方向用“量比 × 涨跌方向”是为了区分放量上涨和放量下跌——同样是放量方向相反时概率应该往两端走。资金落点用收盘价在当日振幅中的相对位置乘以成交量做加权平均逻辑是收在最高价附近且成交量大说明承接强这只是资金强弱的一种代理指标缺少逐笔数据时的常见做法。注意不要在没有逐笔成交数据的情况下把资金因子写成“主力买入量”。公式层拿不到主力账户标识凡是号称能直接算出主力净买入小单大单的源码都是在已有数据上做二次估算。2.3 在公式管理器里落地新建、编译、挂载到副图操作路径是固定的按顺序走一遍就不会卡住打开通达信按快捷键CtrlF调出公式管理器或从顶部菜单进入公式系统。展开“技术指标”目录点“新建”公式名称建议用拼音缩写如DKGL描述里写清版本和因子构成。在参数区先加四个参数N1、N2、M、HI每个参数填最小、最大、缺省三个值这一步做完再写公式体。把公式正文粘贴进编辑区点“测试公式”报错会直接定位到行号。编译通过后点“确定”保存回到 K 线图输入公式名回车副图就挂上了。参数区那一步经常被跳过结果公式体里写了N1却提示“未定义的变量”。通达信的参数必须在参数表里声明不能像 Python 那样在函数签名里直接给默认值。3. 多空概率系统的完整指标公式源码与参数配置3.1 归一化的三种写法截断、映射和平滑归一化的目的是把所有因子拉到同一个量纲。通达信里能做归一化的函数就那几个MIN、MAX做截断加减乘除做线性映射EMA、SMA做平滑。MIN(MAX(X,0),100)是标准的截断写法先压掉下界再压掉上界顺序不能反反过来会把上界也压到 0。线性映射要注意系数。偏离率放大 8 倍是个经验值偏离 12.5% 就顶到 100再大也被截断。系数太小概率曲线永远在 50 附近晃系数太大稍微一涨就顶格失去区分度。这个系数应该在参数敏感性测试里用回测数据定而不是凭感觉。平滑用EMA(X,M)而不是MA(X,M)因为EMA对近期变化更敏感滞后小。代价是曲线会有轻微的过冲在概率上表现为偶尔穿过 100 或 0 的边界所以平滑之后还要再做一次截断。3.2 四路因子源码趋势、动量、量能、资金下面这段是可以直接粘贴进公式编辑器的正文参数区按N1(10,120,20) N2(20,250,60) M(2,30,10) HI(50,95,80) LO(5,50,20)声明。{多空概率系统 - 副图四路因子加权参数见公式参数表} {--- 1. 趋势因子收盘价对长期均线的偏离放大后截断 ---} MA_S:MA(C,N1); MA_L:MA(C,N2); DEV:(C-MA_L)/MA_L*100; TREND_P:MIN(MAX((DEV12)*8,0),100); {--- 2. 动量因子KDJ 的 K 值本身已是 0~100 ---} RSV:(C-LLV(L,9))/(HHV(H,9)-LLV(L,9)0.0001)*100; K:SMA(RSV,3,1); MOM_P:MIN(MAX(K,0),100); {--- 3. 量能因子量比乘方向50 为中性 ---} VR:V/MA(V,5); VDIR:IF(CREF(C,1),1,-1); VOL_P:MIN(MAX(50VDIR*(VR-1)*25,0),100); {--- 4. 资金落点收盘位置按成交量加权 ---} CPOS:(C-L)/(H-L0.0001)*100; MF_P:SUM(CPOS*V,10)/SUM(V,10); {--- 加权合成与平滑 ---} WR:TREND_P*0.30MOM_P*0.25VOL_P*0.20MF_P*0.25; 多空概率:MIN(MAX(EMA(WR,M),0),100),COLORMAGENTA,LINETHICK2; 空方概率:100-多空概率,COLORGREEN,LINETHICK1; {--- 分界线与标注 ---} 强线:HI,COLORRED,DOTLINE; 弱线:LO,COLORLIBLUE,DOTLINE; DRAWTEXT(CROSS(多空概率,HI),HI5,多),COLORRED; DRAWTEXT(CROSS(LO,多空概率),LO-5,空),COLORGREEN; DRAWICON(CROSS(多空概率,HI),HI12,1); STICKLINE(多空概率HI,HI,多空概率,3,0),COLORRED;逻辑说明前四段各算一路因子TREND_P里(DEV12)*8是把 -12% 到 12.5% 的偏离映射到 0~100截断兜底。VOL_P用 50 做中性点量比 1 时正好是 50放量涨往上、放量跌往下VDIR用IF判断方向。MF_P是 10 日收盘位置按成交量加权成交量大的那几天权重高。参数说明N1短均线周期决定趋势因子的灵敏度默认 20N2长均线周期决定基准默认 60改成 120 会让趋势因子变得迟钝但更稳M是最终概率的平滑周期默认 10越小越灵敏、伪信号越多HI和LO是强弱分界默认 80 和 20宽幅震荡市可以把HI降到 75、LO提到 25 以减少信号。DRAWICON的图标编号是通达信内置的1 号在多数版本里是向上箭头实际显示以公式编辑器右侧的图标面板为准改编号就能换成圆点、旗帜等标记。STICKLINE的最后一个参数 0 表示实心柱改成 1 是空心。3.3 编译报错时先查这五件事通达信的报错信息偏简短很多问题要自己排查。按出现频率排序依次检查报错现象原因处理方式未定义的变量参数没在参数表声明或变量名拼写不一致检查参数表中文变量名前后要完全一致语法错误行号附近用了而不是:或:赋值符号只有这两个只用于条件判断除数为零分母里有HHV-LLV这类可能为 0 的项分母统一加0.0001输出线过多中间量用了:中间量一律用:图标不显示DRAWICON的条件恒为假或价格坐标超出可视区用CROSS而不是坐标往外偏一点4. 用 Python 复算概率并回测把副图信号变成可统计的策略4.1 从通达信本地数据文件拿到 K 线两种可靠路径第一条路径是公式管理器或菜单里的数据导出把日线导出成 txt优点是零代码缺点是导出区间和格式要手动配。第二条路径是直接读通达信安装目录下的本地数据文件日线在vipdoc/sh/lday和vipdoc/sz/lday文件扩展名.day每条记录固定 32 字节小端存放。第二种方式更适合批量复算因为日线文件是定长记录解析不需要任何依赖库。import struct import pandas as pd def read_day(path): 读取通达信 .day 日线文件返回 DataFrame。 每条记录 32 字节日期、开、高、低、收、成交额、成交量、保留位。 价格字段按分存储需要除以 100 还原。 with open(path, rb) as f: buf f.read() rows [] for i in range(len(buf) // 32): rec buf[i * 32:(i 1) * 32] date, o, h, l, c, amount, vol, _ struct.unpack(IIIIIfII, rec) rows.append((date, o / 100, h / 100, l / 100, c / 100, amount, vol)) df pd.DataFrame(rows, columns[date, open, high, low, close, amount, vol]) df[date] pd.to_datetime(df[date], format%Y%m%d) return df.sort_values(date).reset_index(dropTrue)参数说明格式串IIIIIfII对应小端下的 8 个字段前 5 个是无符号整型f是单精度浮点的成交额后两个是成交量和保留位。如果你的数据源里价格字段已经是元而不是分/100要去掉。分钟线文件结构不同1 分钟在fzline目录下扩展名为.lc15 分钟在minline下为.lc5字段排布与日线有差异不能直接套用这个函数。4.2 用 pandas 复算概率验证公式与脚本结果一致公式和脚本必须能对上否则回测出来的胜率再高也无法验证是公式生效还是脚本写错。复算的关键是把通达信的SMA(X,N,1)和EMA用 pandas 等价实现。import numpy as np def bull_prob(df, n120, n260, m10): c, h, l, v df[close], df[high], df[low], df[vol] # 趋势因子偏离率映射到 0~100 dev (c - c.rolling(n2).mean()) / c.rolling(n2).mean() * 100 trend_p ((dev 12) * 8).clip(0, 100) # 动量因子KDJ 的 K 值SMA(X,3,1) 等价于 ewm(alpha1/3) rsv (c - l.rolling(9).min()) / (h.rolling(9).max() - l.rolling(9).min() 1e-4) * 100 k rsv.ewm(alpha1 / 3, adjustFalse).mean() mom_p k.clip(0, 100) # 量能因子量比乘方向 vr v / v.rolling(5).mean() vdir np.where(c c.shift(1), 1, -1) vol_p (50 vdir * (vr - 1) * 25).clip(0, 100) # 资金落点收盘位置按成交量加权 cpos (c - l) / (h - l 1e-4) * 100 mf_p (cpos * v).rolling(10).sum() / v.rolling(10).sum() wr trend_p * 0.30 mom_p * 0.25 vol_p * 0.20 mf_p * 0.25 return wr.ewm(spanm, adjustFalse).mean().clip(0, 100)逻辑说明ewm(alpha1/3)与通达信SMA(X,3,1)的权重一致ewm(spanm)与EMA(X,M)的平滑系数2/(M1)一致。参数说明n1、n2、m和权重必须和公式里完全一致改动任意一项都会让两条曲线分叉。验证方法很简单——在同一段数据上跑一遍把 Python 输出的最后 20 个值和副图上读出的数值比误差应该在小数点后两位以内。对不上就优先查量能因子vdir的边界处理最容易出偏差。4.3 信号统计胜率、盈亏比和回撤的简易算法把概率曲线和价格对齐之后就可以统计信号质量。逻辑是概率从下往上穿过强势线时记为一次入场持有固定周期后看收益。def evaluate(df, prob, hi80, hold5): enter (prob hi) (prob.shift(1) hi) rets [] for i in df.index[enter]: if i hold len(df): rets.append(df[close].iloc[i hold] / df[close].iloc[i] - 1) rets np.array(rets) win rets[rets 0] loss rets[rets 0] return { 信号次数: len(rets), 胜率: round(len(win) / len(rets), 3) if len(rets) else 0, 平均盈利: round(win.mean(), 4) if len(win) else 0, 平均亏损: round(loss.mean(), 4) if len(loss) else 0, 盈亏比: round(abs(win.mean() / loss.mean()), 2) if len(loss) and len(win) else 0, }参数说明hi是触发阈值要和分析时用的强势线一致hold是持有周期日线上常用 3、5、10 三个值分别跑一遍看信号是短线型还是趋势型。这个评估不做滑点和手续费扣减结论只用于横向比较不同参数不能直接等同于实盘收益。参数组HIM信号次数胜率盈亏比灵敏组756偏多偏低偏低默认组8010中等中等中等保守组8515偏少偏高偏高这张表的填写方式建议固定一个标的和一段区间只改一组参数横向比较三行。信号次数从多变少、胜率从低变高是正常规律如果保守组胜率反而更低说明阈值已经切掉了有效信号问题出在因子本身而不是参数。5. 参数调优、盘中验证与源码存档的三个具体技巧5.1 三个必调参数的敏感性测试顺序调参有先后顺序乱调会互相掩盖。第一步调M即平滑周期它在 4 到 20 之间扫一遍看概率曲线的形态是否稳定太大则信号滞后太小则噪声多通常 8 到 12 是可用区间。第二步调HI即强势线阈值固定M之后把HI从 70 扫到 90观察信号次数和盈亏比的乘积取拐点而不是取最大值。第三步才调均线周期N1、N2因为均线一变偏离率的分布整体位移前两步的结论就作废了。5.2 用 drawicon 和分时数据做盘中验证副图信号在日线上是收盘后确认的盘中会随着价格跳动反复穿越阈值。验证方法是把公式挂到分时图或 1 分钟周期上加上DRAWICON标记观察同一天内标记出现的次数。如果一天内反复出现又消失超过三次说明平滑周期偏小把M加到 12 以上通常能压下来。通达信的实时行情刷新会持续重算公式所以盘中看到的是瞬时值别把盘中穿越直接当成入场信号。5.3 跨周期一致性与本地源码存档同一个公式在不同周期上要方向一致。日线偏多而 60 分钟偏空是正常的分歧说明短期回调但 1 分钟和日线方向完全相反且反复切换就要回查资金因子它的 10 日加权在短周期上几乎等于噪声。存档这件事值得单独说一句网上流传的指标文件常以加密打包格式存在导入公式管理器后只能使用看不到也不能还原成明文源码。真正想留住自己的劳动成果就在公式编辑器里把正文复制出来另存为 txt连同参数表一起记录包括参数名、最小值、最大值和缺省值。导出的加密文件只适合分发使用不适合当作源码备份。公式管理器里也能把当前公式导出成文本走的是导出而非加密导出那条路径具体选项在不同版本里位置略有差别导出后打开文件确认内容是明文再收进版本库。本文还有配套的精品资源点击获取
返回列表