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

 
Artem Mordvinkin:

Ну вот - шах и мат Часть локальных агентов успевают схватить котировки и наполнить массив Но большая часть вываливается в аут из-за скорости.

Ещё один код да Винчи ) Вы поболтать пришли или послушать что люди советуют?

Dmitry Fedoseev:
Покажите как вычисляете data[0]
 
VVT:

Ещё один код да Винчи ) Вы поболтать пришли или послушать что люди советуют?

Послушать. Буду рад если вы мне скажете что я должен ответить на "как вычисляете" Код я прислал. Что-то другое надо? 

Массив data заполняется значениями из copybuffer - 10 значений`. Потом происходит сортировка и data[0] - это самое свежее значение индикатора на тике.

Еще раз код (чуть больше, но на суть не повлияет) Например, 5 инструментов по 5 периодов

Полноценно работают пара агентов, остальные вернули ошибку о которой я сказал. На мой взгляд, если пара агентов работают, ошибка-то все же не в коде наверное. Его надо дополнить проверкой data[0]  и если нет такого члена - не обращаться к нему в текущем тике.

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

//--------------------------------------Копирование в буфер данных индикаторов-------------------------------------------

for(int id_instrument = 0; id_instrument<ArraySize(instr_arr); id_instrument++)
  {
   for(int i=0; i<ArraySize(period_arr); i++)
     {

      //Envelopes
      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);
     }
  }
 
Artem Mordvinkin:

Ну вот - шах и мат Часть локальных агентов успевают схватить котировки и наполнить массив Но большая часть вываливается в аут из-за скорости. Не в массивах дело и не в коде, а в процедуре. Теперь (поскольку я с таким не сталкивался, а хочется решить задачку как можно быстрее, уж простите - не лень, а оптимизация времени). Кто подскажет: как в случае отсутствия значений индикатора в массиве (из-за того что они не успевают прогрузится к первому тику) не вываливать ошибку размерности массива (ибо в таком случае он пустой - 0 членов после copybuffer), а вернуть сову снова в стадию получения данных?  


Разделите один цикл на два. В первом грузите данные, во втором их обрабатывайте. Будут дырки, но не будет сюрпризов. 

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

Разделите один цикл на два. В первом грузите данные, во втором их обрабатывайте. Будут дырки, но не будет сюрпризов. 

Пока не могу понять как это сделать - ведь значение одно для двухмерного массива. Один цикл перебирает инструменты, второй - периоды внутри инструмента. В итоге получается, например, значение индюка для EURUSD на 15 минутном таймфрейме

 
Artem Mordvinkin:

Пока не могу понять как это сделать - ведь значение одно для двухмерного массива. Один цикл перебирает инструменты, второй - периоды внутри инструмента. В итоге получается, например, значение индюка для EURUSD на 15 минутном таймфрейме

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

Наверно функция CopyBuffer отработала с ошибкой и не изменила размер массива.

Результат CopyBuffer всегда надо проверять.

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

Я делал ресайз прямо в цикле - не помогло (это в самом первом сообщении топика написал:).

Но!

Может его надо делать после copybuffer, если copybuffer принудительно сокращает массив до кол-ва значений в нем самом

 
Dmitry Fedoseev:

Наверно функция CopyBuffer отработала с ошибкой и не изменила размер массива.

Результат CopyBuffer всегда надо проверять.

Да-да Я тоже в ходе дискуссии к этому пришел. Сейчас попробую после него ресайз сделать

 
@Artem Mordvinkin, в коде есть чтение из файлов?
 
Dmitry Fedoseev:

Наверно функция CopyBuffer отработала с ошибкой и не изменила размер массива.

Результат CopyBuffer всегда надо проверять.

for(int i=0; i<ArraySize(period_arr); i++)
     {
      //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);
   
            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;
            }
           
      }
      

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

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