分享

量化投资

 taozl 2022-09-23 发布于安徽

第十一章:最大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/

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多