//+------------------------------------------------------------------+
//|                                             		    AllMinutes.mq4 |
//|                                      Copyright © 2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, komposter"
#property link      "mailto:komposterius@mail.ru"
//----
#include <WinUser32.mqh>
// Ñïèñîê ãðàôèêîâ êîòîðûå íåîáõîäèìî îáðàáàòûâàòü, ðàçäåë¸ííûé çàïÿòîé (",")
extern string	ChartList	= "EURUSD1,GBPUSD1";
// Ðàçðåøèòü/çàïðåòèòü ðèñîâàòü áàðû â âûõîäíûå
// Åñëè == true, âûõîäíûå îñòàíóòñÿ íåçàïîëíåíûìè
// Åñëè == false, âûõîäíûå áóäóò çàïîëíåíû áàðàìè O=H=L=C
extern bool		SkipWeekEnd	= true;
// ×àñòîòà, ñ êîòîðîé áóäóò îáíîâëÿòüñÿ ãðàôèêè â ìèëèñåêóíäàõ
//- ×åì áîëüøå çíà÷åíèå, òåì ìåíüøå ðåñóðñîâ áóäåò èñïîëüçîâàòü ñêðèïò.
extern int		RefreshLuft	= 1000;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() 
  { 
   start(); 
   return(0); 
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
	  int		_GetLastError = 0, cnt_copy = 0, cnt_add = 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[];
//---- ñ÷èòàåì êîëè÷åñòâî ãðàôèêîâ, êîòîðûå íåîáõîäèìî îáðàáîòàòü
	  while(pos <= len)
	    {
		     curchar = StringGetChar( ChartList, pos);
		     if(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 = "";
				           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(_Bars,	Charts);
	  for(int curChart = 0; curChart < Charts; curChart++)
	    {
		     _PeriodSec[curChart] = _Period[curChart]*60;
		     //---- îòêðûâàåì ôàéë, â êîòîðûé áóäåì çàïèñûâàòü èñòîðèþ
		     file_name = StringConcatenate("ALL", _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;
		       }
		     //---- Çàïèñûâàåì çàãîëîâîê ôàéëà
		     FileWriteInteger(HistoryHandle[curChart], 400, LONG_VALUE);
		     FileWriteString(HistoryHandle[curChart], "Copyright © 2006, komposter", 64);
		     FileWriteString(HistoryHandle[curChart], 
							                StringConcatenate("ALL", _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];
			        //---- åñëè åñòü ïðîïóùåííûå áàðû,
			        while(now_time[curChart] > pre_time[curChart] + _PeriodSec[curChart])
			          {
				           pre_time[curChart] += _PeriodSec[curChart];
				           pre_time[curChart] /= _PeriodSec[curChart];
				           pre_time[curChart] *= _PeriodSec[curChart];
				           //---- åñëè ýòî íå âûõîäíûå,
				           if(SkipWeekEnd)
				             {
					              if(TimeDayOfWeek(pre_time[curChart]) <= 0 || 
							               TimeDayOfWeek(pre_time[curChart]) > 5) 
							                continue; 
					              if(TimeDayOfWeek(pre_time[curChart]) == 5)
					                {
						                 if(TimeHour(pre_time[curChart]) == 23 || 
						                    TimeHour(pre_time[curChart] + 
						                    _PeriodSec[curChart]) == 23) 
						                     continue; 
					                }
				             }
				           //---- çàïèñûâàåì ïðîïóùåííûé áàð â ôàéë
				           FileWriteInteger(HistoryHandle[curChart], pre_time[curChart],	LONG_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], pre_close[curChart],	DOUBLE_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], pre_close[curChart],	DOUBLE_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], pre_close[curChart],	DOUBLE_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], pre_close[curChart],	DOUBLE_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], 1,	DOUBLE_VALUE);
				           FileFlush(HistoryHandle[curChart]);
				           cnt_add ++;
			          }
			        //---- çàïèñûâàåì íîâûé áàð â ôàéë
			        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]);
			        cnt_copy ++;
			        //---- çàïîìèíàåì çíà÷åíèå âðåìåíè è öåíó çàêðûòèÿ çàïèñàííîãî áàðà
			        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_add, " áàðîâ - - - >");
	      Print("< - - - Äëÿ ïðîñìîòðà ðåçóëüòàòîâ, îòêðîéòå ãðàôèê \"ALL", 
									    _Symbol[curChart], _Period[curChart], "\" - - - >");
	    }
	  //+------------------------------------------------------------------+
	  //| Îáðàáàòûâàåì ïîñòóïàþùèå òèêè
	  //+------------------------------------------------------------------+
	  while(!IsStopped())
	    {
		     RefreshRates();
		     for(curChart = 0; curChart < Charts; curChart ++)
		       {
			        //---- ñòàâèì "êóðñîð" ïåðåä ïîñëåäíèì áàðîì
			        //---- (ýòî íåîáõîäèìî íà âñåõ çàïóñêàõ, êðîìå ïåðâîãî)
			        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(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] );
			          }
			        //---- åñëè ïîÿâèëèñü ïðîïóùåííûå áàðû,
			        while(now_time[curChart] > pre_time[curChart] + _PeriodSec[curChart])
			          {
				           pre_time[curChart] += _PeriodSec[curChart];
				           pre_time[curChart] /= _PeriodSec[curChart];
				           pre_time[curChart] *= _PeriodSec[curChart];
				           //---- åñëè ýòî íå âûõîäíûå,
				           if(SkipWeekEnd)
				             {
					              if(TimeDayOfWeek(pre_time[curChart]) <= 0 || 
						                TimeDayOfWeek(pre_time[curChart]) > 5 ) 
						                 continue; 
					              if(TimeDayOfWeek(pre_time[curChart]) == 5)
					                {
						                 if(TimeHour(pre_time[curChart]) == 23 || 
							                   TimeHour(pre_time[curChart] + _PeriodSec[curChart]) == 23) 
							                    continue; 
					                }
				             }
				           //---- çàïèñûâàåì ïðîïóùåííûé áàð â ôàéë
				           FileWriteInteger(HistoryHandle[curChart], pre_time[curChart],	LONG_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], pre_close[curChart],	DOUBLE_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], pre_close[curChart],	DOUBLE_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], pre_close[curChart],	DOUBLE_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], pre_close[curChart],	DOUBLE_VALUE);
				           FileWriteDouble(HistoryHandle[curChart], 1,	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( "ALL", _Symbol[curChart]), 
																								                     _Period[curChart]);
				           if(hwnd[curChart] != 0) 
				             { 
				               Print("< - - - Ãðàôèê ", "ALL" + _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