请老师看看为何排序总是出错

利用系统自带的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); } } //====================================== }