Тиковая запись, не работает FileSeek

 

Доброго времени суток, подскажите в чем может быть причина,

при обновлении файла - дозапись (переоткрытие), рандумно записывает HST ячйки.

При наличии условия в коде, записи в конец файла.

  FileSeek(hand1e,0,2);


//----

FileWriteInteger(hand1e,    t,   LONG_VALUE);  

FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);          

FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);  

FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);  

FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);  

FileWriteDouble (hand1e,  sec, DOUBLE_VALUE);

            FileFlush (hand1e); 

Файлы:
sandyew-4.mq4  6 kb
 
Не понятна логика. Зачем Вы, после открытия файла, открываете такой же файл в папке History и пишете уже туда?
 

можно конечно оптимизировать, при постоянной перезаписи заголовка , digits пишется 4/5, такое бывает если терминал не перезагружать недели три.

поэтому если файл в папке history есть (проверяем открытием на чтение) то закрываем и  пере откроем для записи, если нет то открытие для записи и создание заголовка hst.

 
Первый раз Вы открываете файл 

в папке каталог_терминала\experts\files, а уж потом в папке History.

Почему не сделать менее заумно - на каждом тике открывать свой файл, дописывать данные и закрывать? И не держать свой файл открытым  три недели и грузить проц каждые 10 мс?



 

При большой нагрузке на дисковую подсистему (I/O) функция FileTell дает задержку, например идет до запись каждые 2-3 мс, FileTell пишет 1/2/7/34/67 ячеек, возможно по этой же причине

FileSeek не верно ставит свой идентификатор конца файла, данный пример с общей нагрузкой на  (I/O)  всего 25% + до запись файла может начаться с середины. 

Постоянное пере открытие, дает задержку-потери собранных данных до 1-5% сутки, замерял, с учетом динамики поступления новых тиков <25 мс, в пике и <5 мс. Это если ценовые данные считывать с памяти терминала.

 

В предопределенных переменных приоритет обновления ниже, в скрипте цикл обновления можно увеличить и до 50 мс, и экономнее использовать формат индикатора-советника, с постоянным пере открытием.  

но это не решает проблему с до записью :[

 

посмотрите значения нагрузки I/O, первая/3 волна - запись как в скрипте, 10 мс. 2/3 волна - с постоянным пере открытием-до записью, экономнее но только на формат индикатора-советника. 

 

 
owner89: 

FileSeek не верно ставит свой идентификатор конца файла, данный пример с общей нагрузкой на  (I/O)  всего 25% + до запись файла может начаться с середины. 

 FileSeek  - все правильно работает, ищите ошибки в своем коде, для начала выводите в .txt файл, убедитесь, что все правильно выводите начинайте работать с .hst - будет ошибка вывода вида хай меньше лоу - не будет отображаться, будет ошибка правее бар имеет время меньше левого - не будет отображаться ....

займитесь оптимизацией кода, код не эффективный , не хочу разбираться с Вашим кодом, но даже

Comment( StringConcatenate(WindowExpertName()," ",TimeToStr((start.time-time),TIME_MINUTES|TIME_SECONDS)," Remain...") );

будет жрать ресурсы поболее чем вывод в файл 

 

Вы как то ни о чем написали, фильтры мт для автономного чарта это понятно

все работает, но почему запись с середины файла может пойти?  

 
owner89:все работает, но почему запись с середины файла может пойти?  

еще раз повторяю - ищите ошибку, вот нашел старые свои наработки, пишем 10-ти тиковые бары (настройка) в файл с именем !tickxxxxxxxTF.hst , работал как часы и тики не пропускал, эксперт обновляет онлайн последний бар

//+------------------------------------------------------------------+
//|                                                     tickBars.mq4 |
//|                                      Copyright © 2010, IgorM     |
//|                               https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"

#include <WinUser32.mqh>

extern int              NumTF   = 10;

int HistoryHandle = -1, HistoryFilePos = 0, hwnd = 0, now_time;
double now_close, now_open, now_low, now_high, now_volume;
string _Symbol,win_name;
//_____________________________________________________
int init(){
   _Symbol = Symbol();
   win_name = StringConcatenate( "!tick", _Symbol );
        hwnd = 0;
        string file_name = StringConcatenate( "!tick", _Symbol, NumTF, ".hst" );
        HistoryHandle = FileOpenHistory( file_name, FILE_BIN|FILE_READ);
        if ( HistoryHandle < 0 ){
                 HistoryHandle = FileOpenHistory( file_name, FILE_BIN|FILE_WRITE );
                 if ( HistoryHandle < 0 ) Print( "Ошибка при создании файла ", file_name,"- Error #", GetLastError());
                   else{ 
                        Print("Файл ", file_name," не найден, создан новый файл");
                        FileWriteInteger( HistoryHandle, 400, LONG_VALUE );
                   FileWriteString( HistoryHandle, "Copyright © 2010, IgorM", 64 );
                   FileWriteString( HistoryHandle, StringConcatenate( "!tick", _Symbol ), 12 );
                   FileWriteInteger( HistoryHandle, NumTF, LONG_VALUE );
                   FileWriteInteger( HistoryHandle, Digits, LONG_VALUE );
                   now_time             = TimeCurrent();
                   FileWriteInteger( HistoryHandle, now_time, LONG_VALUE );
                   FileWriteInteger( HistoryHandle, now_time, LONG_VALUE );
                   int temp[13];
                   FileWriteArray( HistoryHandle, temp, 0, 13 );
                   FileFlush(HistoryHandle);
              }
   } else Print("Файл ", file_name," найден, дозапись");
        FileClose(HistoryHandle);
        HistoryHandle = FileOpenHistory( file_name, FILE_BIN|FILE_READ|FILE_WRITE);
        if ( HistoryHandle < 0 ){Alert("Ошибка при работе с файлом ", file_name,"- Error #", GetLastError());   return(-1);}
        FileSeek(HistoryHandle, 0, SEEK_END);
        now_time                = TimeCurrent();
        now_volume      = 0;
        now_close       = iClose(_Symbol,0,0);
        now_open                = now_close;
        now_low         = now_close;
        now_high                = now_close;
        HistoryFilePos = FileTell( HistoryHandle);
        RefreshWindow();
return(0);
}
//_____________________________________________________
int deinit(){
        if ( HistoryHandle > 0 ){FileClose( HistoryHandle );HistoryHandle = -1;}
        Comment("");
return(0);
}
//_____________________________________________________
int start(){
        if ( HistoryHandle < 0 ) return(-1);
        FileSeek( HistoryHandle, HistoryFilePos, SEEK_SET );
        now_volume ++;
        if ( now_volume <= NumTF ){
                if ( Bid < now_low  ) now_low  = Bid;
                if ( Bid > now_high ) now_high = Bid;
                now_close = Bid;
                writehistory();
        } else {
               writehistory(1);
               now_time = TimeCurrent();
                    now_open = Bid;
                    now_low      = Bid;
                    now_high = Bid;
                    now_close= Bid;
                    now_volume  = 1;
                    HistoryFilePos = FileTell( HistoryHandle);
                    writehistory();
        }
        RefreshWindow();
return(0);
}
//_____________________________________________________
void writehistory(int shift=0){
      FileWriteInteger  ( HistoryHandle, now_time,              LONG_VALUE      );
                FileWriteDouble ( HistoryHandle, now_open,              DOUBLE_VALUE);
                FileWriteDouble ( HistoryHandle, now_low,               DOUBLE_VALUE);
                FileWriteDouble ( HistoryHandle, now_high,              DOUBLE_VALUE);
                FileWriteDouble ( HistoryHandle, now_close,     DOUBLE_VALUE);
                FileWriteDouble ( HistoryHandle, now_volume-shift,      DOUBLE_VALUE);
                FileFlush                       ( HistoryHandle );
return;
}
//_____________________________________________________
void RefreshWindow(){ 
        if ( hwnd != 0 ) {
             int param = 0;
             PostMessageA( hwnd, WM_COMMAND, 33324, param ); 
             int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
             if (MT4InternalMsg != 0) PostMessageA(hwnd, MT4InternalMsg, 2, param);
        } else{
             hwnd = WindowHandle( win_name, NumTF );
                  if ( hwnd != 0 ) Print( "< - - - График !tick", _Symbol, NumTF, " найден! - - - >" );
        }
return;
}
//_____________________________________________________

 вот запустил эксперт, в логе получил при первом вызове:
09:48:35 tickBars EURUSD,H1: loaded successfully
09:48:37 tickBars EURUSD,H1 inputs: NumTF=10; 
09:48:37 tickBars: cannot open file C:\Alpari МТ4\history\Alpari-ECN-Demo\!tickEURUSD10.hst
09:48:37 tickBars EURUSD,H1: Файл !tickEURUSD10.hst не найден, создан новый файл

при втором запуске:

09:49:32 tickBars EURUSD,H1: loaded successfully
09:49:32 tickBars EURUSD,H1: Файл !tickEURUSD10.hst найден, дозапись
09:49:32 tickBars EURUSD,H1: < - - - График !chEURUSD10 найден! - - - >
 
Наверно от того, что в файлы стандартных таймфреймов сам терминал пишет.
 

проблема была в цикле, с использованием функции IsStopped()

скрипт удалялся с графика, при этом что то не дописывалось и структура hst ломалась, в виде 44 байт на бар. отсюда некорректное исполнение функции fileseek.

решение - сделать выключатель, через gui или еще что-то.

Причина обращения: