同花顺公式编写规则和公式大全

 

 

同花顺公式
同花顺公式编写规则和公式大全
语言规范:
在自定义公式里面的各种符号(如,“;” )只能用半角不能用全角。

关键字
if else while break continue return (无大小写之分)

常数
浮点数、整数、字符串

分隔符
“ ” ‘  ( ) ; { } 注释/* */

标识符
由字母和数字组成,由字母开头,不分大小写

运算符(优先级从高到低排列,同级同行)
* /

+ -

== != > =

And

Or

语句
赋值 a = b

条件 IF (a==b) c=d;

循环 while a==b c=d;

函数调用 func(a,b)


直接访问数据项的函数
例如:OPEN[t] 为t周期之前的开盘价
所有行情数据项(CLOSE等)都与此相同。


标识符:
标识符在表达式中只存名称,值保留在符号表。标识符包括函数名、参数名和变量名。函数名用来传递函数返回值;参数名用于函数调用时的参数传递;变量名在计算中存储中间计算结果。

分隔符:

符号
含义

“ ”
引用字符串

‘ 
引用字符

( )
控制运算的优先级

;
每行语句的结束标志

{ }
将多个语句组合成一个语句体

/* */
注释,无任何实际功能


赋值语句:
其一般形式为:

a=b; 含义为将b的值付给a。

几个运算符“=”“:=”“:”“:>”。其含义分别为“赋值”、 “赋值”、“赋值并输出数值或字符串”、“赋值并输出图形”。

注意:“=”和“:=”两个运算符的意义、用法完全相同。这样做主要是为了更好地兼容市场上目前的各种带有公式编辑功能的分析软件。

条件语句:
其一般形式为:

IF(逻辑表达式) 语句1;

ELSE 语句2;

上述结构表示: 如果逻辑表达式的值为非0(TURE)即真, 则执行语句1, 执行完语句1从语句2后开始继续向下执行; 如果表达式的值为0(FALSE)即假, 则跳过语句1而执行语句2。

注意:

1、条件执行语句中ELSE 语句2;部分是选择项, 可以缺省, 此时条件语句变成:

IF(逻辑表达式) 语句1;

表示若逻辑表达式的值为非0则执行语句1 , 否则跳过语句1继续执行。

2、如果语句1或语句2有多于一条语句要执行时, 必须使用{和} 把这些语句包括在其中, 此时条件语句形式为:

IF(逻辑表达式) { 语句体1; }

ELSE { 语句体2; }

这里语句体指多个语句,每个语句都必须以“;”结尾。

3. 条件语句可以嵌套, 这种情况经常碰到, 但条件嵌套语句容易出错, 其原因主要是不知道哪个IF对应哪个ELSE。

例如:

IF(x>20 OR x

IF(yx)

A=Good;

ELSE

B=Bad;

对于上述情况, 规定: ELSE语句与最近的一个IF语句匹配, 上例

中的ELSE与IF(yx)相匹配。为了使ELSE与IF(x>20 OR x

IF(x>20 OR x

{ IF(yx)

A=Good; }

ELSE B=Bad;

4. 可用阶梯式IF-ELSE-IF结构。

阶梯式结构的一般形式为:

IF(逻辑表达式1) 语句1;

ELSE IF(逻辑表达式2) 语句2;

ELSE IF(逻辑表达式3) 语句3;


循环语句:
while循环的一般形式为:

while(条件) 语句;

while循环表示当条件为真时, 便执行语句。直到条件为假才结束循环。并继续执行循环程序外的后续语句。

注意:

1、可以有多层循环嵌套。

2、语句可以是语句体, 此时必须用{和}括起来。

break语句

break语句通常用在循环语句中。当break语句用while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。 即满足条件时便跳出循环。

注意:

1、break语句对if-else的条件语句不起作用。

2、在多层循环中, 一个break语句只向外跳一层。

continue 语句

continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。

continue语句只用在while循环体中, 常与if条件语句一起使用, 用来加速循环。


函数调用:
调用函数的基本方式为:函数名(参数,参数,…)

其返回值为函数里面的return语句规定的返回值。若无return语句,则返回被调用函数里,以函数名命名的变量的值。若无以函数名命名的变量,则返回最后一个输出的值。若无输出的值,则返回最后一个被调用的语句的值。

例如:调用KDJ指标。KDJ函数的名称为kdj,其参数和内容如下:

参数名
最小值
最大值
默认值

N1
1
100
9

M1
2
40
3

M2
2
40
3


函数内容为:

RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;

K:SMA(RSV,M1,1);

D:SMA(K,M2,1);

J:3*K-2*D

则当您在其它函数里输入a=KDJ(8,6,6)的时候,相当于计算N1=8,M1=6,M2=6时的J值,并把这个值赋给a。

注意:

1、当传递的参数数目不等于被调用函数设置的参数数目时。

a、没有传递参数。则采用原来设置的默认参数计算。

b、传递参数少于被调用函数设置的参数数目。则将参数传过去,依次改变前面同样数目参数的值,后面其它的参数采用原来设置的默认参数计算。

c、传递参数大于被调用函数设置的参数数目。则将参数传过去,依次改变被调用函数的参数值,多余的参数不起作用。

2、函数名称不区分大小写。

3、新建的函数,其函数名可能与其它以存在的函数里面的内部变量重名。这样在调用那个函数时,那个内部变量将变成对这个新建函数的函数调用,从而产生错误。所以,在新建函数起名时要注意。

返回值:自定义公式里面如果有多数据项输出,则调用此函数的时候返回值默认为最后一个输出。如果希望确定某项输出则可用return,或者将函数名指定为其中一项输出。