我试图遍历一系列收盘价以获得每种 Assets 的返回率。我写的代码是:
´´´
void返回(MqlRates&rt [],int a_size)
{
double rtacao[];
ArraySetAsSeries(rtacao, true);
ArrayResize(rtacao,(a_size-1));
for(int i=1;i<=a_size;i++)
{
rtacao[i]=MathLog(rt[i].close/rt[i-1].close);
}
return;
}
无效的OnStart()
{
int nacoes=144;
string acao[];
count_instr("ativos.txt",nacoes);
ArrayResize(acao,nacoes);
load_instr("ativos.txt",nacoes,acao,100);
MqlRates rates[];
ArraySetAsSeries(rates,true);
ArrayResize (rates,100);
for (int i=0;i<nacoes;i++)
{
SymbolSelect(acao[i],true);
if(CopyRates(acao[i],APeriod,0,100,rates)!=100)
{
Print("CopyRates of ",acao[i]," failed, no history");
//Erase(acao, i);
//nacoes=nacoes-1;
} else
{
Returns(rates, 100);
}
}
}
´´´
我收到以下错误消息:
2019.12.30 08:11:57.983 OnStart(IBOV,D1)数组超出'OnStart.mq5'中的范围(39,15)
在返回的计算中,它指向数组-rtacao []。我看不到循环中的错误。有人能帮我吗?
最佳答案
数组从0开始计数。这意味着数组的最后一个索引是(array_size-1)。据此,您应在循环中使用“i for(int i=0;i<a_size;i++)
{
rtacao[i]=MathLog(rt[i].close/rt[i-1].close);
}
但是您必须考虑术语rt [i-1],它在循环的第一次运行中为-1。这意味着您需要为循环的第一次运行指定规格。就像是:for(int i=0;i<a_size;i++)
{
if(i==0)
// something that happens when i is 0
else
rtacao[i]=MathLog(rt[i].close/rt[i-1].close);
}
要么:// something that happens when i is 0
for(int i=1;i<a_size;i++)
{
rtacao[i]=MathLog(rt[i].close/rt[i-1].close);
}
关于c++ - 阵列超出范围MQL5循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59529968/