
同花顺编程语言.docx
39页同花顺编程语言 有几个比较好的交流论坛: 理想论坛 net/上善若水论坛http://www.rs17888.c n/语言规范: 在自定义公式里面的各种符号(如,“;” )只能用半角不能用全角关键字 if else while break continue return (无大小写之分)常数 浮点数、整数、字符串分隔符 “ ” ‘ ' ( ) ; { } 注释/* */标识符 由字母和数字组成,由字母开头,不分大小写 运算符(优先级从高到低排列,同级同行) * /+ -== != > < >= <=AndOr语句 赋值 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;上述结构表示:如果逻辑表达式的值为非O(TURE)即真,则执行语句1,执行完语句1从语句2后开始继续向下执行;如果表达式的值为O(FALSE)即假,则跳过语句1而执行语句21、 条件执行语句中"ELSE语句2;"部分是选择项,可以缺省,此时条件语句变成:IF(逻辑表达式)语句1;表示若逻辑表达式的值为非0则执行语句1 ,否则跳过语句1继续执行2、 如果语句 1 或语句 2 有多于一条语句要执行时, 必须使用"{"和"}" 把这些语句包括在其 中, 此时条件语句形式为:IF(逻辑表达式){语句体1; }ELSE { 语句体 2; } 这里语句体指多个语句,每个语句都必须以“”结尾3. 条件语句可以嵌套, 这种情况经常碰到, 但条件嵌套语句容易出错, 其原因主要是不知道 哪个 IF 对应哪个 ELSE。
例如:IF(x>20 OR x<-10)IF(y<=100 AND y>x)A="Good";ELSEB = "Bad";对于上述情况,规定:ELSE语句与最近的一个IF语句匹配,上例中的ELSE与IF(y<=100 AND y>x)相匹配为了使ELSE与IF(x>20 OR xv-10)相匹配,必须 用花括号如下所示:IF(x>20 OR x<-10){ IF(y<=100 AND y>x)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 9M1 2 40 3M2 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,或者将函数名指定为其中一项输出关于“空”: 所谓“空”即指没有数据在某些情况下,一些数据项可能取不到数据,这时返回值为“空”例如,yearrep(&jlr,4),其含义为取该公司3年前年报的净利润如果某家公司上市时间较短, 而无三年前的年报数据,则其值为“空”1、 “空”与任何数据作计算时,相应计算被取消例如:7XNULL (即“空”)得到的结果为7。
2、 “空”与任何数据比较大小时, “空”较小例如:一7>NULL (即“空”)得到的结果为1 (即条件满足)这样的结果可能与您原来希望得到的数值不符,如果您想避免这种情况可以用 ISNULL 函 数来判断某个数据是否为“空”(相关说明见后面的系统函数说明部分)系统函数说明 板块函数:1、板块平均:求板块里某一数据项的平均值用法:BLOCKAVG(&N), N表示选择的数据项例如:BLOCKAVG(&NEW)表示这个板块里所有股票当前时刻的平 均价2、板块最小值:求板块里某一数据项的最小值用法:BLOCKMIN(&N), N表示选择的数据项例如:BLOCKMIN(&LOW)表示这个板块里所有股票当天的最低 价3、板块最大值:求板块里某一数据项的最大值用法:BLOCKMAX(&N), N表示选择的数据项例如:BLOCKMAX(&HIGH)表示这个板块里所有股票当天的最高 价4、板块求和:求板块里某一数据项的和用法:BLOCKSUM(&N), N表示选择的数据项例如:BLOCKSUM(&VOL)表示这个板块里所有股票当前时刻的 总成交手数5、取板块领先股票:取板块指数的所属个股中数据X最大的股票的数据Y。
适用于板块指数用法:BLOCKLEAD(&X,&Y)取板块指数中个股数据X最大的股票的数据Y例如:BLOCKLEAD(&VOL, &ZQMC) 取该板块指数中成交量最大的股票名称财务函数:1、季报:调用季报数据项用法:QUARTERREP(&N,K,L), N为财务数据项,K可以是1 (表示最近一次的季报)、2 (表示上一次的季 报)、3、4等或者直接输入希望调用的年份,L可以是1或3即第一季度或第三季度的季报注意L仅在 K选择年份的时候适用2、 年报:调用年报数据项用法:YEARREP(&N,K),N为财务数据项,K可以是1 (表示最近一次的年报)、2 (表示上一次的年报)、3、 4等或者直接输入希望调用的年份注意:N要为基本的财务数据项,而不能是编写的计算项目,即N为功能树里公式栏里面的“财务数据” 目录下面的数据项3、中报:调用中报数据项用法:MIDREP(&N,K,L),N为财务数据项,K可以是1 (表示最近一次的中报)、2 (表示上一次的中报)、3、4等或者直接输入希望调用的年份4、同期报表:调用最近一次报表或与其同类型报表的数据项用法:REP(&N,K) N为财务数据项,K为1 (表示最近一次公布的报表)、2 (表示去年与最近一次公布报 表同类型报表)、3、4等。
5、取报表日期:取某个财务数据项的报表日期用法:REPDATE(&N,M,K),N =财务数据项M=引用周期数,与YEARREP等的调用相同K = 1、一季度报 表,2、中报,3、三季度报表,4、年报如REPDATE(&ZGB,1,4),表示取最近总股本年报的报表日期指标函数:1、成本:成本分布情况用法:C0ST(10),表示10%获利盘的价格是多少,即有10%的持仓量在该价格以下,其余90%在该价格以上, 为套牢盘该函数仅对日线分析周期有效2、分价函数:用来制作分价表用法:在制作分价表的时候选择多数据项输出,然后直接将这个函数拖进数据项选择框就可以了3、成本分布:用于画成交分布云用法:用于画成交分布云例如CM(0,1,2,0)参数含义:1、计算天数,0表示计算全部天数2、当日成 本算法:0=平均分布,1=三角分布3、精度:一般是24、起始位置:0是从当天开始计算,1是从前一天 开始算,类推5、换手:缺省是3,即300%换手参数5可以没有基本原理:我们对历史筹码是依后面的换手率而递减的我们相信这样基本反应了一个事实即历史越悠久 的成交,对当前的影响越小比如说,1000万的盘子,前天均价为10元,成交量为200万,也就是20% 换手率;昨天以均价11元又成交300万,也就是30%换手率;那前天的200万成交量怎么样了呢?成本分 析假定,前天的200万在昨天也以11元被30%换手了,那么,前天以10元成交的成交量还剩了 200*(1-30%)=140万;若今天以均价12元又成交了 400万,同理可算,现在的筹码分布是:10元筹码为 200*(1-30%)*(1-40%)=84 万,11 元的筹码为 300*(1-40%)=180 万,12 元的筹码是 400 万。
4、 之字转向用法:ZIG(K,N),当价格变化量超过N%时转向,K表示0:开盘价,1:最高价,2:最低价,3:收盘价例如:ZIG(3,5)表示当前收盘价超过上次ZIG转向输出值的+5%或-5%,则输出当前收盘价并ZIG转向5、 获利盘:表示获利盘比例用法:WINNE。












