Блог им. 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 ... 
    15 комментариев
    я сдался… остановил процесс, закомментил считывание данных и создал простой счетчик строк.. 
    тоесть он просто считает количество строк в файле.. 
    и... 
    и мт4 опять умер ((( 
    avatar
    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, ДА, спасибо )) отписал чуть ниже. 

    за подсказку while (!FileIsEnding(hFile)) тоже большое сенкс 
    avatar
    hile (read)
          {
    
             int i = ArraySize(HistBar); ArrayResize(HistBar,i+1);<br />}

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

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

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

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

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


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


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


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




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

    теги блога Роман

    ....все тэги



    UPDONW