array out of range при оптимизации в значениях индикатора - страница 4

 
Artem Mordvinkin:

Не решило проблему:(

Что еще интересно: в момент проверки и ресайзов - никаких ошибок, ошибка возникает уже позже в коде - при обращении к data[0] для работы с ним

А где вы ее решали?

 
Dmitry Fedoseev:

А где вы ее решали?

ArrayResize после CopyBuffer. Иначе надо?

 
Artem Mordvinkin:

ArrayResize после CopyBuffer. Иначе надо?

То что CopyBuffer возвращает надо смотреть.

Глядя на то как вы вызываете CopyBuffer, хотя все знают, что ее результат надо проверять, там в коде ошибок должно быть еще достаточное количество))

 
Dmitry Fedoseev:

То что CopyBuffer возвращает надо смотреть.

Глядя на то как вы вызываете CopyBuffer, хотя все знают, что ее результат надо проверять, там в коде ошибок должно быть еще достаточное количество.

Знать бы еще как вывести в терминал результаты ArrayPrint при оптимизации, но при одиночном тестировании

Код:

//Envelopes
      if (Envelopes_handle[instr_arr[id_instrument], period_arr[i]]){
            CopyBuffer((int)Envelopes_handle[instr_arr[id_instrument], period_arr[i]],0,0,10,Envelopes_up[instr_arr[id_instrument], period_arr[i]].data);
            CopyBuffer((int)Envelopes_handle[instr_arr[id_instrument], period_arr[i]],1,0,10,Envelopes_low[instr_arr[id_instrument], period_arr[i]].data);
            
            Print ("CopyBuffer");
            ArrayPrint (Envelopes_low[instr_arr[id_instrument], period_arr[i]].data);
   
            ArraySetAsSeries(Envelopes_up[instr_arr[id_instrument], period_arr[i]].data,true);
            ArraySetAsSeries(Envelopes_low[instr_arr[id_instrument], period_arr[i]].data,true);
            
            ArrayResize(Envelopes_up[instr_arr[id_instrument], period_arr[i]].data, 10);
            ArrayResize(Envelopes_low[instr_arr[id_instrument], period_arr[i]].data, 10);
            
            if (!Envelopes_low[instr_arr[id_instrument], period_arr[i]].data[0]){
                Envelopes_low[instr_arr[id_instrument], period_arr[i]].data[0]=0;
            }
            if (!Envelopes_up[instr_arr[id_instrument], period_arr[i]].data[0]){
                Envelopes_up[instr_arr[id_instrument], period_arr[i]].data[0]=0;
            }
           
      }
      

В оптимизации никаких сообщений не выводится 


UPD Так же в одиночном тестировании data[0] заполнена

Вот код

if(Bid[EURUSDId]<Envelopes_low[EURUSDId, M15].data[0] && param[6][1]>0)
  {
   param[6][1]=0;
   //упростим задачу и выведем Envelopes_low[EURUSDId, M15].data[0] в тестере
   
   Print("Envelopes_low[EURUSDId, M15].data[0]=",Envelopes_low[EURUSDId, M15].data[0]);
  }
 
В файл можно писать, в общую папку.
 
Artem Mordvinkin:

Не решило проблему:(

Что еще интересно: в момент проверки и ресайзов - никаких ошибок, ошибка возникает уже позже в коде - при обращении к data[0] для работы с ним

То есть, ошибка возникает гораздо позже, чем показывает код, который мы видим. Вам помощь квалифицированная требуется, или с такими яйцами останетесь? 

 
Алексей Тарабанов:

То есть, ошибка возникает гораздо позже, чем показывает код, который мы видим. Вам помощь квалифицированная требуется, или с такими яйцами останетесь? 

Ну и еще раз первый пост топика "Ошибка позже" - это та ошибка которую я не могу победить Ясен пень, что значения индикаторов задаются раньше, чем с ними работают Я и говорю, что при добавлении строк проверки на наличие значений сразу после CopyBuffer не генерируется ошибка, хоть к ним и обращаются, но почему-то ошибка возникает там где и была и она позже этой проверки. И уже больше чем уверен, что индюкам не присваиваются значения из-за торомозов прогрузки всеми агентами разом истории в оперативку. Я не знаю как работает оптимизация, как подаются данные на обработку, но то, что есть временной лаг при загруженности - это опытным путем стало ясно. А как теперь решить вопрос с тем, что CoppyBuffer пуст и дальше массив не ресайзится - я понятия не имею И сюда пришел за этим А читаю совсем не то, за чем пришел (я про вангу и яйца) Давайте держать себя в руках и не представлять собеседника идиотом, даже если очень хочется

struct S1{
   double data[];
};

S1 Envelopes_up[10,10], Envelopes_low[10,10];

...
// копируем значения индикаторов 
CopyBuffer((int)Envelopes_handle[instr_arr[id_instrument], period_arr[i]],0,0,10,Envelopes_up[instr_arr[id_instrument], period_arr[i]].data);
CopyBuffer((int)Envelopes_handle[instr_arr[id_instrument], period_arr[i]],1,0,10,Envelopes_low[instr_arr[id_instrument], period_arr[i]].data);

//сортируем
ArraySetAsSeries(Envelopes_up[instr_arr[id_instrument], period_arr[i]].data,true);
ArraySetAsSeries(Envelopes_low[instr_arr[id_instrument], period_arr[i]].data,true);

....

// ругается на data[0] - это и есть "
line 15, col 51"
if(Bid[EURUSDId]<Envelopes_low[EURUSDId, M15].data[0]){...}
Документация по MQL5: Строковые функции / StringAdd
Документация по MQL5: Строковые функции / StringAdd
  • www.mql5.com
StringAdd - Строковые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Bid в тестере не работает. Это и есть ошибка. 
 
Dmitry Fedoseev:
В файл можно писать, в общую папку.

Я на скорую руку сделал Возможно не так надо было, но теперь уже на эту строку и data[0] "critical runtime error 502 in OnTester function (array out of range)" in 0:00:12.935 

Файл пустой
double OnTester(){

 
   filehandle=FileOpen(InpDirectoryName+"\\CopyBuffer.txt",FILE_READ|FILE_WRITE|FILE_ANSI|FILE_COMMON,"\n");
   
   FileWrite(filehandle,"CopyBuffer="+ Envelopes_low[EURUSDId, M15].data[0]);
   
  return(param_test);
   
}
 
Artem Mordvinkin:

Я на скорую руку сделал Возможно не так надо было, но теперь уже на эту строку и data[0] "critical runtime error 502 in OnTester function (array out of range)" in 0:00:12.935 

Файл пустой

Выведите размер массива data