OnBarcalose在跨周期有重大BUG。大家引起注意。

Params Numeric NumberONE(1); //开仓数 Numeric Q(9); //过阈值 9 Numeric N(120); //分水岭 120 Vars Series<Numeric> H1; Series<Numeric> L1; Series<Numeric> H2; Series<Numeric> L2; Series<Numeric> K1; Series<Numeric> K2; Series<Numeric> G; Series<Numeric> MA; Numeric MinPoint; Bool Condition1; Bool Condition2; Numeric Condition3; Numeric Condition4; Numeric Condition5; Numeric Condition6; Events OnInit() { SetbeginBarMaxCount(-1); SubscribeBar(data0.symbol, \"5m\",Data0.BeginDateTime); /* Range[0:DataCount-1] { AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 SetOrderMap2MainSymbol(); //设置委托映射到主力 SetSlippage(Enum_Rate_PointPerHand,1); //设置滑点为2跳/手 SetOrderPriceOffset(0); //设置委托价为叫买/卖价偏移2跳 SetInitCapital(1000000); //设置初始资金为X万 } */ } OnBarClose(ArrayRef<Integer> indexs) { Range[0 : DataCount - 1] { H1 = IIF(H<H[2] And H[1]<H[2],H[2],0); L1 = IIF(L>L[2] And L[1]>L[2],L[2],0); If(H1>0) H2 = H1+2*MinPoint; If(L1>0) L2 = L1-2*MinPoint; K1 = IIF(C>H2,-1,IIF(C<L2,1,0)); If(K1<>0) K2 = K1; MinPoint = MinMove*PriceScale; G = IIF(K2==1,H2,L2); MA = XAverage(C,N); } Range[1 : 1] { Plotauto(\"data1.G\",data1.G,0,Yellow,Enum_Solid,Enum_Line,Enum_2Pix); Plotauto(\"data1.MA\",data1.MA,0,Red,Enum_Solid,Enum_Line,Enum_2Pix); } Range[0 : 0] { //Plotauto(\"data1.G\",data1.G,0,Yellow,Enum_Solid,Enum_Line,Enum_2Pix); // Plotauto(\"data1.MA\",data1.MA,0,Red,Enum_Solid,Enum_Line,Enum_2Pix); } } OnBar(ArrayRef<Integer> indexs) { Condition1 = data0.C[1]>data1.G[1] And data0.H>data0.H[1] And data0.H>data1.G[1]+Q*MinPoint ; Condition2 = data0.C[1]<data1.G[1] And data0.L<data0.L[1] And data0.L<data1.G[1]-Q*MinPoint ; Condition3 = Max(Max(Max(data0.H[1],data0.O),data1.G[1]+Q*MinPoint),data1.MA[1]); Condition4 = Min(Min(Min(data0.L[1],data0.O),data1.G[1]-Q*MinPoint),data1.MA[1]); Condition5 = Max(Max(data0.H[1],data0.O),data1.G[1]+Q*MinPoint); Condition6 = Min(Min(data0.L[1],data0.O),data1.G[1]-Q*MinPoint); If(MarketPosition == 1) //平多 { If (Condition2 And BarsSinceEntry > 0 ) Sell(0,Condition6); } If(MarketPosition == -1) //平空 { If (Condition1 And BarsSinceEntry > 0 ) BuyToCover(0,Condition5); } If(MarketPosition == 0 ) { { //开多 If (Condition1 And data0.H>data1.MA[1] ) Buy(NumberONE,Condition3); } { //开空 If (Condition2 And data0.L<data1.MA[1]) SellShort(NumberONE,Condition4); } } Commentary(\"浮动盈亏=\"+text(Portfolio_PositionProfit));//当前持仓浮动盈亏 Commentary(\"建仓价格=\"+text(EntryPrice));//当前持仓建仓价格 Commentary(\"净持仓=\"+text(MarketPosition));//当前持仓净持仓 }

每节都听,而且也都下载了,反复看。。。。我再详细看看,谢谢老师详细讲解。

kyover老师,我要是只运行data1图层的onbarclose,改怎么修改呢?针对跨周期?

回复:onbarclose返回的参数indexs里会记录驱动图层的序号你如果想只在data1图层发生驱动的时候执行代码,那就用分支结构判断indexs数组里是否含有1元素这些机制应该在视频课程里都有详细介绍过 https://www.tbquant.net/TrainDetail?id=194

第一 你给的代码无法完全复现你图表里展示的内容,需要进行调整才能变成你图上的样子。我自己调整了一下,但是不能确定调整的部分是不是会导致差异的部分。第二 你的onbarclose里代码没有限定data1图层的代码只有在data1图层驱动的时候才运行,所以data0的图层发生驱动,导致代码执行,然后data1图层画出了点。而下面一张图,只有一个图层,确实没有发生驱动,就不会执行代码,这个效果是符合说明文档里的运行机制说明的第三 建议你在没有完全掌握语法机制的前提下,不要随随便便拉个标题“重大bug”,本来以为真的是有什么bug,结果发现只是你没搞明白运行机制而已,久而久之问题就不想回答了。

1