【问题标题】:Array out of range MQL5 loop数组超出范围 MQL5 循环
【发布时间】:2019-12-30 11:20:33
【问题描述】:

我正在尝试遍历一系列收盘价来获得每种资产的回报率。我写的代码是:

´´´

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;

}

void 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[]——在计算中的返回值。我看不到我在循环中做错了什么。有人可以帮我吗?

【问题讨论】:

    标签: c++ arrays loops mql mql5


    【解决方案1】:

    数组从 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); 
    }
    

    【讨论】:

    • 感谢@Florian,我按照您所说的更改了“=”信号并将 rtacao[i] 更改为 rtacao[i-1](从 0 开始)。有效。非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2017-06-01
    • 2010-10-07
    • 1970-01-01
    • 2021-11-12
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多