简介:同花顺软件编程.pdf 是一份面向股票技术分析爱好者和量化初学者的实操教程,聚焦同花顺自定义公式的编写规则与系统函数应用,帮助用户快速掌握指标公式、选股公式的编写思路。资料为单个 PDF 文件,仅 489KB,内容紧凑、便于随时查阅。全篇以公式语言规范为起点,系统讲解标识符、分隔符的使用,赋值语句中“=”“:=”“:>”等符号的区别,条件语句中 IF-ELSE 的嵌套与匹配原则,while 循环中 break 和 continue 的作用,以及函数调用的参数传递与返回值规则;同时对“空值”数据的运算和比较特性进行了专门说明。在此基础上,资源还介绍了系统函数库中的板块函数,如 BLOCKAVG、BLOCKMIN 等函数的用法,覆盖公式编写从入门到进阶的主要环节。目前已吸引 666 人学习,适合希望系统理解同花顺公式逻辑、提升技术分析效率的读者下载收藏。
1. 同花顺公式系统编程到底是什么
很多 IT 从业者第一次接触“同花顺软件编程”,是在公司研报里、选股清单里,或者在同事的“黑匣子”指标文件里。同花顺作为行情终端,核心能力不只是看盘,而是内置了一套类似 C 的公式引擎:用户可以用它写行情指标、条件选股、交易模型,甚至回测策略。这套引擎对 WPF、后端服务或嵌入式开发背景的人来说,语法门槛不高,但数据模型和运行机制却和常规编程很不一样,上手时容易把“序列”当成“数组”去写,然后得到一系列诡异结果。这篇文章从同花顺公式系统的最小可用写法讲起,覆盖指标公式、条件选股、参数优化、性能陷阱和外部扩展,目标是让有一定编程基础、但没接触过金融终端脚本的人,能用这套语言写出能在真实盘面上运行的脚本。
2. 认识同花顺公式语言:数据类型、语句结构和第一个指标
2.1 在同花顺里建一个新公式的入口和文件位置
写同花顺公式不需要安装额外 IDE,打开行情终端后按Ctrl+F调出“公式管理器”,左侧分类里能找到“技术指标”“条件选股”“交易系统”“五彩K线”等分组。新建一个技术指标的常规路径是:在“技术指标”分类下点击“新建”,会打开一个纯文本编辑窗口。公式存储在本地安装目录下的Formula文件夹里,后缀名为.fnc;同花顺期货通、同花顺经典版在公式文件的兼容性上有细微差异,但语法核心一致。如果团队要分发指标,通常直接传.fnc文件,或者让对方打开文本编辑器粘贴源码。
公式语言没有 main 函数,执行入口就是你在编辑器里写的每一行。系统会按 K 线从前往后依次推进,每一根 K 线都计算一次这一整段代码,并把最终输出变量映射到主图或副图上。这个计算模型非常像流式计算:行情数据是一根一根喂进来的,而不是一次性给你一张完整的数据表。
2.2 序列数据和非序列数据:同花顺编程最关键的抽象
同花顺公式里的核心数据类型是“序列数据”,它表示一组随时间变化的数值。比如CLOSE(收盘价)、VOL(成交量)、MA(CLOSE,5)(5日均线)都是序列数据,每个 K 线位置都有一个值。反过来,常量100、3.14属于非序列数据,它们在任何一根 K 线位置都返回同一个值。
这个区分异常重要,因为公式引擎做计算时,会自动把非序列数据广播到所有 K 线,但序列数据与序列数据之间只有“按位对齐”的算术操作。比如CLOSE + 100是允许的,REF(CLOSE,1) + CLOSE也是允许的(前者表示每一根 K 线的收盘价加上 100,后者表示前一根收盘价加当前收盘价)。但如果你想遍历CLOSE序列做任意逻辑,普通的 for 循环在公式语言里并不好用,很多场景应该用REF、HHV、COUNT这类函数来表达。
2.2.1 赋值语句:冒号和等号不是一回事
同花顺公式里,冒号:表示“输出变量”,会在图上画出曲线;等号=表示“中间变量”,只参与计算,不显示在盘面上。看下面这段代码:
VAR1:MA(CLOSE,5),COLORWHITE; VAR2:=MA(CLOSE,10); VAR3:VAR1 - VAR2;第一行定义VAR1为 5 日均线,并设置白色输出;第二行定义VAR2为 10 日均线但不输出;第三行把差值输出为VAR3。如果你把第二行误写成冒号赋值,副图上会多出一条中间线。这个规则和 C 语言里的赋值“效果可见性”完全不同,是新手最常见的低级错误。
2.3 常用函数清单:写指标前至少记住 10 个
同花顺公式系统内置上百个函数,但日常工作高频的并不多。下表按用途分类列出最常用的一组,括号里的参数在实际编写时几乎天天用到:
| 函数 | 用途 | 典型参数 | 说明 |
|---|---|---|---|
REF(X,N) | 取前第 N 个 K 线的值 | REF(CLOSE,1) | 取昨收 |
MA(X,N) | 简单移动平均 | MA(VOL,5) | 5 周期均量 |
EMA(X,N) | 指数移动平均 | EMA(CLOSE,12) | 对价格变化更敏感 |
HHV(X,N)/LLV(X,N) | N 周期最高/最低值 | HHV(HIGH,20) | 20 日最高价 |
CROSS(A,B) | A 上穿 B 时为 1 | CROSS(MA(C,5),MA(C,10)) | 金叉 |
COUNT(COND,N) | N 周期内满足条件的次数 | COUNT(CLOSE>OPEN,10) | 10 天里收阳天数 |
BARSLAST(COND) | 距上次满足条件的 K 线数 | BARSLAST(CROSS(MA(C,5),MA(C,10))) | 上次金叉距今天数 |
IF(COND,A,B) | 条件判断 | IF(CLOSE>OPEN,1,0) | 阳线为 1 否则为 0 |
ABS(X) | 绝对值 | ABS(CLOSE-OPEN) | 实体长度 |
SUM(X,N) | N 周期求和 | SUM(VOL,5) | 5 日成交量之和 |
这些函数大多返回序列数据,也可以嵌套使用。比如要计算“最近 10 天里收盘价创 20 日新高的次数”,可以写成COUNT(CROSS(CLOSE,HHV(HIGH,20)),10),其中HHV(HIGH,20)表示在 20 日高点序列上做比较。
2.4 写一个最小可用指标:双均线叠加 MACD 柱体
把下面的代码粘贴到技术指标编辑器的文本区里,编译通过后,在 K 线图左下方的指标列表里找到它,拖拽到副图:
SHORT:MA(CLOSE,6); LONG:MA(CLOSE,24); DIF:EMA(CLOSE,12) - EMA(CLOSE,26),COLORYELLOW; DEA:EMA(DIF,9),COLORMAGENTA; MACD:(DIF - DEA) * 2,COLORSTICK;这段代码做了两件事:主图输出大小周期均线,副图输出 MACD 的三条线(其中COLORSTICK让MACD以红绿柱形式显示)。其中DIF的计算是标准 MACD 定义,DEA是 DIF 自己的 9 周期指数平均,乘 2 是为了让柱体在视觉上更明显。注意这里的MACD是用冒号赋值的,它会作为输出显示,但软件不知道你想画在主图还是副图——按Ctrl+Enter保存后,软件会弹出现察窗口,你可以在“主图叠加”和“副图”之间切换。如果想把均线画在主图,把SHORT和LONG保留在主图区域,把包含DIF、DEA、MACD的变量整体移动到单独一个副图指标里,也可以。公式引擎允许一个文件里同时输出主图和副图变量,但不同版本对“主图叠加”标识的处理略有区别,最常见的做法是分别建两个公式文件。
3. 条件选股公式与全市场扫描
3.1 选股公式和指标公式的语法差异在哪里
指标公式只是为了画图,输出变量可以有很多个;选股公式则不同,它只能有一个输出,而且这个输出的值必须是一个真假条件(1 为真,0 为假)。系统运行时会遍历整个股票池,对每个标的计算这个输出,如果最后一根 K 线的结果为正数(包括非 0 的任意数),该股就进入候选列表。
因此,选股公式里通常用X:或XG:作为最终输出变量名,中间过程全部用等号赋值。再强调一次:只有冒号输出才被系统识别为筛选条件,多个冒号输出甚至会导致公式编译报错。
3.2 一个可跑通的选股示例:5 日均线上穿 20 日均线且放量
在“条件选股”分类下新建公式,输入以下内容:
MA5:=MA(CLOSE,5); MA20:=MA(CLOSE,20); VOL5:=MA(VOL,5); COND1:=CROSS(MA5,MA20); COND2:=VOL > VOL5 * 1.5; XG:COND1 AND COND2;执行逻辑是:金叉发生当根 K 线(CROSS只在交叉发生的瞬间返回 1,之后立即回到 0),同时当天成交量要大于 5 日均量的 1.5 倍。这个条件组合在牛市初期的票池里经常出现,适合用来验证整个扫描链路。注意VOL5是均量,它本身也是一个序列,VOL > VOL5 * 1.5是序列与序列的逐位比较,最终得到布尔序列。
3.2.1 运行选股的正确路径
在同花顺终端上,点击“选股器”或直接Ctrl+T,可以进入条件选股窗口。在“选择指标”里下拉找到刚保存的公式,然后设置选股范围:沪深 A 股、科创板、创业板、港股或自定义板块。“时间段”可以选择“最近一天”或“最近一周”,如果选“最近一周”,CROSS会在一周内的任意 K 线上满足条件时选中该股。这里有个很实际的坑:如果你只需要今天刚好发生金叉的股票,时间段一定要设为“最近一天”,否则系统会把 5 天前发生过金叉的股票也拉出来,而CROSS本身在后续 K 线里值为 0,不及时收紧时间窗口就会得到大量陈旧结果。
执行完成后,结果会以列表形式展示,双击任意一只票可以跳转到对应 K 线图。在 K 线图上检查信号位置时,可以把刚才的指标公式也挂上去,看CROSS信号是否和选股条件一致。
3.3 用“程序测评”验证选股条件的有效性
选定公式后,点击“程序交易测评”或“条件选股测试”(不同版本菜单名不同,功能一致),会进入回测面板。需要设置几个关键参数:测试时间段(建议取 3 到 5 年)、初始资金、交易成本(默认千分之三)、调仓周期。同花顺会基于公式输出逐日模拟买卖:信号为 1 时次日买入,信号为 0 时卖出。
这里最容易误操作的是“交易模型”和“选股模型”的区别。上面的XG:公式属于选股模型,它只在信号发生当天执行一次买入动作;如果你想要一个持仓型的策略(比如信号为 1 时持仓,0 时空仓),需要把输出写成ENTERLONG:(开多)和EXITLONG:(平多),这两者是同花顺交易系统公式的保留变量名。选股公式做测评时同花顺会模拟“每期从满足条件的股票里等额买入”,而交易系统公式会模拟单只或少量标的的连续持仓。如果你的目标是“每天调仓换股”,用选股模型更贴近实盘;如果目标是拟合 K 线图上的买卖点,应该改用交易系统公式。
3.4 从选股到预警:让公式自动盯盘
同花顺内置“语音预警”和“弹窗预警”功能,可以把选股公式挂到“预警系统”里。在“工具”菜单下找到“预警”,选择“新建预警”,指定刚才的选股公式,设定检查频率(比如每 5 秒一次),同花顺会在条件满足的第一时间弹窗提醒。注意免费版或轻量版的数据刷新延迟,日线收盘后运行公式的结果是绝对的,盘中实时预警则受行情推送速度限制。
4. 参数优化、性能瓶颈与同花顺公式系统的三个经典坑
4.1 给公式加参数:把魔法数字变成可调节变量
指标公式里的周期值、倍数、阈值都是“魔法数字”,改一个参数就得打开编辑器改代码;更麻烦的是,在回测阶段你没法自动化地批量搜索最优参数。同花顺公式语言提供了INPUT关键字,语法是:
INPUT:N(5,1,100,1); MA1:MA(CLOSE,N);其中N是变量名,5是默认值,1是最小值,100是最大值,最后一个1是步长。保存后退出编辑器,在指标参数列表里可以直接拖动滑块调节 N,图表会实时刷新。选股公式同样可以使用INPUT,在选股窗口里修改参数值即可。
做参数优化时,同花顺有一个“参数优化”面板,选中公式并设置参数的搜索范围,图表会输出一个二维表格,纵轴是参数值组合,横轴是测评指标(收益、回撤、胜率、盈亏比等)。要提醒的是,开放式优化很容易产生过拟合,比如你优化 5 日均线还是 7 日均线,结果差异可能只是某个时间段里的巧合。应对方法是把优化窗口切成多段,用第一段找参数,再用第二段验证。
4.2 公式运行的性能瓶颈:为什么你的选股能跑半小时
同花顺的公式计算是逐股逐 K 线执行的,公式复杂度和股票池大小决定总耗时。一个常见的性能杀手是循环内反复调用高层函数。例如:
FOR I=1 TO 100 DO SUM(CLOSE,I);循环体里每次SUM都要从当前 K 线往前计算一遍,等于同一根 K 线的历史数据被重复读取 100 次。正确做法是用一句话承接:
MA_N:MA(CLOSE,100);另一个性能瓶颈是序列数据的条件分支写得太重。假设你在公式里写了大量IF(CLOSE>OPEN, ...),系统会对每个分支都计算完整序列,而不是像普通编程语言那样按值跳转。更高效的做法是把条件先存成中间变量,例如:
UP:=CLOSE>OPEN; IF(UP, VOL, 0);这里的差异在几千只股票的全市场扫描时被放大到秒级甚至分钟级。
4.3 云端掉线、除权数据和 TICK 序列:三个必踩的坑
第一个坑是除权数据导致的指标跳变。某只股票 10 送 10 之后,CLOSE会从 50 变成 25,移动平均线也瞬间腰斩,完全看不出真实趋势。同花顺在公式里默认使用前复权数据,但如果你选了“不复权”或者导入的是第三方数据源,公式结果会和你上证图看到的完全不同。解决办法:在 K 线界面右键选择“前复权”,或者使用PRICE()系列函数,它们能自动处理复权因子。
第二个坑是未来函数。同花顺公式系统里有一类函数(如TRADE_PRICE、HIGH_AFTER)能引用“未来”的数据,用它们写出的回测结果会非常好看,但实盘中使用是没有意义的。自查方法:把公式里出现HIGH、LOW时,看有没有以>REF(HIGH,0)之外的形态出现;更直接的方法是打开“公式管理器”里的“未来函数检查”,系统会标红列出风险函数。
第三个坑是 TICK 数据。同花顺期货通和同花顺经典版的公式语法同源,但期货通里CLOSE在分时周期不再是 60 秒 K 线的收盘,而可能是 500ms、200ms 级别的切分状态;如果你在涨停/跌停附近的 TICK 序列上算MA5,得到的均线会快速震荡,适合做高频的连续开平仓判断,但不适合直接拿到日线模型里嫁接。遇到这种跨周期混合模型,常见做法是先在小周期上把信号聚合成一个布尔值,再在大周期上用COUNT(BUYSIGNAL, N)统计。
4.4 参数优化结果怎么看:收益、回撤和胜率不是一回事
回测报告里通常给出“总收益率、年化收益率、最大回撤、胜率、盈亏比、交易次数”。优化时最值得比较的是“收益回撤比”,也就是总收益率除以最大回撤幅度。一段策略在震荡市里胜率很高但一次趋势反转就打回原形,胜率再高也没有实用价值。建议至少要对比“低回撤区间的前 20% 参数组合”,而不是挑收益率最高的那组。再到不同分段行情里跑两轮,看看参数是全局稳定还是只在局部牛市里有效。
5. 进阶用法:DLL 扩展、iFind 数据插件与信号验证技巧
5.1 用 DLL 扩展公式语言跑自定义计算
同花顺公式系统支持调用外部 DLL,解决内置函数算不了的高阶逻辑。常见做法是用 C++ 或 Delphi 写一个动态库,导出特定签名的函数,比如:
extern "C" __declspec(dllexport) double __stdcall MyFunc(double* data, int n, double param) { double sum = 0; for (int i = 0; i < n; i++) sum += data[i]; return sum / n; }编译成 DLL 后,在同花顺里用EXTERN关键字引入:
EXTERN: MyFunc(CLOSE, 5);需要强调的是,这种扩展接口的位数必须和同花顺主程序一致;32 位版只能加载 32 位 DLL,64 位版必须用 64 位编译器重新生成。如果加载失败,终端不会给出详细报错,先去事件查看器里查模块加载日志,通常能找到“无法加载 DLL”或“找不到指定的模块”。这个过程和嵌入式开发里调试驱动加载失败的思路完全一样,先看依赖项,再看位数,最后确认函数名导出符号是否带了下划线和修饰符。
5.2 通过 iFind Excel 数据插件绕过公式引擎的边界
同花顺还有一条进入编程世界的旁路:iFind 数据插件。它可以在 Excel 里拉取同花顺的历史行情、财务数据和板块数据,然后再用 VBA 做二次加工。对于没有在公式引擎里写出来的复杂多因子模型,这条路径比同花顺公式语言更灵活,因为 VBA 能直接操作电子表格、数据库和其他业务系统。
在 Excel 里安装 iFind 插件后,常用函数形如=IFINDC("stock","open",...)。更快的做法是直接用“智能数据”面板,把输出表导成 CSV,再交给 Python 的 pandas 或者自己的后端服务做计算。我在实际项目里见过好几套“C++/Python 计算信号 → iFind 回填到同花顺 → 画图”的流程,适合对公式语言性能不满意但有外部算力的团队。
5.3 用历史回放和 K 线标记验证你的信号没有“漂移”
写完一个指标或策略,最先要做的不是看收益,而是用历史回放检查信号是否比行情晚出现。打开 K 线图,把公式输出变量放大,然后按↓键逐根 K 线回放。正常逻辑下,CROSS信号应当发生在 K 线收盘那一刻,而不是在下一根 K 线开盘时突然出现。如果你在回放时发现信号出现的位置比公式逻辑预期晚了 1 根 K 线,大概率是你在条件里使用了REF并且方向写反了,或是引用了未来函数。
一个实用的自查技巧是写出一个“无意义的基准公式”,然后手动在一根已知 K 线上标记期望值,看看计算结果是否吻合。比如对某一段已知上涨趋势,手动算出某一天的COUNT(CLOSE>OPEN,5)期望值,再对照公式返回。这步做一次,能帮你快速发现数据类型、复权方式和引用序号的偏差,比在回测报告里反复猜原因要快得多。
本文还有配套的精品资源,点击获取