量化投资_EasyLanguage/PowerLanguage教学课程__【第二篇专题】__【第十一章最大bar数量(转)】

第十一章:最大bar数量

   如图所示,策略的最大bar数量在策略属性中进行设置,默认为50;信号脚本会从图表左边开始的第51根bar开始计算,依次向图表右边进行执行计算,这是策略(信号)基于bar的一个计算顺序,从左边向右边逐根bar执行计算。

  那么很明显的问题是,为什么要设置最大bar数量,这个有什么用?答案是用于回溯,因为信号基于当根bar(假设是图表上第51根bar)执行计算时,有时需要回溯当根bar前若干根bar上的信息进行计算判断(假设此时当根bar为图表上第51根bar,即图中的21:51分钟的收盘时间线位置,而信号基于第51根bar进行计算时,需要调用图表上第49根bar上的收盘价信息,那么此时就需要进行回溯);退一步考虑,若最大bar数量设置为0,而当根bar为图表上第1根bar,并且信号基于当根bar的计算时需要调用前1根bar上的信息,例如收盘价信息,但是此时当根bar就是图表上第1根bar,从而当根bar前面没有bar可用于回溯调用。这就是最大bar数量的用途所在。

1. 最大bar数量

  相对编号和绝对编号

  下方当我们涉及到最大bar数量时,我们始终将策略属性中的最大bar数量设置成默认的50,为方便叙述起见。引入了最大bar数量之后,就引入了两个概念,分别是bar的相对编号和绝对编号。Bar的编号是每根bar的一个位置,位置分为相对位置和绝对位置;bar的绝对编号就是绝对位置,和最大bar数量没有关系,它是基于图表中第1根bar依次进行编号的,即图表中第1根bar的绝对编号为1,第51根bar的绝对编号为51;bar的相对编号就是相对位置,它是基于图表中最大bar数量之后的bar依次进行编号的,一句话就是,bar的相对编号=bar的绝对编号—最大bar数量。

    关键字currentbar返回的数值就是当根bar的相对编号,关键字maxbarsback反映的数值就是策略属性中设置的最大bar数量;基于这两个关键字,当根bar的绝对编号就等于两个关键字的返回值之和。

 

 

2. 回溯

 

  如所示,我们以相对编号为1的bar为当根bar进行分析,也就图中收盘时间为21:51的时间线所在的位置为当前策略(信号)正在执行计算的位置,可以看出,当根bar的bar编号=51,这个是它的绝对编号,图表显示出来的bar的编号都是绝对编号。基于当根bar进行计算时,需要调用前几根bar的信号,例如调用前几根bar上的收盘价进行分析,相应的代码如下:

 

//信号代码
if currentbar=1 then begin
print("currentbar=",currentbar,",time[0]=",time[0],",close[0]=",close[0]);
          print("time[1]=",time[1],",close[1]=",close[1]);
          print("time[2]=",time[2],",close[2]=",close[2]);
          print("time[3]=",time[3],",close[3]=",close[3]);
          print("time[4]=",time[4],",close[4]=",close[4]);
          print("time[5]=",time[5],",close[5]=",close[5]);
          print("time[6]=",time[6],",close[6]=",close[6]);
          print("time[7]=",time[7],",close[7]=",close[7]);
          print("time[8]=",time[8],",close[8]=",close[8]);
end;
//输出
currentbar=   1.00,time[0]=2151.00,close[0]=3354.00
time[1]=2150.00,close[1]=3353.00
time[2]=2149.00,close[2]=3353.00
time[3]=2148.00,close[3]=3352.00
time[4]=2147.00,close[4]=3352.00
time[5]=2146.00,close[5]=3351.00
time[6]=2145.00,close[6]=3350.00
time[7]=2144.00,close[7]=3353.00
time[8]=2143.00,close[8]=3353.00

  在当根bar的位置调用当根bar的收盘价可以使用close[0]或者close即可,对应到图2中的“0”标记;调用前第1根bar的收盘价可以使用close[1]即可,对应到图2中的“1”标记;调用前第2根bar的收盘价可以使用close[2]即可,对应到图2中的“2”标记;调用前第3根bar的收盘价可以使用close[3]即可,对应到图2中的“3”标记,其它以此类推即可,但是最多只能回溯前第50根bar的收盘价,因为回溯的数量不能超过策略属性中的最大bar数值50。

 

  但是并不是所有的关键字都有回溯的功能,比如关键字currentbar就不能进行回溯,currentbar[1]始终返回的数值等于currentbar返回的数值;关键字currentbar不能进行回溯,但是使用currentbar[2]这种形式并不会报错,只是currentbar[2]始终等于currentbar,对于currentbar[3]、currentbar[4]也始终等于currentbar的返回值。其它不能回溯的关键字在这里不一一叙述,请参考关键字currentbar的使用情况;我们可以将其数值赋值给变量,然后通过变量的回溯功能来回溯前第N根bar上的currentbar的数值,代码如下:

 

//信号代码:
value1=currentbar;
print("currentbar=",currentbar,",value1=",value1,",value1[1]=",value1[1]);
//输出
currentbar=   1.00,value1=   1.00,value1[1]=   0.00
currentbar=   2.00,value1=   2.00,value1[1]=   1.00
currentbar=   3.00,value1=   3.00,value1[1]=   2.00

 

3. symbol系列关键字

  symbol系列关键字有symbol_close、symbol_currentbar、symbol_length、symbol_time、symbol_date、symbol_downticks、symbol_high、symbol_low、symbol_open、symbol_openint、symbol_tickid、symbol_ticks、symbol_time、symbol_time_s、symbol_upticks、symbol_volume,但是本文并不打算将symbol系列关键字全部进行阐述清楚,我们只选择如下4个进行阐述,其它的symbol类关键字以此类推即可;之所以阐述symbol系列关键字,是因为它们在使用上不受最大bar数量的限制,这点是关键的地方。

 

Symbol关键字名称

简介

Symbol_close

返回bar的收盘价

Symbol_currentbar

返回bar的绝对编号

 


情景一:

 

//信号代码
if currentbar=1 then
    close[51];

 

  由于这段代码的存在,会弹出一个窗口报错提示“指标运算试图参考的bar的数量(51)比当前设置的“指标运算参考的最大bar数量”多,这是因为最大bar数量设置为50,而关键字close调用了前第51根bar上的收盘价,回溯的数量已经超过了最大bar数量50的限制,这是不允许的。

 

情景二:

 

//信号代码
if currentbar=1 then
    symbol_close[51];

 

  这段代码的存在仍然会弹出一个与情境一相同的窗口报错提示,但是这里我们的解释与上面不一样;报错的原因是因为关键字symbol_close调用(回溯)不存在的bar上的收盘价信息而导致报错提示;因为相对编号为1的bar的前面最多只有50根bar,所以最多只能调用(回溯)前第50根bar上的数据,这点与最大bar数量限制没有关系。

 

情景三:

 

//信号代码
if currentbar=10 then
    close[51];

 

  这段代码的存在会弹出一个与情境一相同的窗口报错提示,原因与情境一完全一样,是因为回溯的数量超过了最大bar数量50的限制。

 

 

情景四:

 

//信号代码
if currentbar=10 then
    symbol_close[51];

 

  这段代码的存在不会弹出窗口报错提示,原因是因为相对编号为10的bar的前面有59根bar,这个数量大于当前回溯的数量51,所以不会报错。

  通过这4个情境,我们已经将symbol_close与close的区别阐述清楚了,前者不受策略属性中的最大bar数量的限制,而后者会受最大bar数量的限制。对于其它的symbol类关键字,请参考symbol_close与close之间的区别。

关键字Symbol_currentbar的返回值等于currentbar与maxbarsback的返回值之和,它表示的是当根bar的绝对编号,这是与currentbar的唯一区别;symbol_currentbar和currentbar这两个关键字都不能回溯。

 

 

=================================================

之前的文章感谢大家的转载,希望转载时请注明出处,本人转自其它网站的图表一并感谢,谢谢~!

https://www.cnblogs.com/noah0532/

原文地址:https://www.cnblogs.com/noah0532/p/13718080.html