c++ - 数组超出范围 MQL5 循环
问题描述
我正在尝试遍历一系列收盘价以获得每种资产的回报率。我写的代码是:
'''
void Returns(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 < a_size”而不是“i <= a_size”:
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++ - 输入 trait 以接收 T::value_type 如果存在,否则为 T
- web-services - 有人可以帮我从日本网络服务中解码这个网络服务响应吗?
- python - 从 c++ 到 python 的二进制阅读器
- laravel - 如何设置 Deployer 以仅将指定文件夹从 localhost 同步到生产环境?
- c - 比较数组,为什么我的 != if 语句正在运行?
- r - 用 R 中的一个唯一单词替换单词列表
- python - 找不到 numpy
- python - 创建与大型数据集折叠的数据透视表的策略
- c - 使用函数传递 char[] 的双链表问题
- javascript - 如何将两个可观察项转换为另一个具有两个初始可观察对象的映射值的可观察对象?