我定义了一个二维数组addopen用来记录加仓信息(止损价格,手数),以做空为例如果上一根K线是阳线就开盘价加仓1手,同时设定1倍ATR止损,这两个信息同时记录在二维数组里面。收盘过均线全平仓;如果均线小于加仓止损价就从数组里面删除相关元素,如果盘中最高价大于数组中记录的止损价就平仓相应手数并从数组中删除相应元素。
今天运行中发现一个问题:数组中删除一项元素以后for循环遍历的时候会跳过下一个元素,并且盘中实时提示信号闪烁,这个该如何解决?
Params
Numeric Length(26);
Vars
Series<Numeric> Lots_now (0);
Numeric Lots(0);
Numeric StdDev(2.0);
Numeric ATR;
Global Array<Array<Numeric>> addopen; //定义数组
Series<Numeric> Ma20;
Numeric price;
Numeric i;
Events
OnBar(ArrayRef<Integer> indexs)
{
ATR = Round(XAverage(TrueRange,Length),0);
lots=1;
ma20=Average(Close[1],Length);
PlotNumeric("ma20",ma20);
if(marketposition!=-1&&close[1]<ma20)
{
sellshort(lots,open);
Lots_now =Lots ;
}
If(MarketPosition ==-1 && Close[1]>Open[1] && Lots_now < 30) //上一根是阳线,加仓
{
If(Close[1]>ma20) SellShort(0,Open); //过均线全部平仓
If(Close[1]>Open[1] && Lots_now < 30)//加仓
{
SellShort(1,Open);
Array<Numeric> addInfo;
addInfo[0] = Open+ATR;
addInfo[1] = Lots;
ArrayPushBack(addopen,addInfo);
Lots_now = Lots_now + Lots;
}
}
For i=0 to GetArraySize(addopen)-1
{
price=addopen[i][0];
lots=addopen[i][1];
Print("开始新一轮循环");
Print("i="+Text(i));
Print("大小:" +text(GetArraySize(addopen)));
Print("addopen="+TextArray(addopen));
Print("price="+Text(price));
If(price==0 Or Lots==0) Continue;
If(ma20 <= price)
{
ArrayErase(addopen,i,1); //移除加仓数组相应信息
Continue;
}
If(High>=price)
{
BuyToCover(Lots,Max(price,Open));
ArrayErase(addopen,i,1); //移除加仓数组相应信息
Lots_now = Lots_now - Lots;
}
}
}
螺纹指数运行如下图:
这个有什么解决办法吗?我在后面加一个i=i-1也不管用,依然会跳过。还是循环中尽量避免删除元素?
这个明显是你算法中循环变量没控制好的问题
举个例子 数组为array = [1,2,3,4,5] 长度为5 用for循环逐个删除所有元素
你可能这么写
for i = 0 to 4
删除array[i]元素
伪代码 大概这个意思
我们debug来看看
第一次循环 i =0 删除array[0] 元素 那就是1
删除该元素后 array 数组变成了[2,3,4,5]
第二次循环 i=1 删除array[1] 那就是3
数组变成了[2,4,5]
这个2是不是就跳过了?
所以删除数组元素的算法要慎重 所有语言都是一样的 算法有很大问题
如果操作导致元素长度和元素位置发生改变 循环就容易出错