(原创:Alex) 关于this bar和next bar的区别会涉及到barstatus关键字的用法,所以第一部位介绍barstatus关键字,第二部位介绍MC是如何判断当根bar结束,第三、四部分会分未开启bar、开启bar、回测及开启自动交易四种情况分别进行讨论,在此我们以”buy this bar at close;”和”buy next bar at market;”这两个委托语句来阐述this bar和next bar用法的区别,其它情况逻辑完全一致,所以不再阐述。
一、barstatus关键字 每根bar都是由一定数量的tick组成的(一个tick表示一笔成交,每笔tick只有一个价格),分为开盘tick、bar内tick和收盘tick,开盘tick就是形成bar的第一笔tick,收盘tick就是形成bar的最后一笔tick,bar内tick就是在bar的形成过程中产生的tick。而关键字barstatus用于返回当根bar中的tick的状态,barstatus返回为0时表示当前tick是开盘tick;barstatus返回为1时表示当前tick是bar内tick;barstatus返回为2时表示当前tick是收盘tick;除此之外,barstatus还会返回-1,这种情况会在调用子图时出现,关于barstatus返回-1更深入的介绍将在后续帖子中阐述。
二、判断当根bar结束 MC对于当根bar收盘的识别其实是以下一根bar的第一笔tick被接收为标志,也就是说,下一根bar第一笔tick有两个作用,它即表示当根bar的结束,也表示下一根bar的开始;这一点可以在开启bar内模式下(可选用不活跃合约测试),使用语句”print(“ currentbar=”,currentbar,” barstatus=”,barstatus);”进行测试,当接收到下一根bar第一笔tick时,会计算两次,第一次计算输出当根bar的编号及收盘tick的状态(即2),第二次计算输出下一根bar的编号及开盘tick的状态(即0)。若一直未收到下一根bar的第一笔tick怎么办,是否当根bar就永远不识别为结束?并不是这样,MC会以5分钟为限,若5分钟内接收不到下一根bar的第一笔tick,那么MC也会认识当根bar结束,并且会信号脚本会计算一次;这就是为什么使用”buy this bar at close;”委托语句在交易时段最后一根bar上满足条件时并且发送委托单,为什么结果5分钟后收到委托拒绝的提示“非交易时间”,那是因为5分钟后,MC识别当根bar已经结束,此时信号脚本会计算一次并且发送委托单,由于是非交易时间,所以会被拒绝。
由于当根bar的结束是以下一根bar的开盘tick为判断,所以收盘tick并不是真实的从交易所接收的tick,收盘tick没有成交量,收盘tick的价格取bar内最后一笔tick的价格(即最后一笔bar内tick的价格),开盘tick和bar内tick都是从交易所接收的真实的tick(即有真实的价格,也有真实的成交量);关于这点,可以在开启bar模式,精细回测或者自动交易时测试通过print语句将相关信息输出进行测试,”print("currentbar=",currentbar," close=",close," barstatus=",barstatus," ticks=",ticks);“。
三、未开启bar内模式 未开启bar内模式情况下,信号脚本(交易策略是由若干个信号组成的,也可以由一个信号脚本组成)会在当根bar结束的时候计算一次程序,当根bar结束的标志是以接收到下一根bar的第一笔tick;由于只会计算一次,所以使用语句”print(“ currentbar=”,currentbar,” barstatus=”,barstatus);”测试时,会输出当根bar的编号及收盘tick的状态(即2)。
1、 回测 对于委托语句”buy this bar at close;”,信号脚本会在当根bar收盘时计算一次程序,若条件满足时会以当根bar的收盘价成交,所以在图表上回测时会看到进场位置标记在当根bar下方,而不是下一根bar的下方。 对于委托语句”buy next bar at market;”,信号脚本会在当根bar收盘时计算一次程序,若条件满足时会以下一根bar的开盘价(即开盘tick的价格)成交,所以在图表上回测时会看到进场位置标记在下一根bar的下方,而不是当根bar的下方。 对于两者在未开启bar并且回测时的区别,由于都是在当根bar收盘时计算(即收盘tick),然后由于成交的价格一个取的是当根bar的收盘tick的价格、另一个取的是下一根bar的开盘tick的价格导致在图表上显示的位置不一致。
2、 开启自动交易 开启自动交易时,无论是AA模式还是SA模式,两者实际的发单效果是完全一样的,没有逻辑上的差异;信号脚本都在在收盘tick时计算一次程序,当条件满足时即发送市价单,而最终市价单会以什么价格成交,这个是由市场决定的,并不会因为this bar和next bar的区别而影响。
AA模式时,图表上进场出场部位的显示情况,其实和回测时的部位显示情况一致(对于这一点,只是初步测试,并没有完全测试),所以”buy this bar at close;”的进场位置会在当根bar上,图表上显示的成交价格是当根bar的收盘价,而”buy next bar at market;”的进场位置会在下一根bar上,图表上显示的成交价格是下一根bar的开盘价。
SA模式时,图表上进场出场部位的显示情况是以实际成交情况会依据,所以”buy this bar at close;”和”buy next bar at market;”的进场位置会在下一根bar的下方,图表上显示的成交价格也是实际的成交价格。
四、开启bar内模式 开启bar内模式,信号脚本会基于每笔tick计算一次(基于开盘tick、bar内tick、收盘tick进行计算)。若当根bar实际由120笔tick组成,那么通过”print(“currentbar=”,currentbar,” barstatus=”,barstatus);”测试时,会发现当根bar计算了121次,最后一次是基于当根bar的收盘tick进行的计算。所以对于某些会涉及统计成交笔数、成交量等信息进行委托下单时,需要通过barstatus=2将收盘tick的信息过滤掉。
1、 精细回测 对于委托语句”buy this bar at close;”,即使在开启bar内的情况,也会在信号脚本基于收盘tick计算时,条件满足才会发送委托单;所以”buy this bar at close;”并不会在bar内发送委托单。精细回测时,”buy this bar at close;”会在当根bar收盘(基于收盘tick的计算)时并且条件满足时,以当根bar的收盘价成交,也就是在图表上当根bar下方显示进场标记,在图表上显示的进场价格是当根bar的收盘价。
对于委托语句”buy next bar at market;”,会分两种情况,第一种是信号脚本基于开盘tick和bar内tick计算时,委托语句”buy next bar at market;”会以当笔tick的价格成交,进场位置会在图表上的当根bar下方显示,成交价格是当根bar的当笔tick的价格,例如,若信号脚本在开盘tick(即barstatus=0时)时计算时,进场价格取开盘tick的价格;第二种是信号脚本基于收盘tick计算时,委托语句”buy next bar at market;”会以下一根bar的开盘tick的价格成交,进场位置会在图表上的下一根bar的下方显示,成交价格是下一根bar的开盘tick的价格。
2、 开启自动交易 对于委托语句”buy this bar at close;”,信号脚本的计算基于收盘tick计算时,会发送市价委托单,由于是否开启bar内模式对this bar的发送委托单没有影响,所以会和未开启bar模式下的自动交易一致(包括图表显示),请参考上面相关内容。
对于委托语句”buy next bar at market;”,信号脚本在基于每笔tick计算(开盘tick、bar内tick和收盘tick)时都会发送市价委托单;若当根bar实际上由33笔tick组成,那么委托语句”buy next bar at market;”会发送34笔市价单,因为信号脚本在基于收盘tick计算时也会发送委托单。
对于两者发送的委托单最终的成交价格受市场影响,并不因为this bar和next bar的区别而影响。SA模式下,两者在图表上显示的位置及价格依据实际成交情况;AA模式下,两者在图表上显示的位置及价格和上面的精细回测一致(只是初步测试,并没有完全测试),并不依据实际成交情况。 |