资讯动态

同花顺公式语言全解析:语法、函数与选股实战

发布时间:2026/9/19 6:54:16 来源:尧图企业网站定制
简介同花顺软件编程.pdf是一份面向同花顺软件二次开发与公式编写人群的入门与进阶资料适合需要自定义技术指标、选股条件或行情分析公式的股民与量化研究者。文档从公式编写规则讲起覆盖语言规范、标识符、分隔符、赋值与条件语句、while循环、函数调用及“空”值处理等关键语法并以KDJ指标调用等案例演示参数传递机制系统函数说明部分则对板块平均、板块最小值等常用函数给出格式与示例能够帮助读者快速理解公式背后的逻辑并上手实践。资源为单文件PDF共1个pdf压缩包整体仅489KB便于下载后随时查阅。当前已有666人浏览学习适合刚接触同花顺公式编程、想系统梳理语法要点和函数用法的用户作为速查与自学材料。1. 一份OCR残缺的同花顺公式手册为什么还值得读手头这份《同花顺软件编程.pdf》是典型的扫描件转文字失败的产物ifvhil»、break continu«、r»turn这类乱码遍布全文。但如果跳过这些干扰把残留的格式信息拼回去你会发现这其实是一份公式语言的手册它定义了同花顺公式系统的词法、赋值规则、条件分支、循环控制以及覆盖板块、财务、指标、时间、统计的系统函数族。对经常写同花顺指标或选股公式的人来说这种能用但资料稀少的语言最缺的不是某个函数的用法而是对整个语法模型的完整认知。这篇内容适合两类人一是想从零搭建自己交易公式的量化初学者二是需要把同花顺公式与Python、Excel插件等外部工具对接的工程师——后者往往会踩到空值跨周期引用函数返回规则这些隐蔽的坑。2. 公式语言的语法骨架赋值、条件、循环与函数调用规则2.1 分隔符与赋值运算符的真正含义原文一开始就强调自定义公式里的符号必须用半角不能用全角这点在处理从网页复制的公式片段时非常容易出现。分隔符方面()控制运算优先级{}把多个语句组合成语句体;是每条语句的结束标志。真正的重点在赋值语句同花顺公式系统里有四个容易混淆的运算符——、:、:和:。和:的含义、用法完全相同都是纯赋值:是赋值并输出数值或字符串会在公式结果中显示:是赋值并输出图形用于画线。这个设计是为了兼容市场上其他带公式编辑功能的分析软件。实际写公式时如果你用:定义了中间变量它在最终结果里不可见用:定义的变量则会直接出现在输出区域。调试时把关键中间量从:改成:就能在图形上看到它这是最朴素但有效的排查手段。2.2 IF-ELSE的最近匹配原则与花括号的必要性条件语句的一般形式是IF(逻辑表达式)语句1; ELSE 语句2;其中ELSE语句2;是可选部分。这里最容易出错的是嵌套场景。原文给了一个典型的错误示例IF(x20 OR x-10) IF(y100 AND yx) AGood; ELSE BBad;按照规则ELSE与最近的IF匹配所以这个ELSE实际挂在IF(y100 AND yx)上而不是外层那个条件上。要让ELSE归外层IF管必须加花括号IF(x20 OR x-10) { IF(y100 AND yx) AGood; } ELSE BBad;这段代码的逻辑是先判断x是否大于20或小于-10只有满足这个外层的价量异动前提才去判断y的范围花括号把内层IF括成一条语句ELSE才能正确匹配到外层。当公式出现该出信号的地方没出信号、不该出的却出了这类问题时优先检查IF-ELSE的配对关系——多数情况下不是行情判断错了而是分支挂错了层级。2.3 while循环、break与continue的边界约束循环语句只有while(条件)语句;一种形式条件为真时反复执行语句体直到条件为假。支持多层嵌套但要记住两点break对if-else条件语句不起作用只作用于while循环在多层循环中一个break只向外跳一层。continue则跳过本轮剩余语句、强行进入下一轮循环。在写遍历历史K线统计满足条件次数这类逻辑时continue比多层if嵌套可读性好得多。2.4 函数返回值溯源与缺参补参规则调用函数的基本方式是函数名(参数参数…)。返回值的选择顺序值得细看有return语句就用return规定的值没有return返回以函数名命名的变量的值还没有返回最后一个输出的值再没有返回最后一个被调用的语句的值。原文举了KDJ的例子在其它函数里输入aKDJ(8,6,6)KDJ内部有K、D、J三个输出默认返回最后一个输出J值。参数传递有几个容易忽略的规则完全不传参数采用函数设置的默认参数传参少于函数参数数目依次改变前面同等数目的参数值后面的用默认值传参大于函数参数数目多余参数不起作用。还有一条隐蔽的坑新建的函数名如果与既有函数里的内部变量重名调用时该内部变量会变成对这个新函数的调用产生错误。所以给新函数命名时要避开常用的局部变量名我的做法是统一加前缀比如F_开头。3. 空值语义与系统函数分类精讲3.1 NULL的运算规则为什么7×NULL等于7空即没有数据。原文强调了两个反直觉的规则第一空与任何数据计算时相应计算被取消例如7×NULL得到的结果是7第二空与任何数据比较大小时空较小例如-7NULL的结果为1条件满足。第二个规则在实际选股公式里很容易埋雷某只次新股没有三年前的年报净利润YEARREP(JLR,4)返回空如果你用YEARREP(JLR,4)0去筛选空值会参与比较且被当作较小筛选结果可能包含你意料之外的股票。避免办法是先用ISNULL函数判断数据可用:ISNULL(YEARREP(JLR,4))0; 条件1:IF(数据可用, YEARREP(JLR,4)5000000, 0);这段代码先判断财务数据是否为空为空时直接给0不参与后续比较。在用财务函数做历史对比或跨期筛选时这条防护逻辑要形成习惯否则回测结果和实盘表现会出现系统性偏差。3.2 板块函数BLOCKAVG、BLOCKLEAD与指数联动板块函数用于获取板块内所有股票的聚合数据。BLOCKAVG(N)求板块平均值BLOCKMIN(N)求最小值BLOCKMAX(N)求最大值BLOCKSUM(N)求和。原文的例子是BLOCKAVG(NEW)表示板块里所有股票当前时刻的平均价BLOCKMIN(LOW)表示当天最低价BLOCKSUM(VOL)表示当前时刻总成交手数。BLOCKLEAD(X,Y)值得单独说明它取板块指数的所属个股中数据X最大的股票的数据Y。原文给的例子是BLOCKLEAD(VOL,ZQ)取该板块指数中成交量最大的股票名称。这个函数在识别板块内领涨/领跌权重股时非常有用。比如要找出大盘当日成交额最大的个股名称可以配合INDEXDATA做跨品种联动分析。函数原型功能典型返回BLOCKAVG(N)板块内某数据项平均值BLOCKAVG(CLOSE)板块均价BLOCKMIN(N)板块内某数据项最小值BLOCKMIN(LOW)板块最低价BLOCKMAX(N)板块内某数据项最大值BLOCKMAX(HIGH)板块最高价BLOCKSUM(N)板块内某数据项求和BLOCKSUM(VOL)板块总手BLOCKLEAD(X,Y)取X最大的个股的Y数据BLOCKLEAD(VOL,ZQ)最大成交个股名称注意N里的N是数据项标记用前缀不是变量。3.3 财务函数的时间窗口YEARREP、QUARTERREP、MIDREP、REP财务函数的核心是调哪一期报表。QUARTERREP(N,K,L)调用季报数据K表示最近一次(1)、上一次(2)、更早(3、4)或直接输年份L可以是1或3表示第一季度或第三季度季报且L仅在K选择年份时适用。YEARREP(N,K)调用年报数据K1表示最近一次年报K2表示上一次年报也可以直接输年份。MIDREP(N,K)调中报。REP(N,K)调用最近一次报表或与其同类型报表的数据项K1是最近一次公布的报表K2是去年同类型报表。这里有个重要约束N必须是基本的财务数据项不能是编写的计算项目也就是功能树里公式栏财务数据目录下面的数据项。REPDATE(N,M,K)用于取某个财务数据项的报表日期原文的例子REPDATE(ZGB,1,4)表示取最近总股本年报的报表日期。做成长股筛选时我一般会把REPDATE和当前日期做差值判断剔除财报过于陈旧的标的。3.4 指标函数COST、WINNER、ZIG、SAR的计算语义COST(10)表示10%获利盘的价格即10%的持仓量在该价格以下其余90%在该价格以上为套牢盘该函数仅对日线分析周期有效。WINNER(CLOSE)表示以当前收市价卖出的获利盘比例返回0.1表示10%获利盘WINNER(10.5)表示10.5元价格的获利盘比例。PWINNER(10,CLOSE)计算10天前那部分成本以当前收市价卖出的获利盘比例返回0.2表示20%获利盘。这三个函数联合使用可以刻画筹码的浮盈浮亏结构。ZIG(K,N)是之字转向当价格变化量超过N%时转向K表示0开盘价、1最高价、2最低价、3收盘价。例如ZIG(3,5)表示当前收盘价超过上次ZIG转向输出值的5%或-5%则输出当前收盘价并ZIG转向。要注意的是ZIG用了未来函数性质的回溯算法只适合用来做技术形态标注不适合直接作为可交易信号。SAR(N,S,M)计算抛物转向N为计算周期S为步长M为极值。SAR(10,2,20)表示10日抛物转向步长2%极限值20%。同花顺的SAR参数和通达信略有差异移植公式时要确认步长和极值的单位是百分比还是小数。3.5 引用函数族MA、EMA、SMA、DMA、WMA的算法差异这一族函数是公式系统里最常用的但它们的算法差异常被忽略函数算法简洁说明MA(X,N)(X1X2...Xn)/N简单算术平均所有样本等权EMA(X,N)Y[2*X(N-1)*Y]/(N1)指数平滑近期权重更大SMA(X,N,M)Y[M*X(N-M)*Y]/N带权重因子的移动平均DMA(X,A)YA*X(1-A)*YA必须小于1动态移动平均平滑因子可变WMA(X,A)(N*X0(N-1)X1...1XN)/(N(N-1)...1)线性加权越近权重越大表格里的Y表示上一周期Y值。原文给的例子很实用SMA(CLOSE,30,1)是30日移动平均价DMA(CLOSE,VOL/CAPITAL)是以换手率作平滑因子的平均价——这意味着换手率高时当前价格权重更大能更快反映活跃交易区的成本变化。SUMBARS(VOL,CAPITAL)表示将成交量向前累加直到大于等于流通股本返回这个区间的周期数也就是完全换手到现在的周期数这是评估筹码充分换手程度的常用指标。4. 实战从零组装一个多因子选股公式4.1 公式骨架与参数定义把前文的语法和函数组合起来做一个可运行的选股公式。目标是选出同时满足以下条件的标的均线多头排列、MACD在零轴上方刚刚金叉、站上60日成本线、且换手率处于合理区间。打开同花顺的公式编辑器新建一个条件选股公式{多因子选股 - 逻辑示例} N1:5; N2:10; N3:30; N4:60; MA5:MA(CLOSE,N1); MA10:MA(CLOSE,N2); MA30:MA(CLOSE,N3); MA60:MA(CLOSE,N4); {均线多头排列: 5日 10日 30日 60日} 多头排列:MA5MA10 AND MA10MA30 AND MA30MA60; {MACD金叉} DIF:EMA(CLOSE,12)-EMA(CLOSE,26); DEA:EMA(DIF,9); MACD金叉:CROSS(DIF,DEA) AND DIF0; {站上60日成本线参考1 - 60日获利盘达到80%} 站上成本:WINNER(CLOSE)0.8; {换手率适中} 换手率:VOL/CAPITAL*100; 量能适中:换手率3 AND 换手率15; {综合条件} 综合:多头排列 AND MACD金叉 AND 站上成本 AND 量能适中;这段代码的含义是用MA函数构建四条均线多头排列用AND连接四个比较式MACD部分先算DIF和DEA再用CROSS(DIF,DEA)检测金叉附加DIF0过滤零轴下方的反弹WINNER(CLOSE)作为成本分布依据要求当前价对应的获利盘比例不低于80%。4.2 参数设置与回测验证公式写完后在同花顺的选股器里设置参数N15、N210、N330、N460。回测周期建议至少覆盖一轮完整的牛熊比如2018年1月到2024年12月这样能同时检验趋势市和震荡市的表现。实际回测时纯WINNER(CLOSE)0.8这个条件在震荡市会频繁发出信号因为获利盘高意味着上方套牢盘少价格弹性大但同时也意味着短期涨幅不小。我一般会叠加一个CLOSEHHV(HIGH,20)*0.95的约束即当前收盘价不超过20日最高价的95%过滤掉短期急拉后的追高信号。4.3 用公式选股结果反推参数敏感性回测完成后重点看参数敏感性。把N1从5改成3或8观察选股数量和收益分布的变化幅度如果选股数量从200变成20说明条件对参数过于敏感这种公式的泛化能力差如果变化不大说明条件本身具备稳定性。同花顺的条件选股功能支持批量修改参数并重新选股可以一次性跑多组参数对比。另外提醒一点公式里用了WINNER和COST这类仅对日线分析周期有效的函数用在小级别周期会直接失效不要在分钟线选股里套用。5. 性能与排错把公式从能跑到跑得可靠5.1 序列计算的效率瓶颈降低数据维度与避免重复调用同花顺公式是逐K线计算的序列语言同样一段逻辑不同的写法性能差异可以很大。最典型的低效写法是在循环里反复调用HHV、LLV这类需要扫描整个历史序列的函数。原PDF里的COUNT(X,N)、SUM(X,N)在N0时会从第一个有效值开始统计这个范围是全历史区间数据量大时非常耗时。我的做法是先用BARSLAST或BARSSINCE把计算窗口限制到最近N个周期再把CLOSE这类行情数据项作为参数传入函数避免每次迭代重新取数。另外HHVBARS(X,N)、LLVBARS(X,N)这类返回最高值/最低值到当前周期数的函数比先算HHV再循环比对的做法快一个量级能用它们表达的逻辑就不要手写循环。5.2 未来函数检测ZIG与BACKSET的实盘陷阱ZIG(K,N)和BACKSET(X,N)都带有未来函数性质。BACKSET(X,N)的语义是从当前位置到N周期前的数据设为1它在历史K线上回看时是确定的但在逐根K线实盘中最后一根K线的赋值会随着新K线产生而改变导致信号漂移。检验公式是否含未来函数可以打开公式检测功能里的提示信息或手动在最新K线上对比信号是否随行情推进而变化。如果回测胜率特别高、但实盘信号经常消失优先怀疑这两种函数。5.3 断点式排查用输出语句定位逻辑分支当公式结果与预期不符我在公式末尾临时增加几个输出项调试1:多头排列; 调试2:MACD金叉; 调试3:站上成本; 调试4:量能适中;用:而不是:这些条件会在结果区域逐行显示。哪一项为0问题就出在哪一段逻辑。排查顺序是先看原始行情数据能不能取到警惕停牌股的空值再看中间计算比如WINNER(CLOSE)在次新股上可能因筹码数据不足返回空最后看组合条件的边界比如换手率3 AND 换手率15是否把某些创业板股票排除在外。排查完再把调试输出改回:避免影响最终选股结果。最后所有公式保存前记得用全角转半角工具清理一遍——帖子里那些从网页复制来的中文括号、中文分号是公式编译报错的第一大来源。本文还有配套的精品资源点击获取

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

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

免费获取报价