写入TICK数据的EA,但是调试时候始终报array out of range

 

下面这段代码比较简单,但是在mt5的Testing Visualization下一直报array out of range 错误。

新手不知道为什么,觉得可能是OnTick()函数中缓存的问题,请各位高手指导,谢谢!

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

MqlTick myticks[];
double tick_bid[];
double tick_ask[];

int OnInit()
  {

   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {

   
  }

void OnTick()
  {
         ArraySetAsSeries(myticks,true);  
         CopyTicks("XAUUSD",myticks,COPY_TICKS_INFO,0,50);   //开始将TICKS数据传入数组myticks
                 

         ArrayInitialize(tick_bid,0);//初始化数组tick_bid、tick_ask;
         ArrayInitialize(tick_ask,0);
         ArrayResize(tick_bid,50);
         ArrayResize(tick_ask,50); 
  
         for(int i=0;i<50;i++)  // 将myticks中报价信息传入数组
         {  
         
            tick_bid[i]=myticks[i].bid;
            tick_ask[i]=myticks[i].ask;
   
         }


}

通过MQL5社区和服务探索MetaTrader 5的新机遇
通过MQL5社区和服务探索MetaTrader 5的新机遇
  • www.mql5.com
MQL5:MetaTrader 5客户端内置的交易策略语言。语言允许编写您自己的自动交易系统,技术指标,脚本和函数程序库
 
数据越界,检查数组是否有值。
 
Wen Tao Xiong #:
数据越界,检查数组是否有值。

谢谢,用什么方法来检查呢?

我在脚本中运行里面的代码是可以的,但是在EA中就不行,不太明白到底是什么东西导致的。

 
检查CopyTick的返回值,可能没有拷贝到50个数据。
 

复盘测试时,只有前面两种tick模式下,CopyTick才能拷贝到数据。

供参考:

//+------------------------------------------------------------------+
//|                                                        test2.mq5 |
//|                                           Copyright 2021,fxMeter |
//|                           https://www.mql5.com/zh/users/fxmeters |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021,fxMeter"
#property link      "https://www.mql5.com/zh/users/fxmeters"
#property version   "1.00"


MqlTick myticks[];
double tick_bid[];
double tick_ask[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{
   ArraySetAsSeries(myticks,true);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{

   int n = CopyTicks("XAUUSD",myticks,COPY_TICKS_INFO,0,50);   //开始将TICKS数据传入数组myticks  
   if(n <= 0)return;

   ArrayResize(tick_bid,n);
   ArrayResize(tick_ask,n);

   ArrayInitialize(tick_bid,0);//初始化数组tick_bid、tick_ask;
   ArrayInitialize(tick_ask,0);

   for(int i = 0; i < n; i++) // 将myticks中报价信息传入数组
   {
      tick_bid[i] = myticks[i].bid;
      tick_ask[i] = myticks[i].ask;
   }
}
//+------------------------------------------------------------------+
 
Ziheng Zhuang #:
检查CopyTick的返回值,可能没有拷贝到50个数据。

谢谢版主大神!

是不是在用EA策略回测的时候,不允许使用动态数组呢?我发现只要使用动态数组,就会报错

 

任何时候都可以使用动态数组,使用前要先分配空间。

不过有些函数比如CopyTicks内部就能给数组分配空间,这种情况下可以不必事先分配空间。

 
Ziheng Zhuang #:

任何时候都可以使用动态数组,使用前要先分配空间。

不过有些函数比如CopyTicks内部就能给数组分配空间,这种情况下可以不必事先分配空间。

明白了,谢谢!