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的意愿.
说下我的理解,不管放在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正常发单,没问题的.