多图层下onbaropen域执行机制疑问

策略思路是:开盘价突破布林线上下轨开仓,高低点触碰中轨平仓。需求是用此策略在多图层下限制总持仓品种数,由于只用open进行开仓判断,而平仓在K线运行中随时都可能发生。不希望在K线运行中出现开仓信号,否则开仓位置与历史测试差距比较大,不好判断实际运行结果。故选择使用onbaropen域执行开仓信号,代码是按照这个思路来考虑的,代码进行了数据对齐判断,只有在所有图层数据都对齐时才进行开仓操作,历史测试时结果正常,而实盘时会发现策略只执行平仓,并不执行开仓。经过测试观察:1、目前的猜测是在onbaropen域的range下当数据对齐时有的品种虽然符合开仓信号,但已经过了开盘价执行范围或时间,无法执行开仓动作。不知我的理解是否正确?2、onbaropen域的开仓动作具体执行机制是什么,是否有执行范围和时间限制?3、还有没有其他方案可以实现在多图层数据对齐后单根K只执行一次开仓动作的需求? Params Numeric Length(15); Numeric StdDevUp(1.6); Numeric ChicangN(3); // Vars Series<Numeric> UpperBand; Series<Numeric> LowerBand; Series<Numeric> AveMa; Series<Numeric> lots; Series<Numeric> Bars; Numeric StdValue; Numeric i; Integer ChiCangUp; Integer ChiCangDo; Numeric ChiCang; bool GuoLv; Numeric ii ; Numeric result(1); Integer di; Global Integer AAA; Events OnInit() { Range[0:DataCount-1] { AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓 } } OnBarOpen(ArrayRef<Integer> indexs)//在onbaropen域根据开盘价进行开仓 { Range[0:DataCount-1] { //==============================//判断K线是否对齐 For ii=0 to DataSourceSize-1 { result=result*data[ii].Barexiststatus; } //if(result<>1) Return; //============================== //==============================//指标计算 /*lots = 1000/(StdDevUp*StandardDev(O,Length) * ContractUnit()*BigPointValue()); lots = IntPart(lots); // 对小数取整 if (lots<1)*/ lots = 1; AveMa=Average(O,Length); StdValue = StandardDev(O,Length); UpperBand=Avema+StdDevUp*StdValue; LowerBand=Avema-StdDevUp*StdValue; Bool OUpBand=CrossOver(O,UpperBand); Bool ODownBand=CrossUnder(O,LowerBand); PlotNumeric(\"UpperBand\",UpperBand); PlotNumeric(\"LowerBand\",LowerBand); PlotNumeric(\"AveMa\",AveMa); GuoLv= CurrentBar>=Length*2 /*&& OpenInt>50000*/ && result==1; //==============================================================//统计所有图层中多单或空单持仓品种数 if(GuoLv)//数据对齐后进行如下操作 { ChiCangUp=0; ChiCangDo=0; For i=0 to DataCount-1 { if(Data[i].MarketPosition>0) { ChiCangUp=ChiCangUp+1; } if(Data[i].MarketPosition<0) { ChiCangDo=ChiCangDo+1; } } ChiCang=ChiCangUp+ChiCangDo; //==============================================================//开仓必须满足数据对齐和持仓品种限制,开仓条件为开盘价突破布林轨道 If(MarketPosition<1 && OUpBand && ChiCang<ChiCangN && GuoLv) { Buy(Lots,Open); Print(\"===+======+===+===\"); Print(\"开仓==\"+Text(88888)); } If(MarketPosition>-1 && ODownBand && ChiCang<ChiCangN && GuoLv) { SellShort(Lots,Open); Print(\"===+======+===+===\"); Print(\"开仓==\"+Text(88888)); } AAA=AAA+1; Commentary(\"Chicang==\"+Text(ChiCang)); Print(\"result==\"+Text(result)); Print(\"Chicang==\"+Text(ChiCang)); Print(\"AAA==\"+Text(AAA)); Print(\"===+======+===+===\"); } } } onBar(ArrayRef<Integer> indexs)//在onbar域根据实时价格进行平仓,条件为高低点碰到中轨 { Range[0:DataCount-1] { If(MarketPosition>0 && L<=AveMa && BarsSinceEntry>0) { Sell(0,Min(Open,AveMa)); } If(MarketPosition<0 && H>=AveMa && BarsSinceEntry>0) { BuyToCover(0,Max(Open,AveMa)); } } } OnBarClose(ArrayRef<Integer> indexs)//在onbarclose域初始化全局变量 { if(AAA>0) AAA=0; Print(\"++++++++++++++++++\"); Print(\"AAA==\"+Text(AAA)); Print(\"++++++++++++++++++\"); } //======================================================================// 策略单元已上传到附件,由于不能传xml类文件,故修改了后缀名,改回来便可。

你这个是跨周期还是什么?如果不跨周期别做数据对齐,这个没做好就会让信号闪烁的

回复:刘老师好,我这个策略是用在多图层相同周期多品种上的,实在是无法解决这个问题。另外“如果不跨周期别做数据对齐,这个没做好就会让信号闪烁的” 如何理解?多图层不也得做数据对齐吗,否则信号闪烁很厉害啊