Проблема с конвертацией

 
Неожиданно возникла проблема с конвертацией CSV файла в файл истории.
Запись CSV файла имеет формат [date time bid]. Это файл тиков.
Я пытаюсь данные за какой-то интервал времени (месяц, например) записать как файл истории нестандартного таймфрейма. Конвертация проходит нормально, файл истории создается.
МТ4 видит его и правильно показывает название, т/ф, количество записей, начальную и конечную
дату и время. Однако, при попытке открыть этот файл автономно, виснет бесповоротно.
Причину этого установить мне так и не удалось. Помогите разобраться, плз.

Скрипт, с помощью которого я конвертирую, прилагаю
//+------------------------------------------------------------------+
//|                                                                   HST_import.mq4 |
//|                        Copyright © 2005, MetaQuotes Software Corp. |
//|                                                   http://www.metaquotes.net |
//+-------------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property show_inputs
//#include <WinUser32.mqh>

extern string IMfile="EURUSD2006";     // Import data from *.csv file 
extern string EXfile="EURUSD20061";    // Export data to *.HST file 

int    ExHndl,ImHndl,handle;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{  int    i_time,last_volume,last_fpos,mBars;
   double d_close,d_volume;
   string sdate,stime,sclose;
   datetime StD,EnD;
   
//---- History header
   int    version=400;
   string c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   string c_symbol=StringSubstr(EXfile,0,6);
   int    i_period=StrToInteger(StringSubstr(EXfile,6));
   int    i_digits=Digits;
   int    i_unused[13];
   
   handle = FileOpen("HST_import.csv",FILE_CSV|FILE_READ|FILE_WRITE," ");
   if(handle<1) { Print("File HST_import.csv not found. Error:", GetLastError());
                  return(false);   }
  
   ExHndl=FileOpenHistory(EXfile+".hst", FILE_BIN|FILE_READ|FILE_WRITE);
   if (ExHndl<0) { Print("File "+EXfile+".hst dont open. Error:", GetLastError());
                   return(false);  }
   //FileSeek(ExHndl,0,SEEK_END);
   //last_fpos=FileTell(ExHndl);
   last_fpos = 0;
   
//---- write history file header
   if (last_fpos == 0)
   {  //FileSeek(ExHndl,0,SEEK_SET);
      FileWriteInteger(ExHndl, version, LONG_VALUE);
      FileWriteString (ExHndl, c_copyright, 64);
      FileWriteString (ExHndl, c_symbol, 12);
      FileWriteInteger(ExHndl, i_period, LONG_VALUE);
      FileWriteInteger(ExHndl, i_digits, LONG_VALUE);
      FileWriteInteger(ExHndl, 0, LONG_VALUE);       //timesign
      FileWriteInteger(ExHndl, 0, LONG_VALUE);       //last_sync
      FileWriteArray  (ExHndl, i_unused, 0, 13);
      FileFlush(ExHndl);
   }
   
   ImHndl = FileOpen(IMfile+".csv",FILE_CSV|FILE_READ," ");
   if(ImHndl<0) { Print("File "+IMfile+".csv not found. Error:", GetLastError());
                  return(false);   }
   
   StD=D'2006.01.01 00:00:00';
   EnD=D'2006.02.01 00:00:00';
   mBars=0;
   while (true)
   {  //---- read import *.csv file
      sdate =FileReadString(ImHndl);
      stime =FileReadString(ImHndl);
      sclose=FileReadString(ImHndl);
      if (FileIsEnding(ImHndl)) break;
      
      i_time=StrToTime(sdate+" "+stime);
      if (i_time<StD) continue;
      if (i_time>=EnD) break;
      //if (mBars>=500000) break;
      
      mBars++;
      //---- write history file
      if (mBars==1) last_volume=i_time-1;
      d_close = StrToDouble(sclose);
      d_volume= i_time-last_volume;
      
      FileWriteInteger(ExHndl, i_time, LONG_VALUE);      // Time
      FileWriteDouble (ExHndl, d_close, DOUBLE_VALUE);   // Open
      FileWriteDouble (ExHndl, d_close, DOUBLE_VALUE);   // Low
      FileWriteDouble (ExHndl, d_close, DOUBLE_VALUE);   // High
      FileWriteDouble (ExHndl, d_close, DOUBLE_VALUE);   // Close
      FileWriteDouble (ExHndl, d_volume, DOUBLE_VALUE);  // Volume
      last_volume=i_time;
      FileFlush(ExHndl);
   }  
   Print("File "+IMfile+" done. Total bars: ",mBars);
   
//----
   return(0);
}

//+------------------------------------------------------------------+
//| script program deinit function                                   |
//+------------------------------------------------------------------+
void deinit()
{  FileClose(handle);
   FileClose(ExHndl);
   FileClose(ImHndl);
   return;
}
 
 
2 komposter

Спасибо, допомогло. :-) Однако, - не принципиально.
Казалось бы, 2 целых + целый массив i_unused[13], а с другой стоороны - только массив i_unused[15]. Разве это не одно и то же ? Ну может быть и так, хотя мне это непонятно.

Во всяком случае после изменений мне удалось создать hst-файл за один месяц, всего 195875 тиков.
Этот файл был виден в окне "открыть автономно" и параметры его были правильные.
Загрузить этот файл в МТ4 удалось ! Но!!! На это ушло более 2-х минут и при этом количество его тиков изменилось на 181013. Теперь это число отбражается на вкладке графика и в таблице окна "открыть автономно". Однако, я точно знаю, что это число неверное.

Во время чтения этого файла и после его загрузки менеджер задач показывал, что процесс terminal.exe потребляет немногим больше 25 Мб памяти.

Дальше хуже. Когда я попытался создать тиковый файл за 1-й квартал все получилось также хорошо. Размер файла порядка 22 Мб, чуть больше 500000 тиков. Но прочесть, т.е. загрузить его в МТ4, не удалось. Также как и раньше МТ4 виснет безвозвратно. При этом terminal.exe потребляет всего около 40 Мб памяти. Думаю, что собственно размер файла не может быть причиной этих трудностей. Файл минуток, например, содержит значительно больше, чем 500000 записей, но грузится моментально и в работе не тормозит. При этом МТ4 потребляет памяти больше 100 Мб.

2 stringo

Все, что написано выше, относится к билду 201 от 26 декабря 2006, на котором я работаю. Я записывал раньше тиковые файлы и работал с ними в автономе без всяких проблем. Это было год назад !
Опять совершенствование МТ4 привело к разрушению того, что уже работало хорошо. И дело не в тиках, поскольку эти проблемы будут касаться любых нестандартных файлов истории созданных пользователем.

Возможно дело в каких-то моих ошибках. Код я представил. Если они там есть, укажите мне на них. Если же дело в МТ4, то очень прошу Вас найти и устранить причины. Без возможности работать с необходимыми наборами данных теряют смысл все преимущества MQL4.
 
Казалось бы, 2 целых + целый массив i_unused[13], а с другой стоороны - только массив i_unused[15]. Разве это не одно и то же ? Ну может быть и так, хотя мне это непонятно.

Одно и то же. stringo забыл записать этих самых 2 целых, о чем я и писал в той ветке ;)

Во всяком случае после изменений мне удалось создать hst-файл за один месяц, всего 195875 тиков.
Этот файл был виден в окне "открыть автономно" и параметры его были правильные.
Загрузить этот файл в МТ4 удалось ! Но!!! На это ушло более 2-х минут

При открытии файла в журнале не появляются записи типа "xxx errors in EURUSD20061"?
Столько времени может уйти на проверку и исправление файла, но никак на открытие.
Т.е. в файле скорее всего ошибки.

Я уже когда-то ругался с разработчиками (да, ругался! один раз в жизни ;) по поводу автономных файлов. МТ брал _мой_ файл и правил как хотел. Оказалось - ошибки в файле. Я все равно остался при мнении, что МТ неправ, но ошибки исправил ;)


И еще, только что обратил внимание - имя файла и заголовок должны соответствовать. Имя файла состоит из названия инструмента и периода графика.
Т.е. МТ воспринимает записанный файл как 20061-минутный EURUSD.
А в заголовке период записывается другой - это точно ошибка.
 
Столько времени может уйти на проверку и исправление файла, но никак на открытие.
Т.е. в файле скорее всего ошибки.


Этого только не хватало ! Когда-то Слава присылал мне код с их проверками файлов истории, но файлы которые я сам записывал МТ никогда не правил.

И еще, только что обратил внимание - имя файла и заголовок должны соответствовать. Имя файла состоит из названия инструмента и периода графика.
Т.е. МТ воспринимает записанный файл как 20061-минутный EURUSD.
А в заголовке период записывается другой - это точно ошибка.


В скрипте стоит
extern string EXfile="EURUSD20061";    // Export data to *.HST file 
.............
string c_symbol=StringSubstr(EXfile,0,6);
int    i_period=StrToInteger(StringSubstr(EXfile,6));



Так что получается c_symbol=EURUSD, i_period=20061. Так и должно быть и это не ошибка.
Так что имя файла и заголовок соответствуют, если я правильно понимаю.

 
Я уже когда-то ругался с разработчиками (да, ругался! один раз в жизни ;) по поводу автономных файлов. МТ брал _мой_ файл и правил как хотел. Оказалось - ошибки в файле. Я все равно остался при мнении, что МТ неправ, но ошибки исправил ;)

Андрей, не могли бы Вы объяснить о каких ошибках идет речь.
Похоже, что такая суперактивность МТ просто лишает возможности работать с тиковыми файлами.
Вот мне и хотелось бы разобраться в том, насколько это непреодолимо.

PS Интересная логика, неправда ли ? "Совершенствовать" продукт до такого состояния, что пользователям приходится бороться уже не с собственными ошибками, а с самим софтом.
 
Попробуйте подсунуть тестеру кривые котировки и посмотреть - насколько кривыми они будут в fxt-файле. Это и есть "суперактивность" МетаТрейдера, другой нет.
 
Попробуйте подсунуть тестеру кривые котировки и посмотреть - насколько кривыми они будут в fxt-файле. Это и есть "суперактивность" МетаТрейдера, другой нет.


Я разобрался уже что не нравится МТ - тики с совпадающим временем. Насколько я понял, совпадение считается с точностью до секунд. Поскольку, как установил я на собственном опыте, в периоды активности рынка бывает приходят котировки с интервалом 100-300 милисек., то они случается имеют в МТ одно и то же время.

Как можно увидеть из моего второго поста, за январь 2006 случилось около 15000 таких совпадений. МТ просто напросто удалил их из файла истории. Очень конструктивное вмешательство !

Тестером я пользуюсь редко. Тем более, не стремлюсь заменить МТшные смоделированные тики реальными. Не вижу в этом смысла и качество моделирования меня вполне устраивает. Поэтому не могу проверить, что же Вы имели в виду. Однако, что бы это ни было, оно учитывает интересы только одной стороны.

Тики мне нужны для исследования тонкой структуры графика цены. В частности, в связи с проверкой достоверности результатов и действенности стратегий изложенных в известной Вам диссертации Пастухова. Если уж МТ дает возможность тестить стратегии с использованием тиков, то он должен давать возможности и для построения этих стратегий, а значит и для проведения необходимых исследований.

А предусмотреть это, наверное, на так уж сложно. Можно было бы все эти коррекции проводить на этапе формирования fxt файла. А с файлами истории созданными пользователем можно было бы дать возможность работать без какого либо вмешательства вообще. Ну в крайнем случае - с минимальным контролем. Именно это - возможность исследовать и ставить эксперименты, - делает МТ многоцелевой платформой, а не интерфейсом для работы с брокером.
 
Так что получается c_symbol=EURUSD, i_period=20061. Так и должно быть и это не ошибка.
Так что имя файла и заголовок соответствуют, если я правильно понимаю.

Сорри, не заметил StringSubstr.

Андрей, не могли бы Вы объяснить о каких ошибках идет речь.
Похоже, что такая суперактивность МТ просто лишает возможности работать с тиковыми файлами.
Вот мне и хотелось бы разобраться в том, насколько это непреодолимо.

Например, Close < Low или Open > High. Или время бара меньше времени предыдущего (тут не уверен).
В 202-м билде добавили проверку на равенство Volume нулю. Раньше не было...
 
Спасибо, Андрей, я уже разобрался - совпадение времени разных тиков.
Раньше эта ошибка тоже отслеживалась, но по крайней мере ничего не корректировалось.
 
В 202-м билде добавили проверку на равенство Volume нулю. Раньше не было...

Были креши при открытии архива котировок из-за запредельных значений объёмов. Поэтому и вставили проверку объёмов
Причина обращения: