同花顺公式编辑基础语法入门:从变量到选股公式 在技术指标里均线是均线、MACD是MACD那些都是别人写死的算法打开同花顺公式编辑器以后这些东西全变成你手里的原材料了。你可以把两条均线揉在一起自定义买卖信号可以把成交量跟价格走势组合成一个自定义强度指标甚至能把一套完整的选股逻辑编译成几行公式让软件帮你全市场扫一遍。这就是公式编辑最吸引人的地方而这一切的前提就是把基础语法这块地基打好。这份教程的第2章聚焦的就是基础语法。它面向的人很具体已经知道同花顺有个公式编辑器也知道在哪里新建公式但一打开编辑器就有点蒙菜单栏、插入函数、参数设置一大堆不知道从哪一行写起的初学者。目标说透一点第2章学完你能读懂别人写的公式能独立写出像双均线金叉、MACD柱状图这样的小指标能自己排查最常见的语法报错。后面不管你是想写选股公式、交易系统还是研究资金博弈这类复杂指标的源码靠的都是这套底子。1. 动笔之前先把公式系统看透再写1.1 公式编辑器到底在“翻译”什么很多教程一上来就列语法、抄代码结果读者写完一条MA5:MA(CLOSE,5);能画出均线但不知道为什么这样写换个需求就卡壳。问题出在没理解公式系统的本质。同花顺的公式编辑器本质上是一个“行情描述语言”的编译入口。你输入的每一行文本软件都会翻译成在每根K线上执行的计算指令。所谓指标就是这套指令在K线序列上逐根算出来的结果再画成线条、柱状或文字。我用生活里的例子说明你在Excel里写A1B1系统按单元格算同花顺公式里写VAR1 : CLOSE OPEN行情软件按每一根K线的收盘价和开盘价相加从第一根K线一直算到最后一根生成一整列数据。这根“列”在公式里叫序列是整个语法的绝对核心。1.2 要理解“类型”公式系统不是只有一个编辑器同花顺新建公式时会让你先选公式类型。常见的有技术指标、条件选股、交易系统、五彩K线版本不同命名可能略有差别。这里先不纠结细节但你心里必须明白类型决定了你写出来的公式被拿去干什么。技术指标公式输出线画在主图或副图上比如均线、MACD。条件选股公式输出一个选股条件满足为1不满足为0公式供选股器批量扫描使用。交易系统公式输出买入信号和卖出信号用于历史回测。五彩K线用颜色区分满足特定条件的K线形态。好消息是不管选哪种类型基础语法完全一样。你在这章学会的变量、运算符、条件判断、函数调用在四个类型里都通用区别只是最后几行怎么收尾。这也是为什么第2章只讲语法不讲具体应用方向底子通了往哪个方向走都是顺水推舟。1.3 建立三个底层认知比背语法更重要第一公式是“逐根K线算”的。软件按时间顺序从第一根K线算到最新一根每根K线上都完整执行一遍你写的所有语句。所以VAR1 : CLOSE OPEN;这一句在任何一根K线上算出来的都是“这根的收盘价是否大于开盘价”这个布尔判断结果为1或0而不是全市场的统计值。第二变量名背后往往是一整列数据。你写VAR1 : MA(CLOSE,5);得到的是一个序列不是一个单值。做条件判断、画线、引用都是在这个序列上操作。第三赋值和输出是两回事。这是新手最容易晕的地方也是下一章的重点赋值语句只把计算结果存进变量不画线输出语句才会把结果显示在K线图上。理解了这三条后面所有的语法细节都有了挂靠点。2. 基础语法要素逐项拆解2.1 语句、冒号和分号公式的最小组成单位同花顺公式由一条条语句组成语句以英文分号;结尾。注意一定要用英文输入法中文分号会导致编译报错。每条语句有固定的结构名称 赋值符或输出符 表达式 ;。我选最常用的几个例子MA5:MA(CLOSE,5); DIF : EMA(CLOSE,12) - EMA(CLOSE,26);第一行里的冒号:是“输出符”表示把 MA(CLOSE,5) 的计算结果作为一条指标线画出来线的名字叫 MA5。第二行里的:是“赋值符”把 EMA(CLOSE,12) 减 EMA(CLOSE,26) 的结果存进变量 DIF但不画线只是给后面语句调用。新手必须先死记这个区别。我见过很多人把输出和赋值混着用导致图上画出一堆莫名其妙的线或者该有信号的地方没有信号。写指标时默认用:做中间计算只有最终想展示给眼睛看的线才用冒号:输出。提示如果你想让输出线带颜色或者线型可以在分号前加修饰参数比如MA5:MA(CLOSE,5), COLORRED;。同样分号前用逗号分隔。2.2 变量命名的几个硬规矩变量的作用就是给计算结果起个名字方便复用。命名规则不复杂但有四条硬约束变量名只能由字母、数字、下划线组成不能以数字开头。不能使用系统保留字比如不要用 CLOSE、OPEN、MA、REF 这些函数名或者行情名做变量名。变量名最好有意义AA1、AB2这种纯字母虽然能用但三个月后回看代码你根本记不住它代表什么。同花顺公式对大小写不敏感ma和MA是同一个意思但建议统一大写提升可读性。我见过最坑的错误是拿 MA 当变量名。你写MA : CLOSE;软件很可能直接报错因为它无法区分你现在说的是函数 MA 还是变量 MA。变通的办法是加后缀比如MA5V、MA10V系统函数名后面加个字母后缀就安全很多。2.3 运算符加减乘除、比较和逻辑运算符分三类算术运算符就是最普通的 - * /优先级和数学一致乘除高于加减想改变优先级用括号VAR1 : (CLOSE HIGH LOW) / 3;比较运算符包括、、、、注意这里的是“等于”判断不是赋值。比较运算的结果只能是1成立或0不成立VAR2 : CLOSE OPEN;逻辑运算符是 AND、OR、NOT用来组合多个条件VAR3 : CLOSE OPEN AND VOL REF(VOL,1);这句话的意思是当根收阳线并且成交量大于上一周期条件成立。AND 两侧的条件都需要为真OR 只要一侧为真即可。逻辑运算的结果同样是1或0。这里容易出问题的是优先级。比如VAR4 : CLOSE OPEN AND REF(CLOSE,1) REF(OPEN,1) OR VOL MA(VOL,5);初学者读起来很累。我的建议是只要表达式里条件超过两个全部用括号把逻辑组清晰框起来避免软件优先级和你的意图不一致VAR4 : (CLOSE OPEN AND REF(CLOSE,1) REF(OPEN,1)) OR (VOL MA(VOL,5));2.4 注释公式里的“笔记本”写公式和写代码一样最大的敌人不是语法是“过段时间看不懂自己写了什么”。同花顺支持用花括号{ }写注释注释内容不参与计算。{ 双均线金叉指标 5日均线上穿20日均线时提示 } MA5: MA(CLOSE,5), COLORYELLOW; MA20: MA(CLOSE,20), COLORWHITE;我强烈建议在每个公式开头加一段注释写明这个公式的用途、适用周期、关键参数。后面回看、调试、分享给朋友都会省很多事。尤其当你开始研究别人的源码时源码里有没有注释决定了你半小时能看懂还是三天看不懂。3. 高频函数与条件判断的实操用法3.1 两个必须掌握的函数组合行情函数 统计函数行情函数不是真正的“函数”是系统自带的标准数据源。你写公式时直接用就行名称含义OPEN开盘价CLOSE收盘价HIGH最高价LOW最低价VOL成交量手AMOUNT成交额这六项是原始数据你只需要引用不能给它们赋值。常见的写法是CLOSE OPEN、VOL REF(VOL,1)。统计函数才是真正需要花精力记的它们对序列做加工。下面是出现频率最高的一组函数作用示例REF(X,N)引用N周期前的X值REF(CLOSE,1)昨收MA(X,N)X的N周期简单均线MA(CLOSE,10)HHV(X,N)N周期内X的最高值HHV(HIGH,20)LLV(X,N)N周期内X的最低值LLV(LOW,20)COUNT(条件,N)最近N周期内条件成立次数COUNT(CLOSEOPEN,5)SUM(X,N)N周期X的总和SUM(VOL,5)ABS(X)绝对值ABS(CLOSE-OPEN)MAX(A,B) / MIN(A,B)取较大值/较小值MAX(CLOSE,OPEN)用这些函数时心里要反复念叨那句话它们返回的都是序列不是单值。REF(CLOSE,1)在全序列上运行得到的是“每一根K线对应的上一根收盘价”。3.2 IF函数公式里的“如果那么”IF函数是条件判断的主力军格式是IF(条件, 结果A, 结果B)条件成立返回结果A否则返回结果B。注意A和B可以是一个数也可以是一个序列甚至可以是另一个函数调用VAR1 : IF(CLOSE OPEN, HIGH, LOW);意思很直白当根是阳线取最高价是阴线取最低价。IF经常和MA、REF等组合出各种信号。比如我想画一条“只在收盘价站上20日线时才显示”的均线可以这样写条件 : CLOSE MA(CLOSE,20); 显示线 : IF(条件, MA(CLOSE,5), 0); 显示线, COLORRED;这样条件不满足时显示线直接为0图上就不会出现这条线。需要注意IF的三个参数里条件部分必须能计算出1或0A和B的数据类型最好保持一致不一致时有些版本会报错或显示异常。3.3 CROSS和COUNT识别信号的两个主力CROSS(A,B) 表示A从下方向上穿越B是最高频使用的信号函数。为什么不用A B AND REF(A,1) REF(B,1)来写因为 CROSS 就是这句话的封装一行搞定买入信号:CROSS(MA(CLOSE,5), MA(CLOSE,10));注意我这里用了冒号而不是冒号加等号所以买入信号会作为一条线画出来。当CROSS成立时这根K线位置上返回1其余为0。这种0和1组成的线就叫信号线肉眼看不直观通常配合DRAWICON或STICKLINE使用。COUNT(条件,N) 用来统计过去N根K线里条件满足多少次是设计“过滤重复信号”的利器。比如要求5日均线金叉20日线之后收盘价不能再跌破20日线可以写连续在线上:COUNT(CLOSE MA(CLOSE,20), 5) 0;这句话的意思是最近5根K线里收盘价小于20日线的天数为0也就是全都站上了均线。将CROSS和COUNT搭配能写完绝大多数信号过滤逻辑。3.4 绘图输出STICKLINE、DRAWICON、DRAWTEXT数字信号不直观所以同花顺提供了一组绘图函数把判断结果转换成柱状、图标和文字显示在主副图里。三个最常用的STICKLINE(条件, 起点值, 终点值, 宽度, 空心/实心)条件成立时在起点和终点之间画柱STICKLINE(MACD 0, 0, MACD, 3, 0), COLORRED;这行是MACD柱最常见的画法条件为真时从0轴往上画红色实心柱。DRAWICON(条件, 位置, 图标编号)条件成立时在指定位置画图标DRAWICON(CROSS(MA(C,5), MA(C,10)), LOW*0.98, 1);DRAWTEXT(条件, 位置, 文本)条件成立时在K线图上写字DRAWTEXT(CROSS(MA(C,5), MA(C,10)), LOW*0.98, 金叉);绘图函数不影响指标数值只负责把结果用图形表达出来。刚入门不用把所有编号都背下来打开同花顺公式编辑器里的“插入函数”面板鼠标悬停就能看到每个参数的提示这也是我每次都让新手先去点一遍的东西。4. 容易踩的四个坑排查思路直接甩给你4.1 除零问题指标突然断线或显示乱码你写公式时无法控制每一根K线的数据当分母在某根K线上等于0时整个计算结果就会变成无效值。最典型的是自定义量比公式VAR1 : VOL / REF(VOL,1) * 100;如果上一周期成交量为0比如停牌日或者新股首日分母为0VAR1在当根K线上无法计算指标线就会出现断头或者异常大值。应对思路两种。第一种用IF提前判断分母VAR1 : IF(REF(VOL,1) 0, 0, VOL / REF(VOL,1) * 100);第二种用MAX给分母兜底一个极小值实质上是把除零替换成除一个足够小的数VAR1 : VOL / MAX(REF(VOL,1), 0.01) * 100;两种方式在绝大多数场景下都能稳定输出。我个人的习惯是第一优先级用IF语义更清晰别人读代码也能看懂。4.2 REF参数用错导致信号整体漂移REF(X,N)表示向前引用第N周期的值N的值直接决定信号位置。一个典型场景是“昨天金叉今天我想要提示”。有些新手会写成提示:CROSS(REF(MA(C,5),1), REF(MA(C,10),1));这句的意思是把5日均线和10日均线整体向前推一根再判断金叉逻辑对了但信号出现的位置全部滞后一根。正确做法是保留当根金叉判断只是把结果向后“记忆”一天用COUNT或者REF处理信号线金叉 : CROSS(MA(C,5), MA(C,10)); 提示:REF(金叉,1);这个错误很隐蔽因为公式不报错、能通过编译但信号永远晚一天。排查方法是找一段历史K线手动对照金叉位置和信号位置是否一致不一致就要检查REF方向。4.3 序列和标量混用条件判断“看起来对但输出怪”公式里的标量就是单个数字比如5、0.618序列是一整列数据。二者做运算时你会认为软件“自动扩展”了标量实际也确实如此这就是隐式广播。但问题出在逻辑判断上VAR1 : IF(CLOSE 10, CLOSE, 0);这里的10会被自动扩展成每一根K线上的常数逐根比较没问题。但你如果写VAR2 : IF(CLOSE HIGH, CLOSE, HIGH);当根K线的CLOSE不可能大于自身的HIGH所以VAR2永远等于HIGH。逻辑看似合理其实条件永假或者恒真指标没有区分度但编译不报错。这类问题只能靠检查逻辑本身没有捷径。我的排查技巧是给可疑条件单独写一条输出线直接观察条件序列是不是一直在0或1之间没有变化。4.4 变量命名冲突和常见语法报错速查命名冲突是报错重灾区。系统函数、行情函数、保留字都不允许做变量名。除了我前面说的 MA、REF连 DRAWTEXT、STICKLINE 这种绘图函数也不能用。同花顺报错信息不算特别友好我整理了一个速查表报错现象常见原因处理办法未知标识符变量名没定义就使用或拼写错误检查前后变量名是否完全一致缺少分号语句末尾漏写英文分号常见于复制粘贴后换行处补上分号注意英文输入法参数个数不对函数参数数量或类型不符打开“插入函数”面板核对参数定义等号左侧无效对系统行情函数赋值不能用CLOSE : ...CLOSE只能被引用括号不匹配复制别人代码时漏了括号数一数左右括号数量或用代码编辑器高亮排查语法错误我有个笨但有效的方法先注释掉一半代码看报错是否消失如果消失了说明错误在注释掉的那半部分再二分定位。调试几轮就能锁定有问题的语句。5. 一个能直接套用的入门实战双均线多头选股5.1 先想清楚需求再写一行代码很多人一打开编辑器就写代码这是最大的错误。任何公式哪怕只有五行也应该先有需求描述。这里我定一个非常容易理解的需求选出5日均线刚刚上穿20日均线或者最近5个交易日内刚刚上穿过、目前仍保持5日线在20日线上方的个股。这个需求拆成三个条件条件15日均线上穿20日均线金叉信号。条件2当前5日均线仍在20日均线上方多头状态。条件3金叉信号出现在最近5个交易日之内。用CLOSE计算均线的原因是收盘价是最可靠的确认价盘中选股和盘后选股结果一致不会被盘中波动干扰。5.2 公式代码与逐行说明新建一个条件选股公式输入以下内容{双均线多头选股5日线上穿20日线且5日内维持多头} VAR1 : MA(CLOSE,5); VAR2 : MA(CLOSE,20); 金叉 : CROSS(VAR1, VAR2); 多头 : VAR1 VAR2; 近5日有金叉 : COUNT(金叉,5) 0; 选股: (多头 AND 近5日有金叉) OR 金叉;逐行解释一下前四句第一句是注释写明公式用途方便以后回看。VAR1 : MA(CLOSE,5);计算5日均线存成内部变量不画线。VAR2 : MA(CLOSE,20);计算20日均线。金叉 : CROSS(VAR1, VAR2);金叉信号在当前K线成立时返回1否则0。多头 : VAR1 VAR2;当前5日线在20日线上方时成立。近5日有金叉 : COUNT(金叉,5) 0;最近5根K线内至少出现过一次金叉。最后一行用冒号输出选股结果。这里用括号保证了优先级(多头 AND 近5日有金叉) OR 金叉意思是“如果还处于多头状态且5日内有过金叉也纳入如果当根刚刚金叉哪怕前一根还处于空头也纳入”。5.3 在编辑器里配置和运行的几个要点首先确认公式类型选的是“条件选股”而不是“技术指标”如果用技术指标类型保存选股器可能找不到它。输入完成后点“编译测试”或“测试公式”系统会提示语法是否通过。如果没有报错可以先随便找一只熟悉的股票加载公式在K线图上用副图或信号标记观察输出是否正确。重点检查有没有出现信号连续反复如果一只股票在5根K线里反复金叉死叉选股结果大概率会非常吵这时应该把“近5日有金叉”的周期缩小或者增加一个“死叉过滤”条件。跑全市场选股前我建议先做一个小测试把选股时间限定在近10个交易日检查选出的股票数量是否符合直觉。如果一次选出几百上千只多半是过滤条件太松如果一只都没有可能是条件太苛刻或者公式类型选错。提示这个公式只是教学示例不构成任何投资建议。实际使用前最好先做两年以上的历史回测看看信号的稳定性、胜率和回撤再结合自己的策略做调整。5.4 从示例公式继续扩展的三个方向这个例子虽然简单但已经用上了本章的绝大多数语法要素注释、变量、赋值、输出、MA、CROSS、COUNT、AND、OR、括号。顺着它你至少有三个扩展方向。方向一把均线参数改成外部参数。同花顺支持用参数定义比如在参数设置里定义 N1、N2让使用者能在界面上直接调整不用每次改代码。这需要在新建公式时填参数表实际上就是把硬编码的数字替换成参数名。方向二把选股条件升级成交易系统。把最后的输出拆成买入信号和卖出信号两条线就能在软件里做历史回测统计这个策略到底赚不赚钱。方向三给指标加可视化提示。用DRAWICON和DRAWTEXT把金叉、死叉标在K线图上用STICKLINE画出多空力量柱这样就从一个干巴巴的选股公式变成了一个信息完整的副图指标。这些方向后面的章节都会展开但你可以现在就拿这个例子练手把注释去掉、调大调小周期、加一个条件再删一个条件看看输出怎么变。这个动手过程就是语法从“看懂了”变成“会用”的关键一步。我个人在实际操作中的体会是同花顺公式编辑最大的门槛根本不是语法而是“把需求拆成一行行可计算的规则”这种思维。你越能把一个模糊的想法比如“我想找强势股”拆解成精确的条件比如“收盘价创20日新高、成交量大于5日均量、MACD在零轴上方”你的公式就越贴近你的真实意图。语法只是表达工具分析框架才是内功。建议你从现在开始哪怕不写公式也试着把日常看盘的思路用这种“条件结果”的方式记录下来等基础语法熟练之后那些记录就是现成的公式草稿。