Range[0:DataSourceSize()-1]
{
Raise = Round(10000 * (Close[1] - Close[6]) / AvgTR[1],0);
Drop = Round(10000 * (Close[6] - Close[1]) / AvgTR[1],0);
}
For i = 0 to DataSourceSize()-1
{
ArrayRaise[i] = Data[i].Raise;
ArrayDrop[i] = Data[i].Drop;
ArrayRaiseID[i] = i;
ArrayDropID[i] = i;
}
Na1Sort2(ArrayRaise,ArrayRaiseID,0,(DataSourceSize()-1),False); // 对上涨强度排序 这里会排序2、3次并形成信号闪烁
Na1Sort2(ArrayDrop,ArrayDropID,0,(DataSourceSize()-1),False); // 对下跌强度排序 这里会排序2、3次并形成信号闪烁
Print(Text(Date)+"ArrayRaiseID"+TextArray(ArrayRaiseID));
Print(Text(Date)+"ArrayDropID"+TextArray(ArrayDropID));
按照刘风老师对于截面策略的多品种排序,会发现Na1Sort2函数在多品种排序后,Print会形成几次数组,根据数组发单造成回测的信号闪烁,不知道这里面的问题是什么,计算上涨下跌调用的数据都是历史数据。
不知道你说的什么几次数组
猜测如果你这个代码在onbar下面实时tick是每次运行的
每个tick都会排序一次,如果价格变动过多的话,排序的结果自然马上变化
解决方法:走完K线执行开平仓
感谢您的回复!我也以为是调用了实时的数据造成的信号的闪烁,但是我反复检查并且确认只是用了回溯的数据,还是会有这样的问题。
所以怀疑是不是Na1Sort2函数哪里有问题或者使用错误
Params
//此处添加参数
Vars
//此处添加变量
Numeric i;
Series<Numeric> LastClose;
Array<Numeric> ArrayLastClose;
Array<Integer> ArrayLastCloseID;
Events
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
Range[0:DataCount-1]
{
AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());//设置忽略换仓信号计算
}
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
Range[0:DataSourceSize()-1]
{
LastClose = Close[1];
}
For i = 0 to DataSourceSize()-1
{
ArrayLastClose[i] = Data[i].LastClose;
ArrayLastCloseID[i] = i;
}
Na1Sort2(ArrayLastClose,ArrayLastCloseID,0,DataSourceSize-1,False);
Print(Text(CurrentBar)+"ArrayLastCloseID"+TextArray(ArrayLastCloseID));
}