ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

同花顺公式编辑基础语法全解析:从变量到编译报错

同花顺公式编辑基础语法全解析:从变量到编译报错 很多朋友第一次打开同花顺公式编辑器的时候心态都是把别人写好的源码复制进来点一下编译祈祷它能直接通过。但现实往往是编译失败光标跳到一个莫名其妙的位置界面提示一行看不懂的错误信息。问题出在哪儿十有八九是对基础语法没有一个完整的框架。同花顺公式编辑说到底是一种脚本语言它有固定的语法规则不管是写技术指标、条件选股还是交易系统都跑不出变量、运算符、条件判断、函数调用这几件事。第2章专门讲基础语法就是帮你把这个框架搭起来后续学任何指标都能用得上。这篇文章会从公式引擎的执行机制说起然后逐个拆解变量和赋值语句、运算符和表达式、条件判断、常用基础函数最后再讲几个几乎人人都踩过的语法坑。适合刚接触同花顺公式编辑的新手也适合那些能抄代码但一遇到报错就抓瞎的进阶用户。我尽量用实际能跑的代码片段和踩坑经历来讲不讲学院派道理。1. 公式编辑器与代码执行机制先搞清楚公式在哪儿跑1.1 同花顺公式系统是什么同花顺的公式系统是一个内置的脚本环境你写的每一行代码都会被它翻译成“在每一根K线上执行什么计算”的指令。用户不需要写完整的程序入口也不用管理内存只需要把计算逻辑按规则排列好。公式管理器通常可以在软件的“公式系统”菜单里打开新建的公式会分技术指标、条件选股、交易系统、五彩K线等类型但无论哪一种底层的语法主体是一致的。这个环境跟通用编程语言最大的区别在于它天生就是为行情数据设计的所以代码里不需要写循环去遍历每一根K线系统会自动完成。刚上手的人如果拿Python或者C语言的思维去套反而会处处别扭。1.2 先把“序列”这个概念刻进脑子里很多从普通编程语言转过来的朋友最容易卡在第一关CLOSE到底等于多少在C语言或Python里变量是个单值但在同花顺公式系统里CLOSE是一个序列也就是从第一根K线到最后一根K线的所有收盘价按时间顺序排成的一整列数据。你在公式里写“CLOSE MA(CLOSE,5)”系统不是拿某一个数字去比较而是把整个序列按位置逐根比较最后返回一个“每根K线上是真还是假”的逻辑序列。这个设计让公式语言可以免掉显式循环。你在代码里几乎看不到for、while这种关键词因为内置引擎已经对整列数据做了向量化计算。你写一条语句系统就会对全部K线执行同一套规则。理解序列之后很多现象就解释得通了为什么A:CLOSE*2;画出来不是一条直线而是一条曲线因为每根K线的收盘价都乘了2。为什么REF(CLOSE,1)表示昨天的收盘价因为它把整列CLOSE向下平移了一个周期。为什么选股的时候系统只看最后一根K线因为选股的本质就是取整个序列最后一个值判断当前这个时间点条件是否成立。1.3 执行顺序与“当前K线”概念公式是一行一行从上往下执行的这个顺序直接影响结果。你不能在第5行引用一个还没在第4行定义过的变量也不能在变量定义之前拿它去做运算。公式编辑器在编译时会按语句顺序检查顺序错了立刻报“未定义变量”。还有“当前K线”的概念也需要建立。系统在计算某一根K线时永远把这根K线当作“现在”之前的K线是“过去”之后的K线是“未来”。公式里大部分函数默认只使用当前及过去的数据比如REF(CLOSE,1)取的是当前K线的前一根。如果哪个函数偷偷取到了未来数据编译阶段通常不会报错但信号会“漂移”——这在复盘时看似完美实盘时就变了。写公式时永远不要碰未来数据这条原则从第2章就要记牢。2. 变量、赋值与输出语句公式的最小零件2.1 变量命名从命名开始养成好习惯变量是公式里的数据容器。比如你写MA5:MA(CLOSE,5);就是把“5日收盘价均线”的计算结果放进MA5这个变量里。命名时要遵守几条规则变量名只能由字母、数字、下划线组成不能以数字开头。MA5、VOL_RATIO可以5MA不行。不能用系统保留字和函数名。比如你不能把变量命名为MA、CROSS、IF这些名字已经被系统占用。中文字符在部分公式编辑器里也能当变量名用但为了兼容性和输入效率建议统一用英文加下划线比如BAND_HIGH、PRICE_LOW。变量名要体现含义。我写公式的时候习惯用“用途周期”的命名方式比如MA20、HHV10、VOL_RATIO后期维护时一看名字就知道这行在算什么。2.2 赋值语句输出用单冒号中间计算用双符号这是第2章里最重要的一组语法也是新手最容易栽跟头的地方。先看一行典型的中间变量赋值语句MA5:MA(CLOSE,5);注意两个细节第一变量名和表达式之间是冒号加等号即“:”它表示把右边的计算结果保存到左边的变量里但不会在副图上画线所以叫“中间变量”。第二行尾必须用英文分号结束。如果你手滑写成MA5MA(CLOSE,5);那在公式语言里会被理解为“判断MA5是否等于某个表达式”而不是赋值。这跟Python、C语言的习惯正好相反。很多把这门语言当普通语言写的朋友都在这里翻过车。想直接把结果画出来就要用单冒号的输出语句MA5:MA(CLOSE,5);这里只有一个冒号没有等号。它的意思不只是赋值还告诉公式引擎“这是一个输出项请显示在指标图里。”副图上就会多一条名字叫MA5的均线。所以记口诀要画线就用单冒号只计算不画线就用双符号。2.3 输出行的绘图属性输出语句除了决定画什么还能控制怎么画。在同一行语句的后面加英文逗号和属性参数可以调整颜色、线型、粗细MA5:MA(CLOSE,5),COLORYELLOW,LINETHICK2; VOLUME:VOL,COLORRED;常见属性包括COLORRED、COLORBLUE、COLORGREEN、COLORYELLOW等颜色控制LINETHICK1到LINETHICK4控制线粗DOTLINE表示点线CIRCLEDOT表示用小圆点画线。柱状图常用COLORSTICK它会把数值按正负自动画成红绿柱MACD指标底部的红绿柱就是靠这个属性实现的。这些绘图属性是附加项不影响计算逻辑但会让指标图更易读。新手阶段不用全部记看到一个熟悉一个即可。2.4 常量、字符串与注释公式里除了变量和函数调用还有三类基础元素需要认识。数字常量直接写比如5、2.5、100参与运算时按普通数值处理。字符串一般出现在绘图函数的提示文字里必须用单引号括起来例如DRAWTEXT(COND, LOW, 放量)中的放量这里面的中文不会被当成变量名。注释在公式语言里用一对花括号括起来例如{ 这是注释计算5日均线 } MA5:MA(CLOSE,5);注释不会被编译只是为了方便人阅读。强烈建议每个中间变量都顺手写一句注释否则过两周再回看自己写的公式和看天书没有区别。分号是语句结束符一个语句写完必须用英文分号结束最后一个语句也不例外。如果漏写分号编译器会尝试把两行合并成一行解析报错的位置往往不在真正出错的那一行非常让人头疼。3. 运算符与表达式把行情数据真正“算”起来3.1 算术运算符加减乘除公式语言支持常规的算术运算符加、减、乘、除。举个例子计算当日振幅AMPLITUDE:(HIGH-LOW)/REF(CLOSE,1)*100;这条语句先用最高价减最低价再除以昨天的收盘价最后乘100换算成百分比。注意除数不能为0如果某只股票停牌昨天的收盘价可能取不到有效值结果就会变成无效数据这个问题第6章会专门讲。还有一种高频场景是计算涨跌幅常见写法是CHANGE:(CLOSE-REF(CLOSE,1))/REF(CLOSE,1)*100;乘除号在公式里不能省略。想做平方计算可以直接写成CLOSE*CLOSE这种方式最简单也最保险想用幂函数的话打开公式管理器的“插入函数”面板查一下当前软件版本内置的幂函数再使用。我不建议凭记忆盲写函数名版本不同函数支持也会有细微差异。3.2 关系运算符比较产生真/假序列关系运算符包括大于、小于、大于等于、小于等于、等于、不等于对应符号分别是、、、、、。例如CLOSE MA20表示收盘价大于20日均线会返回一个逻辑序列。等于号的写法是单个这一点和很多通用编程语言不同。比如CLOSEOPEN用来判断收盘价是否等于开盘价。不等于号的写法是不是!。这个符号是从老一代行情软件语言里继承下来的同样与主流编程语言不一样。从Python转过来的朋友要特别小心写习惯了一不留神就打成!编译直接报错。3.3 逻辑运算符AND、OR、NOT逻辑运算符用来组合多个条件。AND表示两个条件同时成立OR表示至少一个成立NOT表示取反。例如CLOSEMA20 AND VOLREF(VOL,1)*1.5;这个表达式在每个K线上都会计算出一个布尔值收盘价站上20日均线而且成交量放大到前一根的1.5倍以上两个条件同时为真整体才为真。运算符优先级方面NOT最高其次是AND最后是OR。所以A OR B AND C会被解释成A OR (B AND C)。如果你拿不准就显式加括号。写多条件公式时我习惯先在注释里把条件逐条列出来再翻译成代码逻辑条件一多单靠脑子记很容易漏掉括号。3.4 序列与标量的混合计算序列可以和数字直接做混合运算数字会自动扩展到每一根K线。比如CLOSE*2表示每根K线的收盘价都乘以2MAX(CLOSE,5)指的是每根K线上比较“收盘价和5元”取较大的那个。这种机制让公式语言特别简洁你不需要写循环。需要注意的是表达式返回的类型可能不一样。算术表达式返回数值序列关系表达式和逻辑表达式返回逻辑序列。有些函数对参数类型有要求比如IF的第一个参数必须是逻辑序列第二个和第三个参数则可以是数值序列。类型搞混了编译时会有提示但提示信息有时候并不直观所以写的时候要有意识地检查每一段的返回类型。4. 条件判断与逻辑组合让公式学会在不同行情形态下做选择4.1 IF函数公式里的分支选择公式语言没有if...else...语句块但提供了IF函数。它的格式是IF(COND, 真值, 假值)COND是一个条件表达式条件成立时取第二个参数不成立时取第三个参数。举个例子我想让副图画出20日均线但只在收盘价高于20日均线的时候才画其他时间留空可以这样写MA20:MA(CLOSE,20); BOLD_MA20:IF(CLOSEMA20, MA20, DRAWNULL);DRAWNULL是一个特殊值表示“空值不画图”。这样副图上原本连续的均线会在条件不满足的位置断开。这个技巧在自定义指标里很常见比如想只画上升趋势中的均线、只画高于某价的参考线都会用到IF配合DRAWNULL。IF的嵌套不要写得太多。嵌套超过三层逻辑就很难一眼看清。遇到很多分支的情况我的做法是把条件拆成多个中间变量每个变量对应一个明确含义再用IF做最后的选择。4.2 多条件拆解与中间变量举一个完整的例子。假设要表达“放量突破20日均线”这个形态。新手很容易一口气写完CLOSEMA(CLOSE,20) AND REF(CLOSE,1)REF(MA(CLOSE,20),1) AND VOLREF(VOL,1)*1.5;这种写法能编译通过但可读性很差而且MA(CLOSE,20)重复计算括号一旦多一层就特别容易配错。我更推荐拆成中间变量MA20:MA(CLOSE,20); PRE_CLOSE:REF(CLOSE,1); PRE_MA20:REF(MA20,1); BREAK_UP:CLOSEMA20 AND PRE_CLOSEPRE_MA20; VOL_ENLARGE:VOLREF(VOL,1)*1.5; COND:BREAK_UP AND VOL_ENLARGE;这样做的优势很明显第一逻辑一目了然从上往下读就是在复述“价格突破且成交量放大”这句话第二BREAK_UP和VOL_ENLARGE这两个中间变量可以单独拿出来调试看哪个条件没成立第三后续想改条件只需要改其中一行不用动最后输出行。需要强调这个例子只是语法演示不构成操作建议。技术指标公式只是把客观数据计算出来每个人怎么理解、怎么用是自己的判断。4.3 条件选股公式的收尾方式条件选股公式和指标公式的语法主体一样但收尾方式有讲究。选股时系统会拿每只股票最后一根K线上的值去做筛选所以条件选股公式的最后一行一定要输出一个明确的逻辑真值。常见写法是SELECT:BREAK_UP AND VOL_ENLARGE;这里SELECT是输出名后面是一个条件表达式。系统遍历所有股票最后一根K线上这个条件为真就把这只股票选出来。为了控制信号出现的频率常常会配合FILTER或者COUNT来过滤。比如要求5天内至少出现一次SELECT:COUNT(BREAK_UP AND VOL_ENLARGE,5)1;COUNT会统计过去5根K线内条件为真的次数结果大于等于1就表示条件在这段时间内出现过。这种方式可以避免信号当天不成立、但前几天已经出现过的情况。4.4 不要提前引用未来数据编写条件判断时务必遵守“只用当前和过去数据”的原则。如果你在公式里写了REF(CLOSE,-1)那相当于提前使用了未来一根K线的收盘价。语法是对的编译能通过但实际运行时会发现历史K线上的信号非常“准”一到当前K线就完全变样。原因很简单因为你在回看历史时偷偷用了“明天的答案”。选股公式在执行时只会计算到当前最后一根K线所以未来函数会让盘中筛选和盘后复盘结果不一致。新手阶段最稳妥的做法是只用REF(...,N)中 N 为正数或0避免写负数遇到不认识的函数先查清楚它是不是未来函数再用。这条意识一旦建立后面能少踩很多坑。5. 常用基础函数速查写指标离不开的几类函数5.1 均线、统计与周期函数同花顺公式语言里有大量内置函数第2章不需要全部背下来但有几类必须掌握。MA(X,N)X的N周期简单平均。最典型的就是5日、10日、20日均线。EMA(X,N)X的N周期指数平均。它对近期数据更敏感均线反应更快。HHV(X,N)和LLV(X,N)N周期内的最高值和最低值常用于判断突破。SUM(X,N)N周期求和常用于统计区间总成交量。COUNT(COND,N)N周期内条件满足的次数选股公式里非常常用。STD(X,N)N周期标准差常用来描述价格波动幅度。举个例子布林带的中轨和上下轨用这些函数可以很简洁地实现MID:MA(CLOSE,20); UPPER:MID2*STD(CLOSE,20); LOWER:MID-2*STD(CLOSE,20);函数可以嵌套使用比如HHV(MA(CLOSE,5),10)表示“10日内5日均线的最高值”。但嵌套别太深层数一多括号数量很难数清楚。每写一个函数先确认第一个参数是数据源第二个参数是周期顺序不能写反。编译报错时优先检查参数个数和参数顺序。5.2 历史引用与交叉函数REF(X,N)是使用频率最高的历史引用函数表示取N个周期前的X值。N为1时就是上一根K线也就是我们常说的“昨天”。N为0时就是当前。这个函数很简单只记住一点N不要填负数。CROSS(X,Y)是判断“上穿”的函数。它的内部逻辑是当前K线上X大于Y并且上一根K线上X不大于Y。这句话翻译出来就是金叉。例如CROSS(MA5,MA10);表示5日均线上穿10日均线。如果想判断死叉把参数调换位置写成CROSS(MA10,MA5);注意CROSS本身已经完成了“当前比较前一根比较”的逻辑不需要再额外写REF。很多新手不理解这个反而在CROSS外面套一层REF导致信号变得迟钝这属于典型的画蛇添足。5.3 绘图函数把条件画到图上想让条件在图上直观可见就要用绘图函数。DRAWTEXT(COND, PRICE, 内容)在满足条件时的PRICE位置写一段文字。DRAWICON(COND, PRICE, 图标编号)在满足条件时的PRICE位置画一个图标。STICKLINE(COND, PRICE1, PRICE2, 宽度, 是否空心)画柱状线。举例把“放量”两个字标在K线下方DRAWTEXT(VOLREF(VOL,1)*2, LOW*0.98, 放量);这段代码的意思是当成交量放大到前一根的两倍以上时在K线最低价下方附近标记“放量”文字。绘图函数不影响选股结果只用于辅助观察。如果公式只是做条件选股可以完全不写绘图语句。副图指标则建议适当加些文字或图标方便肉眼定位信号。基础阶段函数不需要死记硬背。先把MA、REF、IF、CROSS、COUNT这几个高频词用熟剩下的大多是“用到再查”。6. 编译报错排查与语法坑我踩过的高频问题6.1 中英文标点混用公式编辑器只认英文半角字符。最常见的错误是中文输入法下打出了中文分号“”或者中文括号“”编译器直接报“语法错误”。排查方法很简单出现这种让人摸不着头脑的语法错误时先把整段代码复制进文本编辑器用查找替换功能把中文标点全部替换成英文标点。更治本的办法是写代码时把输入法切到英文模式关闭中文标点。6.2 漏写冒号或等号“输出语句漏冒号”和“中间变量漏写 :”都是高频错误。比如把MA5:MA(CLOSE,5);写成MA5MA(CLOSE,5);系统会当成“等于”的比较表达式而不是赋值。编译器提示“未定义变量 MA5”时第一反应就应该是回头检查赋值符号看看是不是把双符号写成了单个等号。6.3 变量未定义或名称冲突变量必须先定义后使用这是几乎所有脚本语言的通用规则。变量的定义顺序也要注意先定义、后引用不能反过来。如果编译报“未定义变量”优先检查变量名有没有拼写错误有没有在定义之前被引用以及是否和系统函数重名。6.4 引用了不存在的数据或未来数据REF(CLOSE,-1)这种写法会引入未来数据前面已经强调过。还有一种常见情况是某些股票上市时间短REF需要的周期数超过了已有的K线数量结果就是空值。判断有效周期数可以借助内置的有效周期统计函数但新手阶段最简单的办法是先用常见的函数避开数据不足导致的边界错误。6.5 调试步骤别瞎猜按流程走公式编译失败时情绪上最容易着急但真正高效的做法是按步骤排查先看公式编辑器光标停留的位置。它一般会把光标定位到第一个可疑点重点检查上一行末尾的分号有没有漏掉。用二分法注释代码。把后半段用一对花括号注释掉重新编译。如果通过说明问题在后半段再逐步放开注释缩小出错范围。临时输出中间变量。调试副图指标时把可疑的中间变量改成输出语句在副图上观察数值范围是否合理。查函数语法。打开公式管理器里的“插入函数”面板查看函数说明和示例确认参数个数、参数顺序。这个流程看起来朴素但确实是最省时间的。我自己的公式出问题时90%靠第2步和第4步就能定位剩下10%才是真正的逻辑问题。7. 学习基础语法的三个实用建议7.1 基础语法需要练到什么程度基础语法不需要背下所有函数但要做到一件事在不查帮助的情况下能用MA、REF、IF、CROSS、COUNT这几个函数把自己的想法写成一条完整、可编译的公式。判断标准很简单给你一段“均线上穿且放量”的文字描述你能不能熟练地拆成变量、条件和输出语句。如果能基础语法这一关就算过了还没达到这个标准先不要急着去研究更复杂的函数地基打不牢后面写长公式一定会出问题。7.2 每天改写一个源码示例我学同花顺公式编辑的时候有个笨办法特别有效每天从系统自带的指标里挑一个把源码抄写一遍然后动手改参数、增加条件再观察副图曲线的变化。抄写本身不是目的改代码才是。比如把MA(CLOSE,5)改成EMA(CLOSE,5)观察两条曲线的差异就能直观理解简单平均和指数平均在反应速度上的不同。这种实验式的练法比单纯看语法文档快得多也更容易记得牢。7.3 写公式时顺手写注释的习惯很多共享出来的源码没有注释读起来非常费劲。自己写公式时随手在每个中间变量后面加上注释既方便后期维护也能帮自己理清思路。注释不需要写长句子一句话说清楚“这是什么、用来干什么”就够。比如PRE_MA20:REF(MA20,1); { 前一天的20日均线 }这个习惯一开始觉得麻烦但写的公式越多越能体会到它的价值。三个月后再打开一个老公式能让你快速回忆起来的不是变量名本身而是注释里那句人话。学习同花顺公式编辑最忌讳的就是背源码、不理解语法。第2章的基础语法从序列、变量、赋值到运算符、条件判断、函数调用本质上是教你如何把自己的想法翻译成公式引擎能听懂的语言。语法不牢后面学条件选股、交易系统、复杂指标时都会到处撞墙。最后再分享一个小习惯每次写完公式我都会从头到尾扫一遍——分号是否都是英文、冒号和等号数量对不对、变量是否都定义过、注释是否写清楚了。这个习惯不复杂但能帮你省下大量排错时间。基础语法过关之后下一章就可以开始组合这些语法块写一个真正实用的完整副图指标了。
返回列表