各位老师好,我在编写策略的时候,想实现一个需求:即在开盘第一根K线未突破上轨时,马上出局。于是选择使用了onbarclose代码,但今天开盘时程序立即执行了程序,如下图所示:
于是我打开程序检查代码,如下所示:
OnBarClose(ArrayRef<Integer> indexs)
{
//如果在10:00前没有向上突破,且昨日有持仓,则平仓
If(data1.time == 0.093 and Data1.High <= BuyLine)
{
data1.Commentary(data1.time= + TimeToString(data1.time));
data1.Commentary(Data1.High[1]= + text(Data1.High[1]));
data1.Commentary(BuyLine= + text(BuyLine));
Range[2:datacount-1]
{
if(MarketPosition==1)
{
SellForIndexOption(lots,Close);
FileAppend(c:\\\\DT_Option_Debug,data1.time= + Text(data1.Time) + CurrentDate= + DateToString(CurrentDate) + CurrentTime= + TimeToString(CurrentTime)
+ Data1.High[1]= + Text(Data1.High[1]) + Buyline= + Text(BuyLine) + SellLine= + Text(SellLine) + 此时价格为
+ Text(data1.close) + ,未向上突破buyline,平仓所有合计 + text(lots) + 张看涨期权 );
data1.PlotString(Cover,平仓,low,red);
lots = 0;
}
}
}
}
对上文的代码简单解释一下:
1、代码是在onbarclose中执行,已用红色字段加粗,
2、限制time==0.093这根K线才执行,即9:30这根K线收盘后才执行。
3、SellForIndexOption(lots,Close);是我自己封装的函数,里面的代码就是平仓函数sell
4、使用了多图层,结构如下所示:
事后我查看了交易的实数数据,发现程序在9点29分29秒即触发了交易,而我希望其在10:00才触发。
这与onbarclose的设计并不相符,这是为何?是我对这个函数的机制理解不对吗?请老师指导。
onbarclose如果没有设置settrigger的话 实际上是在下一根bar的onbaropen前驱动的,只不过bar数据还是当前bar
你是数据叠加了吧
这个onbarclose实际上应该是另外一个图层驱动的
你应该检查一下驱动参数indexs是不是你想进行操作的data1
我盲猜实际上indexs里驱动的应该是0
如果我希望使用图层1的数据进行驱动,是否应该相关的代码要加上range[1:1]?但代码需要轮询每个期权合约,将其进行平仓操作,此时也要用到range[],可TB不允许range进行嵌套,该如何编写此项需求?
是否在应该把raneg[1:1]改为 if(indexs,1) ?