Скачать MetaTrader 5

Динамический массив для эксперта

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск на MQL5.community ведется во всех разделах. Попробуй сам!
Yedelkin
4532
Yedelkin 2010.05.05 20:18 

Объясните, пожалуйста.

При запуске на отладку простой программы (см. ниже)  выдается сообщение об ошибке: "test001 (EURUSD,H1) Array out of range in 'test001.mq5' (25,7)" с указанием на строку    "  test_array[i]=0.0;".

Подскажите, в чём проблема? 

========================================

//+------------------------------------------------------------------+
//|                                                      test001.mq5 |
//+------------------------------------------------------------------+
double test_array[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(test_array,true);
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<10;i++)
      test_array[i]=0.0;
  }
//+------------------------------------------------------------------+

Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции - Документация по MQL5
Alexandr Krivoshey
980
Alexandr Krivoshey 2010.05.05 21:13  
Массив не отразмерен.
ArrayResize до нужного размера сначала, а потом с ним работать...
Вадим
703
Вадим 2010.05.05 21:32  

Странно, но теперь динамические массивы требуют обязательной инициализации. Вот такой код рабочий:

//+------------------------------------------------------------------+
//|                                                      test002.mq5 |
//|              Copyright Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                      test001.mq5 |
//+------------------------------------------------------------------+
double test[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   int gf=ArrayResize(test,10,5);
   ArraySetAsSeries(test,1);
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<10;i++)
     {
      test[i]=0.5;
     }
   Print(test[1]);
  }
//+------------------------------------------------------------------+

 

Yedelkin
4532
Yedelkin 2010.05.05 22:28  
Joker:
Массив не отразмерен.
ArrayResize до нужного размера сначала, а потом с ним работать...

Странно. Когда создавал индикатор, то использовал динамические массивы, но при этом их не "отразмеривал". И всё прекрасно работает.

Но как только стал создавать эксперт для той же торговой стратегии, возникла вышеуказанная проблема.

Правильно ли я понимаю, что при создании экспертов необходимо всегда применять ArrayResize к динамическим массивам, даже когда нужный размер массива заранее неизвестен? В справочнике никаких указаний на эту тему обнаружить на удалось.

..Да и если бы нужный размер массива был известен,  я бы использовал не динамический, а статический массив. В общем, интересует теоретическая (идеологическая) подоплёка вопроса.

Вадим
703
Вадим 2010.05.05 22:33  
Yedelkin:

Странно. Когда создавал индикатор, то использовал динамические массивы, но при этом их не "отразмеривал". И всё прекрасно работает.

Но как только стал создавать эксперт для той же торговой стратегии, возникла вышеуказанная проблема.

Правильно ли я понимаю, что при создании экспертов необходимо всегда применять ArrayResize к динамическим массивам, даже когда нужный размер массива заранее неизвестен? В справочнике никаких указаний на эту тему обнаружить на удалось.

..Да и если бы нужный размер массива был известен,  я бы использовал не динамический, а статический массив. В общем, интересует теоретическая (идеологическая) подоплёка вопроса.

Этого раньше не было, появилось после какого-то обновления. Если это не устранят, то у меня будут проблемы... нужно будет исправлять кучу индикаторов, советников и нейронных сетей...
Yedelkin
4532
Yedelkin 2010.05.05 22:57  
Rinng:
Этого раньше не было, появилось после какого-то обновления. Если это не устранят, то у меня будут проблемы... нужно будет исправлять кучу индикаторов, советников и нейронных сетей...
Благодарю, Rinng, за подробное разъяснение ситуации. Будем ждать пояснений разработчиков по теме.
MetaQuotes
Админ
24945
Renat Fatkhullin 2010.05.05 23:00  
Yedelkin:

Странно. Когда создавал индикатор, то использовал динамические массивы, но при этом их не "отразмеривал". И всё прекрасно работает.

Динамический массив, привязанный к индикатору, управляется самой подсистемой индикатора автоматически. То есть, расчетные буферы индикатора автоматически ресайзятся вслед за ростом количества рабочих баров.

Если же динамический массив используется в обычной работе, то его нужно ресайзить вручную.

Вадим
703
Вадим 2010.05.05 23:10  

Ясно, если стоит код типа

SetIndexBuffer(1,OutBuffer,INDICATOR_DATA);
то всё должно работать и без ресайза.

 

Yedelkin
4532
Yedelkin 2010.05.05 23:24  

 

Renat:

Динамический массив, привязанный к индикатору, управляется самой подсистемой индикатора автоматически. То есть, расчетные буферы индикатора автоматически ресайзятся вслед за ростом количества рабочих баров.

Если же динамический массив используется в обычной работе, то его нужно ресайзить вручную.

ОК. Просьба: отразить аналогичную информацию в справочнике, в частности, в разделах "Динамические массивы", "ArrayResize". Для начинающих может оказаться весьма полезной.
Vasily
1261
Vasily 2010.05.06 00:50  
Yedelkin
4532
Yedelkin 2010.05.06 22:44  
Указанная Вами тема интересна с точки зрения дополнительного расширения кругозора, но ответа на обозначенную здесь проблему я там не обнаружил.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий