策略思路是:开盘价突破布林线上下轨开仓,高低点触碰中轨平仓。
需求是用此策略在多图层下限制总持仓品种数,由于只用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类文件,故修改了后缀名,改回来便可。
你这个是跨周期还是什么?
如果不跨周期别做数据对齐,这个没做好就会让信号闪烁的
刘老师好,我这个策略是用在多图层相同周期多品种上的,实在是无法解决这个问题。
另外“如果不跨周期别做数据对齐,这个没做好就会让信号闪烁的” 如何理解?多图层不也得做数据对齐吗,否则信号闪烁很厉害啊