FileWrite не работает в режиме отладки на исторических данных?

 

Добрый день.

Столкнулся с любопытной проблемой.

Немного истории, для понимания.

В ходе отладки работы советника возникла необходимость записывать ряд значений, используемых для инициации некоторых функций. Отладку запускал в режиме исторических данных. Но, несмотря на то, что FileOpen получал хэндлер файла, FileWrite отрабатывал процедуру записи без выдачи ошибки, и даже FileClose отладка проходила без сбоев, файл логов не возникал после окончания работы советника.

Начал разбираться с простыми примерами.

input string             InpFileName="muy3.csv";  // имя файла
input string             InpDirectoryName="Data"; // имя директории
int file_handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_TXT);
   if(file_handle!=INVALID_HANDLE)
     {
         FileWrite(file_handle,12+"\r\n");      
         for(int i=0;i<12;i++)
            {   FileWrite(file_handle,i+"fdfdfdfdffdf");
            }         
     }
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
      EventKillTimer();
      FileClose(file_handle);   
}


Заметил закономерность. Если запускать отладку на реальных данных, то советник отрабатывает, файл создается, в него записываются данные. Файл появляется в ожидаемом месте.

Если запускать в режиме отладки на исторических данных, происходит ровно то-же самое за исключением последнего пункта. Файл не появляется.

Есть какие-то незадокументированные особенности работы с файлами в режиме отладки на исторических данных?

 

Попробуйте сразу закрыть файл после записи.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
   {
   EventSetTimer(5);
   file_handle=FileOpen(InpDirectoryName+"//"+InpFileName, FILE_READ|FILE_WRITE|FILE_TXT);
   if(file_handle!=INVALID_HANDLE)
      {
      FileWrite(file_handle, 12+"\r\n");
      for(int i=0; i<12; i++)
         FileWrite(file_handle, i+"fdfdfdfdffdf");
      }
   FileClose(file_handle); // TODO
//---
   return INIT_SUCCEEDED;
   }


У меня вот тут он появился:

C:\Users\Admin\AppData\Roaming\MetaQuotes\Tester\xxx\Agent-127.0.0.1-3000\MQL5\Files\Data\muy3.csv

Отладка на истории.

Согласно Документации:

...По умолчанию все файловые операции в языке MQL5 производятся в пределах "файловой песочницы" и при тестировании эксперту доступна только собственная "файловая песочница". Для того чтобы индикатор и эксперт при тестировании работали с файлами из одной папки, использовался флаг FILE_COMMON...
Документация по MQL5: Программы MQL5 / Тестирование торговых стратегий
Документация по MQL5: Программы MQL5 / Тестирование торговых стратегий
  • www.mql5.com
Тестирование торговых стратегий - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Denis Kirichenko #:

Попробуйте сразу закрыть файл после записи.


У меня вот тут он появился:

C:\Users\Admin\AppData\Roaming\MetaQuotes\Tester\xxx\Agent-127.0.0.1-3000\MQL5\Files\Data\muy3.csv

Отладка на истории.

Согласно Документации:

Спасибо.
 
Denis Kirichenko #:

Попробуйте сразу закрыть файл после записи.


У меня вот тут он появился:

C:\Users\Admin\AppData\Roaming\MetaQuotes\Tester\xxx\Agent-127.0.0.1-3000\MQL5\Files\Data\muy3.csv

Отладка на истории.

Согласно Документации:

Спасибо! Заработало с FILE_COMMON