利用系统自带的Na1Sort2函数对多图层各个品种的同一个指标值进行从大到小排序后操作,但排序的结果有时对有时又是错误的,请老师帮忙看看代码的问题出在哪儿?应该如何调整?
//按照强弱排序后对多图层进行开仓操作
Params
Numeric Length(80);
Integer TOP(4);//筛选前多少名操作
Vars
Series<Numeric> ATR(0);
Series<Numeric> HD;
Series<Numeric> ZSE;
Series<Integer> Bars;
Series<Numeric> ZCN(0);
Numeric i;
Numeric j;
Array<Numeric> ArrayA;
Array<Numeric> ArrayB;
Array<Integer> ArrayAind;
Array<Integer> ArrayBind;
Array<Integer> ResultArray;
Array<Integer> JunkArray;
bool GuoLv;
bool UPK;
bool DNK;
Integer ChiCangUp;
Integer ChiCangDo;
Integer ChiCang;
Events
OnInit()
{
Range[0:DataCount-1]
{
AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); // 设置忽略换仓信号计算
}
}
onBar(ArrayRef<Integer> indexs)
{
Range[0:DataCount-1]
{
//===========================================================================
atr = AvgTrueRange(Length)/RollOver;//
ZCN=Round(Abs(((O-Xaverage(O,Length))*0.3+(Xaverage(O,Length*0.25)-Xaverage(O,Length))*0.3+(Xaverage(O,Length)-Xaverage(O,Length*4))*0.3)*10/atr[1]),3);//计算品种强弱数值
Commentary(强弱=+Text(ZCN));
}
for i=0 to datasourcesize-1//======================================把需要排序的指标值写入数组
{
ArrayAind[i]=i;
ArrayA[i]=data[i].ZCN;
}
//======================================
Na1Sort2(ArrayA,ArrayAind,0,datasourcesize-1,False);//==============按照指标值对品种进行从大到小排序
for i=0 to TOP-1//把排序后的品种图层筛选出预设数量按顺序装入结果数组
{
ArrayInsert(ResultArray,0,ArrayAind[i]);
}
//====================================== //输出一下排序结果
for i=0 to datasourcesize-1
{
Commentary(ArrayA[i]=+Text(ArrayA[i]));
Commentary(ResultArray[i]=+Text(ResultArray[i]));
}
//======================================
//======================================
}
经过修改与测试,问题已解决,多谢老师。
你应该是理解错了排序函数的意思
序号数组arrayfind经过na1sort2函数降序排序后,假如返回的是比如[3,1,0,2],他的意思是,现在排最高的是原始数据里序号为3,也就是第四个数组元素,同理排第二的是序号为1,也就是第二个数组元素。
拿你最后这图举例,resultarray[0] = 0,也就是第一个图层的数据是最大的,而第一个图层是142.832,确实是最大的。
resultarray[1] = 2,也就是第三个图层的数据是第二大的,而第三个图层的数据是36.874,确实是第二大的。
原来结果是正确的,多谢刘风老师,理解了。
以下的代码增加了开仓部分,这么写应该是不对,好像又按照原来的图层顺序从上到下执行了一遍,怎么才能够把排序后的图层按照由强到弱的顺序进行开仓操作呢?您看我的开仓部分应该怎么改呢?
//按照强弱排序后对多图层进行开仓操作
Params
Numeric Length(80);
Integer TOP(4);//筛选前多少名操作
Vars
Series<Numeric> ATR(0);
Series<Numeric> HD;
Series<Numeric> ZSE;
Series<Integer> Bars;
Series<Numeric> ZCN(0);
Numeric i;
Numeric j;
Array<Numeric> ArrayA;
Array<Numeric> ArrayB;
Array<Integer> ArrayAind;
Array<Integer> ArrayBind;
Array<Integer> ResultArray;
Array<Integer> JunkArray;
bool GuoLv;
bool UPK;
bool DNK;
Integer ChiCangUp;
Integer ChiCangDo;
Integer ChiCang;
Events
OnInit()
{
Range[0:DataCount-1]
{
AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); // 设置忽略换仓信号计算
}
}
onBar(ArrayRef<Integer> indexs)
{
Range[0:DataCount-1]
{
//===========================================================================
atr = AvgTrueRange(Length)/RollOver;//
ZCN=Round(Abs(((O-Xaverage(O,Length))*0.3+(Xaverage(O,Length*0.25)-Xaverage(O,Length))*0.3+(Xaverage(O,Length)-Xaverage(O,Length*4))*0.3)*10/atr[1]),3);//计算品种强弱数值
Commentary(\"强弱=\"+Text(ZCN));
}
for i=0 to datasourcesize-1//======================================把需要排序的指标值写入数组
{
ArrayAind[i]=i;
ArrayA[i]=data[i].ZCN;
}
//======================================
Na1Sort2(ArrayA,ArrayAind,0,(datasourcesize-1),True);//==============按照指标值对品种进行从大到小排序
for i=0 to TOP-1//把排序后的品种图层筛选出预设数量按顺序装入结果数组
{
ArrayInsert(ResultArray,0,ArrayAind[i]);
}
//====================================== //输出一下排序结果
for i=0 to datasourcesize-1
{
Commentary(\"ArrayA[i]=\"+Text(ArrayA[i]));
Commentary(\"ResultArray[i]=\"+Text(ResultArray[i]));
}
//======================================
for i=0 to GetArraySize(ResultArray)-1//把排序筛选后的品种图层按照开仓信号筛选开仓操作
{
//==========================================================开仓条件
If(data[ResultArray[i]].MarketPosition<1 && data[ResultArray[i]].开多条件)
{
data[ResultArray[i]].Buy(data[ResultArray[i]].Lots,data[ResultArray[i]].O);
}
If(data[ResultArray[i]].MarketPosition>-1 && data[ResultArray[i]].开空条件)
{
data[ResultArray[i]].SellShort(data[ResultArray[i]].Lots,data[ResultArray[i]].O);
}
}
//======================================
}