简介:本资源是面向股票量化初学者与通达信平台新用户的公式编写入门教程,专为具备基础编程思维但缺乏金融终端开发经验的学习者设计,旨在系统解决技术指标、选股策略、交易信号及K线形态识别等核心公式的编写难题。教程以Word文档形式呈现,共1个DOC文件,大小约1MB,内容结构清晰,覆盖公式系统四大类型——技术指标公式(如MA、KDJ)、条件选股公式(如‘股价小于每股净资产’)、交易系统公式(自动买卖点生成)与五彩K线公式(特殊形态染色),并逐类详解编辑路径、函数调用(CROSS、REF、AND等)、参数设置及测试验证流程。内含3.1节均线指标与3.2节条件选股的完整实操示例,从新建公式、插入函数、参数填写到动态翻译与测试通过,步骤细致可复现。目前已有8298人学习下载,是掌握通达信公式语言、构建个性化分析工具的高实用性入门指南。
1. 通达信公式编写教程完整版:不是“写代码”,而是用金融逻辑喂养K线的实操手册
你有没有试过在通达信里点开“公式管理器”,看到一堆函数名却不敢动——怕一改就报错,怕测试不通过,更怕写完根本调不出来?这不是你手生,是绝大多数人卡在了“知道有MA、KDJ,但不知道怎么把‘五日均线上穿十日均线’翻译成通达信能听懂的语言”这道坎上。这份《通达信公式编写教程完整版.doc》不是教你怎么背函数表,而是带你在真实操作路径里走一遍:从新建一个空白公式开始,到在主图上画出第一条自定义均线,再到跑出第一个“股价跌破净资产”的选股结果——全程不跳步、不省略鼠标点击位置、不回避“测试失败”时弹窗里那行红色报错文字。它专为有基础认知(比如知道K线有OPEN/CLOSE/HIGH/LOW)、但没真正落笔写过公式的开发者设计;也适合某高校金融工程课上需要带学生做量化初探的导师,或某公司投研部刚接手技术分析支持工作的新人。文档虽是Word格式,但内容颗粒度细到参数命名规范、分号必须英文、REF函数括号里数字不能带空格——这些细节,才是你第二天就能复现、第三天就能微调、第五天就能独立写交易信号的关键。
2. 四大公式类型落地指南:技术指标、条件选股、交易系统、五彩K线的调用链与编辑入口
通达信的公式系统不是抽象概念,而是一套严格绑定界面操作路径的模块化结构。你写的每一条公式,最终都要落到具体菜单、右键菜单、键盘输入三个出口。本章不讲分类意义,只拆解“在哪建、在哪调、哪一步按错就进不去编辑区”——这是所有翻车事故的起点。
2.1 技术指标公式:主图叠加与副图显示的底层逻辑差异
技术指标公式最常被误用为“只要能画出来就行”,但实际中,画线方法直接决定公式能否被正确引用。例如,你想把自定义的“布林带宽度”指标用于后续条件选股,就必须设为“副图”;若设为“主图叠加”,该指标将无法被其他公式通过REF()或CROSS()调用——因为通达信内部对主图叠加类指标不生成可索引的序列数组。
提示:主图叠加指标(如MA、BOLL)仅用于视觉参考,其数值不参与计算;副图指标(如MACD、RSI)才具备完整时间序列属性,可被其他公式引用。
新建路径:功能 → 专家系统 → 公式管理器 → 左侧树状列表选“技术指标公式” → 右侧点“新建”
关键设置项(必须手动确认):
- 公式类型:选“均线型”或“其他”,影响公式归类,不影响功能;
- 画线方法:必选“副图”(除非你纯看图不用计算);
- 坐标线位置:默认“自动”即可,手动设置需用英文分号分隔,如
-2;-1;0;1;2; - 额外Y轴分界:填入数值(如
0),会在副图Y轴上加白线,便于观察零轴穿越。
测试通过后保存,调用方式有两种:
- 键盘输入公式名(如
JX1)+ 回车 → 自动加载到当前窗口; - 在副图区域右键 → “选择指标” → 找到你命名的公式 → 点击加载。
2.2 条件选股公式:为什么“测试通过”不等于“能选出股票”?
条件选股公式表面看只是写个布尔表达式,但它的执行环境有硬约束:必须运行在全市场股票池上,且每个周期只返回TRUE/FALSE。这意味着你写的CLOSE < FINANCE(35)(股价小于每股净资产)看似简单,但若未处理停牌、ST、数据缺失股,实际选股结果会漏掉大量有效标的。
新建路径:功能 → 选股器 → 条件选股 → 公式管理器 → 左侧选“条件选股公式” → 右侧点“新建”
核心区别项:
- 无“画线方法”选项:条件选股公式不绘图,只输出股票代码列表;
- 测试时默认用当前个股测试:这是最大陷阱!点击“测试公式”时,通达信默认用当前打开的个股(如600519)验证逻辑,但真正选股时是遍历全部A股。因此测试通过≠全市场可用。
验证方法:
- 先在个股界面测试逻辑是否成立(如600519当前是否满足
CLOSE < FINANCE(35)); - 再进入
功能 → 选股器 → 条件选股,选择你刚写的公式 → 点“执行选股” → 观察结果列表是否为空; - 若为空,检查
FINANCE(35)是否对所有股票都有效(部分小盘股财务数据延迟,FINANCE(35)返回0,导致CLOSE < 0恒假)。
2.3 交易系统公式:买卖信号如何避免“滞后一天”?
交易系统公式本质是生成BUY和SELL信号序列,但新手常忽略一个关键机制:通达信默认在K线收盘后才触发信号计算。这意味着你写的CROSS(MA(C,5),MA(C,10)),信号实际出现在第10根K线的收盘位置,而非第5根K线刚上穿时——这是实盘信号延迟的根源。
新建路径:公式管理器 → 左侧选“交易系统公式” → 右侧点“新建”
必须显式声明的语句:
BUY: CROSS(MA(C,5),MA(C,10)); SELL: CROSS(MA(C,10),MA(C,5));注意:
BUY/SELL为保留字,不可改名;- 每条语句末尾必须加分号(英文);
- 不支持
IF嵌套,逻辑复杂时需拆成多行布尔表达式。
调用方式:
在K线图界面 → 鼠标右键 → “交易系统指标” → 选择你的公式 → 点“确定”。信号以红绿箭头形式标注在K线上,箭头位置即信号生成K线的收盘点,非开盘或最高价点。
2.4 五彩K线公式:颜色标记不是装饰,而是形态识别的可视化接口
五彩K线公式不输出数值,只改变K线颜色,但它背后是严格的形态判定逻辑。例如“锤子线”要求:实体长度≤全K线1/3、下影线≥实体2倍、上影线极短。你写的COLOR=IF((L<=C*0.98 AND C>O AND (C-O)<=(H-L)/3 AND (H-C)<=0.01*(H-L)),COLORRED,COLORYELLOW),表面是设颜色,实则是用价格关系定义形态。
新建路径:公式管理器 → 左侧选“五彩K线公式” → 右侧点“新建”
关键语法限制:
- 必须以
COLOR=开头; - 右侧只能是
COLORxxx常量(如COLORRED、COLORGREEN)或IF三元表达式; IF条件中不可调用REF()以外的时间函数(BACKSET等高级函数不支持);- 每根K线只能赋一种颜色,无法实现“同一根K线不同部位不同色”。
调用方式:
K线图界面 → 鼠标右键 → “五彩K线指示” → 选择公式 → 点“确定”。颜色变化实时生效,无需刷新。
3. 函数编写实战:从HIGH/REF/CROSS到AND的组合逻辑与边界踩坑
通达信公式语言不是Python,没有调试器、没有变量作用域、没有错误堆栈——它靠的是对函数行为的肌肉记忆。本章不罗列函数表,只聚焦四类高频函数的真实用法、参数陷阱、以及为什么REF(C,1)有时返回0而不是前一日收盘价。
3.1 行情函数:HIGH/LOW/CLOSE/VOL的“周期幻觉”
你以为HIGH永远返回当日最高价?错。它的值取决于你当前打开的K线周期。如果你在“5分钟线”界面编写公式,HIGH返回的是最近一根5分钟K线的最高价,而非日线最高价。更隐蔽的是:当K线数据不全时(如新股上市首日只有30分钟数据),HIGH可能返回0或异常值。
典型误用场景:
// 错误:想取日线最高价,但在5分钟图上写 HHV(HIGH,5) // 实际计算的是5根5分钟K线的最高价,非5日日线高点正确写法(跨周期引用):
// 在任意周期图上,强制取日线HIGH DAY_HIGH := REF(HIGH, BARSLAST(DATE<>REF(DATE,1))); // 解释:BARSLAST(DATE<>REF(DATE,1))定位上一日K线位置,REF取其HIGH注意:
BARSLAST是跨周期锚定核心函数,DATE函数返回1900年以来的年月日(如20240315),REF(DATE,1)取前一周期日期,二者不等即为新交易日。
3.2 REF函数:M参数不是“天数”,而是“K线根数”
REF(C,5)常被理解为“5天前收盘价”,但严格说是“往前数第5根K线的CLOSE值”。这意味着:
- 在日线图上,
REF(C,5)= 5个交易日前; - 在周线图上,
REF(C,5)= 5周前(约25个交易日); - 在1分钟图上,
REF(C,5)= 5分钟前(可能还在同一天内)。
致命陷阱:
// 当前是2024-03-15日线,但3月14日停牌,3月13日有数据 REF(C,1) // 返回3月13日收盘价,而非3月14日(因无K线) // 但如果你期望“跳过停牌日取最近有效日”,REF做不到,需手动处理安全写法(取最近N个有效交易日):
// 取最近5个有成交的交易日收盘价均值 SUM(IF(VOL>0,C,0),5)/COUNT(VOL>0,5)3.3 CROSS函数:交叉判定的“单边穿透”特性
CROSS(X,Y)只在X从下方上穿Y的那一根K线返回1,其余时间返回0。它不关心X是否持续在Y上方,也不反馈“已上穿多久”。这是交易信号去重的关键。
常见翻车:
// 错误:以为CROSS能持续输出1,用于画线 DRAWICON(CROSS(MA(C,5),MA(C,10)),LOW,1); // 正确:只在交叉点画图标 // 错误写法(试图持续标记) DRAWTEXT(CROSS(MA(C,5),MA(C,10)),"↑",COLORRED); // 若不加条件,后续K线仍显示↑正确信号延续写法:
// 定义信号发生后保持3根K线 BUY_SIGNAL := CROSS(MA(C,5),MA(C,10)); HOLD_DAYS := BARSSINCEN(BUY_SIGNAL,3); // 从信号起算,已过多少根K线 DRAWTEXT(BUY_SIGNAL OR HOLD_DAYS<3,"↑",COLORRED);3.4 AND/OR逻辑符:运算优先级与括号强制
通达信公式中AND/OR无优先级,从左到右顺序计算。A AND B OR C等价于(A AND B) OR C,而非A AND (B OR C)。这与多数编程语言不同,极易引发逻辑漏洞。
血泪经验:
// 想表达“5日均线上穿10日均线 且 收盘价高于布林上轨” // 错误写法(无括号) CROSS(MA(C,5),MA(C,10)) AND C>BOLLUP // 可能被解析为 (CROSS(...) AND C) > BOLLUP → 语法错误 // 正确写法(括号明确范围) CROSS(MA(C,5),MA(C,10)) AND (C>BOLLUP) // 更安全写法(拆成变量) MA5_UP := CROSS(MA(C,5),MA(C,10)); PRICE_ABOVE_BOLL := C>BOLLUP; BUY_COND := MA5_UP AND PRICE_ABOVE_BOLL;4. 避坑:通达信公式编写中5个高频报错与现场排查方案
写公式最耗时的不是构思逻辑,而是读懂通达信弹窗里那句“公式编译错误:第7行,缺少分号”。本节不讲原理,只列真实发生过的5个坑,附带现象、根因、三步定位法和修复命令——全是某公司投研部A同学在实盘信号开发中记下的原始笔记。
4.1 现象:测试公式时提示“函数名错误:FINANCE”
原因:FINANCE(N)系列函数(如FINANCE(35)每股净资产)仅在通达信专业版及以上版本支持,免费版或旧版客户端不识别该函数,直接报未定义。
排查三步:
- 在公式编辑器中删掉所有
FINANCE相关语句,仅留C;测试是否通过; - 若通过,说明是函数版本问题;
- 查客户端版本:
帮助 → 关于通达信,核对是否为V7.90+。
修复:升级客户端,或改用兼容函数(如DYNAINFO(35),但精度略低)。
4.2 现象:条件选股执行后结果为空,但个股测试显示TRUE
原因:FINANCE类函数对ST股、退市整理股、B股返回0,导致CLOSE < FINANCE(35)恒为FALSE;同时,通达信默认选股范围包含B股和基金,而FINANCE(35)对它们无效。
排查三步:
- 在选股器中点“设置” → 勾选“仅A股”;
- 在公式中增加过滤:
NOT(NAMELIKE('ST') OR NAMELIKE('*ST')); - 将
FINANCE(35)替换为IF(FINANCE(35)>0,FINANCE(35),10000),避免0值干扰。
修复公式片段:
IS_A_STOCK := NOT(NAMELIKE('ST') OR NAMELIKE('*ST')); HAS_NET_ASSET := FINANCE(35)>0; NET_ASSET := IF(HAS_NET_ASSET,FINANCE(35),10000); SELECT := C < NET_ASSET AND IS_A_STOCK;4.3 现象:交易系统信号箭头出现在K线中间,而非收盘位置
原因:公式中使用了DRAWICON等绘图函数,但未指定坐标。通达信默认将图标画在LOW位置,而LOW是最低价,非收盘价。
排查三步:
- 检查公式中是否有
DRAWICON(...,LOW,...); - 查看K线图中箭头是否总在实体底部;
- 对比
DRAWICON(...,C,...)是否移到收盘价附近。
修复:所有信号图标统一用C(收盘价)或O(开盘价)定位:
DRAWICON(BUY_SIGNAL,C,1); // 红箭头画在收盘价高度 DRAWICON(SELL_SIGNAL,C,2); // 绿箭头画在收盘价高度4.4 现象:五彩K线颜色不更新,始终为初始色
原因:公式中COLOR=语句被写在IF条件外,或IF条件永远不满足(如用VOL=0判断停牌,但实际VOL为NULL而非0)。
排查三步:
- 简化公式为
COLOR=COLORRED;,看是否全红; - 若全红,说明原逻辑条件未触发;
- 检查条件中是否用了
=比较NULL(应改用ISNULL(VOL))。
修复:用ISNULL()替代==0判断缺失值:
// 错误 COLOR=IF(VOL=0,COLORGRAY,COLORGREEN); // 正确 COLOR=IF(ISNULL(VOL),COLORGRAY,COLORGREEN);4.5 现象:副图指标显示“数值溢出”,Y轴刻度疯狂跳变
原因:公式中出现除零(如C/REF(C,1)当REF(C,1)=0时)、或LOG()对负数取对数、或SQRT()对负数开方。通达信不报错,但数值变为极大正/负数,导致坐标轴自动缩放失效。
排查三步:
- 在动态翻译区观察公式计算值,找异常大数(如1E+30);
- 检查所有除法、对数、开方运算的分母/参数;
- 用
IF包裹危险运算:IF(REF(C,1)<>0,C/REF(C,1),1)。
修复模板:
// 安全除法 SAFE_DIV := IF(DENOMINATOR<>0,NUMERATOR/DENOMINATOR,1); // 安全对数(底数>0且≠1) SAFE_LOG := IF(NUM>0,LOG(NUM),0);5. 参数精灵实战:让非程序员也能动态调均线周期、布林带参数、选股阈值
参数精灵不是锦上添花的功能,而是把公式从“固定脚本”变成“交互工具”的关键开关。没有它,每次改5日均线为10日,你得手动打开公式管理器、修改数字、重新测试、再保存——而用参数精灵,只需右键指标→“参数设置”→拖动滑块。本章教你从零配置一个带3个可调参数的布林带公式,并解决“参数改了但图形不刷新”的玄学问题。
5.1 参数定义语法:MID/N/PRD三要素缺一不可
通达信参数必须按参数名:最小值,最大值,缺省值;格式声明,且必须放在公式最顶部(注释之后、逻辑之前)。常见错误是把参数写在DRAWLINE后面,导致不生效。
标准参数块(复制即用):
// 布林带三参数:中轨周期、标准差倍数、通道宽度 MID_PERIOD:1,250,20; STD_MULT:0.1,5,2; WIDTH_MULT:0.1,3,1;说明:
MID_PERIOD:中轨均线周期,范围1-250,默认20;STD_MULT:标准差倍数(即布林带上下轨距离中轨的倍数),范围0.1-5,默认2;WIDTH_MULT:通道整体缩放系数,用于微调显示宽度,范围0.1-3,默认1。
注意:参数名必须全大写、无中文、无特殊字符;逗号和分号必须英文;缺省值必须在范围内。
5.2 参数调用:所有函数内参数必须显式替换
定义了参数,不代表自动生效。你必须手动把原公式中的固定数字替换成参数名。例如原布林带:
// 未参数化写法(硬编码) UPPER := MA(C,20) + 2*STD(C,20); LOWER := MA(C,20) - 2*STD(C,20);参数化后:
// 必须逐个替换 UPPER := MA(C,MID_PERIOD) + STD_MULT*STD(C,MID_PERIOD); LOWER := MA(C,MID_PERIOD) - STD_MULT*STD(C,MID_PERIOD); // 通道宽度应用在绘图层,不影响计算 DRAWBAND(UPPER*WIDTH_MULT,RGB(255,200,200),LOWER*WIDTH_MULT,RGB(200,200,255));5.3 参数刷新失效:为什么改了滑块图形不动?
现象:右键指标→“参数设置”→拖动滑块→点“确定”,但K线图上布林带纹丝不动。
根因:通达信缓存机制导致参数变更未触发布尔重算。
三步强制刷新:
- 在公式编辑器中,点“测试公式”(不需改内容,点一下即可);
- 保存公式(Ctrl+S);
- 在K线图界面按
F5强制刷新整个窗口。
血泪经验:某导师带学生做课程设计时,因未执行第1步,全班调试2小时无果。后来发现,只要点一次“测试公式”,哪怕不修改,就能清空缓存。
5.4 进阶技巧:用参数控制信号开关,实现“策略开关面板”
你可以把布尔条件也做成参数,让非技术人员一键开启/关闭某条规则。例如,在交易系统中加入“是否启用成交量过滤”开关:
// 参数块新增 VOL_FILTER_ON:0,1,1; // 0=关闭,1=开启 VOL_THRESHOLD:0.5,5,1.5; // 成交量放大倍数阈值 // 逻辑层 BASE_SIGNAL := CROSS(MA(C,5),MA(C,10)); VOL_OK := IF(VOL_FILTER_ON=1,VOL>REF(VOL,1)*VOL_THRESHOLD,1); FINAL_SIGNAL := BASE_SIGNAL AND VOL_OK; BUY: FINAL_SIGNAL; SELL: CROSS(MA(C,10),MA(C,5));效果:用户右键→参数设置→把VOL_FILTER_ON设为0,信号立即取消成交量过滤,无需改代码。
6. 公式验证闭环:从动态翻译、分步断点到实盘信号回溯的完整质检流程
写完公式不是终点,而是验证的开始。很多开发者卡在“测试通过就导出”,结果实盘发现信号滞后、选股漏股、或副图数值跳变。本章给出一套我在某跨平台系统中沉淀下来的六步验证法,覆盖从编辑器内实时反馈到T+1信号复盘的全链路。它不依赖第三方工具,全部基于通达信原生功能,且每一步都有明确的“合格标准”。
6.1 动态翻译区:第一道防线,必须逐字核对
通达信公式编辑器底部的“动态翻译区”不是摆设,它是公式语义的实时翻译器。例如你输入REF(C,5),它显示“5日前的收盘价”;输入CROSS(MA(C,5),MA(C,10)),显示“5日均价上穿10日均价”。
验证标准:
- 翻译文字必须与你的业务意图100%一致;
- 若出现“未知函数”或“无法翻译”,说明函数名拼错或版本不支持;
- 若翻译含糊(如只写“条件成立”),说明逻辑过于复杂,需拆解为中间变量。
从那以后我每次写完一行,都强迫自己停3秒看翻译区——这3秒省下的是后续2小时排查时间。
6.2 分步断点:用DRAWTEXT在关键节点打桩
通达信无断点调试,但可用DRAWTEXT在图上打印中间变量值,实现“可视化断点”。例如验证布林带上轨计算:
// 在公式末尾添加(临时) DRAWTEXT(ISLASTBAR,UPPER,'UPPER='+NUMTOSTR(UPPER,2),COLORRED); DRAWTEXT(ISLASTBAR,MA(C,20),'MA20='+NUMTOSTR(MA(C,20),2),COLORGREEN);ISLASTBAR确保只在最后一根K线显示,NUMTOSTR(x,2)将数值转为字符串并保留2位小数。
合格标准:
- 图中显示的
UPPER值 =MA20值 +2*STD值(手动计算器验算); - 若偏差>0.01,检查
STD函数周期是否与MA一致。
6.3 副图数值校验:用“副图指标叠加”反向验证
将你写的指标公式,作为另一个公式的输入源,进行交叉验证。例如,你写了MY_MA5:=MA(C,5);,再新建一个验证公式:
// 验证公式:对比通达信内置MA与自定义MA BUILT_IN := MA(C,5); CUSTOM := MY_MA5; DIFF := ABS(BUILT_IN - CUSTOM); DRAWLINE(DIFF>0.001,BUILT_IN,DIFF>0.001,CUSTOM,0),COLORBLUE;合格标准:
DIFF全程≤0.001(浮点精度误差);- 若某日
DIFF突增,说明自定义公式中用了REF等函数导致数据偏移。
6.4 条件选股压力测试:用“历史选股”功能回溯信号
通达信隐藏功能:功能 → 选股器 → 条件选股 → 点“历史选股”。这里可指定日期范围(如2023-01-01至2023-12-31),运行你的公式,生成每日选股列表。
验证重点:
- 检查节假日是否误选(如
DATE函数未过滤非交易日); - 抽样3只入选股,打开其K线图,人工验证当日是否真满足条件(如
C<FINANCE(35)); - 统计入选总数,若<10只,大概率是
FINANCE数据缺失导致。
6.5 交易系统信号对齐:用“信号统计”功能查漏补缺
在交易系统公式加载后,右键K线图→“信号统计”,通达信会列出所有BUY/SELL信号的日期、价格、K线位置。
关键检查项:
- 信号日期是否为真实交易日(排除周末);
BUY信号价格是否等于该K线C(收盘价),而非H或O;- 相邻
BUY与SELL间隔是否合理(如CROSS信号不应连续两天出现)。
6.6 实盘信号快照:T+1日开盘前的终极质检
每天开盘前5分钟,执行以下动作:
- 打开昨日收盘的K线图(如2024-03-14日线);
- 加载你的交易系统公式;
- 观察最后一根K线(即昨日)是否生成
BUY/SELL信号; - 记录信号价格,与今日集合竞价成交价对比,验证信号有效性。
这个习惯我坚持了三年。曾发现某次CROSS信号因BARSLAST计算误差,提前一天触发,正是靠这个快照揪出。希望帮到你。
本文还有配套的精品资源,点击获取