同花顺软件编程The pony was revised in January 2021一、公式编写规则1、 语言规范:在自定义公式里面的各种符号(如,“;”)只能用半角不能用全角直接访问数据项的函数例如:OPEN[t]为t周期之前的开盘价所有行情数据项(CLOSE等)都与此相同2、 标识符:标识符在表达式中只存名称,值保留在符号表标识符包括函数名、参数名和变量 名函数名用来传递函数返回值;参数名用于函数调用时的参数传递;变量名在计算中存 储中间计算结果3、 分隔符:4、 赋值语句:其一般形式为:a=b;含义为将b的值付给a几个运算符“二”“:二” “:”“:〉”其含义分别为“赋值”、“赋值”、“赋值并输出数值或字符串”、“赋值并 输出图形”注意:“二”和“:=”两个运算符的意义、用法完全相同这样做主要是 为了更好地兼容市场上目前的各种带有公式编辑功能的分析软件5、 条件语句:其一般形式为:IF(逻辑表达式)语句1; ELSE语句2;上述结构表示:如果逻辑表达 式的值为非O(TURE)即真,则执行语句1,执行完语句1从语句2后开始继续向下执行; 如果表达式的值为O(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<-10) IF(y<=100 AND y>x) A = 〃Good〃; ELSE B = 〃Bad〃;对于上述情况,规定:ELSE语句与最近的一个IF语句匹配, 上例中的ELSE与IF(y<=100 AND y>x)相匹配为了使ELSE与IF(x>20 OR x<-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;6、循环语句:while循环的一般形式为:while(条件)语句;while循环表示当条件为真时,便执 行语句直到条件为假才结束循环并继续执行循环程序外的后续语句注意:(1) 、可以有多层循环嵌套2) 、语句可以是语句体,此时必须用〃{〃和〃}〃括起来break语句break语句通常 用在循环语句中当break语句用while循环语句中时,可使程序终止循环而执行循环后 面的语句,通常break语句总是与if语句联在一起即满足条件时便跳出循环注意:(1) 、break语句对if-else的条件语句不起作用2) 、在多层循环中,一个break语句只向外跳一层continue语句continue语句 的作用是跳过循环本中剩余的语句而强行执行下一次循环continue语句只用在while 循环体中,常与if条件语句一起使用,用来加速循环7、函数调用:调用函数的基本方式为:函数名(参数,参数,…)其返回值为函数里面的return语句规定的返回值若无return语句,则返回被调用 函数里,以函数名命名的变量的值。
若无以函数名命名的变量,则返回最后一个输出的 值若无输出的值,则返回最后一个被调用的语句的值例如:调用KDJ指标KDJ函数的名称为kdj,其参数和内容如下:函数内容为: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) 、当传递的参数数目不等于被调用函数设置的参数数目时1) 、没有传递参数则采用原来设置的默认参数计算2) 、传递参数少于被调用函数设置的参数数目则将参数传过去,依次改变前面同样 数目参数的值,后面其它的参数采用原来设置的默认参数计算3)、传递参数大于被调用函数设置的参数数目则将参数传过去,依次改变被调用函 数的参数值,多余的参数不起作用2) 、函数名称不区分大小写3) 、新建的函数,其函数名可能与其它以存在的函数里面的内部变量重名这样在 调用那个函数时,那个内部变量将变成对这个新建函数的函数调用,从而产生错误。
所 以,在新建函数起名时要注意返回值:自定义公式里面如果有多数据项输出,则调用此函数的时候返回值默认为最 后一个输出如果希望确定某项输出则可用ret urn,或者将函数名指定为其中一项输 出8、关于“空”的问题:所谓“空”即指没有数据在某些情况下,一些数据项可能取不到数据,这时返回值 为"空"例如,yearrep(&jlr,4),其含义为取该公司3年前年报的净利润如果某家 公司上市时间较短,而无三年前的年报数据,则其值为“空”1) 、“空”与任何数据作计算时,相应计算被取消例如:7XNULL(即“空”) 得到的结果为72) 、“空”与任何数据比较大小时,“空”较小例如:-7>NULL(即“空”)得 到的结果为1(即条件满足)这样的结果可能与您原来希望得到的数值不符,如果您想 避免这种情况可以用ISNULL函数来判断某个数据是否为“空”(相关说明见后面的系统函 数说明部分)二、系统函数说明1、板块函数:(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)取该板块指数中成交量最大的股票名称2、财务函数:(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 =财务数据项引用周期数,与YEARREP等的调用相 同K=1、一季度报表,2、中报,3、三季度报表,4、年报如REPDATE(&ZGB,1,4), 表示取最近总股本年报的报表日期3、指标函数:(1) 、成本:成本分布情况用法:C0ST(10),表示10%获利盘的价格是多少,即有10%的持仓量在该价格以下, 其余90%在该价格以上,为套牢盘。
该函数仅对日线分析周期有效2) 、分价函数:用来制作分价表用法:在制作分价表的时候选择多数据项输出,然后直接将这个函数拖进数据项选择 框就可以了3) 、成本分布:用于画成交分布云用法:用于画成交分布云例如CM(0,l,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) 、获利盘:表示获利盘比例用法:WINNER(CLOSE),表示以当前收市价卖出的获利盘比例例如返回0, 1表示 10%获利盘;WINNER(10,5)表示10, 5元价格的获利盘比例该函数仅对日线分析周期有 效6) 、抛物转向:计算抛物转向用法:SAR(N,S,M), N为计算周期,S为步长,M为极值例如,SAR(10,2,20)表示计算 10 日抛物转向,步长为2%,极限值为20%7) 、远期获利盘比例:计算远期获利盘比例用法:PWINNER(1O,CLOSE)表示10天前的那部分成本以当前收市价卖出的获利盘比 例,例如返回表示20%获利盘;该函数仅对日线分析周期有效4、 逻辑函数:(1) 、条件函数:根据条件求不同的值用法:IF(X,A,B)若X不为0则返回A,否则返回B例如:IF(CLOSE>OPEN,HIGH,LOW )表示该周期收阳则返回最高值,否则返回最低值。