信号闪烁是代码逻辑问题这无可厚非,理当从源头解决,但tbQ3的处理方式太不友好了。 出现开仓信号就已经发出了开仓指令,但当提示“信号闪烁”后,MarketPosition又直接变成了0,这样符合了开仓条件造成不断开仓,直至满仓(极端情况下)。
用tbQ3不只是做回测,还请考虑一下实盘用户的需求,能改进一下——出现信号闪烁能不能只提示,而不将MarketPosition清0。
可是你回测时候就会警告信号闪烁啊!这个时候不就是应该把信号闪烁解决了再实盘吗??
https://video.tbquant.net/video?id=20250310103731783228
看看这节视频吧,信号闪烁不是一定要跑运行自动交易才会警告的,历史信号也可以警告的
这都凌晨了 还在加班....
公司不扣你加班的电费?
😅
谢谢!
您好,您对TB的机制可能还不算完全了解,即使没有信号消失,TBQ3盘中实时运行时,每个Tick运行公式时,MarketPosition都会传递上一个bar的状态,这样才能保证公式编写正确时,不会误把信号消失掉。
我可以举个例子,帮助您理解。例如我写下面的这一句:
if(MarketPosition<>1 And High>=High[1]) Buy(1,Max(Open,High[1])));
这句命令,绝对是编写正确的,没有任何毛病。假如在一根bar中,最高价突破了上一bar的最高价,产生了交易信号,并且发出了委托,请问下一个Tick运行公式,运行到这一语句时,您觉得marketPositon等于1吗?
我估计您的回答应该是,MarketPosition=1,但实际是MarketPosition<>1。因为,如果MarketPosition等于1,那上面这一句就不满足条件了,反而会导致买入的这个信号消失了,那这样,编写正确的公式反而运行不正常了。所以,TB公式运行机制,会在每个tick运行公式时,回到最初始的状态,也就是从上一个bar传递过来时的状态。
理解了这一点,我再回答您说的重复发单的问题,在同一根bar中,同一句命令,因为信号一会有,一会又消失,这个是不会重复发单,只会发一次单,只有换了一根bar,才有可能再次发单,但一根bar同一个信号只会发单一次。
谢谢您的解答,补充一下,我用tick数据开平仓(引用的15秒周期的信号),确实是在不同的tick bar重复开仓了。开仓条件是 MarketPosition==0,因为信号闪烁,成功开仓发出指令后,MarketPosition仍然是0,所以当下一个bar条件满足时,又继续开仓了。
要么开平仓放在tick上
如果在bar上 自己用序列变量或全局变量控制