можно конечно оптимизировать, при постоянной перезаписи заголовка , digits пишется 4/5, такое бывает если терминал не перезагружать недели три.
поэтому если файл в папке history есть (проверяем открытием на чтение) то закрываем и пере откроем для записи, если нет то открытие для записи и создание заголовка hst.
|
При большой нагрузке на дисковую подсистему (I/O) функция FileTell дает задержку, например идет до запись каждые 2-3 мс, FileTell пишет 1/2/7/34/67 ячеек, возможно по этой же причине
FileSeek не верно ставит свой идентификатор конца файла, данный пример с общей нагрузкой на (I/O) всего 25% + до запись файла может начаться с середины.
Постоянное пере открытие, дает задержку-потери собранных данных до 1-5% сутки, замерял, с учетом динамики поступления новых тиков <25 мс, в пике и <5 мс. Это если ценовые данные считывать с памяти терминала.
В предопределенных переменных приоритет обновления ниже, в скрипте цикл обновления можно увеличить и до 50 мс, и экономнее использовать формат индикатора-советника, с постоянным пере открытием.
но это не решает проблему с до записью :[
FileSeek не верно ставит свой идентификатор конца файла, данный пример с общей нагрузкой на (I/O) всего 25% + до запись файла может начаться с середины.
FileSeek - все правильно работает, ищите ошибки в своем коде, для начала выводите в .txt файл, убедитесь, что все правильно выводите начинайте работать с .hst - будет ошибка вывода вида хай меньше лоу - не будет отображаться, будет ошибка правее бар имеет время меньше левого - не будет отображаться ....
займитесь оптимизацией кода, код не эффективный , не хочу разбираться с Вашим кодом, но даже
Comment( StringConcatenate(WindowExpertName()," ",TimeToStr((start.time-time),TIME_MINUTES|TIME_SECONDS)," Remain...") );
будет жрать ресурсы поболее чем вывод в файл
Вы как то ни о чем написали, фильтры мт для автономного чарта это понятно
все работает, но почему запись с середины файла может пойти?
еще раз повторяю - ищите ошибку, вот нашел старые свои наработки, пишем 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 или еще что-то.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток, подскажите в чем может быть причина,
при обновлении файла - дозапись (переоткрытие), рандумно записывает 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);