Однократный расчет массива при оптимизации - страница 5

 
Yuri Evseenkov:
Я делаю так. Провожу однократное тестирование. При этом тестировании записываю массивы в файл. Потом провожу оптимизацию на этом же участке, только теперь массивы не пересчитываются при появлении каждого бара или тика, а читаются из файла. Оптимизация по ценам открытия на недельном периоде происходит мгновенно. А без файловых операций длится часами.
У меня несколько другая ситуация. Мне нужно всего один раз заполнить массив и пользоваться им в течении всех проходов. То есть, для меня даже при каждом проходе один раз заполнить в ините массив много.
 
-Aleks-:

Понял, т.е. готовый файл с цифрами можно считать в массив (мой случай), потом записать в бинарный файл, и потом пользоваться им.

Ну а если из файла нужно читать данные 10 массивов, то нужно сделать сортировщик, который будет по спец цифре понимать окончание массива и наполнять следующий массив... ибо не удобно руками каждый раз писать размер массива.

Сначала пишем в файл переменную int с размером массива, потом массив, потом еще одну переменную int с размером, потом массив и т.д.

В том же порядке читаем: считали переменную с размером, считали массив этого размера, следующую переменную, массив и т.д. 

 
forexman77:
У меня несколько другая ситуация. Мне нужно всего один раз заполнить массив и пользоваться им в течении всех проходов. То есть, для меня даже при кждом проходе один раз заполнить в ините массив много.
Ну так и заполните один раз при однократном тестировании. Программы при тестирование и оптимзации должны отличаться файловыми операциями. При тестировании это запись а при оптимизации чтение. Два кода надо писать. Что значит при ините заполнять массив это много? Вызвать массив из файла по моему это занимает не больше времени, чем например открытие ордера или операция умножени я с double.
 
Yuri Evseenkov:
Ну так и заполните один раз при однократном тестировании. Программы при тестирование и оптимзации должны отличаться файловыми операциями. При тестировании это запись а при оптимизации чтение. Два кода надо писать. Что значит при ините заполнять массив это много? Вызвать массив из файла по моему это занимает не больше времени, чем например открытие ордера или операция умножени я с double.

Много вот почему: мне заранее известен весь массив. И поэтому возник вопрос, как сохранить этот массив между проходами. Я так понимаю, что он обнуляется при следующем проходе, хотя точно в этом не уверен.

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

Мысль была следующая: считать данные и занести их в массив и дальше на всех проходах, только использовать этот массив, то есть массив абсолютно одинаков начиная от первого прохода до последнего. 

 
forexman77:

Много вот почему: мне заранее известен весь массив. И поэтому возник вопрос, как сохранить этот массив между проходами. Я так понимаю, что он обнуляется при следующем проходе, хотя точно в этом не уверен.

Не согласен, что чтение в моем случае быстрее. Скорость быстрее, если тех же данные получаю через индикаторы и значительно падает, когда эти подготовленные данные считываю с файла уже без расчета индикаторов. 

Мысль была следующая: считать данные и занести их в массив и дальше на всех проходах, только использовать этот массив, то есть массив абсолютно одинаков начиная от первого прохода до последнего. 

Здесь только практика ответит. Читайте массив при каждом проходе. Я долго то же мучился. Часами длилась оптимизация. Пока Андрей Хатимлянский не подсказал записывать в файл однократно а потом читать. Теперь нужно один раз подождать однократного тестирования, а потом оптимизация проходит влет. Файловые операции хорошо расписаны в учебнике Ковалева.
 
Dmitry Fedoseev:

Сначала пишем в файл переменную int с размером массива, потом массив, потом еще одну переменную int с размером, потом массив и т.д.

В том же порядке читаем: считали переменную с размером, считали массив этого размера, следующую переменную, массив и т.д. 

Вот тут чувствую себя не образованным... как писать в бинарный файл переменную int с размером массива? Т.е. каким образом можно будет идентифицировать эту переменную при чтении из файла? 
 
forexman77:

Мысль была следующая: считать данные и занести их в массив и дальше на всех проходах, только использовать этот массив, то есть массив абсолютно одинаков начиная от первого прохода до последнего. 

В MT4 действительно работа с файлами очень медленная, не знаю как это в MT5 будет да ещё с бинарным файлом...

Я подобную проблему решаю функцией прям в код записываю весь массив - но это не универсальное решение, конечно.

 

Вот пример записи и чтения массива

datetime T[]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920,
   1278456660,1278540000,1278626400,1278712800,1280447880,1280527200,1280789220,1280959200,1281045720,1283292000,
   1283378400,1283812200,1285626300,1285887060,1286229600,1286316000,1286404740,1288133220,1288216860,1288305120,
   1288392420,1288648860,1288735200,1288741980,1288822080,1288994400,1290722460,1290809040,1291069320,1291329540,
   1293228420,1293577020,1293666300,1293746400,1295992800,1296079320,1296253680,1296514200,1296686940,1296770400,
   1298503260,1298592000,1298672280,1298931060,1300831920,1300917600,1301609160,1301696460,1303512420,1303768920
   };

datetime newT[];
int fileHandle;

/******************Expert initialization function*******************/
int OnInit()
{
   if((fileHandle = FileOpen("test", FILE_READ|FILE_BIN|FILE_COMMON)) != INVALID_HANDLE)// здесь поставь точку останова нажав клавиш F9
    {
     FileReadArray(fileHandle, newT);
      for(int i = 0; i < ArraySize(newT); i++)
       Print(i, " ", TimeToString(newT[i], TIME_DATE|TIME_SECONDS));
      FileClose(fileHandle);
    }
  else
   if(/*IsOptimization()*/IS_DEBUG_MODE && (fileHandle = FileOpen("test", FILE_WRITE|FILE_BIN|FILE_COMMON)) != INVALID_HANDLE)
    {
     FileWriteArray(fileHandle, T);
     FileClose(fileHandle);
    }
   return(INIT_SUCCEEDED);
}/*******************************************************************/


Запусти дважды в режиме отладки и посмотри сколько времени тратится на запись и чтение массива. Первый запуск запишет массив в файл, а второй запуск прочтёт его и начнёт печатать даты из массива. Потом разберись с выделенной частью, надо убрать IS_DEBUG_MODE и надо-ли вставить в условие IsOptimization()

 
-Aleks-:
Вот тут чувствую себя не образованным... как писать в бинарный файл переменную int с размером массива? Т.е. каким образом можно будет идентифицировать эту переменную при чтении из файла? 

Есть функции, что-то типа FileWriteInteger(). Идентифицировать по расположению, переменная должна быть в начале файла, после ее прочтения указатель переместится на ее конец, т.е. на начало массива, после считывания массива указатель будет перед следующей переменной...

Скоро будет статья по работе с файлами. 

 
Dmitry Fedoseev:

Есть функции, что-то типа FileWriteInteger(). Идентифицировать по расположению, переменная должна быть в начале файла, после ее прочтения указатель переместится на ее конец, т.е. на начало массива, после считывания массива указатель будет перед следующей переменной...

Скоро будет статья по работе с файлами. 

Понимаю, спасибо.

Но в коде хотелось бы поглядеть - буду ждать статью. 

Причина обращения: