//+------------------------------------------------------------------+ //| EqualVolumeBars.mq4 | //| Copyright © 2008, komposter | //| mailto:komposterius@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, komposter" #property link "mailto:komposterius@mail.ru" #include //---- Количество тиков в одном баре extern int TicksInBar = 2; extern int StartYear = 2008; extern int StartMonth = 01; int HistoryHandle = -1, HistoryFilePos = 0, hwnd = 0, TicksFilePos = 0, now_time; double now_close, now_open, now_low, now_high, now_volume; string _Symbol; int _Period, _PeriodSec, pre_time, last_fpos = 0; double pre_close; int init() { int _GetLastError = 0, cnt_ticks = 0, cnt_bars = 0, temp[13]; // запоминаем символ графика, обнуляем хэндл окна off-line графика _Symbol = Symbol(); hwnd = 0; // открываем файл, в который будем записывать историю string file_name = StringConcatenate( "!Eqv", _Symbol, TicksInBar, ".hst" ); HistoryHandle = FileOpenHistory( file_name, FILE_BIN | FILE_WRITE ); if ( HistoryHandle < 0 ) { _GetLastError = GetLastError(); Alert( "FileOpenHistory( \"", file_name, "\", FILE_BIN | FILE_WRITE )", " - Error #", _GetLastError ); return(-1); } //---- Записываем заголовок файла FileWriteInteger ( HistoryHandle, 400, LONG_VALUE ); FileWriteString ( HistoryHandle, "Copyright © 2008, komposter", 64 ); FileWriteString ( HistoryHandle, StringConcatenate( "!Eqv", _Symbol ), 12 ); FileWriteInteger ( HistoryHandle, TicksInBar, LONG_VALUE ); FileWriteInteger ( HistoryHandle, Digits, LONG_VALUE ); FileWriteInteger ( HistoryHandle, 0, LONG_VALUE ); //timesign FileWriteInteger ( HistoryHandle, 0, LONG_VALUE ); //last_sync FileWriteArray ( HistoryHandle, temp, 0, 13 ); //+------------------------------------------------------------------+ //| Обрабатываем историю //+------------------------------------------------------------------+ int year = StartYear, month = StartMonth; int cur_date = year*100+month, end_date = Year()*100+Month(); datetime time; double bid; string tmp_str1, tmp_str2; now_time = 60; now_close = 0; now_open = 0; now_low = 0; now_high = 0; now_volume = 0; while ( cur_date <= end_date ) { string ticks_file_name = StringConcatenate( "[Ticks]\\", AccountServer(), "\\", Symbol(), "_", year, ".", strMonth( month ), ".csv" ); int ticks_file_handle = FileOpen( ticks_file_name, FILE_READ | FILE_CSV ); //---- Если возникла ошибка if ( ticks_file_handle < 0 ) { Alert( "Ошибка при открытии файла \"", ticks_file_name, "\" #", GetLastError(), "!" ); } else { while ( !FileIsEnding( ticks_file_handle ) ) { if ( GetLastError() == 4099 ) break; tmp_str1 = FileReadString( ticks_file_handle ); if ( StringLen( tmp_str1 ) < 19 ) continue; tmp_str2 = FileReadString( ticks_file_handle ); if ( StringLen( tmp_str2 ) < Digits+2 ) continue; time = StrToTime ( tmp_str1 ); bid = StrToDouble( tmp_str2 ); // сформировался бар или первый бар if ( now_volume >= TicksInBar || now_volume < 1 ) { if ( now_volume >= TicksInBar ) { 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, DOUBLE_VALUE); FileFlush ( HistoryHandle ); cnt_bars ++; } //now_time = time; now_time += 60; // время подставляем условное, чтоб не получилось 2 бара в одну минуту now_open = bid; now_low = bid; now_high = bid; now_close = bid; now_volume = 1; } else { if ( bid < now_low ) now_low = bid; if ( bid > now_high ) now_high = bid; now_close = bid; now_volume ++; } cnt_ticks ++; } //---- Закрываем файл FileClose( ticks_file_handle ); GetLastError(); } month ++; if ( month > 12 ) { month = 1; year ++; } cur_date = year*100+month; } // запоминаем место в файле, перед записью 0-го бара HistoryFilePos = FileTell( HistoryHandle); // записываем 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, DOUBLE_VALUE); FileFlush ( HistoryHandle ); // выводим статистику Print( "< - - - Обработано тиков: ", cnt_ticks, ", построено полных баров: ", cnt_bars, " - - - >" ); Print( "< - - - Для просмотра результатов откройте график \"!Eqv", _Symbol, TicksInBar, "\" - - - >" ); // обновляем график RefreshWindow(); return(0); } int start() { if ( HistoryHandle < 0 ) return(-1); //+------------------------------------------------------------------+ //| Обрабатываем поступающие тики //+------------------------------------------------------------------+ //---- ставим "курсор" перед последним баром FileSeek( HistoryHandle, HistoryFilePos, SEEK_SET ); now_volume ++; // бар продолжается if ( now_volume <= TicksInBar ) { if ( Bid < now_low ) now_low = Bid; if ( Bid > now_high ) now_high = Bid; now_close = Bid; // записываем 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, DOUBLE_VALUE); FileFlush ( HistoryHandle ); } // пришел тик нового бара else { // записываем 1-й бар 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-1,DOUBLE_VALUE); FileFlush ( HistoryHandle ); // now_time = TimeCurrent(); now_time += 60; // время подставляем условное, чтоб не получилось 2 бара в одну минуту now_open = Bid; now_low = Bid; now_high = Bid; now_close = Bid; now_volume = 1; // запоминаем место в файле, перед записью 0-го бара HistoryFilePos = FileTell( HistoryHandle); // записываем 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, DOUBLE_VALUE); FileFlush ( HistoryHandle ); } /* // Print( "now_time = ", now_time, ", now_open = ", now_open, ", now_low = ", now_low, ", now_high = ", now_high, ", now_close = ", now_close, ", now_volume = ", now_volume ); // Print( "5: file_pos = ", FileTell( HistoryHandle) ); // записываем для отобажения на графике 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, DOUBLE_VALUE); FileFlush ( HistoryHandle ); // Print( "6: file_pos = ", FileTell( HistoryHandle) ); */ // обновляем график RefreshWindow(); } void RefreshWindow() { //---- находим окно, в которое будем "отправлять" свежие котировки if ( hwnd == 0 ) { hwnd = WindowHandle( StringConcatenate( "!Eqv", _Symbol ), TicksInBar ); if ( hwnd != 0 ) { Print( "< - - - График ", "!Eqv", _Symbol, TicksInBar, " найден! - - - >" ); } } //---- и, если нашли, обновляем его if ( hwnd != 0 ) { PostMessageA( hwnd, WM_COMMAND, 33324, 0 ); } } int deinit() { if ( HistoryHandle > 0 ) { //---- закрываем файл FileClose( HistoryHandle ); HistoryHandle = -1; } return(0); } string strMonth( int m ) { if ( m < 10 ) return( StringConcatenate( "0", m ) ); return(m); }