原文:http://web./viewthread.php?tid=2465017 『飞狐交易师』的公式系统是一套功能强大、使用简单的技术分析描述语言系统。
公式系统的作用是什么呢?公式系统其实就是对一系列随时间变化的原始数据组序列进行代数和逻辑计算。为什么是数据组序列呢?因为每一个时间周期(即相邻两组数据间的时间间隔)都包含了一组原始数据,如开高低收量额,公式系统能对其中的任何原始数据进行操作。使用者定义出如何对原始数据进行处理得到一个新的数据,公式系统读出原始数据并按要求计算出使用者定制的数据,并以曲线、图形、指示等形式显示出来。 公式系统可以编辑四种类型的公式,分别是技术指标、交易系统、条件选股和五彩K线公式。技术指标公式是最基本的公式,它用于指标图形的绘制。技术指标公式结合选股条件逻辑判断表达式,即得到条件选股公式,用于条件选股。技术指标公式结合买卖逻辑判断表达式,得到交易系统公式,用于交易系统指示。技术指标公式结合色彩逻辑判断表达式,即得到K线模式公式,用于描述特定的K线模式。公式的编辑在公式编辑器中完成。 公式系统处理的原始数据的分析周期(即相邻两组数据间的时间间隔)可以从1分钟到1000天间的任意值,也可以是分笔成交数据,我们用鼠标把一个公式拖到某只证券的某个周期的图形分析窗口,则该公式处理这个周期的原始数据,如开高低收量额,改变分析窗口显示的分析周期,则公式处理新的分析周期的数据。 公式系统对数据的运算是基于一系列『函数』,函数中除ZIG之字转向函数类和BACKSET函数外,其余函数均满足时间不变性,即时间靠后的数据不对时间靠前的结果产生影响。 弹出公式编辑器后,在公式名称处输入sl001,在公式说明中输入“示例公式001”,在代码框中输入“spj:”,点“插入函数”,在“行情函数”中找到CLOSE,点“插入函数”框的“确定”按钮,在代码框中就插入了一个函数CLOSE。 注:收盘价函数CLOSE可以简写为C,其它如开盘价等经常使用的函数OPEN、HIGH、LOW、VOL也可以简写为其第一个字母。 最后在公式编辑器中点“确定”按钮,我们就建立了一个名为sl001的新公式。公式只有一行代码即: spj:close 其中,spj(“收盘价”的拼音代码)称为公式变量,close是函数(行情函数的一种)两者间以半角的冒号“:”相隔,表示spj定义为close。 3、进入某个股的K线图,在键盘上敲“sl001”调用我们刚才设计的公式,结果在副图显示一条收盘价曲线,曲线的名称是“spj” 注意观察,该曲线是对应了K线的第一天到最后一天,说明,“spj”不是一个简单的变量,是一个数组或者说是一个序列变量,当然理解成一个函数也可以,是一个自变量为时间日期的函数。 因此,今后看公式时,对公式中的变量,一定要理解成是一个序列变量。(序列变量---字面上理解,就是含有一个序列的变量。如“spj:close”,spj就被定义为一个序列变量,spj的值是一个序列,包含很多收盘价,spj的值跟日期(或一般意义上的所处周期)有关,不同的交易日,spj的值就不同,序列变量,有点类似数学中的数列。) 4、在副图指标sl001的空白处,点鼠标右键选“修改指标公式”,在公式编辑器中,看到“主图叠加”的选项了吗?打上“√”确定退出。键盘敲“sl001”,调用sl001公式,结果你看到了什么? 结果是,副图指标sl001变成了主图叠加指标sl001。 在主图指标的名称sl001处,点鼠标右键选“修改指标公式”,在公式编辑器中给“主图”选项打上勾,确定退出。再观察一下,有何变化? 结果是,主图叠加指标变成主图指标,取代了原有的主图(图中是,主图K线被SL001指标所取代,因此就看不到K线了)。 二、参数、参数精灵及其应用: 1、起始有效周期: 上一讲,我们学习了在飞狐中新建公式的基础知识。并编了一个最简单的公式SL001。下面我们再来新建一个主图叠加公式SL002,代码如下: ma5:ma(close,5);{可以简写为ma5:ma(c,5);} 代码解释:定义了一个序列变量ma5,其序列值由函数ma(close,5)确定。查ma函数的注释是: { 求简单移动平均。 用法: MA(X,N),求X的N日移动平均值。 算法: (X1+X2+X3+...+Xn)/N 例如: MA(CLOSE,10)表示求10日均价 } 显然,ma5被定义为5日均价,在K线图中,切换股票到600004,敲sl002,调用这个公式,观察5日均价曲线,发现了什么? 可以看出,ma5是从第5根K线开始的,也就是说,ma5的起始有效周期是5,为什么是5而不是其它数据?根据ma函数的定义,ma5即ma(close,5)等于当日及前4日收盘价的算术平均值,至少要有5天的数据,这就是说,从第5天开始,才会有5日均价。 想想看,ma(close,10)表示什么?它的起始有效周期是多少? 下面,我们修改刚才建立的公式sl002,代码如下: ma5:ma(close,5); ma10:ma(close,10); ma20:ma(close,20); ma30:ma(close,30); ma60:ma(close,60); 注意,每一行公式代码的末尾要有一个半角的分号“;”,表示一行代码结束。切换股票到600317,观察我们修改后的sl002显示的结果,原来就是我们所熟悉的均线系统,由5、10、20、30、60日均价线组成。 2、参数、参数精灵: 上面修改后的公式sl002,已经是很实用的公式了。但有个缺点,如果你想要的不是5、10、20、30、60日均价线,而是其它的譬如7、14、21、28、35日的均价线,怎么办?修改公式代码是一个可行的办法,但太麻烦。在飞狐中,可以使用参数,把公式sl002修改如下: ma5:ma(close,n1); ma10:ma(close,n2) ma20:ma(close,n3); ma30:ma(close,n4); ma60:ma(close,n5); 在公式编辑器中,输入参数n1----n5的最小、最大、缺省值。 为了验证公式代码是否正确,用鼠标左键点“调试公式”按钮,飞狐提示“行3:语句缺少分号”,仔细分析公式代码,原来是第2行少了分号,修正后再点“调试公式”按钮,提示“调试通过”。点“确定”按钮退出并保存公式。 参照上图一边修改参数,一边观察指标线是否变化。最后可以按照自己的需要,把参数修改为自己所需的数值。到此应该满意了吧? 说明:从前面的图中,可以看出,飞狐交易师支持多达16个参数。 3、参数精灵:在上面修改参数的过程,是否注意到参数的提示?因为公式是自己设计的,参数的提示尽管很简单,但自己仍然知道参数的含义,但如果是其他人的话,就可能摸不着头脑了,因此有必要对参数加上一点提示。方法是,在公式编辑器中,点“参数精灵”按钮,输入以下文字: Param#1日均价(1--999); Param#2日均价(1--999); Param#3日均价(1--999); Param#4日均价(1--999); Param#5日均价(1--999); 这里,Param#1表示参数N1,其它依此类推,点“确定”退出公式编辑器。再试试调整参数,发现参数调整窗口的提示已经符合我们的要求。 注意:这里的“Param”中第一个字母要大写。 三、条件表达式及其应用:
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函数,请在公式编辑器中“插入函数”查询注释或鼠标移到函数处,会显示函数的注释}; 例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日均价的运算,要重复算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、线型描述函数:查询可知,目前飞狐本类函数中,共有函数22个,其中描述指标线颜色的有11个,其余11个函数描述指标线的形状、宽度、偏移等,下面举例说明部分函数的常见用法。 例1:指定5日均价线显示为红色。 求解1:ma5:ma(c,5),colorred 求解2:ma5:ma(c,5),color0000ff 说明: ①colorXXXXXX 形式的颜色描述,XXXXXX是6位颜色代码,其中0000ff表示红色,其它颜色的代码,请查阅飞狐帮助文件中的附录部分。 ②用colorXXXXXX形式来描述,可以表达更多的颜色。 例2:指定5日均价显示为红色,并加宽显示,10日均价显示为蓝色,线宽为默认,20日均线不显示指标线但显示数值。 求解:代码如下 ma5:ma(close,5),colorred,linethick2; ma10:ma(c,10),colorblue; ma20:ma(c,20),linethick0; 这里用到了描述符linethick,注释如下: { 改变指标线粗细 例如:ma1:ma(close,5),linethick3; LINETHICK0 表示不画出指标线,不影响坐标,但可在顶部显示数值} 2、绘图函数:飞狐提供了丰富的绘图函数,巧妙应用绘图函数,可以使指标线色彩鲜艳,可以画出自己绘出K线等等。 例3:5日均价线走平或向右上倾斜时,显示为晶红色,否则显示为绿色。 求解: ma5:ma(c,5),colormagenta; partline(ma5<ref(ma5,1),ma5),colorgreen; 代码解释: ①ma5:ma(c,5),colorred,5日均价线显示为晶红色。 ②partline(ma5<ref(ma5,1),ma5),colorgreen中,ref(ma5,1)为昨5日均价,ma5<ref(ma5,1)表示今5日均价线小于昨5日均价线,即5日均价线是下降的;因此本条代码语句意思是,5日均价线呈下降趋势时,5日均价线显示为绿色。本语句在第一条代码语句之后,所画的绿线将覆盖第一条语句所画的晶红色线。这样第一条语句所画的晶红色线,只剩下走平、向上倾斜部分保持晶红色。 例4:利用STICKLINE(COND,PRICE1,PRICE2,WIDTH,EMPTY)函数绘制K线。 分析:K线由上、下影线、实体部分组成,影响K线的股价有open、close、high、low,如果今上涨,K线为红色,否则为蓝色。代码如下: stickline(isup,low,high,1,1),colorred;{今上涨,在最低价到最高价间画红色细线} stickline(isup,open,close,7,1),colorred;{今上涨,在收盘价到开盘价间画红色空心柱线} stickline(isdown,low,high,1,0),colorblue;{今下跌,在最低价至最高价间画蓝色细线} stickline(isdown,open,close,7,0),colorblue;{今下跌,在开盘价至收盘价间画蓝色实心柱线} 五、引用其它公式、引用其它周期、引用其它个股数据: 1、摘录飞狐帮助文件中的相关内容如下,其中选股公式、交易公式将在后面陆续讲解: ㈠引用指标公式/交易系统/条件选股公式 1、引用指标公式,可以写成: "公式名称.指标线名称"(参数表), 其中参数表中的参数个数应该与该公式的实际参数数量一致,若不写参数表,则表示使用缺省参数。 例如:"MACD.DIFF",表示引用根据缺省参数,引用MACD指标中DIFF指标线数值。 2、引用交易系统公式,可以写为: "SYSTEM.公式名称.交易类型"(参数表), 交易类型可以为ENTERLONG、EXITLONG、ENTERSHORT或者 EXITSHORT,分别表示引用多头买入、多头卖出、空头买入、空头卖出。 例如:"SYSTEM.MACD.ENTERLONG",表示根据缺省参数,引用MACD交易系统的多头买入条件。 3、用条件选股公式,可以写为: "EXPLORER.公式名称"(参数表) 例如:"EXPLORER.MACD",表示根据缺省参数,引用MACD条件选股条件。 ㈡跨周期引用公式 下面举例说明跨周期引用的书写方法: 例1."MACD.DIFF#WEEK"(26,10,5) 表示引用MACD指标公式DIFF指标线的数值,在计算指标线值时,参数取(26,10,5),计算周期取周线。 例2."SYSTEM.MACD.ENTERLONG#MONTH" 表示引用MACD交易系统的多头买入信号,参数取缺省值,计算周期取月线。 注意:跨周期引用只能从较短周期引用较长周期,不允许反方向的引用。 可供引用的周期类型有:MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH等八种,分别表示1、5、15、30、60分钟线,以及日线、周线、月线。 ㈢引用任意股票的数据 在公式中可以引用其它任何股票的数据,方法为: "股票代码$数据名称" 数据名称可以是OPEN、HIGH、LOW、CLOSE、VOL、AMOUNT,分别表示包括开盘价、最高价、最低价、收盘价、成交量、成交额。 例如,"000001$CLOSE",表示引用深发展A的收盘价。 2、举例说明:其实上面已经有例子了,这里再举一个综合性的例子: 例1:在分笔周期的主图,显示价位线(即PRICE主图),按下面要求设计主图指标,设为SL005: ⑴显示最新价; ⑵显示均价线; ⑶显示昨收盘,以红色线表示; 求解:(请回顾一下,什么是主图指标、主图叠加指标) ⑴显示最新价,就是最新的收盘价。公式代码很简单,即 最新价:close; ⑵所谓均价,就是今天的平均成交价,等于“当前”的总成交金额除以“当前”的总成交量。在分笔周期,显示的主图,仅显示当天的数据,它的有效起始周期,是当天的开盘时间,结束于当天收盘。 “当前”的总成交金额,等于从开盘到“当前”的成交金额总和,需用“引用函数”类中的求和函数即SUM(X,N),经查询,其注释为 {求总和。 用法: SUM(X,N),统计N周期中X的总和,N=0则从第一个有效值开始。 例如: SUM(VOL,0)表示统计从上市第一天以来的成交量总和} 成交金额的函数是amount,因此,“当前”的总成交金额为 sum(amount,0) 同理,“当前”的总成交量为 sum(vol,0) 这样,我们就得到均价的公式代码为 均价:sum(amount,0)/sum(vol,0); ⑶昨收盘,是日周期,现在我们是设计分笔周期的公式,这就是说,现在要从分笔周期引用日周期的昨收盘价。怎么办?当然要设计一个被引用的指标公式,设为yy001(意为“引用001”),只需一行代码 zsp:ref(c,1); 有了被引用的公式yy001,设计引用昨收盘的公式如下 昨收盘:"yy001.zsp#day",colorred;{意思是,引用公式yy001的变量(即指标线)zsp,被引用的周期是日线} 综合起来,本题的主公式代码如下(另有一个被引用公式yy001), 最新价:c; 均价:sum(amount,0)/sum(vol,0)/100; 昨收盘:"yy001.zsp#day",colorred; 最后公式编辑器中,设定公式的默认周期为分笔,其它周期全部禁用。 |
|