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

编写指标公式技巧全集

编写指标公式技巧全集
  0059--移动成本
  
  不知道函数算法,计算误差在所难免。调整参数“%”可看到不同的移动成本。
  
  ///筹码%
  INPUT:%(90,1,100);
  A:=AMOUNT/V/100;
  成本:FLOOR(COST(50-%/2)*100)/100,COLORYELLOW,LINETHICK0;
  ~:CEILING(COST(50+%/2)*100)/100,COLORYELLOW,LINETHICK0;
  集中度:INTPART((~-成本)/(~+成本)*1000)/10,COLORGREEN;
  平均成本:ROUND(COST(50)*100)/100,LINETHICK0;
  穿透力WINNER(C)-REF(WINNER(C),1))/V*CAPITAL,LINETHICK0;//计算误差大
  //穿透力2WINNER(C)-WINNER(O))/V*CAPITAL,LINETHICK0;//这一写法还是误差大
  获利比例:ROUND(WINNER(C)*1000)/10,LINETHICK0;
  
  0060--妙用SUMBARS()函数
  
  SUMBARS(X,N)
  
  函数的用法如下:
  
  向前累加到指定值到现在的周期数。
  
  用法:  
  SUMBARS(X,A)  
  将X向前累加直到大于等于A,返回这个区间的周期数
  
  例如:
    SUMBARS(VOL,CAPITAL)
  
  1、设计一个指标,计算当日成交量是几天内的最高成交量? 
  2、设计一个指标,计算当日最高价是几天内的最高价?  
  提示:直接用HHV()函数无法得到正确结果。
  
  例一:  
  B:=HHV(H,0);
  A:=IF(BARPOS=1,B[DATACOUNT]*1.2,H);
  价:SUMBARS(REF(A,1)-A,0);
  
  U:=HHV(V,0);
  S:=IF(BARPOS=1,U[DATACOUNT]*1.2,V);
  量:SUMBARS(REF(S,1)-S,0);
  
  或: 
  VH:=HHV(VOL,0);
  FV:=IF(BARPOS=1,VH[DATACOUNT]*1.2,VOL); //VH[DATACOUNT]是历史最高成交量
  量创新高周期数:SUMBARS(REF(FV,1)-FV,0);
  {这里的关键是 REF(FV,1)-FV ,想想看写成 FV-REF(FV,1) 行不行?}
  
  另一种写法:
  VH:=HHV(VOL,0);
  FV:=VOL;
  FV[1]:=VH[DATACOUNT]*1.2; //VH[DATACOUNT]是历史最高成交量
  量创新高周期数:SUMBARS(REF(FV,1)-FV,0);
  {这里的关键是 REF(FV,1)-FV ,想想看写成 FV-REF(FV,1) 行不行?}
  
  代码已经成功了,原理是什么呢?
  
  假设某日成交量是3日内的最大成交量,则必有:  
  REF(VOL,3)-VOL>=0
  等价于:  
  (REF(VOL,3)-REF(VOL,2))+(REF(VOL,2)-REF(VOL,1))+(REF(VOL,1)-VOL) >=0
  
  意思就是说,“昨成交量与今成交量之差”逐日累加,直到某日累加和大于等于0,则这之间的天数,就是所要求的日数。
  
  我们再来看看SUMBARS()函数的含义:  
  SUMBARS(X,A):将X向前累加直到大于等于A,返回这个区间的周期数。
  
  显然上面的式子:  
  (REF(VOL,3)-REF(VOL,2))+(REF(VOL,2)-REF(VOL,1))+(REF(VOL,1)-VOL)>=0
  
  可以写成:  
  SUMBARS(REF(VOL,1)-VOL, 0);  
  为何第1周期的成交量要替换成比所有成交量都大的数值?最后,再来思考一个问题,把题目中的求“最大”,改成求“最小”,即多少天内是最小的?
  
  例二:  
  B:=HHV(H,0);
  A:=IF(BARPOS=1,9999,H);
  Z:SUMBARS(REF(A,1)-A,0);
  DRAWNUMBER(BARPOS=SYSPARAM(1),1,Z,0)ALIGN4,COLORWHITE;
  
  U:=HHV(V,0);
  S:=IF(BARPOS=1,999999999999,V)
  Y:SUMBARS(REF(S,1)-S,0);
  DRAWNUMBER(BARPOS=SYSPARAM(1),1,Y,0)ALIGN3,COLORYELLOW;
  
  例三:
  
  HH:=IF(BARSCOUNT(C)=1,9999,H);
  ZH:SUMBARS(REF(HH,1)-HH,0);//价创了N周期新高  
  VH:=IF(BARSCOUNT(C)=1,99999999,V);
  HV:SUMBARS(REF(VH,1)-VH,0);//量创了N周期新高
  
  LL:=IF(BARSCOUNT(C)=1,0,L);
  ZL:SUMBARS(LL-REF(LL,1),0);//价创了N周期新低
  
  VL:=IF(BARSCOUNT(C)=1,0,V);
  LV:SUMBARS(VL-REF(VL,1),0);//量创了N周期新低
  
  附注:  
  用99999999等具体数值,最好是尽可能大的数值(比如单精数的上限),否则仍有可能无法全部完成计算,比如上证指数的年线,成交量最大时,仍然超过了99999999。
  
  倒数第6天的最高价格怎么表示?
  
  FH:=HIGH;
  FH[DATACOUNT-5]; //倒数第6天的最高价格。
  
  [DATACOUNT]
  
  返回K线的数量,即总共有多少根K线。
  

  0061--取得K线的序号
  
  取得K线的序号,正序有下面几种方法:(从1数起)
  
  BARPOS; 
  SX:BARSCOUNT(CLOSE);  
  SY:SUM(1,0);
  DATACOUNT;{不随光标变动,只显示最后K线序号}
  
  逆序可用下列方法取得:(从1数起)  
  (DATACOUNT-BARPOS)+1;   
  (DATACOUNT-BARSCOUNT(CLOSE))+1;  
  (DATACOUNT-SUM(1,0))+1;
  
  0062--变量宣告   
  指定叙述:经过指定宣告后,飞狐才认识AA、BB、CC,否则会出现"未定义的标示符号"。所谓"定义",程序语言的用语,就叫做"变量宣告"。  
  AA:OPEN;{宣告OPEN,指定给AA→输出的表达式}   
  BB:HIGH,LINETHICK0;{宣告HIGH,指定给BB→输出的表达式→秀数值但不秀线图}   
  CC:=CLOSE;{宣告CLOSE,指定给CC→不输出的表达式→不秀数值也不秀线图}   
  DDAA+BB+CC)/3;{;分号,告诉程序要换行执行了}   
  EE:=(AA+CC)/2;
  PARTLINE(CLOSE>0,EE);{秀线图但不秀数值}
  
  注:{ }大括号内或在//后面,可用来输入公式批注。
  
  0063--跨周期引用数据   
  (一)指针线公式的运算,大部份都是代入开、高、低、收、量等数据去运算的。  
  (二)开、高、低、收、量又分成下面四种型式出现:  
  开、高、低、收、量(基本的日K线数据)
  开、高、低、收、量(周K线数据)
  开、高、低、收、量(月K线数据)
  开、高、低、收、量(年K线数据)
  
  (三)所以当指针线公式运算,要代入下面数据时:
  
  开、高、低、收、量(周K线数据)
  开、高、低、收、量(月K线数据)
  
  #WEEK 和 #MONTH 就会派上用场。
  
  (四)举例:  
  公式A.建立一个专门被用来引用(QUOTE)的公式区。  
  公式名称:QU  
  A1OPEN+HIGH+LOW+CLOSE)/4;  
  说明:上面公式的运算,是代入开、高、低、收(当前周期K线数据)运算的。
  
  公式B.  
  公式名称:AA  
  AA:"QU.A1#WEEK";  
  说明:将下面公式的运算,代入开、高、低、收(周K线数据)运算。
  
  (OPEN+HIGH+LOW+CLOSE) / 4
  
  公式C.
  
  公式名称:BB
  
  BB:"QU.A1#MONTH";
  
  说明:将下面公式的运算,代入开、高、低、收(月K线数据)运算。
  
  (OPEN+HIGH+LOW+CLOSE)/4
  
  附注:
  
  可供引用的周期类型有:
  
  MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH
  
  分别表示将1,5,15,30,60分钟K线数据,以及日,周,月K线数据,代入被引用的公式,进行运算。
  
  意义:
  
  可将大周期内跑的数据,引用到小周期内来跑。将小周期内跑的数据,引用到大周期内来跑,就会有问题,因为时间横坐标不一样了。
  
  公式(1):先建立即将被引用的表达式
  
  将公式建立在:技术指针 ( ●主图叠加 ○主图 )
  
  公式名称:NH
  
  AA:=HIGH< REF(HIGH,1);{不输出的表达式,如果被引用还是会变成不输出的表达式}
  BB:=BARSLAST(AA=1);
  CC:REF(HIGH,BB); {输出的表达式,如果被引用还是会变成输出的表达式}
  
  说明:
  
  上面公式的运算,是以当周期时间数列数据运算的。
  
  公式(2):
  
  将公式建立在:技术指针 ( ●主图叠加 ○主图 )
  
  公式名称:NHH
  
  AA:"NH.AA#WEEK";{不输出的表达式}
  BB:"NH.BB#WEEK";
  CC:"NH.CC#WEEK";{输出的表达式}
  DRAWNUMBER(ISLASTBAR,CC,CC,2);
  
  说明:上面公式的运算,是以周周期时间数列数据运算的。
ヽoo牽ωǒ啲掱ツ
返回列表