反馈一个小问题

onbarclose 运行下,如果配合SetTriggerBarClose计算下单信号.

在上一跟bar结束的时候,新bar产生交易信号的一瞬间, 会判定为上一根bar的onbarclose, 然后信号马上消失,当新bar走完的时候信号会再次出来. 

我不确认是否使用了SetTriggerBarClose才会出现这种情况. 

我分析可能是因为onbarclose是根据新bar出来的时候触发导致的.

 

代码复现是这样的

SetTriggerBarClose([0.1429,0.1459]);

OnBarClose(ArrayRef<Integer>indexs)

    If(MarketPosition == 0 && h > tiaojian) {Buy(1,h);

 

很明显,这里是希望在14:29判断条件是否通过,然后进行下单. 如果条件不通过,应该在14:59再判断一次. 

14:30时, 新K线出来, 新K线条件通过时,应该是没有下单的,应该等到14:59再下单. 

但是实际情况是,14:30会触发下单,然后信号马上消失. 

这样的话,很明显违背了OnBarClose的意愿.

quant1.3.2.2 测试发现的4个小问题,希望反馈给开发。
反馈一个会导致BUG的问题
关于vol>0的小问题
问题反馈
代码小问题
系统自带的海龟交易系统里的一个小问题
请教一个小问题,TBQuant3怎么手动撤单?
bug反馈
问题反馈
学习使用tbquant3 遇到的小问题 截图说明

说下我的理解,不管放在OnBar还是OnBarClose,图表信号的逻辑是没变的。您的写法 If(MarketPosition == 0 && c > condition)很有可能某根历史BAR也会满足开多条件的。如果上面贴的代码就是您全部代码的话,那这个代码是不完整的,只有做多的条件,多头平仓写成了空头开仓,然后没有空头平仓的代码,所以开空后,就什么也不做了。

您说的本来应该20220106.211452开仓,实际却在21:00发单,可能就是这个问题。

这也是我为甚么加上Date==20220106来约束的原因,否则满足h > tiaojian条件的历史BAR太多了,根本就无法测试OnBarClose提前发单的逻辑。实际上,因为是测试,我就是盯着这个行情来写的这段代码,就是看准了57分那根BAR是符合开仓条件的,主要想看是否在58分会出现您说的信号闪下就消失的问题。

不好意思,大意了.实际上是应该是sell 

Params
    
Vars
    Array<Numeric> timepoint([0.091452,0.092952,0.094452,0.095952,0.101452,0.102952,0.104452,0.105952,0.111452,0.112952 ,0.131452,0.132952,0.134452,0.135952,0.141452,0.142952,0.144452,0.145952,0.151452 ,0.211452,0.212952,0.214452,0.215952,0.221452,0.222952,0.224452,0.225952,0.231452,0.232952,0.234452,0.235952,0.001452,0.002952,0.004452,0.005952,0.011452,0.012952,0.014452,0.015952,0.021452,0.022952]);     
    Natural Series<Numeric> condition;                 

Events

OnInit()
{
    SetTriggerBarClose(timepoint);

}


OnBarClose(ArrayRef<Integer>indexs)
{
Range[0:DataCount-1]
{
    condition=Average(Close,20);
    If(MarketPosition == 0 && c > condition)Buy(1,c);
    If(MarketPosition == 1 && c < condition)Sell(1,c);
}
}

 

并不是因为开仓和平仓的问题, 我实际测试的是代码这块设置是正确的.  确实会出现我描述的那个问题. 

不好意思,大意了.实际上是应该是sell 

并不是因为开仓和平仓的问题, 我实际测试的是代码这块设置是正确的.  确实会出现我描述的那个问题. 

 

您测试的时候,Date==20220106 这个表述可能对时间有约束,毕竟20220106.1457这个时间是唯一的. 而我希望用 SetTriggerBarClose 来实现在K线走完前提前N秒发单.

您好!麻烦您告诉下在什么周期下运行的策略?

15m,30m,任何低于日线周期下都会出现这个问题.  在onbarclose下,每次当新的K线出来的时候都会判断一次.

好的,我先跟踪下这个问题。谢谢您!

今天临收盘才测试了下,好像并没有出现您说的情况。您给的代码可能不完整,必须加上时间的限制,否则信号有可能在历史BAR上就出现了。

我后面的代码加上时间。晚上再找时间充分测试下

    OnBarClose(ArrayRef<Integer> indexs)
    {
        If(Date==20220106 And Time>=0.1457 && h > tiaojian) 
        {
            Buy(1,h);        
        }        
    }

非常感谢~是这样的, 一般情况下,需要上一根K线没信号,但新K线开盘即有信号的情况下,会被判定为开仓,随后信号消失.

一般新K线开盘有信号的情况有两种,一是跳空,二是指标的突然改变.

另外,我之前是把指标计算公式也放在onbarclose里面的.

公式结构:

Params
    
Vars
    Array<Numeric> timepoint([0.091452,0.092952,0.094452,0.095952,0.101452,0.102952,0.104452,0.105952,0.111452,0.112952 ,0.131452,0.132952,0.134452,0.135952,0.141452,0.142952,0.144452,0.145952,0.151452 ,0.211452,0.212952,0.214452,0.215952,0.221452,0.222952,0.224452,0.225952,0.231452,0.232952,0.234452,0.235952,0.001452,0.002952,0.004452,0.005952,0.011452,0.012952,0.014452,0.015952,0.021452,0.022952]);     
    Natural Series<Numeric> condition;                 

Events

OnInit()
{
    SetTriggerBarClose(timepoint);

}


OnBarClose(ArrayRef<Integer>indexs)
{
Range[0:DataCount-1]
{
    condition=Average(Close,20);
    If(MarketPosition == 0 && c > condition)Buy(1,c);
    If(MarketPosition == 1 && c < condition)SellShort(1,c);
}
}

后来我又把

condition=Average(Close,20);

放到onbar里面去计算,还是会出现这种情况.典型的是20220106.210000的黄金,本来应该是在20220106.211452开仓,却在210000发单了.

如果在0.210000的时候黄金不满足开仓条件, 则会在0.211452正常发单,没问题的.