//+------------------------------------------------------------------+
//| WithoutSunday.mq4 | 2008.11.17
//| Copyright © 2006, komposter |
//| mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, komposter"
#property link "mailto:komposterius@mail.ru"
#include <WinUser32.mqh>
//---- Ñïèñîê ãðàôèêîâ êîòîðûå íåîáõîäèìî îáðàáàòûâàòü, ðàçäåë¸ííûé çàïÿòîé (",").
//---- Ñèìâîë îò ïåðèîäà îòäåëÿåòñÿ ïðîáåëîì (" ").
extern string ChartList = "EURUSD 1440,GBPUSD 1440";
extern bool SundayToMonday = true;
//---- ×àñòîòà, ñ êîòîðîé áóäóò îáíîâëÿòüñÿ ãðàôèêè â ìèëèñåêóíäàõ
//---- ×åì áîëüøå çíà÷åíèå, òåì ìåíüøå ðåñóðñîâ áóäåò èñïîëüçîâàòü ñêðèïò.
extern int RefreshLuft = 1000;
#define DELETE_DAY 0
int init() { start(); return(0); }
int start()
{
int _GetLastError = 0, cnt_copy = 0, cnt_add = 0, cnt_delete = 0, temp[13];
int Charts = 0, pos = 0, curchar = 0, len = StringLen( ChartList );
string cur_symbol = "", cur_period = "", file_name = "";
string _Symbol[100]; int _Period[100], _PeriodSec[], _Bars[];
int HistoryHandle[], hwnd[], last_fpos[], pre_time[], now_time[];
double now_close[], now_open[], now_low[], now_high[], now_volume[];
double pre_close[], pre_open[], pre_low[], pre_high[], pre_volume[];
double del_open[], del_low[], del_high[], del_volume[];
bool period_start = false;
//---- ñ÷èòàåì êîëè÷åñòâî ãðàôèêîâ, êîòîðûå íåîáõîäèìî îáðàáîòàòü
while ( pos <= len )
{
curchar = StringGetChar( ChartList, pos );
if ( CharToStr( curchar ) == " " )
{
period_start = true;
pos++;
continue;
}
if ( period_start && curchar > 47 && curchar < 58 )
{ cur_period = cur_period + CharToStr( curchar ); }
else
{
if ( curchar == ',' || pos == len )
{
MarketInfo( cur_symbol, MODE_BID );
if ( GetLastError() == 4106 )
{
Alert( "Íåèçâåñòíûé ñèìâîë ", cur_symbol, "!!!" );
return(-1);
}
if ( iClose( cur_symbol, StrToInteger( cur_period ), 0 ) <= 0 )
{
Alert( "Íåèçâåñòíûé ïåðèîä ", cur_period, "!!!" );
return(-1);
}
_Symbol[Charts] = cur_symbol; _Period[Charts] = StrToInteger( cur_period );
cur_symbol = ""; cur_period = ""; period_start = false;
Charts ++;
}
else
{ cur_symbol = cur_symbol + CharToStr( curchar ); }
}
pos++;
}
Print( "< - - - Íàéäåíî ", Charts, " êîððåêòíûõ ãðàôèêîâ. - - - >" );
ArrayResize( _Symbol, Charts ); ArrayResize( _Period, Charts );
ArrayResize( HistoryHandle, Charts ); ArrayResize( hwnd, Charts );
ArrayResize( last_fpos, Charts ); ArrayResize( pre_time, Charts );
ArrayResize( now_time, Charts ); ArrayResize( now_close, Charts );
ArrayResize( now_open, Charts ); ArrayResize( now_low, Charts );
ArrayResize( now_high, Charts ); ArrayResize( now_volume, Charts );
ArrayResize( pre_close, Charts ); ArrayResize( pre_open, Charts );
ArrayResize( pre_low, Charts ); ArrayResize( pre_high, Charts );
ArrayResize( pre_volume, Charts ); ArrayResize( _PeriodSec, Charts );
ArrayResize( del_open, Charts ); ArrayResize( del_low, Charts );
ArrayResize( del_high, Charts ); ArrayResize( del_volume, Charts );
ArrayResize( _Bars, Charts );
for ( int curChart = 0; curChart < Charts; curChart ++ )
{
cnt_copy = 0; cnt_delete = 0;
_PeriodSec[curChart] = _Period[curChart] * 60;
//---- îòêðûâàåì ôàéë, â êîòîðûé áóäåì çàïèñûâàòü èñòîðèþ
file_name = StringConcatenate( "WS_", _Symbol[curChart], _Period[curChart], ".hst" );
HistoryHandle[curChart] = FileOpenHistory( file_name, FILE_BIN | FILE_WRITE );
if ( HistoryHandle[curChart] < 0 )
{
_GetLastError = GetLastError();
Alert( "FileOpenHistory( \"", file_name, "\", FILE_BIN | FILE_WRITE )",
" - Error #", _GetLastError );
continue;
}
ArrayInitialize( temp, 0 );
//---- Çàïèñûâàåì çàãîëîâîê ôàéëà
FileWriteInteger ( HistoryHandle[curChart], 400, LONG_VALUE );
FileWriteString ( HistoryHandle[curChart], "Copyright © 2006, komposter", 64 );
FileWriteString ( HistoryHandle[curChart], StringConcatenate( "WS_", _Symbol[curChart] ), 12 );
FileWriteInteger ( HistoryHandle[curChart], _Period[curChart], LONG_VALUE );
FileWriteInteger ( HistoryHandle[curChart], MarketInfo( _Symbol[curChart], MODE_DIGITS ), LONG_VALUE );
FileWriteInteger ( HistoryHandle[curChart], 0, LONG_VALUE ); //timesign
FileWriteInteger ( HistoryHandle[curChart], 0, LONG_VALUE ); //last_sync
FileWriteArray ( HistoryHandle[curChart], temp, 0, 13 );
//+------------------------------------------------------------------+
//| Îáðàáàòûâàåì èñòîðèþ
//+------------------------------------------------------------------+
_Bars[curChart] = iBars( _Symbol[curChart], _Period[curChart] );
pre_time[curChart] = iTime( _Symbol[curChart], _Period[curChart], _Bars[curChart] - 1 );
for( int i = _Bars[curChart] - 1; i >= 1; i-- )
{
//---- Çàïîìèíàåì ïàðàìåòðû áàðà
now_open [curChart] = iOpen ( _Symbol[curChart], _Period[curChart], i );
now_high [curChart] = iHigh ( _Symbol[curChart], _Period[curChart], i );
now_low [curChart] = iLow ( _Symbol[curChart], _Period[curChart], i );
now_close [curChart] = iClose ( _Symbol[curChart], _Period[curChart], i );
now_volume [curChart] = iVolume ( _Symbol[curChart], _Period[curChart], i );
now_time [curChart] = iTime ( _Symbol[curChart], _Period[curChart], i ) / _PeriodSec[curChart];
now_time [curChart] *=_PeriodSec[curChart];
cnt_copy ++;
if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY )
{
del_open [curChart] = now_open [curChart];
del_high [curChart] = now_high [curChart];
del_low [curChart] = now_low [curChart];
del_volume [curChart] = now_volume [curChart];
cnt_delete ++;
continue;
}
if ( SundayToMonday )
{
if ( del_open[curChart] > 0 && del_volume[curChart] > 0 && del_low [curChart] > 0 && del_high[curChart] > 0 )
{
now_open [curChart] = del_open[curChart];
now_high [curChart] = MathMax( del_high[curChart], now_high[curChart] );
now_low [curChart] = MathMin( del_low [curChart], now_low [curChart] );
now_volume [curChart] += del_volume[curChart];
del_open[curChart] = 0.0;
del_high[curChart] = 0.0;
del_low [curChart] = 0.0;
del_volume[curChart] = 0.0;
}
}
//---- çàïèñûâàåì íîâûé áàð â ôàéë
FileWriteInteger ( HistoryHandle[curChart], now_time[curChart], LONG_VALUE );
FileWriteDouble ( HistoryHandle[curChart], now_open[curChart], DOUBLE_VALUE);
FileWriteDouble ( HistoryHandle[curChart], now_low[curChart], DOUBLE_VALUE);
FileWriteDouble ( HistoryHandle[curChart], now_high[curChart], DOUBLE_VALUE);
FileWriteDouble ( HistoryHandle[curChart], now_close[curChart], DOUBLE_VALUE);
FileWriteDouble ( HistoryHandle[curChart], now_volume[curChart], DOUBLE_VALUE);
FileFlush ( HistoryHandle[curChart] );
//---- çàïîìèíàåì çíà÷åíèå âðåìåíè è öåíó çàêðûòèÿ çàïèñàííîãî áàðà
pre_close[curChart] = now_close[curChart];
pre_time[curChart] = now_time[curChart] / _PeriodSec[curChart];
pre_time[curChart] *=_PeriodSec[curChart];
}
last_fpos[curChart] = FileTell( HistoryHandle[curChart] );
//---- âûâîäèì ñòàòèñòèêó
Print( "< - - - ", _Symbol[curChart], _Period[curChart], ": áûëî ", cnt_copy, " áàðîâ, óäàëåíî ", cnt_delete, " áàðîâ - - - >" );
Print( "< - - - Äëÿ ïðîñìîòðà ðåçóëüòàòîâ, îòêðîéòå ãðàôèê \"WS_",
_Symbol[curChart], _Period[curChart], "\" - - - >" );
}
//+------------------------------------------------------------------+
//| Îáðàáàòûâàåì ïîñòóïàþùèå òèêè
//+------------------------------------------------------------------+
while ( !IsStopped() )
{
RefreshRates();
for ( curChart = 0; curChart < Charts; curChart ++ )
{
if ( HistoryHandle[curChart] < 0 ) continue;
//---- ñòàâèì "êóðñîð" ïåðåä ïîñëåäíèì áàðîì
//---- (ýòî íåîáõîäèìî íà âñåõ çàïóñêàõ, êðîìå ïåðâîãî)
FileSeek( HistoryHandle[curChart], last_fpos[curChart], SEEK_SET );
//---- Çàïîìèíàåì ïàðàìåòðû áàðà
now_open [curChart] = iOpen ( _Symbol[curChart], _Period[curChart], 0 );
now_high [curChart] = iHigh ( _Symbol[curChart], _Period[curChart], 0 );
now_low [curChart] = iLow ( _Symbol[curChart], _Period[curChart], 0 );
now_close [curChart] = iClose ( _Symbol[curChart], _Period[curChart], 0 );
now_volume [curChart] = iVolume ( _Symbol[curChart], _Period[curChart], 0 );
now_time [curChart] = iTime ( _Symbol[curChart], _Period[curChart], 0 )
/ _PeriodSec[curChart];
now_time [curChart] *=_PeriodSec[curChart];
if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY )
{
del_open [curChart] = now_open [curChart];
del_high [curChart] = now_high [curChart];
del_low [curChart] = now_low [curChart];
del_volume [curChart] = now_volume [curChart];
continue;
}
if ( SundayToMonday )
{
if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY + 1 )
{
now_open [curChart] = del_open[curChart];
now_high [curChart] = MathMax( del_high[curChart], now_high[curChart] );
now_low [curChart] = MathMin( del_low [curChart], now_low [curChart] );
now_volume [curChart] += del_volume[curChart];
}
}
//---- åñëè áàð ñôîðìèðîâàëñÿ,
if ( now_time[curChart] >= pre_time[curChart] + _PeriodSec[curChart] )
{
//---- çàïèñûâàåì ñôîðìèðîâàâøèéñÿ áàð
FileWriteInteger ( HistoryHandle[curChart], pre_time[curChart], LONG_VALUE );
FileWriteDouble ( HistoryHandle[curChart], pre_open[curChart], DOUBLE_VALUE );
FileWriteDouble ( HistoryHandle[curChart], pre_low[curChart], DOUBLE_VALUE );
FileWriteDouble ( HistoryHandle[curChart], pre_high[curChart], DOUBLE_VALUE );
FileWriteDouble ( HistoryHandle[curChart], pre_close[curChart], DOUBLE_VALUE );
FileWriteDouble ( HistoryHandle[curChart], pre_volume[curChart], DOUBLE_VALUE );
FileFlush ( HistoryHandle[curChart] );
//---- çàïîìèíàåì ìåñòî â ôàéëå, ïåðåä çàïèñüþ 0-ãî áàðà
last_fpos[curChart] = FileTell( HistoryHandle[curChart] );
}
//---- çàïèñûâàåì òåêóùèé áàð
FileWriteInteger ( HistoryHandle[curChart], now_time[curChart], LONG_VALUE );
FileWriteDouble ( HistoryHandle[curChart], now_open[curChart], DOUBLE_VALUE );
FileWriteDouble ( HistoryHandle[curChart], now_low[curChart], DOUBLE_VALUE );
FileWriteDouble ( HistoryHandle[curChart], now_high[curChart], DOUBLE_VALUE );
FileWriteDouble ( HistoryHandle[curChart], now_close[curChart], DOUBLE_VALUE );
FileWriteDouble ( HistoryHandle[curChart], now_volume[curChart], DOUBLE_VALUE );
FileFlush ( HistoryHandle[curChart] );
//---- çàïîìèíàåì ïàðàìåòðû çàïèñàííîãî áàðà
pre_open[curChart] = now_open[curChart];
pre_high[curChart] = now_high[curChart];
pre_low[curChart] = now_low[curChart];
pre_close[curChart] = now_close[curChart];
pre_volume[curChart] = now_volume[curChart];
pre_time[curChart] = now_time[curChart] / _PeriodSec[curChart];
pre_time[curChart] *=_PeriodSec[curChart];
//---- íàõîäèì îêíî, â êîòîðîå áóäåì "îòïðàâëÿòü" ñâåæèå êîòèðîâêè
if ( hwnd[curChart] == 0 )
{
hwnd[curChart] = WindowHandle( StringConcatenate( "WS_", _Symbol[curChart] ),
_Period[curChart] );
if ( hwnd[curChart] != 0 ) { Print( "< - - - Ãðàôèê ", "WS_" + _Symbol[curChart],
_Period[curChart], " íàéäåí! - - - >" ); }
}
//---- è, åñëè íàøëè, îáíîâëÿåì åãî
if ( hwnd[curChart] != 0 ) { PostMessageA( hwnd[curChart], WM_COMMAND, 33324, 0 ); }
}
Sleep(RefreshLuft);
}
for ( curChart = 0; curChart < Charts; curChart ++ )
{
if ( HistoryHandle[curChart] >= 0 )
{
//---- çàêðûâàåì ôàéë
FileClose( HistoryHandle[curChart] );
HistoryHandle[curChart] = -1;
}
}
return(0);
}
Comments