各位老师,
下面序列数组排序这几行(红色部分)不能通过编译是何原因?
Params
Integer TOP(4);//排序前几名
Numeric LOTS(1);//下单数量
Numeric MP(1);//滑点设置
Vars
Series<Numeric> ZD(0);//涨幅
Numeric i;
Numeric j;
Numeric K;
Series<Array<Numeric>> ArrayZD;//数据源涨幅数组
Series<Array<Numeric>> ArrayZDind;//数据源索引
Series<Array<Numeric>> ArrayH;//开盘第一根K线最高价
Series<Array<Numeric>> ArrayL;//开盘第一根K线最低价
bool BuyCon;//开多条件
bool SellCon;//开空条件
Events
OnInit()
{
Range[0:DataCount-1]
{
AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); // 设置忽略换仓信号计算
SetSlippage(Enum_Rate_PointPerHand,MP); //设置滑点-跳/手
SetOrderPriceOffset(1); //设置委托价为叫买/卖价偏移1跳
SetOrderMap2MainSymbol(); //设置委托映射到主力
SetInitCapital(1000000); //设置初始资金为100万
}
}
OnBar(ArrayRef<Integer> indexs)
{
If(Time>=0.0905 AND Time<0.0910)//开盘5分钟后计算前5分钟涨幅
{
Range[0:DataCount-1]
{
ZD=100*((C[1]-C[2])/C[2]);
//Commentary(\"涨幅=\"+Text(ZD));
}
for i=0 to datasourcesize-1//把需要排序的指标值写入数组
{
ArrayZDind[0][i]=i;
ArrayZD[0][i]=data[i].ZD;
ArrayH[0][i]=Data[i].H;
ArrayL[0][i]=Data[i].L;
}
}
Na1Sort2(ArrayZD,ArrayZDind,0,(datasourcesize-1),False);//按照指标值对品种进行从大到小排序
Na1Sort2(ArrayZD,ArrayH,0,(datasourcesize-1),False);
Na1Sort2(ArrayZD,ArrayL,0,(datasourcesize-1),False);
/*for i=0 to TOP-1
{
Commentary(\"ArrayZD[i]=\"+Text(ArrayZD[0][i]));
Commentary(\"ArrayZDind[[i]=\"+Text(ArrayZDind[0][i]));
}*/
for i=0 to GetArraySize(ArrayZD)-1//把排序筛选后的品种图层按照开仓信号筛选开仓操作
{
//==========================================================开仓条件
j=ArrayZDind[0][i];
BuyCon = i<=TOP-1 AND data[J].C[1]>data[J].OPEN[1] AND data[J].OPEN[1]==data[J].L[1];
SellCon = i>=DataSourceSize()-TOP-1 AND data[J].C[1]<data[J].OPEN[1] AND data[J].OPEN[1]==data[J].H[1];
If(data[J].MarketPosition<1 && BuyCon and Time>=0.090500 and Time<0.091000)
{
data[J].Buy(Lots,Open);
}
If(data[J].MarketPosition>-1 && SellCon and Time>=0.090500 and Time<0.091000)
{
data[J].SellShort(Lots,Open);
}
}
IF(Time>=0.145000 AND Time<=0.150000)
{
For K=0 to DataSourceSize-1
{
If(Data[K].MarketPosition==1)
{
data[K].Sell(lots,Open);
}
}
}
IF(Time>=0.145000 AND Time<=0.150000)
{
For K=0 to DataSourceSize()-1
{
If(Data[K].MarketPosition==-1)
{
data[K].BuyToCover(lots,Open);
}
}
}
}
Na1Sort2 第二个参数是integer的数组
第二个参数改成整型数组,还是通过不了编译呀。
王老师,能否帮我改一下?
我帮助你修改好了,代码如下: OnBar(ArrayRef<Integer> indexs)
{
arraySize = DataSourceSize();
// 方法1:使用标准数组初始化语法
If (BarStatus () == 0 Or GetArraySize(tmpZD) == 0)
{
// 初始化或重新初始化数组
tmpZD = tmpZD[arraySize];
tmpZDind = tmpZDind[arraySize];
tmpH = tmpH[arraySize];
tmpL = tmpL[arraySize];
For i = 0 To arraySize - 1
{
If (i < GetArraySize(tmpZDind))
{
tmpZDind[i] = i;
tmpZD[i] = 0;
tmpH[i] = 0;
tmpL[i] = 0;
}
}
}
// 方法2:如果数组大小发生变化,重新创建数组
Else If (GetArraySize(tmpZD) != arraySize)
{
// 重新初始化数组
tmpZD = tmpZD[arraySize];
tmpZDind = tmpZDind[arraySize];
tmpH = tmpH[arraySize];
tmpL = tmpL[arraySize];
For i = 0 To arraySize - 1
{
If (i < GetArraySize(tmpZDind))
{
tmpZDind[i] = i;
tmpZD[i] = 0;
tmpH[i] = 0;
tmpL[i] = 0;
}
}
}
// 在指定时间段计算涨幅并排序
If (Time >= 0.0905 And Time < 0.0910 And Not HasSorted)
{
// 计算所有品种的涨幅
For i = 0 To arraySize - 1
{
If (i < GetArraySize(tmpZD))
{
If (Data[i].C[2] != 0)
{
// 计算前一根K线的涨幅
tmpZD[i] = 100 * ((Data[i].C[1] - Data[i].C[2]) / Data[i].C[2]);
}
Else
{
tmpZD[i] = 0;
}
tmpZDind[i] = i;
tmpH[i] = Data[i].H;
tmpL[i] = Data[i].L;
}
}
// 使用冒泡排序按涨幅降序排列
For i = 0 To arraySize - 2
{
For j = i + 1 To arraySize - 1
{
If (j < GetArraySize(tmpZD) And i < GetArraySize(tmpZD))
{
If (tmpZD[i] < tmpZD[j])
{
// 交换值
tempVal = tmpZD[i];
tmpZD[i] = tmpZD[j];
tmpZD[j] = tempVal;
// 交换索引
tempIdx = tmpZDind[i];
tmpZDind[i] = tmpZDind[j];
tmpZDind[j] = tempIdx;
}
}
}
}
HasSorted = True; // 标记已排序
// 输出排序结果用于调试
Commentary("Top " + Text(TOP) + " 品种:");
For i = 0 To Min(TOP-1, arraySize-1)
{
If (i < GetArraySize(tmpZDind))
{
j = tmpZDind[i];
Commentary("第" + Text(i+1) + "名: 代码=" + Data[j].Symbol +
", 涨幅=" + Text(tmpZD[i], 2) + "%");
}
}
}
// 其余的交易逻辑保持不变