EqualVolumeBars





//+------------------------------------------------------------------+
//|                                              EqualVolumeBars.mq4 |
//|                                      Copyright © 2008, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, komposter"
#property link      "mailto:komposterius@mail.ru"

#include <WinUser32.mqh>

//---- Êîëè÷åñòâî òèêîâ â îäíîì áàðå
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);
}



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:


It issuies visual alerts to the screen
Uses files from the file system
It reads information from a file