多图层下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类文件,故修改了后缀名,改回来便可。

评论区
rsdy184****1520

刘老师好,我这个策略是用在多图层相同周期多品种上的,实在是无法解决这个问题。

另外“如果不跨周期别做数据对齐,这个没做好就会让信号闪烁的”  如何理解?多图层不也得做数据对齐吗,否则信号闪烁很厉害啊

2024-09-18 12:02
顶部