TradeContext





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

/////////////////////////////////////////////////////////////////////////////////
/**/ int _IsTradeAllowed( int MaxWaiting_sec = 30 )
/////////////////////////////////////////////////////////////////////////////////
// ôóíêöèÿ îïðåäåëÿåò ñîñòîÿíèå òîðãîâîãî ïîòîêà. Êîäû âîçâðàòîâ:
//  1 - òîðãîâûé ïîòîê ñâîáîäåí, ìîæíî òîðãîâàòü
//  0 - òîðãîâûé ïîòîê áûë çàíÿò, íî îñâîáîäèëñÿ. Òîðãîâàòü ìîæíî òîëüêî ïîñëå îáíîâëåíèÿ ðûíî÷íîé èíôîðìàöèè.
// -1 - òîðãîâûé ïîòîê çàíÿò, îæèäàíèå ïðåðâàíî ïîëüçîâàòåëåì (ýêñïåðò óäàë¸í ñ ãðàôèêà, çàêðûò òåðìèíàë, èçìåíèëñÿ 
// 	  ïåðèîä è/èëè ñèìâîë ãðàôèêà, ... )
// -2 - òîðãîâûé ïîòîê çàíÿò, èñòåêëî ìàêñèìàëüíîå âðåìÿ îæèäàíèÿ (MaxWaiting_sec). Âîçìîæíî, ýêñïåðòó çàïðåùåíà 
// 	  òîðãîâëÿ (ãàëî÷êà "Ðàçðåøèòü ýêñïåðòó òîðãîâàòü" â íàñòðîéêàõ ýêñïåðòà).
//
// MaxWaiting_sec - âðåìÿ (â ñåêóíäàõ), â òå÷åíèè êîòîðîãî ôóíêöèÿ áóäåò æäàòü îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà (åñëè îí 
// çàíÿò). Ïî óìîë÷àíèþ = 30.
/////////////////////////////////////////////////////////////////////////////////
{
	// ïðîâåðÿåì, ñâîáîäåí ëè òîðãîâûé ïîòîê
	if ( !IsTradeAllowed() )
	{
		int StartWaitingTime = GetTickCount();
		Print( "Òîðãîâûé ïîòîê çàíÿò! Æä¸ì, ïîêà îí îñâîáîäèòüñÿ..." );
		// áåñêîíå÷íûé öèêë
		while ( true )
		{
			// åñëè ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì, ïðåêðàùàåì ðàáîòó
			if ( IsStopped() ) { Print( "Ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì!" ); return(-1); }
			// åñëè îæèäàíèå äëèòñÿ äîëüøå âðåìåíè, óêàçàííîãî â ïåðåìåííîé MaxWaiting_sec, òîæå ïðåêðàùàåì ðàáîòó
			if ( GetTickCount() - StartWaitingTime > MaxWaiting_sec * 1000 ) { Print( "Ïðåâûøåí ëèìèò îæèäàíèÿ (" + MaxWaiting_sec + " ñåê.)!" ); return(-2); }
			// åñëè òîðãîâûé ïîòîê îñâîáîäèëñÿ,
			if ( IsTradeAllowed() )
			{
				Print( "Òîðãîâûé ïîòîê îñâîáîäèëñÿ!" );
				return(0);
			}
			// åñëè íè îäíî èç óñëîâèé îñòàíîâêè öèêëà íå ñðàáîòàëî, "æä¸ì" 0,1 ñåêóíäû è íà÷èíàåì ïðîâåðêó ñíà÷àëà
			Sleep(100);
		}
	}
	else
	{
		Print( "Òîðãîâûé ïîòîê ñâîáîäåí!" );
		return(1);
	}
}
/*
Øàáëîí ýêñïåðòà, èñïîëüçóþùåãî ôóíêöèþ _IsTradeAllowed:
int start()
{
	// îïðåäåëÿåì íåîáõîäèìîñòü âõîäà â ðûíîê
	...
	// ðàñ÷èòûâàåì óðîâíè Ñòîï Ëîññ, Òåéê Ïðîôèò è ðàçìåð ëîòà
	...
	// ïðîâåðÿåì, ñâîáîäåí ëè òîðãîâûé ïîòîê
	int TradeAllow = _IsTradeAllowed();
	if ( TradeAllow < 0 ) { return(-1); }
	if ( TradeAllow == 0 )
	{
		RefreshRates();
		// ïåðåñ÷èòûâàåì óðîâíè Ñòîï Ëîññ è Òåéê Ïðîôèò
		...
	}
	// îòêðûâàåì ïîçèöèþ
	OrderSend(.....);
return(0);
}
*/

/////////////////////////////////////////////////////////////////////////////////
/**/ int TradeIsBusy ( int MaxWaiting_sec = 30 )
/////////////////////////////////////////////////////////////////////////////////
// Ôóíêöèÿ ìåíÿåò çíà÷åíèå ãëîáàëüíîé ïåðåìåííîé TradeIsBusy ñ 0 íà 1.
// Åñëè â ìîìåíò çàïóñêà TradeIsBusy = 1, ôóíêöèÿ æä¸ò, ïîêà TradeIsBusy ñòàíåò = 0, è òîëüêî ïîòîì ìåíÿåò.
// Åñëè ãëîáàëüíîé ïåðåìåííîé TradeIsBusy íå ñóùåñòâóåò, ôóíêöèÿ ñîçäà¸ò å¸.
// Êîäû âîçâðàòîâ:
//  1 - óñïåøíîå çàâåðøåíèå. Ãëîáàëüíîé ïåðåìåííîé TradeIsBusy ïðèñâîåíî çíà÷åíèå 1
// -1 - â ìîìåíò çàïóñêà ôóíêöèè TradeIsBusy = 1, îæèäàíèå áûëî ïðåðâàíî ïîëüçîâàòåëåì (ýêñïåðò óäàë¸í ñ ãðàôèêà, çàêðûò 
// òåðìèíàë, èçìåíèëñÿ ïåðèîä è/èëè ñèìâîë ãðàôèêà, ... )
// -2 - â ìîìåíò çàïóñêà ôóíêöèè TradeIsBusy = 1, èñòåêëî ìàêñèìàëüíîå âðåìÿ îæèäàíèÿ (MaxWaiting_sec)
/////////////////////////////////////////////////////////////////////////////////
{
	// ïðè òåñòèðîâàíèè íåò ñìûñëà â ðàçäåëåíèè òîðãîâîãî ïîòîêà - ïðîñòî çàâåðøàåì ðàáîòó ôóíêöèè
	if ( IsTesting() ) { return(1); }
	int _GetLastError = 0, StartWaitingTime = GetTickCount();

	//+------------------------------------------------------------------+
	//| Ïðîâåðÿåì, ñóùåñòâóåò ëè ãë. ïåðåìåííàÿ è, åñëè íåò, ñîçäà¸ì å¸
	//+------------------------------------------------------------------+
	while( true )
	{
		// åñëè ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì, ïðåêðàùàåì ðàáîòó
		if ( IsStopped() ) { Print( "Ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì!" ); return(-1); }
		// åñëè îæèäàíèå äëèòñÿ äîëüøå âðåìåíè, óêàçàííîãî â ïåðåìåííîé MaxWaiting_sec, òîæå ïðåêðàùàåì ðàáîòó
		if ( GetTickCount() - StartWaitingTime > MaxWaiting_sec * 1000 ) { Print( "Ïðåâûøåí ëèìèò îæèäàíèÿ (" + MaxWaiting_sec + " ñåê.)!" ); return(-2); }
		// ïðîâåðÿåì, ñóùåñòâóåò ëè ãë. ïåðåìåííàÿ
		if ( GlobalVariableCheck( "TradeIsBusy" ) )
		// åñëè îíà åñòü, âûõîäèì èç ýòîãî öèêëà è ïåðåõîäèì ê áëîêó èçìåíåíèÿ çíà÷åíèÿ TradeIsBusy
		{ break; }
		else
		// åñëè GlobalVariableCheck âåðíóëà FALSE, çíà÷èò ëèáî ïåðåìåííîé íåò, ëèáî ïðè ïðîâåðêå âîçíèêëà îøèáêà
		{
			_GetLastError = GetLastError();
			// åñëè ýòî âñ¸ òàêè îøèáêà, âûâîäèì èíôîðìàöèþ, æä¸ì 0,1 ñåêóíäû è íà÷èíàåì ïðîâåðêó ñíà÷àëà
			if ( _GetLastError != 0 )
			{
				Print( "TradeIsBusy() - GlobalVariableCheck ( \"TradeIsBusy\" ) - Error #", _GetLastError );
				Sleep(100);
				continue;
			}
		}

		// åñëè îøèáêè íåò, çíà÷èò ãëîáàëüíîé ïåðåìåííîé ïðîñòî íåò, ïûòàåìñÿ ñîçäàòü å¸
		if ( GlobalVariableSet ( "TradeIsBusy", 1.0 ) > 0 )
		// åñëè GlobalVariableSet > 0, çíà÷èò ãëîáàëüíàÿ ïåðåìåííàÿ óñïåøíî ñîçäàíà. Âûõîäèì èç ô-öèè
		{ return(1); }
		else
		// åñëè GlobalVariableSet âåðíóëà çíà÷åíèå <= 0, çíà÷èò ïðè ñîçäàíèè ïåðåìåííîé âîçíèêëà îøèáêà
		{
			_GetLastError = GetLastError();
			// âûâîäèì èíôîðìàöèþ, æä¸ì 0,1 ñåêóíäû è íà÷èíàåì ïîïûòêó ñíà÷àëà
			if ( _GetLastError != 0 )
			{
				Print( "TradeIsBusy() - GlobalVariableSet ( \"TradeIsBusy\", 0.0 ) - Error #", _GetLastError );
				Sleep(100);
				continue;
			}
		}
	}

	//+------------------------------------------------------------------+
	//| Åñëè âûïîëíåíèå ôóíêöèè äîøëî äî ýòîãî ìåñòà, çíà÷èò ãëîáàëüíàÿ ïåðåìåííàÿ ñóùåñòâóåò.
	//| Æä¸ì, ïîêà TradeIsBusy ñòàíåò = 0 è ìåíÿåì çíà÷åíèå TradeIsBusy ñ 0 íà 1
	//+------------------------------------------------------------------+
	while( true )
	{
		// åñëè ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì, ïðåêðàùàåì ðàáîòó
		if ( IsStopped() ) { Print( "Ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì!" ); return(-1); }
		// åñëè îæèäàíèå äëèòñÿ äîëüøå âðåìåíè, óêàçàííîãî â ïåðåìåííîé MaxWaiting_sec, òîæå ïðåêðàùàåì ðàáîòó
		if ( GetTickCount() - StartWaitingTime > MaxWaiting_sec * 1000 ) { Print( "Ïðåâûøåí ëèìèò îæèäàíèÿ (" + MaxWaiting_sec + " ñåê.)!" ); return(-2); }
		// ïûòàåìñÿ ìåíÿòü çíà÷åíèå TradeIsBusy ñ 0 íà 1
		if ( GlobalVariableSetOnCondition( "TradeIsBusy", 1.0, 0.0 ) )
		// åñëè íàì ýòî óäà¸òñÿ, âûõîäèì èç ô-öèè, âîçâðàùàÿ 1 - "óñïåøíîå çàâåðøåíèå"
		{ return(1); }
		else
		// åñëè íåò, âîçìîæíû 2 ïðè÷èíû: TradeIsBusy = 1 (òîãäà íàäî æäàòü), ëèáî âîçíèêëà îøèáêà (ýòî ìû è ïðîâåðèì)
		{
			_GetLastError = GetLastError();
			// åñëè ýòî âñ¸ òàêè îøèáêà, âûâîäèì èíôîðìàöèþ è ïðîáóåì åù¸ ðàç
			if ( _GetLastError != 0 )
			{
				Print( "TradeIsBusy() - GlobalVariableSetOnCondition ( \"TradeIsBusy\", 1.0, 0.0 ) - Error #", _GetLastError );
				continue;
			}
		}

		// åñëè îøèáêè íåò, çíà÷èò TradeIsBusy = 1 (äðóãîé ýêñïåðò òîðãóåò) - âûâîäèì èíôîðìàöèþ è æä¸ì...
		Comment ( "Æä¸ì, ïîêà äðóãîé ýêñïåðò çàêîí÷èò òîðãîâàòü..." );
		Sleep(1000);
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void TradeIsNotBusy ()
/////////////////////////////////////////////////////////////////////////////////
// Ôóíêöèÿ óñòàíàâëèâàåò çíà÷åíèå ãëîáàëüíîé ïåðåìåííîé TradeIsBusy = 0.
// Åñëè ãëîáàëüíîé ïåðåìåííîé TradeIsBusy íå ñóùåñòâóåò, ôóíêöèÿ ñîçäà¸ò å¸.
/////////////////////////////////////////////////////////////////////////////////
{
	// ïðè òåñòèðîâàíèè íåò ñìûñëà â ðàçäåëåíèè òîðãîâîãî ïîòîêà - ïðîñòî çàâåðøàåì ðàáîòó ôóíêöèè
	if ( IsTesting() ) { return(0); }
	int _GetLastError;

	while( true )
	{
		// åñëè ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì, ïðåêðàùàåì ðàáîòó
		if ( IsStopped() ) { Print( "Ýêñïåðò áûë îñòàíîâëåí ïîëüçîâàòåëåì!" ); return(-1); }
		// ïûòàåìñÿ óñòàíîâèòü çíà÷åíèå ãë. ïåðåìåííîé = 0 (èëè ñîçäàòü ãë. ïåðåìåííóþ)
		if ( GlobalVariableSet( "TradeIsBusy", 0.0 ) > 0 )
		// åñëè GlobalVariableSet âåðíóëà çíà÷åíèå > 0, çíà÷èò âñ¸ çàêîí÷èëîñü õîðîøî. Âûõîäèì èç ô-öèè
		{ return(1); }
		else
		// åñëè GlobalVariableSet âåðíóëà çíà÷åíèå <= 0, çíà÷èò âîçíèêëà îøèáêà. Âûâîäèì èíôîðìàöèþ, æä¸ì, è ïðîáóåì åù¸ ðàç
		{
			_GetLastError = GetLastError();
			if ( _GetLastError != 0 )
			{ Print( "TradeIsNotBusy() - GlobalVariableSet ( \"TradeIsBusy\", 0.0 ) - Error #", _GetLastError ); }
		}
		Sleep(100);
	}
}

/*
Øàáëîí ýêñïåðòà, èñïîëüçóþùåãî ôóíêöèè TradeIsBusy() è TradeIsNotBusy():

#include <TradeContext.mqh>

int start()
{
	// îïðåäåëÿåì íåîáõîäèìîñòü âõîäà â ðûíîê
	...
	// ðàñ÷èòûâàåì óðîâíè Ñòîï Ëîññ, Òåéê Ïðîôèò è ðàçìåð ëîòà
	...
	// æä¸ì îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà è çàíèìàåì åãî (åñëè ïðîèçîøëà îøèáêà, âûõîäèì)
	if ( TradeIsBusy() < 0 ) { return(-1); }
	// îáíîâëÿåì ðûíî÷íóþ èíôîðìàöèþ
	RefreshRates();
	// ïåðåñ÷èòûâàåì óðîâíè Ñòîï Ëîññ è Òåéê Ïðîôèò
	...
	// îòêðûâàåì ïîçèöèþ
	OrderSend(.....);
	// îñâîáîæäàåì òîðãîâûé ïîòîê
	TradeIsNotBusy();
return(0);
}
*/



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
It automatically opens orders when conditions are reached

Other Features: