Запись данных в автономный файл истории в режиме онлайн

 

Пытаюсь писать свои данные в автономный файл в режиме обновления онлайн

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

1 удаляет файл если он уже есть, потом создает файл и его заголовок

2 записывает данные в этот файл, постоянно переписываются 2 последних бара, если в данных появляется новый бар то переписывается 1 последний бар и добавляется новый

Пока нет нового бара все работает, текущие бары переписываются, как только приходит новый бар он появляется на автономном графике и обновление приостанавлявается на 10-20 секунд, после чего работа продолжается, но данные уже получаются кривыми. Подскажите где ошибка и что можно оптимизировать????????

Вот код индикатора

//+------------------------------------------------------------------+
//| FileWrite.mq4 |
//| Никитка |
//| Никитка |
//+------------------------------------------------------------------+
#property copyright "Никитка"
#property link "Никитка"

#property indicator_chart_window
#include <WinUser32.mqh>
//---- input parameters
extern int ExtParam1=0;
extern int ExtParam2;

int nNenkaCurrPosBuf;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
NenkaFileOpenZagolovok( );

int shift_in=1;
for( int nPos = 10; nPos >= 0; nPos-- ){
int nenf=NenkaFileStart(shift_in,Time[nPos+1],Open[nPos+1],High[nPos+1],Low[nPos+1],Close[nPos+1],20,Time[nPos],Open[nPos],High[nPos],Low[nPos],Close[nPos],Volume[nPos]);
}
nNenkaCurrPosBuf=Bars;
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//int counted_bars=IndicatorCounted();
//----
int nNenkaCurrPos=Bars;

if(nNenkaCurrPos>nNenkaCurrPosBuf){ // если появился новый бар
//for(int bb=nNenkaCurrPos-nNenkaCurrPosBuf; bb>=0; bb--){
int shift_in=1; // задаем смещение указателя файла, добавляем новый бар
int nPos=0;
int nenf=NenkaFileStart(shift_in,Time[nPos+1],Open[nPos+1],High[nPos+1],Low[nPos+1],Close[nPos+1],20,Time[nPos],Open[nPos],High[nPos],Low[nPos],Close[nPos],Volume[nPos]);
}
if(nNenkaCurrPos==nNenkaCurrPosBuf){ //если новый бар не появился
shift_in=2; // переписываем текущий бар
nPos=0;
nenf=NenkaFileStart(shift_in,Time[nPos+1],Open[nPos+1],High[nPos+1],Low[nPos+1],Close[nPos+1],20,Time[nPos],Open[nPos],High[nPos],Low[nPos],Close[nPos],Volume[nPos]);
}
if(nNenkaCurrPos>nNenkaCurrPosBuf){
nNenkaCurrPosBuf=nNenkaCurrPos+1;
}

//----
return(0);
}
//+------------------------------------------------------------------+

//-------------------ПОЛЬЗОВАТЕЛЬСКАЯ ФУНКЦИЯ 1 -------------------------- МОЯ
//--------------- Создание файла, запись заголовка файла------------------------
int NenkaFileOpenZagolovok( )
{
string s_symbol="NENKA"+Symbol();
int i_period=1;
int i_digits=Digits;
int i_unused[13];
string sFileName = s_symbol+i_period+".hst";
//----
int ExtHandle=-1;
ExtHandle=FileOpenHistory(sFileName, FILE_BIN|FILE_WRITE); //Если FILE_WRITE не комбинируется с FILE_READ, то будет открыт файл нулевой длины. Даже если до открытия в файле были данные, то они будут уничтожены.
if( ExtHandle != -1 ){
// FileSeek(ExtHandle, 0, SEEK_SET); //устанавливаем файловый указатель на начало файла
//----Пишем заголовок файла------------------------------------------------------------------
FileWriteInteger(ExtHandle, 400, LONG_VALUE); // версия базы 4 байта
FileWriteString(ExtHandle, "NIKITKA NENKA", 64); // копирайт "MetaQuotes Software Corp."
FileWriteString(ExtHandle, s_symbol, 12); // инструмент
FileWriteInteger(ExtHandle, i_period, LONG_VALUE); // период инструмента 4 байта
FileWriteInteger(ExtHandle, i_digits, LONG_VALUE); // число знаков после запятой в инструменте 4 байта
FileWriteInteger(ExtHandle, 0, LONG_VALUE); // timesign временной отпечаток создания базы 4 байта
FileWriteInteger(ExtHandle, 0, LONG_VALUE); // last_sync время последней синхронизации 4 байта
FileWriteArray(ExtHandle, i_unused, 0, 13); // для будущего использования
//-------------------------------------------------------------------------------------------
FileClose(ExtHandle);
} //Всего 148 байт

ExtHandle=-1;

return ( 0 );
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

//-------------------ПОЛЬЗОВАТЕЛЬСКАЯ ФУНКЦИЯ 2 -------------------------- МОЯ
//--------------- дозапись в файл---------------------------------------------------------
int NenkaFileStart(int shift_in,datetime dt_time2,double d_open2,double d_high2,double d_low2,double d_close2,double d_volume2,
datetime dt_time,double d_open,double d_high,double d_low,double d_close,double d_volume)
{
// --- Открываем файл ---
string s_symbol="NENKA"+Symbol();
int i_period=1;
string sFileName = s_symbol+i_period+".hst";

int ExtHandle=-1;
ExtHandle=FileOpenHistory(sFileName, FILE_BIN|FILE_READ|FILE_WRITE);
if( ExtHandle != -1 ){
// int nSize = FileSize( ExtHandle );
// нуна проверка на размер файла можно ли сделать такой здвиг
FileSeek(ExtHandle, -44*(shift_in), SEEK_END); //Функция перемещает файловый указатель от конца файла
//----------------пишем старый бар---------------
FileWriteInteger(ExtHandle, dt_time2, LONG_VALUE);
FileWriteDouble(ExtHandle, d_open2, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_low2, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_high2, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_close2, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_volume2, DOUBLE_VALUE);
//-------------пишем новый бар-----------------------
FileWriteInteger(ExtHandle, dt_time, LONG_VALUE);
FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);

FileClose(ExtHandle);
}

ExtHandle=-1;

//---- находим окно, в которое будем "отправлять" свежие котировки для обновления--
int hwnd = 0;
hwnd = WindowHandle(s_symbol,i_period);
if(hwnd != 0){
//Print("< - - - График ", s_symbol, i_period, " найден! и обновлен - >");
PostMessageA(hwnd, WM_COMMAND, 33324, 0);
}
//---------------------------------------------------------------------------------
return ( 0 );
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------