在技术指标里,均线是均线、MACD是MACD,那些都是别人写死的算法;打开同花顺公式编辑器以后,这些东西全变成你手里的原材料了。你可以把两条均线揉在一起自定义买卖信号,可以把成交量跟价格走势组合成一个自定义强度指标,甚至能把一套完整的选股逻辑编译成几行公式,让软件帮你全市场扫一遍。这就是公式编辑最吸引人的地方,而这一切的前提,就是把基础语法这块地基打好。
这份教程的第2章,聚焦的就是基础语法。它面向的人很具体:已经知道同花顺有个公式编辑器,也知道在哪里新建公式,但一打开编辑器就有点蒙,菜单栏、插入函数、参数设置一大堆,不知道从哪一行写起的初学者。目标说透一点:第2章学完,你能读懂别人写的公式,能独立写出像双均线金叉、MACD柱状图这样的小指标,能自己排查最常见的语法报错。后面不管你是想写选股公式、交易系统,还是研究资金博弈这类复杂指标的源码,靠的都是这套底子。
1. 动笔之前,先把公式系统看透再写
1.1 公式编辑器到底在“翻译”什么
很多教程一上来就列语法、抄代码,结果读者写完一条MA5:MA(CLOSE,5);能画出均线,但不知道为什么这样写,换个需求就卡壳。问题出在没理解公式系统的本质。
同花顺的公式编辑器,本质上是一个“行情描述语言”的编译入口。你输入的每一行文本,软件都会翻译成在每根K线上执行的计算指令。所谓指标,就是这套指令在K线序列上逐根算出来的结果,再画成线条、柱状或文字。
我用生活里的例子说明:你在Excel里写=A1+B1,系统按单元格算;同花顺公式里写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(CLOSE>OPEN,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或0,A和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,比如停牌日或者新股首日,分母为0,VAR1在当根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日线上方的个股。
这个需求拆成三个条件:
- 条件1:5日均线上穿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在零轴上方”,你的公式就越贴近你的真实意图。语法只是表达工具,分析框架才是内功。建议你从现在开始,哪怕不写公式,也试着把日常看盘的思路用这种“条件+结果”的方式记录下来,等基础语法熟练之后,那些记录就是现成的公式草稿。