- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
我对关于TB交易信号丢失的理解
最近和朋友讨论了很多关于TB交易信号丢失的问题,即从bar数据看满足了交易条件,应该发出交易信号,但是实际上图表显示又没有发出交易信号。
比如写的代码逻辑是:
if(close>close[1])
{
buy(...)
}
从形成的bar看来,close明明是大于close[1]的,但并没有执行buy(...)而显示交易信号。
我实验并总结了一下其中的原因,主要有两个可能性:
1.程序代码段过长,最后形成bar的tick数据到来时被丢失了。
2.TB的一些保留变量在最后一个tick数据到来时,被系统更改了值,而影响了程序的执行。
先说第一种情况。
。。。//这里的程序很长
。。。//
if(close>close[1])//没有执行到
{
buy(...);
}
就如示例所说,由于if(close>close[1])前面的程序很长,当最后一个tick到来确认了bar的close的时候,前面的程序还没有执行完,所以就被丢失掉了,即使close>close[1]了,也没有在这根bar上执行buy(...),而进入了下一根bar,所以本该在这根bar上显示的交易信号也被丢失掉。
再说第二种情况,TB里面有很多系统维护的保留变量,比如BarStatus,A_BuyPosition等等,在最后一个tick数据到来的时候,系统要对其作出修改。比如BarStatus,当最后一个tick数据到来前,系统认为这根bar为最后一根bar,因此BarStatus==2,但最后一个tick数据到来后,下一个tick数据到来前,系统认为这根bar已经为倒数第二根bar了,因此将修改BarStatus的值为1。如果程序里面有:
if(BarStatus==2&&close>close[1])
{
buy(...);
}
这样的代码,当最后一个tick数据到来时,是不会执行buy(...);的,所以即使close>close[1]了,也没有在这根bar上执行buy(...),所以本该在这根bar上显示的交易信号也被丢失掉。
再如A_BuyPosition,系统只会对最后一根bar维护其值,所以当最后一个tick数据到来后,下一个tick数据到来前(最后一根bar还没有形成),A_BuyPosition将会是无效值。如果程序里面有:
if(A_BuyPosition>0&&close>close[1])
{
buy(...);
}
这样的代码,当最后一个tick数据到来时,是不会执行buy(...);的,所以即使close>close[1]了,也没有在这根bar上执行buy(...),所以本该在这根bar上显示的交易信号也被丢失掉。
下图是我实验的结果:
我选取的bar是一分钟k线,可以看到,当使time=0.132700(代表13:27)更新到time=0.132800(代表13:28)的最后一个tick数据到来,驱使程序执行时,BarStatus值由2变为1,A_BuyPosition由6变为N/A(无效值)。
因此,在使用TB编写程序的时候,要尽量规避以上谈到的两种问题,后面我会讲到如何规范编程以避免出现以上问题。 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|