Блог им. Crazy_Trading

Тестирование робота на истории - что то пошло не так ))

Всем привет, добрые люди по моей вчерашней просьбе скинули склеенную 5 минутную историю с 1997 по 2016 гг
одним большим файлом.. 

поскольку тест проводился в МТ4, то я решил, что неплохо былоБЫ )) воткнуть всю эту историю в массивы в МТ4, и прогнать по уже имеющимся алгоритмам в самом терминале… иначе ведь надо будет писать полностью свой собственный тестер как отдельное приложение... 

файл мне скинули вот такого формата: 

ESU97;19970910;001000000;934.00;934.00;934.00;934.00;0
парсим простыми методами: 

int start1() 
{
   int hFile,

   bool read = true;
   
   datetime tm1 = TimeCurrent(), tm2;
   
  string filename = "ES.TXT";   
   
   hFile = FileOpen(filename, FILE_CSV|FILE_READ, ';');  if (hFile<1) {  Alert("Файл "+filename+" не найден!"); return(false); }
   
   while (read)
      {

         int i = ArraySize(HistBar); ArrayResize(HistBar,i+1);
         
         HistBar[i].NameB = FileReadString(hFile);
         string data = FileReadString(hFile);
         string data1 = FileReadString(hFile);
         HistBar[i].TimeB = conkdata(data, data1); 
         HistBar[i].OpenB = FileReadString(hFile);
         HistBar[i].HighB = FileReadString(hFile);
         HistBar[i].LowB = FileReadString(hFile);
         HistBar[i].CloseB = FileReadString(hFile);
         HistBar[i].SizeB = FileReadString(hFile);
         
         if(FileIsEnding(hFile)==true) read = false;
         
       //  Print(TimeToString(HistBar[i].TimeB,  TIME_DATE|TIME_MINUTES  ), "    ", DoubleToStr(HistBar[i].OpenB, 2),"  ",DoubleToStr(HistBar[i].HighB, 2),"  ",DoubleToStr(HistBar[i].LowB, 2),"  ",DoubleToStr(HistBar[i].CloseB, 2),"  " );
      }
tm2 = TimeCurrent();
   FileClose(hFile);
Print(ArraySize(HistBar));
Print(TimeToString(tm1,  TIME_DATE|TIME_SECONDS  ) ,"    ",TimeToString(tm2,  TIME_DATE|TIME_SECONDS  ) );
return (0);
}
/////////////////////////////
datetime conkdata( string data, string data1)
{
   datetime vzv = StrToTime(StringSubstr(data, 0, 4) + "."+ StringSubstr(data, 4, 2)+ "."+ StringSubstr(data, 6, 2)+ " "+ StringSubstr(data1, 0, 2)+ ":"+ StringSubstr(data1, 2, 2));
   return(vzv);
}
и все вроде хорошо… но что то пошло не так )) 
файл ES имеет размер 67 мегабайт... 
и вышеописанный алгоритм считывания работает на меньших данных, но на этом файле он просто умер )) 
вот уже полчаса терминал висит и идет его считывание... 

так дело не пойдет. придется создавать виртуальный инструмент и в режиме АВТОНОМНОЙ работы с графиком — работать с этими данными.. 
скорее всего еще придется разбить по годам, и создавать 10 разных графиков с разными годами… ибо на одном графике 10 летняя история с периодом 5 минут — просто не влезет в МТ4 ... 
я сдался… остановил процесс, закомментил считывание данных и создал простой счетчик строк.. 
тоесть он просто считает количество строк в файле.. 
и... 
и мт4 опять умер ((( 
int i = ArraySize(HistBar); ArrayResize(HistBar,i+1);
Изменять размер массива с шагом 1 — очень плохая практика. Таким образом вы на пустом месте получаете алгоритм квадратичной сложности, вместо линейной. Увеличивайте размер массива с достаточно большим шагом, например, 100000 — это сэкономит кучу времени на копирование данных.
bool read = true;
...
while (read) {
...
if(FileIsEnding(hFile)==true) read = false;
Проще написать while (!FileIsEnding(hFile)){
avatar

Eugene Logunov

Eugene Logunov, ДА, спасибо )) отписал чуть ниже. 

за подсказку while (!FileIsEnding(hFile)) тоже большое сенкс 
hile (read)
      {

         int i = ArraySize(HistBar); ArrayResize(HistBar,i+1);<br />}

resize в огромном цикле это нонсенс, попробуй сначала узнать количество строк и потом разово вызвать resize.
Сергей и Евгений — спасибо, да, я знаю что ресайз дело не благодарное )) потому то в повторном считывании просто решил узнать количество строк )) 
Тихая Гавань, зависнуть при считывании строк для подсчета их числа может только из-за Вашей ошибки, не из-за размера файла. Например, считываете число строк в переменную недостаточного размера.

Судя по таким ошибкам в базовых вещах, ни о какой реализации более менее сложного алгоритма речи идти не может
avatar

Vad

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

учел ваши советы и исправил ошибки )) 
Тихая Гавань, обработчик тестера пишите же Вы.
Про строки я привел для примера, т.к. в некоторых компиляторах (старых, но все же встречается иногда) int является 16 битовым, т.е. всего 64000. Сталкивался с такой ошибкой у некоторых...

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

Vad

Vad, 
признаю что допустил ошибку в коде, и приношу свои извинения за свои слова в отношении вас. 

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


ошибка была не только в РЕСАЙЗ, но и в синтаксисе... 


Тихая Гавань, ну как бы int бывает разный… до 2000года нормально было инт иметь в 2 байта...


avatar

ves2010

ves2010, да, сорри, просто я не прогер, я самоучка программирующий в среде МТ4 )) 
а в нем как бы вот так: 




А по нефти есть такой файл?
avatar

XoraX

XoraX, я спросил по сиплому — мне прислали сиплого )) по нефти не интересно
А чего, в MT4 нет возможности сделать CustomSymbol, как в MT5?

теги блога Тихая Гавань

....все тэги



2010-2020
UPDONW