分享

飞狐公式编写入门之(二)

 幽谷清馨 2015-12-08
                                  二、条件表达式及其应用:

1、条件表达式:在飞狐中设计公式,需要大量使用条件表达式,根据条件表达式的结果,作出判断,以便确定下一步该做什么,不该做什么。基本的条件表达式由“>、>=、<、<=、=、and、or、not”等比较运算符、逻辑运算符组成,此外单独的“逻辑函数”,如判断是否最后周期的函数ISLASTBAR也可以构成条件表达式。条件表达式的值只有2个,1和0,条件成立则返回1,条件不成立则返回0,下面举例说明:

例1:close>open{表示收盘价大于开盘价,如果成立返回1,否则这个条件表达式的值为0};

例2:close>open and close>ma(close,5){表示收盘价大于开盘价且close大于5日均价,and 是“且、和”的意思};

例3:close<=ref(close,1) or close<=ref(close,2){今收盘小于昨收盘或今收盘小于等于前2天收盘价,or是“或 的意思,ref()函数的含义,请在公式编辑器中点“插入函数”按钮后找到ma函数查询其注释,或鼠标移到函数的名称处,会浮动提示该函数的注释};

例4:corss(ma(c,5),ma(c,10)){5日均价线上穿10日均价线,cross函数的定义,请自查。这里close简写为c};

说明:上面例子中,包含在半角的一对花括号“{”、“}”的部分,是注释语句,注释这行代码的含义、思路等,不会被飞狐运行。一个好公式的设计,需要花费很多心血,时间久了有可能自己也忘记当时是怎么设计的,此外也为了别人能看懂公式,适当的加入注释是个好习惯。除了用花括号作注释,飞狐中还允许用半角的双斜杠“//”作注释,双斜杠后面写入注释的内容。

明白了条件表达式的意义后,我们来设计一个有点实用价值的公式:

例5:设计一个副图指标,8日内如果先后出现5日均价线上穿10日均价线、5日均价线上穿20日均价线,则返回1,否则返回0。

求解:根据上面的学习,“5日均价线上穿10日均价线”的条件表达式是cross(ma(c,5),ma(c,10)),“5日均价线上穿20日均价线”的条件表达式是cross(ma(c,5),ma(c,20)),那么本例是不是可以写成

cross(ma(c,5),ma(c,10)) and cross(ma(c,5),ma(c,20))

答案是否定的。因为这个条件表达式是表示同时满足2个条件,怎么办?
本指标的设计要用到逻辑函数EXIST(X,N),查询EXIST(X,N)的注释如下

{是否存在
用法: EXIST(X,N)返回N周期内是否存在满足条件X,N可为常数或变量
例如: EXIST(C>O,10)表示10个周期中存在阳线}

正确代码结果如下,我们把公式命名为sl003:

信号:EXIST(cross(ma(c,5),ma(c,10)),8) AND EXIST(cross(ma(c,5),ma(c,20)),8)

代码说明:
①飞狐的公式代码不区分字母的大小写,字母可以大写,也可以小写或者大小写混合。
②本例中,公式代码使用了函数嵌套,即一个函数套一个函数,这里使用了三重嵌套。
③要看懂嵌套函数,基本的分析方法是,从里到外一层层分析,如EXIST(cross(ma(c,5),ma(c,20)),8),先分析ma(c,5)、ma(c,10)是什么意思,然后分析cross(ma(c,5),ma(c,20))是什么意思,最后再分析EXIST(cross(ma(c,5),ma(c,20)),8)是什么意思。

例5的公式,显示的结果如何,不错吧?条件满足时,指标线的值会由0突变为1,“信号”很醒目。不过还是有点不爽,如果连续出现信号则第一次满足条件才给出“信号”,似乎更好些,怎么办呢?留给大家作为练习吧^_^。
给一点提示:①利用“引用函数”类中的“信号过滤”函数FILTER(X,N)。②巧妙利用“突变”这个特征。
这个练习对于初学者有点难度,只有不断学习、不断钻研,才能更快进步,南客给大家加油!

2、中间变量:考察上面的示例公式sl003中,ma(c,5)共出现了2次,每出现一次,飞狐软件都要进行一次5日均价的运算,ma(c,5)出现了2次就要重复算2次相同的运算。如果一个公式中,类似这样ma(c,5)出现的次数是N次,那岂不是要重复N次相同的运算,是不是有点太“笨”了、效率太低了?解决的办法是,把运算结果先临时“保存”到中间变量(或称临时变量),要用时,从中间变量中取出。

例6:选用适当的中间变量,改写公式sl003。

求解:正确结果如下,我们下面公式命名为sl004

ma5:=ma(c,5);
ma10:=ma(c,10);
ma20:=ma(c,20);
信号:EXIST(cross(ma5,ma10),8) AND EXIST(cross(ma5,ma20),8);

或者

n:=8;
ma5:=ma(c,5);
ma10:=ma(c,10);
ma20:=ma(c,20);
tj1:=EXIST(cross(ma5,ma10),n);
tj2:=EXIST(cross(ma5,ma20),n);
信号:tj1 and tj2;

第二段代码的解释:
①ma5:=ma(c,5)是中间语句,ma5是中间变量(也可称为临时变量),中间变量是用“:=”来定义的,而变量(即序列变量)的定义是用“:”,前者在冒号后多了个等号;ma10、ma20等也是中间变量。想想看:公式代码中,“信号”是中间变量吗?这段代码中,共有几个临时变量,分别是哪些?
②公式中间变量的结果,不会在K线图的主图或副图中显示出来。
③公式代码中,n:=8,不是为了减少运算量,这里使用中间变量的目的,是为了改写代码方便,例如,公式设计好后,发现用8不大妥,想改为9,于是就需要在代码中找若干处把8改写为9,用中间语句n:=8,则公式代码只需修改一处就行了。
说明:通过以上修改代码,减少了公式的运算量,这称之为公式的优化,一个公式定型前,要养成优化的好习惯,以提高公式的运算速度,提高运行效率。

3、条件函数:设计飞狐公式时,条件函数IF很重要,经常都要用到,查询注释如下:

{根据条件求不同的值。
用法:
IF(X,A,B)若X不为0则返回A,否则返回B
例如:
IF(CLOSE>OPEN,HIGH,LOW)表示该周期收阳则返回最高值,否则返回最低值}

例7:问题同例5,但输出的“信号”修改为10和0。

求解:公式代码如下

n:=8;
ma5:=ma(c,5);
ma10:=ma(c,10);
ma20:=ma(c,20);
tj1:=EXIST(cross(ma5,ma10),n);
tj2:=EXIST(cross(ma5,ma20),n);
tj3:=tj1 and tj3;
信号:if(tj3=1,10,0);

代码解释:
①信号:if(tj3=1,10,0),表示如果tj3成立(即等于1)则返回10,否则返回的值为0。
②信号:if(tj3=1,10,0)可以简写为信号:if(tj3,10,0),参阅IF的注释,想想看,这是为什么?

本讲小结:今天学习了条件表达式,中间语句、中间变量,公式设计的若干技巧。

练习1:设计一个副图指标,M日内如果先后出现5日均价线上穿10日均价线、5日均价线上穿20日均价线,则返回1,否则返回0。要求M是可调参数。

练习2:设计一个副图指标,M日内,如果先后出现5日均价线上穿10日均价线、5日均价线上穿20日均价线和10日均价线上穿20日均价线,则返回1,否则返回0。要求M是可调参数。

练习3:设计一个副图指标,M日内如果先后出现5日均价线上穿10日均价线、5日均价线上穿20日均价线,则返回1,否则返回0,如果连续发出“信号”,则只在第一次发出“信号”时显示“信号”。要求M是可调参数。

探索:新建一个副图公式,试试公式编辑器中的“引入公式”,把KD引入新建的公式。然后继续设计公式,要求M日内,如果先后出现5日均价线上穿10日均价线、K上穿D,则返回1否则返回0。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多