我对关于TB交易信号丢失的理解
[color=#464646][font=simsun]最近和朋友讨论了很多关于TB交易信号丢失的问题,即从bar数据看满足了交易条件,应该发出交易信号,但是实际上图表显示又没有发出交易信号。[/font][/color][color=#464646][font=simsun]比如写的代码逻辑是:[/font][/color]
[color=#464646][font=simsun]if(close>close[1])[/font][/color]
[color=#464646][font=simsun]{[/font][/color]
[color=#464646][font=simsun]buy(...)[/font][/color]
[color=#464646][font=simsun]}[/font][/color]
[color=#464646][font=simsun]从形成的bar看来,close明明是大于close[1]的,[/font][/color][color=#464646][font=simsun]但并没有执行buy(...)而显示交易信号。[/font][/color]
[color=#464646][font=simsun]我实验并总结了一下其中的原因,主要有两个可能性:[/font][/color]
[color=#464646][font=simsun]1.程序代码段过长,最后形成bar的ti[/font][/color][color=#464646][font=simsun]ck数据到来时被丢失了。[/font][/color]
[color=#464646][font=simsun]2.TB的一些保留变量在最后一个tick数据到来时,被系统更改了值,而影响了程序的执行。[/font][/color]
[color=#464646][font=simsun]先说第一种情况。[/font][/color]
[color=#464646][font=simsun]。。。//这里的程序很长[/font][/color]
[color=#464646][font=simsun]。。。//[/font][/color]
[color=#464646][font=simsun]if(close>close[1])//没有执行到[/font][/color]
[color=#464646][font=simsun]{[/font][/color]
[color=#464646][font=simsun]buy(...);[/font][/color]
[color=#464646][font=simsun]}[/font][/color]
[color=#464646][font=simsun]就如示例所说,由于if(close>close[1])前面的程序很长,当最后一个tick到来确认了bar的close的时候,前面的程序还没有执行完,所以就被丢失掉了,即使close>close[1]了,也没有在这根bar上执行buy(...),而进入了下一根bar,所以本该在这根bar上显示的交易信号也被丢失掉。[/font][/color]
[color=#464646][font=simsun]再说第二种情况,TB里面有很多系统维护的保留变量,比如BarStatus,A_BuyPosition等等,在最后一个tick数据到来的时候,系统要对其作出修改。比如BarStatus,当最后一个tick数据到来前,系统认为这根bar为最后一根bar,因此BarStatus==2,但最后一个tick数据到来后,下一个tick数据到来前,系统认为这根bar已经为倒数第二根bar了,因此将修改BarStatus的值为1。如果程序里面有:[/font][/color]
[color=#464646][font=simsun]if(BarStatus==2&&close>close[1])[/font][/color]
[color=#464646][font=simsun]{[/font][/color]
[color=#464646][font=simsun]buy(...);[/font][/color]
[color=#464646][font=simsun]}[/font][/color]
[color=#464646][font=simsun]这样的代码,当最后一个tick数据到来时,是不会执行buy(...);的,所以即使close>close[1]了,也没有在这根bar上执行buy(...),所以本该在这根bar上显示的交易信号也被丢失掉。[/font][/color]
[color=#464646][font=simsun] 再如A_BuyPosition,系统只会对最后一根bar维护其值,所以当最后一个tick数据到来后,下一个tick数据到来前(最后一根bar还没有形成),A_BuyPosition将会是无效值。如果程序里面有:[/font][/color]
[color=#464646][font=simsun]if(A_BuyPosition>0&&close>close[1])[/font][/color]
[color=#464646][font=simsun]{[/font][/color]
[color=#464646][font=simsun]buy(...);[/font][/color]
[color=#464646][font=simsun]}[/font][/color]
[color=#464646][font=simsun]这样的代码,当最后一个tick数据到来时,是不会执行buy(...);的,所以即使close>close[1]了,也没有在这根bar上执行buy(...),所以本该在这根bar上显示的交易信号也被丢失掉。[/font][/color]
[color=#464646][font=simsun]下图是我实验的结果:[/font][/color]
[url=http://photo.blog.sina.com.cn/showpic.html#blogid=56e7157f0101610o&url=http://s6.sinaimg.cn/orignal/56e7157fxc2810e352da5][img=0,179]http://s6.sinaimg.cn/middle/56e7157fxc2810e352da5&690[/img][/url]
[color=#464646][font=simsun]我选取的bar是一分钟k线,可以看到,当使time=0.132700(代表13:27)更新到time=0.132800(代表13:28)的最后一个tick数据到来,驱使程序执行时,BarStatus值由2变为1,[/font][/color][color=#464646][font=simsun]A_BuyPosition由6变为N/A(无效值)。[/font][/color]
[color=#464646][font=simsun] 因此,在使用TB编写程序的时候,要尽量规避以上[/font][/color][color=#464646][font=simsun]谈到的两种问题,后面我会讲到[/font][/color][color=#464646][font=simsun]如何规范编程以避免出现以上问题。[/font][/color]
页:
[1]