飞狐基本函数简介之行情函数这些行情函数所取得的数据,是我们所编写的公式的原材料。
如果说公式是衣服,这些行情函数就是布。 有人会说做衣服不一定要布,野草树皮也可以做。对,一个公式中不一定非有行情函数不可,但总感觉透风,缺点什么。 一、 函数: OPEN 说明: 取得该周期开盘价,也可简写为 O. 函数: HIGH 说明: 取得该周期最高价,也可简写为 H. 函数: LOW 说明: 取得该周期最低价,也可简写为 L. 函数: CLOSE 说明: 取得该周期收盘价,也可简写为 C. OPEN,打开。HIGH,高度。LOW,低的。CLOSE,关闭、结束。 常言道,巧妇难为无米之炊。此四者,就是我们做价格指标的“米”了。不同周期的K线,均由此四者为原材料画出。 (有人说,家里的米没有味道,于是去割野菜,采野花,日子一长,又说还是家里的米能填饱肚子。) 有人说,价、量、时、人是技术分析的四大要素,那么O、H、L、C便构成了“价”的四大要素。 道氏理论,主要关注的是长期趋势,所以,一般以CLOSE线为主要参考指标。所取前期高、低点,也是CLOSE线的高、低点。 人的心理,常以成败论英雄。所以CLOSE作为一根K线中的“结局”,被视为价格四大要素中的最关键因素。此论似成通论,但有些短线炒手认为,OPEN要比CLOSE更重要。股市本是无定论的地方,仁者见仁,智者见智,故不敢多作妄论。 这里随便谈些本人对未来函数和未来数据的看法。关于未来也者,在较为经典的书上很少直接见到这种说法,只是在网上见得多了,便有了些想法,说出与大家共同探讨。 如图,一般带公式平台的股票软件,有“公式检测”这一项,用来判断公式中是否含有未来函数。 目前的信号的产生和保持,如果全依赖于之前的数据,则可认为产生信号的公式中,不含有未来函数和未来数据。 目前的信号的产生和保持,如果部分依赖于之后的数据,则可认为产生信号的公式中,含有未来函数和未来数据。 换句话说,如果公式中产生的信号,随着行情的发展,信号永远不变,则此公式就绝无“未来”之嫌疑;信号可能要逃、要变,则此公式中就有“未来”。 如果此定义成立,则可将“未来”分为两种情况: 1、在一根K线(即时行情)中; 2、在多根K线(盘后)中。 在第一种情况中,以即时行情中的当前日K线为例,除了O之外,其它H、L、C全有未来之嫌。因为在收盘之前,拉高、打压是司空见惯的事,谁也不能保证H、L不会创出当天的新高和新低,更不用说C了。比如日线周期公式“C>REF(C,1);”,前一分钟信号成立,后一分钟可能信号就不成立了。这样说的话,在日K中包括H、L、C的指标,就全有“未来”之嫌疑了。 还有就是引用进来的信号,比如引用了周K和月K指标,因为当前周K和月K还在变动之中,所以也是未来数据。 在第二种情况中,因为在盘后,日K中的四大要素就没有未来之可能了。在多K线中,典型的未来函数有两个:BACKSET、ZIG。这两个未来函数到底未来到什么程度,到以后介绍时再说。就算在盘后,除了周五之外,引用的周K指标也是未来数据;除了在月末,引用的月K指标也是未来数据。 这样说的话,到处是“未来”,我们何处适从? 实际上未来也者,并不是新问题,而是老问题,从有技术分析之日起,这个问题就存在了,只是在经典著作中,并不是以“未来”的字眼出现。 “我们所采取的交易风格越保守,那么,耐心地等待趋势反转的验证信号就越为重要。到底需要等待多久呢?这就得从风险与报偿两个方面来权衡。如果我们选择较为保守的交易风格,宁愿等待趋势反转的验证信号,那么,确实可能承担较少的风险;但是另一方面,我们从交易中取得的报偿也可能减少了。等到趋势反转信号得到确认的时候,获利的空间也许已经缩小了。” (<日本蜡烛图技术>P.159) 所以说即时行情中的“未来”也一样,体现的是技术分析中最古老的一个问题。 而多K线中的未来数据,是要好好注意的。如果在ZIG的低点买进,在ZIG的高点卖出,则是全世界最好的交易系统了--可惜是马后炮,因为当时谁也做不到这一点。但也不能说BACKSET、ZIG就一无是处了,有时甚至是不可或缺的。刀剑可能自伤,也可用于杀敌。只要我们熟悉了BACKSET和ZIG的本质,就可以了解它们“未来”到什么程度,拿来用也是不妨的。至于不熟悉的,还是少用为妙。 二、 函数: VOL 参数: 无 说明: 取得该周期成交量,也可简写为 V. 函数: AMOUNT 参数: 无 说明: 取得该周期成交额 VOLUME,量。AMOUNT,数量、总计。 成交量系统默认单位是手(一百股)。成交额系统默认单位是元(A股和基金是人民币、沪B股是美元、深B股是港元)。 成交量是仅次于价格的技术分析要素。成交额因为里面有价量因素,有些高手应用时喜欢用之代替成交量。 成交金额万元:AMOUNT/10000,LINETHICK0; 成交量手:VOL,VOLSTICK; 流通盘万股:CAPITAL/100,LINETHICK0; 换手率:100*V/CAPITAL,LINETHICK0; 三、 函数: ADVANCE 参数: 无 说明: 取得该周期上涨家数。(本函数仅对大盘有效)。 参数: DECLINE 参数: 无 说明: 取得该周期下跌家数。(本函数仅对大盘有效)。 ADVANCE,前进。DECLINE,下降。 用于上证指数和深圳成指。 A:=ADVANCE-DECLINE; SUM(A,50); 这个线形状与指数C线有些不同,反映的是不加权的情况。 四、 函数: BUYVOL 参数: 无 说明: 取得主动性买单量。 当本笔成交为主动性买盘时,其数值等于成交量,否则为0. (本函数仅个股在分笔成交分析周期有效) 函数: SELLVOL 参数: 无 说明: 取得主动性卖单量。当本笔成交为主动性卖盘时,其数值等于成交量,否则为0. (本函数仅个股在分笔成交分析周期有效) BUY,买。SELL,卖。VOL,VOLUME,量。 在分笔成交分析周期中看: 主动性买单量:BUYVOL; 主动性卖单量:SELLVOL; 之和:BUYVOL+SELLVOL; 总成交量:V; 两者之和必然为总成交量。所以说每笔之成交量,不是主动性买单量,就是主动性之卖单量。 主动性买单量代表多方的力量,主动将挂在卖盘档位的单子吃进,主动性卖单量则反之,代表的是空方的力量。 至于庄家对倒诱空诱多之动作,长期看另当别论,但在当时,确实也代表了多空之一方。 每日之SUM(BUYVOL,0)之类的数据,不能在其它周期中引用,要做成扩展数据才可。 五、 函数: ISBUYORDER 参数: 无 说明: 取得该成交是否为主动性买单。当本笔成交为主动性买盘时,返回1,否则为0. (本函数仅个股在分笔成交分析周期有效) ORDER,定单。BUYORDER,买单(不是请客吃饭后的买单!)。 在分笔成交分析周期中可以看到,任一笔成交的单子,不是主动买单,就是主动卖单。 主动买单:ISBUYORDER; 主动卖单:NOT(ISBUYORDER)*0.5; 这也就是没有ISSELLORDER函数的原因,因为用NOT(ISBUYORDER)就可以取得相同功能。 六、 函数: BIDPRICE(N) 参数: N取1--3,表示买盘档位。 说明: 取得委买1--委买3价格。(本函数仅个股在分笔成交分析周期有效) 示例: BIDPRICE(1) 表示最高叫买价。 函数: BIDVOL(N) 参数: N取1--3,表示买盘档位。 说明: 取得委买1--委买3量。(本函数仅个股在分笔成交分析周期有效) 示例: BIDVOL(1) 表示最高叫买量。 BID,出价、投标,这里是买进报价的意思。PRICE,价格。 有人可能会说:图中不是有委买8的单子么?呵呵,那是推算出来的,撤单了亦未可知。 七、 函数: ASKPRICE(N) 参数: N取1--3,表示卖盘档位。 说明: 取得委卖1--委卖3价格。(本函数仅个股在分笔成交分析周期有效) 示例: ASKPRICE(1) 表示最低叫卖价。 函数: ASKVOL(N) 参数: N取1--3,表示卖盘档位。 说明: 取得委买1--委买3量。(本函数仅个股在分笔成交分析周期有效) 示例: ASKVOL(1)+ASKVOL(2)+ASKVOL(3) 表示三档卖盘量总和。 ASK,询问、要求,这里是卖出报价的意思。 副图公式一: 委买总量:BIDVOL(1)+BIDVOL(2)+BIDVOL(3); 委卖总量:ASKVOL(1)+ASKVOL(2)+ASKVOL(3); 副图公式二: 卖一买一空档:ASKPRICE(1)-BIDPRICE(1); 编仅个股在分笔成交分析周期有效的公式时要注意,编好了之后,公式的“禁用周期”就自动设置为如图的样子。 如果以后要把这个公式修改为其它周期的公式时,不可忘记把“禁用周期”中的设置改过来,否则公式指标输出会没有显示。 飞狐基本函数简介之绘图函数这组函数的功能是在主图或副图上设定条件输出图象、图标、直线、文字、数字、指标线、指标柱等,全部可以单独使用。
个人感觉,飞狐的强大功能,在此组函数中有淋漓尽致的发挥。无论在表面(美感),还是实质(提高工作效率)上,都有良好表现。 毫无例外的是,这组函数中,都带有COND。CONDITION,条件,状态。COND在这里可作为条件理解。 为了能找到合适的COND,用于举例子,请允许我先介绍一组概念。 高点:在2N+1根K线中,中间这根K线的H,要大于等于左右N根K线的H。在N+1根K线中,有等高点出现,取最先出现的。 低点:在2N+1根K线中,中间这根K线的L,要小于等于左右N根K线的L。在N+1根K线中,有等低点出现,取最先出现的。 峰点:高点和低点,合称为峰点。 (这个定义,意合于技术分析的老祖宗道氏:“只要平均指数的最高点超过了前期的最高点,它就处于牛市时期;当最低点低于前期的最低点时,它处于熊市时期。”这里我们撇开向上、向下分形和分形峰状点等概念,以免把概念复杂化。) 也为了不让公式一来就过于复杂,我们先取N为2来做公式。简介到后面,可以看到,N是可以作为峰点公式的参数进行调整的。 公式名称:FENG2 公式说明:供引用 公式内容: {峰点参数暂定为2} A:=REF(H,2);{中间K线的最高价} B:=A>=REF(H,4) AND A>=REF(H,3) AND A>=REF(H,1) AND A>=H;{中间K线的最高价大于等于两边共四根K线的最高价} D:=BACKSET(B,3);{将当前位置和之前2个周期的数值设为1} HD:FILTER(D,2);{找到高点后,过滤掉其后2周期内可能出现的等高点。输出高点} A2:=REF(L,2);{中间K线的最低价} B2:=A2<=REF(L,4) AND A2<=REF(L,3) AND A2<=REF(L,1) AND A2<=L;{中间K线的最低价小于等于两边共四根K线的最低价} D2:=BACKSET(B2,3);{将当前位置和之前2个周期的数值设为1} LD:FILTER(D2,2);{找到低点后,过滤掉其后2周期内可能出现的等低点。输出低点} {后面有些例子,就从这个公式中引用信号。} 一、 函数: DRAWICON 参数: 无 用法: DRAWICON(COND,PRICE,TYPE),当COND条件满足时,在PRICE位置画TYPE号图标。 说明: 在图形上绘制小图标,其中TYPE可选7种图标,编码为1-7(1-3为小脸,4、5为上下箭头,6、7为红绿小旗)。TYPE为 字符串时可显示用户自制BMP图。 示例: DRAWICON(CLOSE>OPEN,LOW,1);表示当收阳时在最低价位置画1号图 DRAWICON(C>O,L,'MyBMP')表示当收阳时在最低价位置画FmlDLL子目录下的自制图标MyBMP.BMP 1、COND条件,一般是指判断的结果,不是0就是1。如用其它数据,大于等于1的,条件满足;小于1,条件就不满足。 2、TYPE图标,现在已经有12种,用下面的公式,在000829上可以全部显示出来。当TYPE取大于等于12的数时,都显示黄球。 当TYPE取0时,显示的是笑脸(这个公式中没有做进去,自己可以试一下)。 B:="FENG2.HD"; D:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1); A:=D>REF(D,1); DRAWICON(REF(A,1),1.05*H,1); DRAWICON(REF(A,2),1.05*H,2); DRAWICON(REF(A,3),1.05*H,3); DRAWICON(REF(A,4),1.05*H,4); DRAWICON(REF(A,5),1.05*H,5); DRAWICON(REF(A,6),1.05*H,6); DRAWICON(REF(A,7),1.05*H,7); DRAWICON(REF(A,8),1.05*H,8); DRAWICON(REF(A,9),1.05*H,9); DRAWICON(REF(A,10),1.05*H,10); DRAWICON(REF(A,11),1.05*H,11); DRAWICON(REF(A,12),1.05*H,12); DRAWICON(REF(A,13),1.05*H,13); DRAWICON(REF(A,14),1.05*H,100);{主图叠加} 当红球和绿球连续显示时,立体感会强一些。 DRAWICON(C>=MA(C,30),MA(C,30),10); DRAWICON(C<MA(C,30),MA(C,30),11);{主图叠加} 3、PRICE是用于定位图标的位置的。一般用1.01*H,或者0.99*L等。现在可用ALIGN(0-5)指定对齐位置。 用这个公式来试(主图叠加) B:="FENG2.HD"; D:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1); A:=D>REF(D,1); E:=REF(H,1); DRAWICON(A,E,10),ALIGN0; DRAWICON(A,E,11),ALIGN1; DRAWICON(A,E,12),ALIGN2; DRAWICON(A,E,3),ALIGN3; DRAWICON(A,E,4),ALIGN4; DRAWICON(A,E,5),ALIGN5; 可以初步得出结论: ALIGN0:信号出现在PRICE的正中; ALIGN1:信号出现在PRICE下边(十分靠近); ALIGN2:信号出现在PRICE上边(十分靠近); ALIGN3:信号出现在主图的中间; ALIGN4:信号出现在主图的最上边; ALIGN5:信号出现在主图的最下边; 在高低点上作图标,可以使高低点更明确了。 A:="FENG2.LD"; B:="FENG2.HD"; DRAWICON(A,L,11),ALIGN1; DRAWICON(B,H,10),ALIGN2;{主图叠加} 4、可以自由调用MyBMP.BMP图到显示位置,大大增强了输出的效果。你只要看到好看的图,可以随时抓拍过来,做成BMP文件,放到FmlDLL子目录下,就可以调用了。 A:="FENG2.LD"; B:="FENG2.HD"; DRAWICON(A,L,'PIG'),ALIGN1; DRAWICON(B,H,'PIG'),ALIGN2;{主图叠加。如果你没有PIG.BMP文件,则不可显示。} DRAWICON(1,MA(C,5),'S28'); DRAWICON(1,MA(C,10),'S31'); DRAWICON(1,MA(C,20),'S14'); DRAWICON(1,MA(C,30),'S25');{主图叠加。如果你想要这个公式有显示,可到楼下下载,解压缩到FmlDLL子目录下} 内有40个不同颜色的小球。 二、 函数: DRAWLINE 参数: 无 用法: DRAWLINE(COND1,PRICE1,COND2,PRICE2,EXPAND),当COND1条件满足时,在PRICE1位置画直线起点,当COND2条件满足时,在PRICE2位置画直线终点,EXPAND为延长类型。 说明: 在图形上绘制直线段。 示例: DRAWILINE(HIGH>=HHV(HIGH,20),HIGH,LOW<=LLV(LOW,20),LOW,1);表示在创20天新高与创20天新低之间画直线并且向右延长。 DRAWLINE是唯一一个一句里面用到两个COND的绘图函数。因为它需要两个点来决定一直线。 COND1相当于指定K线位置(横坐标),PRICE1相当于是指定价位(纵坐标),这样一个点在平面上的位置就决定了。 DRAWLINE是从第一点画到第二点的,即有起点与终点的顺序关系:第一点出现的时间,要在第二点之前。否则线是画不出来的。 EXPAND,扩张、发展,这里是延伸的意思吧。一般取0,不延长;取1,延长。实际上是取大于等于1的数就延长,小于1就不延长。 DRAWLINE目前支持POINTDOT、LINETHICK、COLOR、SHIFT这四个描述函数。 举个例子吧。 A:="FENG2.LD"; B:="FENG2.HD"; DRAWICON(A,L,11),ALIGN1; DRAWICON(B,H,10),ALIGN2; D:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1); E:=D>REF(D,1); F:=BACKSET(E,REF(BARSLAST(B),1)+2); G:=F>REF(F,1); DRAWLINE(G,H,E,H,1),pointdot,linethick1,coloryellow;{主图叠加} 这根线有些趋势线的意思了。由于趋势线的主观性颇强,只有多设参数才能满足多数人的要求,以后有机会再作介绍。 DRAWLINE画出的线,应该比手工画出的线精确一些。(DRAWLINE画线的灵敏度,要比手工画线低,所以说DRAWLINE画出的线精确,就未必对。) 主要用于画斜线,水平线我们一般可以另想办法。因为在图中显示直线,并非DRAWLINE的“专利”。 比如: A:="FENG2.LD"; B:="FENG2.HD"; D:=BACKSET(ISLASTPERIOD,BARSLAST(A)+1); E:=D>REF(D,1); F:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1); G:=F>REF(F,1); 前高:REF(H,BARSLAST(G)); 前低:REF(L,BARSLAST(E));{主图叠加} 这里出个“难题”吧: 怎么在主图上画一根直线?直线的高度是今天收盘价。就是这个样子的: 三、 函数: DRAWTEXT 参数: 无 用法: DRAWTEXT(COND,PRICE,TEXT),当COND条件满足时,在PRICE位置书写文字TEXT,可显示多行文本,用"\n"换行。 说明: 在图形上显示文字。 示例: DRAWTEXT(CLOSE/OPEN>1.08,LOW,'大阳线');表示当日涨幅大于8%时在最低价位置显示'大阳线'字样。 DRAWTEXT(CLOSE/OPEN>1.08,LOW,'好呀\n大涨啦');可显示多行文本,用"\n"换行; 在某些满足条件的地方直接显示文字或字符,比显示图标要更直观一些。 此函数可以用ALIGN来定位水平位置。而ALIGN用在DRAWICON上定位的是高低的位置。 从下面例子可以看到,ALIGN(0~2)定义水平位置的意义: ALIGN0:居中; ALIGN1:偏右; ALIGN2:偏左。 也可以用SHIFT函数进行向右水平移位。 所显示的文字或字符,可以用COLOR函数来定义颜色。至于文字的大小,则采用系统默认的大小,在此函数中无法定义。 此函数单独使用有其用途,与DRAWNUMBER配合应用时,效果更不错。后面介绍到DRAWNUMBER时再举例子。 A:="FENG2.LD"; B:="FENG2.HD"; DRAWICON(A,L,11),ALIGN1; DRAWICON(B,H,10),ALIGN2; D1:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1); E1:=D1>REF(D1,1);{离目前最近的一个高点} D2:=BACKSET(E1,REF(BARSLAST(B),1)+2); E2:=D2>REF(D2,1);{倒数第二个高点} D3:=BACKSET(E2,REF(BARSLAST(B),1)+2); E3:=D3>REF(D3,1);{倒数第三个高点} DRAWTEXT(E1,H*1.01,'☆TEXT:'),COLORRED,ALIGN0; DRAWTEXT(E2,H*1.01,'★TEXT:'),COLORGREEN,ALIGN1; DRAWTEXT(E3,H*1.01,'▓TEXT:'),COLORYELLOW,ALIGN2;{主图叠加} 四、 函数: POLYLINE 参数: 无 用法: POLYLINE(COND,PRICE),当COND条件满足时,以PRICE位置为顶点画折线连接。 说明: 在图形上绘制折线段。 示例: POLYLINE(HIGH>=HHV(HIGH,20),HIGH);表示在创20天新高点之间画折线。 POLY,多个的。 支持POINTDOT、LINETHICK、COLOR、SHIFT这四个描述函数。 A:="FENG2.LD"; B:="FENG2.HD"; DRAWICON(A,L,11),ALIGN1; DRAWICON(B,H,10),ALIGN2; POLYLINE(A,L),POINTDOT,COLORGREEN; POLYLINE(B,H),LINETHICK2,COLORMAGENTA;{主图叠加} 五、 函数: STICKLINE 参数: 无 用法: STICKLINE(COND,PRICE1,PRICE2,WIDTH,EMPTY),当COND条件满足时,在PRICE1和PRICE2位置之间画柱状线,宽度为WIDTH可为0---100(10为标准间距),EMPTH不为0则画空心柱。 说明: 在图形上绘制柱线。 示例: STICKLINE(CLOSE>OPEN,CLOSE,OPEN,0.8,1);表示画K线中阳线的空心柱体部分。 再说明三点: 1、PRICE1和PRICE2没有顺序关系,即何者在前何者在后都不影响语句的执行。 2、WIDTH宽度,支持小数。用1和用0.1,会有很大的差别。取7时和主图的K线宽度差不多。 以下的副图公式,画出的K线,与主图中显示的K线差不多。有些“主图叠加公式”,叠加在副图中也未尝不可了。 STICKLINE(C>O OR (C=O AND C>REF(C,1)),O,C,7,1),colorred;{画出红K实体} STICKLINE((C>O AND C<>H) OR (C=O AND C>REF(C,1)),C,H,0.1,0),colorred;{画出红K上影线} STICKLINE((C>O AND L<>O) OR (C=O AND C>REF(C,1)),L,O,0.1,0),colorred;{画出红K下影线} STICKLINE(C<O OR (C=O AND C<=REF(C,1)),C,O,7,0),colorcyan;{画出青K实体} STICKLINE(C<O OR (C=O AND C<=REF(C,1)),L,H,0.1,0),colorcyan;{画出青K影线。因为青K是实心的,所以影线从中穿过} MA(C,5); 3、用STICKLINE可以用两种方法做出多色彩K线效果。 一种是横向的,将K线实体从O到C分为N等份,每个小格中放入不同的但比较连续的颜色。 这里随便举个例子,N取4,只对阳线加了效果。其它变化,道理是一样的。 A:=C-O; B:=C>O; STICKLINE(B,O,O+A/4,8,0),COLORFF99FF; STICKLINE(B,O+A/4,O+A*2/4,8,0),COLORFF00FF; STICKLINE(B,O+A*2/4,O+A*3/4,8,0),COLOR9900FF; STICKLINE(B,O+A*3/4,O+A,8,0),COLOR0000FF;{主图叠加} 还有一种方法就是纵向的了。先在较宽的K线中加颜色,然后把宽度逐步收窄,再加颜色覆盖以前的的,这样从纵向看,一根K线中就有不同颜色了。效果做得好的,可以做到赏心悦目。 B:=C>O; STICKLINE(B,O,C,8,0),COLORFF99FF; STICKLINE(B,O,C,6,0),COLORFF00FF; STICKLINE(B,O,C,4,0),COLOR9900FF; STICKLINE(B,O,C,2,0),COLOR0000FF;{主图叠加} 六、 函数: DRAWNUMBER(COND,PRICE,NUMBER,PRECISION) 参数: NUMBER(可以为常数或数组序列),PRECISION为精度(取值范围0-3),即显示到小数点后PRECISION位。 用法: DRAWNUMBER(COND,PRICE,NUMBER,PRECISION),当COND条件满足时,在PRICE位置书写数字 说明: 在图形上显示数字。 示例: DRAWNUMBER(CLOSE/OPEN>1.08,HIGH,(CLOSE-OPEN)/OPEN*100,2);表示当日涨幅大于8%时在最低价位置显示涨幅(相对开盘价的百分比)。 这个函数的特色是,在NUMBER位置可以放变量。 NUMBER,数字。DRAWNUMBER是DRAWTEXT的“兄弟”,也可以用ALIGN(0~2)来定义水平位置,方法相同。 A:="FENG2.LD"; B:="FENG2.HD"; DRAWICON(A,L,11),ALIGN1; DRAWICON(B,H,10),ALIGN2; D1:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1); E1:=D1>REF(D1,1);{离目前最近的一个高点} D2:=BACKSET(E1,REF(BARSLAST(B),1)+2); E2:=D2>REF(D2,1);{倒数第二个高点} DRAWTEXT(E1,H*1.02,'高点价:'),COLORGREEN,ALIGN2; DRAWNUMBER(E1,H*1.02,H,2),COLORGREEN,ALIGN1; DRAWTEXT(E2,H*1.02,'高点价:'),COLORYELLOW,ALIGN2; DRAWNUMBER(E2,H*1.02,H,2),COLORYELLOW,ALIGN1;{主图叠加} 七、 函数: FILLRGN(COND,PRICE1,PRICE2) 参数: 用法: FILLRGN(COND,PRICE1,PRICE2),当COND条件满足时,以COLOR填充PRICE1和PRICE2的区间 说明: 绘制指标区间彩带。 示例: FILLRGN(MA1>MA2, MA1,MA2),colorred; 表示MA1>MA2时以红色填充MA1和MA2之间的区域。 FILL,充满,填充。RGN可能是REGION,地区,地域。 用这个函数,再加DRAWICON可以调用BMP图象文件的功能,可以作出象风景一样的图。 这里举个简单的例子: A:=MA(C,5); B:=MA(C,10); FILLRGN(1,H*1.01,H*1.02),COLORFFFF66; FILLRGN(A>=B,A,B),COLORMAGENTA; FILLRGN(A<B,A,B),COLORGREEN; FILLRGN(1,L*0.99,L*0.98),COLORFF99CC;{主图叠加} 416 八、 函数: PARTLINE(COND,PRICE) 参数: 用法: PARTLINE(COND,PRICE),满足COND条件绘制PRICE连线。 说明: 分段绘制指标线 示例: PARTLINE(C>REF(C,1),C),colorred;表示收盘大于前收以红色绘制收盘价连线。 PART,部分,局部。值得一提的是,PARTLINE支持多种描述函数,如例所见。 A:=MA(C,5); B:=MA(C,10); PARTLINE(A>=B,A),COLORRED,POINTDOT; PARTLINE(A>=B,B),COLORGREEN,CIRCLEDOT; PARTLINE(A<B,A),COLORGREEN,CROSSDOT,LINETHICK3; PARTLINE(A<B,B),COLORRED,SHIFT2;{主图叠加} 九、 函数: VERTLINE(COND) 参数: 用法: VERTLINE(COND),在COND条件满足的周期处画垂直线 说明: 在图形上绘制垂直线段 示例: DVERTLINE(HIGH>=HHV(HIGH,20);表示在创20天新高时画垂直线 VERTICAL,垂直的。 VERTLINE目前可以用POINTDOT、LINETHICK、COLOR、SHIFT这四个描述函数来描述。 这个函数,主要是用于画线看时间的。费波纳契周期,可以用这个函数画出来的。 这里举个例子,把日K线中每月的第一个交易日中,画一根垂直线。 A:=MONTH>REF(MONTH,1); VERTLINE(A),COLOR808040,POINTDOT;{主图叠加} 十、 函数: DRAWYITEXT(COND,PRICE,CODE,TYPE) 参数: 用法: 在COND在图形上显示易学文字,可ALIGN0-3定义对齐方式。 说明: 当COND条件满足时,在PRICE位置书写TYPE类型的CODE的对应文字 TYPE为常数,取0--1,分别表示计算的是干支、64卦,CODE为对应的代码 示例: DRAWYITEXT(CLOSE/OPEN>1.05,LOW, GANZHI(DATE*100, 2),0),表示当日涨幅大于5%时在最低价位置显示日干支; DRAWYITEXT(REF(CLOSE,2)>REF(OPEN,2) AND REF(CLOSE,1)>REF(OPEN,1) AND CLOSE>OPEN, LOW, KGUA(1, 1), 1 ),表示连二阳时在最低价位置显示K线卦象。 如下例子:K线卦 kk:=KGUA(0,6); DRAWYITEXT(c>0,mod(BARSCOUNT(c),6),kk,1); {附图指标} 十一、 函数: DRAWBKBMP(COND,BMP) 参数: 用法: 当图形上最后一组COND条件满足时,以MyBMP做背景: 说明: 根据条件设置背景图 示例: 因为系统K线先画,会被后来的指标图覆盖了 这种公式K线要自己画,以下供参考 DRAWBKBMP(c>0,'mybmp'); STICKLINE(c>o or c=o and c>ref(c,1),l,h,0.1,0),colorred; STICKLINE(c>o or c=o and c>ref(c,1),o,c,7,0),colorred; STICKLINE(c<o or c=o and c<=ref(c,1),l,h,0.1,0),colorcyan; STICKLINE(c<o or c=o and c<=ref(c,1),o,c,7,0),colorcyan; 把公式设为主图、主图叠加 十二、 函数: DRAWGBK(COND,COLOR1, COLOR2,D) 参数: 用法: 当COND条件满足时,以COLOR1到COLOR2渐变色填充子图区域,D=0表示从左到右,D=1表示从上到下 说明: 绘制渐变背景色 示例: DRAWGBK(C>O, COLORRGB(255,0,0), COLORRGB(255,255,0),0); 表示图形上最后一组C>O时从左到右从红色到黄色渐变填充子图。 飞狐基本函数简介之时间函数基本函数全是遍历所有从前到后(从第一根到最后一根)K线的,取得每根K线上的时间,就用时间函数了。
飞狐有独有的自然日、阴阳历、节气、月相、易学相关分析,在时间函数中就有相应的体现。 时间周期分析是技术分析的一大分枝吧,江恩等人乐此不疲。不过也有不少人不相信。 一、 函数: DAY 参数: 无 返回: 返回有效值范围为(1-31). 说明: 取得该周期的日期。 函数: WEEKDAY 参数: 无 返回: 返回有效值范围为(0-6),0表示星期天 说明: 取得该周期的星期数。 函数: MONTH 参数: 无 返回: 返回有效值范围为(1-12) 说明: 取得该周期的月份。 函数: YEAR 参数: 无 返回: 返回有效值范围为(1970-2038) 说明: 取得该周期的年份。 与DATE函数不同,这些函数所输出的数值,与我们平时使用时是真实对应的,比如DAY返回3,当时就是3号。 小周期K线中使用大周期的时间函数不成问题,反之则不行。比如在分笔成交图中,也可以取得年、月等。 年:YEAR,LINETHICK0; 月:MONTH; 周:WEEKDAY; 日:DAY; 二、 函数: DATE 参数: 无 返回: 返回有效值范围为(700101-1341231),表示19700101-20341231 说明: 取得该周期从1900以来的的年月日。 为什么当时设计这个函数时,不直接取得年月日?不得而知。 后来还是给发现了一些蛛丝马迹, 年月日:DATE+19000000; 年(200)月日:DATE-1000000; YMD:YEAR*10000+MONTH*1000+DAY; 只有第二句的输出始终是对的,其它两句,输出可能都会增1或减1。FH和FXJ一样,都有这个问题。 这就是DATE不直接取得年月日的原因。对于其它整数部分的位数达8位的数的运算,我们也可以知道,个位数的精确度是有问题的。 ******************************************** DATE 函数使用的注意事项 用公式检测: DATE+19000000; 1.有些日期结果不对; 2.DATE+19000000+1;不起作用,只有加2以上才起作用! 是浮点计算造成的误差,写公式时尽量用DATE表述。 只好“压缩”使用了。 比如大盘的成交额,不用元为单位,用万元或亿元为单位。 数据的使用,无需追求过多的位数,要看相对误差。 目前可以正确处理的整数部分的位数达8位,相对误差已经非常的小了。 本来可以显示小数的,大概是1a001提了建议后,这类数据的显示,限制了小数部分的显示了。 只好这样来处理了: mod(YEAR,100)*10000+MONTH*100+DAY 年号只用2位数表示。 ****************************************** 三、 函数: HOUR 参数: 无 飞狐基本函数简介之引用函数引用函数主要是向前引用数据。BACKSET可以理解为向后引用某些判断信号,并不能引用具体数据。
股市技术分析主要是根据已经发生的数据,来推测未来走向的可能,所以引用函数在公式中应用得最多,具体使用时,奥妙也最多。有些东西实在不能铺开多讲,否则篇幅会了无穷尽,只能急刹车。不当之处,请各位多多指正。 一、 函数: COUNT(X,N) 参数: X为数组,N为计算周期 返回: 返回数组 说明: 统计N周期中满足X条件的周期数,若N=0则从第一个有效值开始。 示例: COUNT(CLOSE>OPEN,20) 表示统计20周期内收阳的周期数 函数: SUM(X,N) 参数: X为数组,N为计算周期 返回: 返回数组 说明: 统计N周期中X的总和,N=0则从第一个有效值开始。 示例: SUM(VOL,0) 表示统计从上市第一天以来的成交量总和 COUNT,计数。SUM,总数、和。 当数组为逻辑运算判断的结果时,COUNT和SUM的返回值是一样的。一般习惯上,对于逻辑运算信号,用COUNT统计,返回其它数值的,用SUM统计。当COUNT统计一般数值时,数组大于等于1时,计入;小于1时,不计入。这两个函数,主要用于统计。 用COUNT(CROSS(MA(C,5),MA(C,10)),0);就可以统计出全部的五天均线上穿十天均线的金叉数。 用SUM(CROSS(MA(C,5),MA(C,10)),0);和以上得出的结果应该是一样的。 股市的不随机规律,隐藏在统计概率之中。用这两个函数,可以统计很多概率性的规律。 比如,以两天的收盘价相比,昨天是下跌的,今天的下跌的概率是多少? A:=C<REF(C,1); B:=REF(A,1) AND C>REF(C,1);{昨天下跌,今天上涨} D:=REF(A,1) AND C=REF(C,1);{昨天下跌,今天平盘} E:=REF(A,1) AND C<REF(C,1);{昨天下跌,今天下跌} F:=COUNT(B,0)+COUNT(D,0)+COUNT(E,0); 上升概率:100*COUNT(B,0)/F; 下跌概率:100*COUNT(E,0)/F; 平盘概率:100*COUNT(D,0)/F; 从两市指数看,昨天下跌,今天下跌的概率始终大于50%。 那么连跌两天之后,第三天收盘的各种概率是多少? A:=C<REF(C,1) and ref(c,1)<ref(c,2); B:=REF(A,1) AND C>REF(C,1);{前两天下跌,今天上涨} D:=REF(A,1) AND C=REF(C,1);{前两天下跌,今天平盘} E:=REF(A,1) AND C<REF(C,1);{前两天下跌,今天下跌} F:=COUNT(B,0)+COUNT(D,0)+COUNT(E,0); 上升概率:100*COUNT(B,0)/F; 下跌概率:100*COUNT(E,0)/F; 平盘概率:100*COUNT(D,0)/F; 从指数的输出看,概率更明显了。 连跌三天之后呢? A:=C<REF(C,1) and ref(c,1)<ref(c,2) and ref(c,2)<ref(c,3); B:=REF(A,1) AND C>REF(C,1);{前三天下跌,今天上涨} D:=REF(A,1) AND C=REF(C,1);{前三天下跌,今天平盘} E:=REF(A,1) AND C<REF(C,1);{前三天下跌,今天下跌} F:=COUNT(B,0)+COUNT(D,0)+COUNT(E,0); 上升概率:100*COUNT(B,0)/F; 下跌概率:100*COUNT(E,0)/F; 平盘概率:100*COUNT(D,0)/F; 规律就更明显了。 不要小看这些数据。虽然没有有些“高手”做出的成功率达百分之九十左右的公式那么夸张,但很有意义的。要知道股市中的随机因素太多,平衡性很强,稍稍的统计偏向,足可作为有用的参考。 这只是简单的例子,用这两个函数,可以做出很多的有用的统计数据。 多数的交易系统的“胜率”,可以由此统计出来。 出个“难题”吧: 有个MA5金叉MA10作为买入条件,死叉为卖出条件的交易系统,试做一个副图公式,以每次买一股计算,统计出最后的交易结果(暂不考虑手续费)。买入卖出均以收盘价计算。 二、 函数: REF(X,N) 参数: X为数组,N为计算周期 返回: 返回数组 说明: 引用N周期前的X值。 示例: REF(CLOSE,1) 表示上一周期的收盘价,在日线上就是昨收 REF:REFERENCED,参考的、引用的。 N可以为变量,常用BARSLAST(X)等。 三、 函数: MA(X,N) 参数: X为数组,N为计算周期 返回: 返回数组 说明: 求X的N日移动平均值。 算法: (X1+X2+X3+...+Xn)/N 示例: MA(CLOSE,10),表示求10日均价 MA:MOVING AVERAGE,移动平均。 目前飞狐的MA(X,N)函数支持N为序列变量。 这个简单移动平均值,仅仅覆盖最近的N个周期,并且在每个周期中分配的权重是一模一样的,均为1/N。 移动平均线实质上是一种追踪趋势的工具,而且滞后于市场的变化。这些结果的原因,就是它的计算方法了。 从输出看,N所取周期越长,曲线就越平滑。 平滑和敏感是一对矛盾,请看: A:MA(C,5); B:MA(A,5); D:MA(B,5);{主图叠加} 输出线越来越平滑,但敏感性越来越差。 两条简单移动平均线的交叉,何时、何地所选的参数最优,可以参考飞狐中的“探索最佳参数”功能。 线性加权移动平均值的算法函数,飞狐并未提供。 以五天的线性加权移动平均的算法为例: 五天线性加权:(C*5+REF(C,1)*4+REF(C,2)*3+REF(C,3)*2+REF(C,4)*1)/(5+4+3+2+1); MA(C,5);{主图叠加} 由于算法的原因,线性加权移动平均线由于日子越近的权重越大,比简单移动平均线,跟随趋势要紧密一些,敏感一些。 从图上看,两者的交叉也是极为敏感的。 四、 函数: EMA(X,N) 参数: X为数组,N为计算周期 返回: 返回数组 说明: 求X的N日指数平滑移动平均。 算法: 若Y=EMA(X,N) 则Y=[2*X+(N-1)*Y']/(N+1), 其中Y'表示上一周期Y值。 示例: EMA(CLOSE,30) 表示求30日指数平滑均价 EMA中的E,可能是EXPONENT,指数、幂。 把算法写成这个样子:Y=2*X/(N+1)+(N-1)/(N+1)*Y',就可以看出,当前周期数组值所占的权重是2/(N+1),而上一周期Y值所占的权重是(N-1)/(N+1)。注意,这两个权重相加,结果为1:2/(N+1)+(N-1)/(N+1)=1。 由于一个很经典的指标指数平滑异同平均线MACD(1979年就发明出来了)里面,要用到EMA,才使EMA还在基本函数中占有一席之地。后面我们可以看到,用SMA也可以达到相同的算法。 N可以取到1,不过输出就没有加权的效果了。 五、 函数: SMA(X,N,M) 参数: X为数组,N为计算周期,M为权重 返回: 返回数组 说明: 求X的N日移动平均,M为权重。 算法: 若Y=SMA(X,N,M) 则 Y=[M*X+(N-M)*Y')/N, 其中Y'表示上一周期Y值,N必须大于M。 示例: SMA(CLOSE,30,1) 表示求30日移动平均价 SMA中的S,不会是SIMPLE(简单)的意思吧?由于我们习惯称MA为简单移动平均线,所以称SMA为什么就大伤脑筋。 我的理解,SMA应该称为指数加权移动平均线。不对之处请方家指出。 把算法写成这个样子:Y=M/N*X+(N-M)/N*Y',就可以看出,当前周期数组值所占的权重是M/N,而上一周期Y值所占的权重是(N-M)/N。注意,这两个权重相加,结果为1:M/N+(N-M)/N=1。 看出来了吧?SMA(X,N+1,2)=EMA(X,N); A:SMA(C,N+1,2); B:EMA(C,N);{N:5,2,99。主图叠加} 两条线输出一样。在SMA的参数中,N必须大于M,否则没有输出。 SMA中,数组每天所占的权重,是较为复杂的。总的来说,日子越近,所占的权重越大,当天所占的权重是M/N,前一天所占的权重是M*(N-M)/(N*N);日子越远,所占的权重就越小,上市第一天的K线数据中,在目前还有权重的体现,不过已经非常非常小了。 SMA看似解决了MA的两大缺点:1、只有N天内的数据占有权重;2、N天内数据所占权重比重一样。有所得必有所失,SMA自己的缺点体现在光滑有余,敏感不足。 有一项检测系统得出的结论称:“简单移动平均值方法既胜过线性加权平均值法,也胜过指数加权平均值法。”(<期货市场技术分析>P231),当然他们不是检测中国股市。有兴趣的朋友,可以用这些移动平均函数,做出交易系统,然后进行检测。 六、 函数: DMA(X,A) 参数: X为数组,A为计算周期 返回: 返回数组 说明: 求X的动态移动平均。 算法: 若Y=DMA(X,A) 则 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必须小于1。 示例: DMA(CLOSE,VOL/CAPITAL) 表示求以换手率作平滑因子的平均价 呵呵,均线函数还有。 DMA中的D,是中文的拼音:DONG。也可能是DYNAMIC。 这个函数,与SMA是一家的,看: Y=M/N*X+(N-M)/N*Y'; Y=A*X+(1-A)*Y'; 前者说,N必须大于M,后者说,A必须小于1。然后两者就一样了:A=M/N。 说“A为计算周期”似乎不妥,A明明要取小数才行。DMA在第一根K线就开始起算,SMA要到第二根K线开始起算。 七、 函数: HHV(X,N) 参数: X为数组,N为计算周期 返回: 返回数组 说明: 求N周期内X最高值,N=0则从第一个有效值开始。 示例: HHV(HIGH,30) 表示求30日最高价 函数: HHVBARS(X,N) 返回: X为数组,N为计算周期 参数: 返回数组 说明: 求N周期内X最高值到当前周期数,N=0表示从第一个有效值开始统计 示例: HHVBARS(HIGH,0) 求得历史新高到到当前的周期数 这两个函数一起用,可以找到当前N天中的最高点。 A:=BACKSET(ISLASTPERIOD,HHVBARS(H,N)+1); B:=COUNT(A,N)=1;{取得前N个周期内的最高点位置} REF(H,BARSLAST(B)); DRAWICON(B,H,1),ALIGN2;{主图叠加。N:30,1,9999} 八、 函数: LLV(X,N) 参数: X为数组,N为计算周期 返回: 返回数组 说明: 求N周期内X最低值,N=0则从第一个有效值开始。 示例: LLV(LOW,0) 表示求历史最低价 函数: LLVBARS(X,N) 参数: X为数组,N为计算周期 返回: 返回数组 说明: 求N周期内X最低值到当前周期数,N=0表示从第一个有效值开始统计 示例: LLVBARS(HIGH,20) 求得20日最低点到当前的周期数 当前N天之内的最高点和最低点就一目了然了: A:=BACKSET(ISLASTPERIOD,HHVBARS(H,N)+1); B:=COUNT(A,N)=1;{取得前N个周期内的最高点位置} REF(H,BARSLAST(B)); DRAWICON(B,H,1),ALIGN2; A2:=BACKSET(ISLASTPERIOD,LLVBARS(L,N)+1); B2:=COUNT(A2,N)=1;{取得前N个周期内的最低点位置} REF(L,BARSLAST(B2)); DRAWICON(B2,L,2),ALIGN1;{主图叠加。N:30,1,9999} A:=BACKSET(ISLASTPERIOD,HHVBARS(H,N)+1); B:=COUNT(A,N)=1;{取得前N个周期内的最高点位置} REF(H,BARSLAST(B)); DRAWICON(B,H,1),ALIGN2; A2:=BACKSET(ISLASTPERIOD,LLVBARS(L,N)+1); B2:=COUNT(A2,N)=1;{取得前N个周期内的最低点位置} REF(L,BARSLAST(B2)); DRAWICON(B2,L,2),ALIGN1;{主图叠加。N:30,1,9999} 这个公式求前期高低点,在600036等次新股上试调整参数就露马脚了,并不完善。 问题出在HHVBARS起算点等原因上。 南客刚发表了一个公式,就顺手牵羊牵过来吧。这个公式可以说是完美解决方案: HH:HHV(H,N),LINETHICK2; LL:LLV(L,N),LINETHICK2;{主图叠加,参数N:30,1,9999} <% VH=FFL.VARDATA("HH") VL=FFL.VARDATA("LL") VN=FFL.VARDATA("N") LAST=UBOUND(VH) IF VN>LAST THEN VN=LAST+1 FOR I=LAST TO LAST-VN+1 STEP-1 VH(I)=VH(LAST) VL(I)=VL(LAST) NEXT FFL.VARDATA("HH")=VH FFL.VARDATA("LL")=VL FFL.VARSTARTINDEX("HH")=LAST-VN+1 FFL.VARSTARTINDEX("LL")=LAST-VN+1 %> 当N个周期之内,有两个最高价,即有等高的情况出现,HHVBARS会返回哪个最高价到当前的周期数呢? 用副图公式观察一下,N取10: HHVBARS(H,N); 如图,我们可以得出结论,返回的是前一个最高价到当前的周期数。 同样,当在N个周期之内,有两个等低的最低价出现时,LLVBARS会返回前一个最低价到当前的周期数。 九、 函数: SUMBARS(X,A) 参数: X为数组 返回: 返回数组 说明: 将X向前累加直到大于等于A,返回这个区间的周期数 示例: SUMBARS(VOL,CAPITAL) 求完全换手到现在的周期数 这个函数好用,在于它不但能精确地得到统计结果,而且能得到“模糊”的结果。 就以SUMBARS(VOL,CAPITAL)为例: 日期数:SUMBARS(VOL,CAPITAL);{返回成交量累加到流通盘的日期数} 验证:SUM(V,日期数)/CAPITAL;{把返回的日期数之内的成交量累计,再除以流通盘} 运行的结果中,我们可以看到,“验证”的输出,除了SUMBARS起算点附近之外,从来没有小于1的。可见SUMBARS只往多算,不往少算,非常“精明”。 十、 函数: BARSCOUNT(X) 参数: X为数组 返回: 返回数组 说明: 第一个有效数据到当前的天数 示例: BARSCOUNT(CLOSE) 对于日线数据取得上市以来总交易日数,对于分笔成交取得当日成交笔数,对于1分钟线取得当日交易分钟数 BARS是什么?我们看到,关于取得相隔时间周期的函数中,多数以BARS开头。 查字典,BAR的意思有很多,有条、条形、酒巴、巴等。后来才恍然大悟:相隔时间周期,不就是中间相隔几根条形K线么? BARSCOUNT(X)是第一个有效数据到当前的天数。那么什么是有效数据? A:BACKSET(ISLASTPERIOD,10); 零:BARSCOUNT(A); 很小:BARSCOUNT(C/10000000000000); 负数:BARSCOUNT(-C); 不存在:BARSCOUNT(MA(C,10)); 可见,有效数据并不是全是大于等于1的数据,只要有输出的数据,不管是零,还是负数,均为有效数据。 而MA(C,10)是从第十根K线开始起算的,所以一直要到第十根K线,BARSCOUNT(MA(C,10))才输出1。 这样找一些指标的起算点时间位置,用BARSCOUNT函数就很管用了。 一般找第一根K线的位置,就可以写为BARSCOUNT(C)=1; 十一、 函数: BARSSINCE(X) 参数: X为数组 返回: 返回数组 说明: 第一次X不为0到现在的天数 示例: BARSSINCE(HIGH>20) 表示股价第一次超过20元时到当前的周期数 SINCE,自...以后。BARSSINCE和BARSCOUNT很象,不过它找的是非零信号。 A:BACKSET(ISLASTPERIOD,10); 零:BARSsince(A); 很小:BARSsince(C/10000000000000); 负数:BARSsince(-C); 不存在:BARSsince(MA(C,10)); 可见,零和无效数据,均不被计数。一般BARSSINCE是针对逻辑运算的结果的,因为逻辑运算的结果输出,不是0,就是1。 十二、 函数: BARSLAST(X) 参数: X为数组 返回: 返回数组 说明: 上一次X不为0到现在的天数 示例: BARSLAST(CLOSE/REF(CLOSE,1)>=1.1) 表示上一个涨停板到当前的周期数 条件满足的当前周期,BARSLAST返回0。 是“不为0”到现在的天数么?运行这个公式试试: A:=C>O; A1:=0.5*A; A2:=3*A; A3:=-3*A; 一:BARSLAST(A1); 二:BARSLAST(A2); 三:BARSLAST(A3); 如图,“一”根本就没有输出。初步可得出结论:其绝对值大于等于1的数组信号,BARSLAST(数组)才有输出。 十三、 函数: BACKSET(X,N) 参数: X为数组,N为正整数 返回: 返回数组 说明: 若X非0,则将当前位置到N周期前的数值设为1。 示例: BACKSET(CLOSE>OPEN,2) 若收阳则将该周期及前一周期数值设为1,否则为0 如果公式检测出来有未来数据,则BACKSET是第一个嫌疑。 BACKSET是往前倒推信号(数据1)的,仅此而已。由于所有基本函数都是序列变量,所以要用基本函数,把当前的数据(比如最高价)往前推是做不到的。所以说,基本函数要往后引用具体数据是做不到的,往后引用信号是可能用BACKSET做到的。 说BACKSET不可或缺,是因为用基本函数在找历史峰点等公式中,如果没有它将一筹莫展。 这个“说明: 若X非0,则将当前位置到N周期前的数值设为1。”有点问题,如果数组X是逻辑运算的结果是对的,如果不是就难说了,比如: A:BACKSET(0.1*ISLASTPERIOD,10); B:BACKSET(100*ISLASTPERIOD,20); D:B>REF(B,1); “A”的输出全为0,“B”的输出就正常了。 十四、 函数: FILTER(X,N) 参数: X为数组,N为正整数 返回: 返回数组 说明: 过滤连续出现的信号,X满足条件后,删除其后N周期内的数据置为0 示例: FILTER(CLOSE>OPEN,5) 查找阳线,5天内再次出现的阳线不被记录在内 如果说BACKSET能够向后引用信号,那么FILTER就能向后过滤信号--即把有效信号去掉。比如N取3,就把以后3个周期内的有效信号去掉了,所以从连续信号上看,两个信号之间的间隔不可能小于3的。用这个公式观察一下就容易明白了: A:=C>O; FILTER(A,3); 十五、 举两个综合运用引用函数的例子。 1、RSI(相对强弱指标(Relative Strenth Index),1978年由韦尔斯·王尔德发明) A、飞狐的反趋向指标中的RSI是这样写的: LC := REF(CLOSE,1); RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100; RSI2:SMA(MAX(CLOSE-LC,0),N2,1)/SMA(ABS(CLOSE-LC),N2,1)*100; RSI3:SMA(MAX(CLOSE-LC,0),N3,1)/SMA(ABS(CLOSE-LC),N3,1)*100; {N1:6,2,100 N2:12,2,100 N3:24,2,100} RSI1、RSI2、RSI3三根线是一样的算法,只是所取参数不同。 MAX,在两者之间取大者。ABS,取绝对值。以日K周期为例,LC是昨天的收盘价,C-LC即为两天之间的收盘价差值。 RSI的分母是这个差值的绝对值,进行指数加权平均处理。 RSI的分子是上涨中的差值,进行指数加权平均处理。 分子所占分母的比重的百分比,即得出RSI的值。 B、原始RSI的算法是这样的: 设A为N天内上涨收盘价的平均值,B为N天内下跌收盘价的平均值。 RSI=100-100/(1+RS),其中的RS=A/B。 经过化简,RSI=100*A/(A+B)。写成公式: LC:=REF(C,1); D:=IF(C>LC,C-LC,0); E:=IF(C<LC,LC-C,0); A:=SUM(D,N)/N; B:=SUM(E,N)/N; RSI:100*A/(A+B); {N:6,2,100} 好了,将两种算法写在一起: LC:=REF(C,1); D:=IF(C>LC,C-LC,0); E:=IF(C<LC,LC-C,0); A:=SUM(D,N)/N; B:=SUM(E,N)/N; 原始RSI:100*A/(A+B); {N:6,2,100} 飞狐RSI:SMA(MAX(C-LC,0),N,1)/SMA(ABS(C-LC),N,1)*100; {坐标线位置:0; 20; 50; 80; 100; } 如图,原始RSI要比飞狐RSI要敏感一些,因为飞狐的RSI经过了指数加权平均处理。 我没有说指数加权平均处理就不好了,经过处理后,指标会平滑、稳定一些。 2、参数可调整的峰点公式 A:=REF(H,N)=HHV(H,2*N+1);{当前位置N天之前的最高价是最近2*N+1根K线中的最高价} B:=FILTER(A,N); {当高点附近有等高的K线出现时,会影响后续高点的判断,所以要过滤} D:=BACKSET(B,N+1);{将当前位置及前N周期的数值设为1,所以要用N+1} HD:=FILTER(D,N); {当高点附近有等高的K线出现,取第一个,过滤掉后面N个周期之内出现的} A2:=REF(L,N)=LLV(L,2*N+1);{求低点的过程与求高点的过程同理} B2:=FILTER(A2,N); D2:=BACKSET(B2,N+1);{参数N:1,3,999} LD:=FILTER(D2,N);{主图叠加} DRAWICON(HD,H,10),ALIGN2;{在高点附近显示红球} DRAWICON(LD,L,11),ALIGN1;{在低点附近显示绿球} 可以说,这个公式用了未来函数BACKSET,但是用在日K线中,盘后是没有未来数据的,因为引用的全是已经发生过的不可变的数据了。 至于即时盘中的未来数据,那是说不到底的事,基本所有的公式,都有即时盘中未来数据,详见简介二中的探讨说明。 红球绿球作为峰点标志,在显示K线不多的情况下,还比较清楚。但当K线数较多时,因为球的大小是不变的,所以看起来比较乱。故可用以下公式: A:=REF(H,N)=HHV(H,2*N+1); B:=FILTER(A,N); D:=BACKSET(B,N+1); HD:=FILTER(D,N); A2:=REF(L,N)=LLV(L,2*N+1);B2:=FILTER(A2,N); D2:=BACKSET(B2,N+1);LD:=FILTER(D2,N); STICKLINE(REF(HD,1),REF(H,1),REF(H,1),18,0),COLORMAGENTA; STICKLINE(REF(LD,1),REF(L,1),REF(L,1),18,0),COLORGREEN; |
|