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

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

    }

data-href=

data-href=data-href=data-href=


请大神进来帮看看什么问题?中途为何建仓失败
使用系统的内部函数 SetDataRange 总是提示出错,请老师给出个能通过的例子
老师帮忙看看 总是编译不过,老师帮忙调整一下,谢谢
排序
请帮忙 看看这么写代码有什么问题吗? 信号总是对不上
为何行情服务器总是连不上?
如何求相关系数矩阵?帮我看看哪里出错
求助贴 麻烦老师帮忙看看
总是在启动时提示出错,是什么问题,如何解决
请老师帮忙看看代码的错误

经过修改与测试,问题已解决,多谢老师。

你应该是理解错了排序函数的意思

序号数组arrayfind经过na1sort2函数降序排序后,假如返回的是比如[3,1,0,2],他的意思是,现在排最高的是原始数据里序号为3,也就是第四个数组元素,同理排第二的是序号为1,也就是第二个数组元素。

data-href=

拿你最后这图举例,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);
    }
    

	 }
	 //======================================

    }