返回列表 回复 发帖
MV2009最新版本下载

编写指标公式技巧全集

编写指标公式技巧全集
  0077--扩展数据
  
  函数:EXTDATA(N)
  描述:取得日线扩展数据(1-13); 分析家N取1--11
  类别:扩展数据
  参数:N取1--13
  
  说明:在[扩展数据管理]中定义并计算数据(本函数仅在日线分析周期有效)。
  
  有些数据,非常重要,可是随着时间的推移,就再也找不到了。比如说某个股一天之中的总成交次数,又比如说某个股在上个月的1号,涨幅排名是第几?这些信息,要么以后就查不到了,要么在公式中也无法引用。而扩展数据库能解决这些问题。扩展数据库能够随日线保存这些数据,而且是计算好了的结果,所以引用时速度也很快。
  
  扩展数据有两个用处:1、保存计算值。2、保存计算值的排名结果。目前飞狐的扩展数据,可以最多做13个。太多了好象也没有多大意思,因为扩展数据计算历史数据有点慢,而且也较占空间。历史的数据量大,当然慢了。可是计算好之后,以后只要更新当天的,速度还是较快的。计算扩展数据,某个股,一个交易日,一次只能得到一个结果数据,而且所选之指标,也应该是唯一的。
  
  想保存所有分笔成交记录?扩展数据是做不到的。
  
  缺省数据:某一天,或者说个股停盘等原因,没有计算结果,系统就将缺省数据保存到扩展数据库中。
  
  在进行排序时,有两种排序方式,一种为0-N自然排序,一种为1-1000归一化排序,区别在于:自然排序按自然数来排列名次,排名在第几结果就是几,第一名,返回0;第二名,返回1;第N名,返回N-1。而归一化排序时将排序归一化到0-1000之间,第一位为0,最后一位为1000,采用公式"排名*1000/参加排名的股票数"来进行计算。归一化排序的好处是,不随股票数目的增加而对排序结果有较大的影响。
  
  怎么引用扩展数据?EXTDATA(N);N指引用第几组扩展数据,从1到13。比如把分笔成交次数的扩展数据建立在第一组中,引用时,就用EXTDATA(1);这个公式,在某个股中,就输出此股在当天的总成交次数。扩展数据,有横向的性质,特别是用排名时。同时又是纵向的,只要有数据,以前的日子里,也可以返回所得值。而且从理论上说,扩展数据库是可以永远保存的。由于计算量较大,目前扩展数据不支持即时刷新。不过可以手工刷新。
  

  0078--峰点公式  
  为了能找到合适的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(COND,PRICE,TYPE),当COND条件满足时,在PRICE位置画TYPE号图标。15种图标编码为1-15(1-3为小脸,4-5为上下箭头,6-7为红绿小旗,8-9为三角形,10-12为信号灯,13-15为O、X、四方形)。TYPE为字符串时可显示用户自制BMP图。
  
  示例:DRAWICON(CLOSE>OPEN,LOW,4)表示当收阳时在最低价位置画4号图标。
  
  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');{主图叠加。如果你没有PIG.BMP文件,则不可显示。}
  
  举个例子:
  
  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));{主图叠加}
  
  说明:在图形上显示数字
  用法: DRAWNUMBER(COND,PRICE,NUMBER,PRECISION),当COND条件满足时,在PRICE位置书写数字NUMBER(可以为常数或数组序列),PRECISION为小数显示位数(取值范围0-3)。可ALIGN0-5定义对齐方式。
  示例:DRAWNUMBER(CLOSE/OPEN>1.08,HIGH,(CLOSE-REF(C,1))/REF(C,1)*100,2)表示当日涨幅大于8%时在最高价位置显示涨幅(相对开盘价的百分比)。
  
  这个函数的特色是,在NUMBER位置可以放变量。
  
  NUMBER,数字。DRAWNUMBER是DRAWTEXT的"兄弟",也可以用ALIGN(0-5)来定义水平位置,方法相同。
  
  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;{主图叠加}
  
  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(COND,PRICE),当COND条件满足时,以PRICE位置为顶点画折线连接。
  示例:POLYLINE(HIGH>=HHV(HIGH,10),HIGH)表示在创10天新高点之间画折线。
  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;{主图叠加}
  
  参数可调整的峰点公式:
  
  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;
  
  函数:HHVBARS(X,N)
  描述:上一高点位置
  类别:引用
  参数:X为数组,N为计算周期
  返回:返回数组
  说明:求N周期内X最高值到当前周期数,N=0表示从第一个有效值开始统计
  示例:HHVBARS(HIGH,0)求得历史新高到当前的周期数
  
  HHV、HHVBARS这两个函数一起用,可以找到当前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}
  
  函数:LLVBARS(X,N)
  描述:上一低点位置
  类别:引用
  参数: 无
  返回: 无
  说明:求N周期内X最低值到当前周期数,N=0表示从第一个有效值开始统计
  示例:LLVBARS(HIGH,10)求得10日最低点到当前的周期数
  
  当前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}
  
  这个公式求前期高低点,在600036等次新股上试调整参数就露马脚了,并不完善。问题出在HHVBARS起算点等原因上。
  
  下面这个公式可以说是完美解决方案:
  
  HH:HHV(H,N),LINETHICK2;
  LLLV(L,N),LINETHICK2;{主图叠加,参数N:30,1,9999}
  
  
  当N个周期之内,有两个最高价,即有等高的情况出现,HHVBARS会返回哪个最高价到当前的周期数呢?
  
  用副图公式观察一下,N取10:
  
  HHVBARS(H,N);
  
  我们可以得出结论,返回的是前一个最高价到当前的周期数。同样,当在N个周期之内,有两个等低的最低价出现时,LLVBARS会返回前一个最低价到当前的周期数。
ヽoo牽ωǒ啲掱ツ
返回列表