експорт в файл - страница 2

 
a.pikhotskiy:
Спасибо, деинициализации или удаления - нет.  Мне кажется, что проблема в том, что м ассив данных создается в OnTick() , а используется в OnDeinit () .

Вы как сегодня тестируете? При завершении тестирования по-моему OnDeinit() не выполняется. Для проверки я вынес всё что должно выполняться в OnDeinit() в отельную функцию и вызвал её в определённый момент.

 
Alexey Viktorov:

Пробуйте ещё и ещё. Должно помочь. Я проверил. И исправьте эту строку

так

Ещё можно добавить

тогда после закрытия тестера файл не потеряется.

проблема в том, что я могу записать в файл

В событии OnTick() создается массив дат тиков.

При событии OnDeinit () я хочу  этот массив передать в файл.

Но не могу , хотя Print()  массив отображается корректно, но при записи в файл FileWrite(), не передается массив. Даже ArraySize() записывает "0", а при Print() - "12".

 
a.pikhotskiy:

проблема в том, что я могу записать в файл

В событии OnTick() создается массив дат тиков.

При событии OnDeinit () я хочу  этот массив передать в файл.

Но не могу , хотя Print()  массив отображается корректно, но при записи в файл FileWrite(), не передается массив. Даже ArraySize() записывает "0", а при Print() - "12".

А вы пробовали ArraySize вынести за пределы FileWrite в виде отдельной переменной, а в FileWrite просто писать эту переменную?

 
a.pikhotskiy:

проблема в том, что я могу записать в файл

В событии OnTick() создается массив дат тиков.

При событии OnDeinit () я хочу  этот массив передать в файл.

Но не могу , хотя Print()  массив отображается корректно, но при записи в файл FileWrite(), не передается массив. Даже ArraySize() записывает "0", а при Print() - "12".

Для записи массива надо пользоваться функцией

uint  FileWriteArray( 
   int          file_handle,         // handle файла 
   const void&  array[],             // массив 
   int          start=0,             // начальный индекс в массиве 
   int          count=WHOLE_ARRAY    // количество элементов 
   );

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

Соответственно для чтения этого массива используется

uint  FileReadArray( 
   int    file_handle,               // handle файла 
   void&  array[],                   // массив для записи 
   int    start=0,                   // стартовая позиция для записи в массив 
   int    count=WHOLE_ARRAY          // сколько читать 
   );
А размер массива записывается даже в вашем примере без проблем. Какие изменения я делал в вашем коде я указал в предыдущем сообщении.
 
BlackTomcat:

А вы пробовали ArraySize вынести за пределы FileWrite в виде отдельной переменной, а в FileWrite просто писать эту переменную?

Пробовал, не помогало
 
Alexey Viktorov:

Для записи массива надо пользоваться функцией

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

Соответственно для чтения этого массива используется

А размер массива записывается даже в вашем примере без проблем. Какие изменения я делал в вашем коде я указал в предыдущем сообщении.

Спасибо, но у меня такой вопрос:

после функции OnTick() переменная TickCounter принимает определенное значение (например , 12). 

При вызове Print , отображается , но при запис в файл FileWrite() , записывается в файл не "12", а изначалое значение "0".  В чем ошибка, не могу понять

 
a.pikhotskiy:

Спасибо, но у меня такой вопрос:

после функции OnTick() переменная TickCounter принимает определенное значение (например , 12). 

При вызове Print , отображается , но при запис в файл FileWrite() , записывается в файл не "12", а изначалое значение "0".  В чем ошибка, не могу понять

Да поймите вы наконец-то, я всё это сделал с вашим кодом. Какие делал изменения уже сказано

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

експорт в файл

Alexey Viktorov, 2019.09.01 19:46

Пробуйте ещё и ещё. Должно помочь. Я проверил. И исправьте эту строку

int file_handle = FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);

так

int file_handle = FileOpen(InpDirectoryName+"\\"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);

Ещё можно добавить

int file_handle = FileOpen(InpDirectoryName+"\\"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV|FILE_COMMON);

тогда после закрытия тестера файл не потеряется.


Ещё менял дату так, чтобы максимально ограничить количество тиков. У меня получалось 15 и 15 было записано в файл.


Вот ещё раз проверил уже на реальных тиках. Пришлось сделать ещё некоторые добавки, но они касаются исключительно array out of range

/********************************************************************\
|                                                             00.mq4 |
|                                            © 2019, Alexey Viktorov |
|                       https://www.mql5.com/ru/users/alexeyvik/news |
\********************************************************************/
#property copyright "© 2019, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/users/alexeyvik/news"
#property version   "1.00"
#property strict

int  TickCounter = 0;
datetime tmp_date_buff[]; // массив дат индикатора
input datetime dateEnd = D'2019.09.02 10:02';

/*******************Expert initialization function*******************/
int OnInit()
  {
   ArrayResize(tmp_date_buff, 30);
   return(INIT_SUCCEEDED);
  }

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
  {
   datetime date_buff[]; // массив дат индикатора
   ArrayResize(date_buff, TickCounter);
   for(int i = 0; i < ArraySize(date_buff); i++)
    {
     date_buff[i] = tmp_date_buff[i];
    }
   string  InpFileName = "MACD1.csv";
   string  InpDirectoryName = "Data";
   ResetLastError();
   int file_handle = FileOpen(InpDirectoryName + "\\" + InpFileName, FILE_READ | FILE_WRITE | FILE_CSV | FILE_COMMON);
   if(file_handle != INVALID_HANDLE)
    {
     FileWrite(file_handle, IntegerToString(ArraySize(date_buff)));
     FileClose(file_handle);
    }
  }

/************************Expert tick function************************/
void OnTick()
  {
   if(TimeCurrent() <= dateEnd)
    {
     if(TickCounter >= ArraySize(tmp_date_buff))
      ExpertRemove();
     else
      {
       tmp_date_buff[TickCounter] = TimeCurrent();
       TickCounter++;
      }
    }
   Comment(TickCounter, "\n"
         , tmp_date_buff[TickCounter-1]);
  }
//+------------------------------------------------------------------+

Выделены строки которые я добавил.

Файлы:
00.mq4  4 kb
 
Alexey Viktorov:

Да поймите вы наконец-то, я всё это сделал с вашим кодом. Какие делал изменения уже сказано


Ещё менял дату так, чтобы максимально ограничить количество тиков. У меня получалось 15 и 15 было записано в файл.


Вот ещё раз проверил уже на реальных тиках. Пришлось сделать ещё некоторые добавки, но они касаются исключительно array out of range

Выделены строки которые я добавил.

Спасибо, но у меня , почему-то, файл не создается. Когда же убираю "| FILE_COMMON " и остается : int file_handle = FileOpen(InpDirectoryName + "\\" + InpFileName, FILE_READ | FILE_WRITE | FILE_CSV  , то файл создается, но результат в файл записивается "0".

 
a.pikhotskiy:

Спасибо, но у меня , почему-то, файл не создается. Когда же убираю "| FILE_COMMON " и остается : int file_handle = FileOpen(InpDirectoryName + "\\" + InpFileName, FILE_READ | FILE_WRITE | FILE_CSV  , то файл создается, но результат в файл записивается "0".

Он создаётся, только в другом месте. Документацию почитайте, там написано, где именно. И ещё... Попробуйте удалить FILE_READ и проверьте результат.

 
BlackTomcat:

Он создаётся, только в другом месте. Документацию почитайте, там написано, где именно. И ещё... Попробуйте удалить FILE_READ и проверьте результат.

Ну зачем советовать заведомо бесполезные варианты? Вы советуете читать документацию, а сами её плохо читали.