SU3D[v5]





//+------------------------------------------------------------------+
//|                                                     Su3D[v4].mq4 |
//|                                      Copyright © 2008, Sgibnev   |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "25.03.2009"

//+------------------------------------------------------------------+
//| ÓÑÒÀÍÎÂÊÀ ÂÐÅÌÅÍÈ ÄÅÉÑÒÂÈß ÝÊÑÏÅÐÒÀ ÄÎ:                          +                                                 |
//+------------------------------------------------------------------+
double Days = 25;
double Months = 03;
double Years = 2009;

//double Account1 =40263; 
//double Account2 =183199671;
//double Account3 =183202028;
 

//---- Âíåøíèå ïåðåìåííûå (äîñòóïíûå â îêíå ñâîéñòâ ýêñïåðòà) - ìîæíî óñòàíîâèòü çíà÷åíèÿ ïî óìîë÷àíèþ
extern string 		Symbols 	         	= "GBPUSDH1, AUDCADH1, EURJPYH1, EURUSDH1, USDJPYH1";
extern int        Charts                     = 1;
extern string 		Rick   	           = "TotalEquityRisk 1-5";
extern double     TotalEquityRisk     =3 ;
extern string 		Trade 	           = "Long&Short=0, Only Long=1, Only Short=-1";
extern int      	TradeDirection		        	= 0;		// Ðàçðåøåííîå íàïðàâëåíèå òîðãîâëè: 0 - Buy & Sell, 1 - Buy Only, -1 - Sell Only

int               Profit                     =1; 
//string 		Properties 	            	= "=========== Properties ===========";
double		LotExponent;	
int			PipStep;	
int			TakeProfit						= 25;		// Íåîáõîäèìàÿ äëÿ çàêðûòèÿ ïîçèöèé ïðèáûëü
int			MaxTrades						= 18;		// Ìàêñèìàëüíîå êîë-âî äîëèâîê
int			StopLoss				      	= 15;		// Ïðè óáûòêå ïîñëåäíåé äîëèâêè ðàçìåðîì LastStopLoss ïóíêòîâ âñÿ ñåðèÿ çàêðûâàåòñÿ

int 			Expert_Id 						= 2009;	// Óíèêàëüíûé èäåíòèôèêàòîð ýêñïåðòà. Åñëè íà 2-õ ãðàôèêàõ ñ îäèíàêîâûì Ñèìâîëîì È ÒàéìÔðåéìîì äîëæíî ðàáîòàòü 2 ýêñïåðòà, íàäî óñòàíîâèòü èì ðàçíûå Expert_Id
//int      	TradeDirection		        	= 0;		// Ðàçðåøåííîå íàïðàâëåíèå òîðãîâëè: 0 - Buy & Sell, 1 - Buy Only, -1 - Sell Only
double      StartLot_b, StartLot_s;	// Ñòàðòîâûé ëîò


double RBCImax = 40,FTLMmax = 10,STLMmax = 100,STLMmin = 20,PCCImax = 20;  //M5 
double FTLM,STLM,PCCI,RBCI,SATL,FATL,RFTL,RSTL;
double aSATL[4],aFATL[4],aRFTL[4],aRSTL[4],aFTLM[4],aSTLM[4],aPCCI[4],aRBCI[4];
double tFATL,tRFTL,tSATL,tRSTL,tFTLM,tRBCI,tSTLM,tPCCI;
double atFATL[2];


bool L1 = True,L2A = True,L2B = True, L3 = True,L4 = True,L5 = True,L6 = True,L7 = True,L8 =True;
bool S1 = True,S2A = True,S2B = True,S3 = True,S4 = True,S5 = True,S6 = True,S7 = True,S8 = True;

   int shift;


//========================================================
string 	Trade_Properties 		= "--------Trade-Properties-------";
int 		Slippage 				= 5;
int 		PauseBeforeTrade		= 5;
int 		MaxWaitingTime			= 300;
color 	OrderBuyColor 			= Lime;
color 	OrderSellColor 		= Red;

 string 	Allow_Flags		 		= "-----------Allow-Flags---------";
 bool		Allow_Info				= false;
 bool		Allow_LogFile			= false;
 bool		Allow_TradeLogFile	= false;
 bool		Allow_ErrorMail		= true;
 bool		Allow_ErrorLogFile	= false;

 string 	Info_Properties 		= "--------Info-Properties--------";
 bool		EnglishInfo				= true;
 int		Font_Size_Variant		= 2; //îò 1 äî 10
 color 	Standart_Color 		= White;
 color 	Warning_Color 			= Magenta;
 color 	Price_Up_Color 		= Lime;
color 	Price_Down_Color 		= Red;

string	strComment, strPeriod, TradeInfoLib_Font = "Arial";
double	TradeInfoLib_FontSize, TradeInfoLib_HeadFontSize;

string	_Symbol, ExpertName;
int		_Period, _MagicNumber, _Digits;
double	_Point, _StopLevel, _Spread;
datetime StartTime;

/////////////////////////////////////////////////////////////////////////////////
string stringServer						= "";
string stringReal							= "";
string stringDemo							= "";
string stringTradeAllow					= "";
string stringTradeNotAllow				= "";
string stringLoaded						= "";

string stringOpenedPosition			= "";
string stringOpenedOrder				= "";
string stringPointBefore				= "";

string stringGlobalStop					= "";
string stringGlobalStop1				= "";
string stringGlobalStop2				= "";
string stringNoBars						= "";

string stringInvalidParameters		= "";///////////////////////////////
string stringInvalidOrderType			= "";//////////////////////////////////////
string stringInvalidVolume				= "";
string stringIncorrectAbove			= "";
string stringIncorrectBelow			= "";
string stringIncorrectTooBeside		= " ";
string stringInvalidExpiration		= " ";
string stringIncorrectExpiration		= "";

string stringSendingOrder				= "";
string stringSendingOrder1				= "";
string stringSendingPosition			= "";
string stringSendingPosition1			= "";

string stringCheck						= "";
string stringCheckError					= "";
string stringCheckOK						= "";

string stringNoConnection				= "";
string stringStopped						= "";
string stringTimeOut						= "";
string stringSuccessfully				= "";
/////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////
/**/ void TradeInfoLib_Initialization ( int TradeInfoLib_ExpertId, string TradeInfoLib_ExpertName )
/////////////////////////////////////////////////////////////////////////////////
// Èíèöèàëèçàöèÿ ïåðåìåííûõ, ñîçäàíèå îáúåêòîâ äëÿ âûâîäà èíôîðìàöèè,
// çàïèñü â ëîã èíôîðìàöèè îá èíèöèàëèçàöèè.
// Ãåíåðàöèÿ êîììåíòàðèÿ ê îðäåðàì ( êîòîðûå áóäóò îòêðûòû ñ ïîìîùüþ ô-öèè _OrderSend )
//
// Íåîáõîäèìî âûçâàòü ô-öèþ èç init() ýêñïåðòà
/////////////////////////////////////////////////////////////////////////////////
{

		/////////////////////////////////////////////////////////////////////////////////
		if ( EnglishInfo )
		{
				stringServer						= "Server ";
				stringReal							= "REAL ACCOUNT #";
				stringDemo							= "Demo account #";
				stringTradeAllow					= "TRADE IS ALLOWED!";
				stringTradeNotAllow				= "Trade is not allowed";
				stringLoaded						= "Expert loaded successfully...";

				stringOpenedPosition				= " - position opened by this expert:";
				stringOpenedOrder					= " - order opened by this expert:";
				stringPointBefore					= "Ïóíêòîâ äî ñðàáàòûâàíèÿ - ";///////////////////////////////

				stringGlobalStop					= "Expert was stopped!";
				stringGlobalStop1					= "Global variable";
				stringGlobalStop2					= "must be >= 0!";
				stringNoBars						= "Ñëèøêîì ìàëî áàðîâ íà ãðàôèêå!";///////////////////////////

				stringInvalidParameters			= "Invalid trade parameters";
				stringInvalidOrderType			= "Invalid OrderType";
				stringInvalidVolume				= " - invalid volume!!!";
				stringIncorrectAbove				= " - Incorrect (above";
				stringIncorrectBelow				= " - Incorrect (below";
				stringIncorrectTooBeside		= " - Incorrect (too beside to";
				stringInvalidExpiration			= " - Äëÿ ìàðêåò-îðäåðà íåëüçÿ óñòàíîâèòü âðåìÿ èñòå÷åíèÿ!!!";//////
				stringIncorrectExpiration		= " - Âðåìÿ èñòå÷åíèÿ íåëüçÿ óñòàíîâèòü â ïðîøëîì!!!";/////////////

				stringSendingOrder				= "Sending ";
				stringSendingOrder1				= "-order...";
				stringSendingPosition			= "Sending ";
				stringSendingPosition1			= " position...";

				stringCheck							= "Checking.....";
				stringCheckError					= "Checking.....Error!";
				stringCheckOK						= "Checking.....OK...";

				stringNoConnection				= "No connection with trade server";
				stringStopped						= "Expert was stopped by user";
				stringTimeOut						= "Limit of waiting time";
				stringSuccessfully				= "Successfully...";
		}
		/////////////////////////////////////////////////////////////////////////////////
//		if (false) { _MagicNumber(1,"",1); _OrderSend("",1,1.1,1.1,1,1.1,1.1); _OrderModify(1,1.1,1.1,1.1,0); _OrderClose(1,1.1,1.1,1); _OrderDelete(1); _Reverse(1); _TrailingStop(1,1); intPeriod(1); }
	int _GetLastError;

//---- ïðè òåñòèðîâàíèè âñå "êðàñèâîñòè" âûêëþ÷àåì
	if ( IsTesting() )
	{
		if ( !IsVisualMode() ) Allow_Info = false;
		Allow_LogFile			= false;
		Allow_TradeLogFile	= false;
		Allow_ErrorMail		= false;
		Allow_ErrorLogFile	= false;
	}

//---- Èíèöèàëèçèðóåì ãëîáàëüíûå ïåðåìåííûå áèáëèîòåêè (îáúÿâëåííûå âíå ô-öèé)
	StartTime	= 0;
	_Symbol		= Symbol();
	_Period		= Period();
	_Digits		= MarketInfo( _Symbol, MODE_DIGITS );
	_Point		= MarketInfo( _Symbol, MODE_POINT );
	_StopLevel	= NormalizeDouble ( ( MarketInfo( _Symbol, MODE_STOPLEVEL ) + 1 ) * _Point, _Digits );
	_Spread		= NormalizeDouble ( MarketInfo ( _Symbol, MODE_SPREAD ) * _Point, _Digits );
	strPeriod	= strPeriod( _Period );
	_MagicNumber= _MagicNumber( TradeInfoLib_ExpertId, _Period );


	if ( TradeInfoLib_ExpertName == "" )
		ExpertName = WindowExpertName();
	else
		ExpertName = TradeInfoLib_ExpertName;

	strComment	= ExpertName + " (" + _Symbol + ", " + strPeriod + ")";
//---- Ñîçäà¸ì ýêñïåðòó ëè÷íóþ ãëîáàëüíóþ ïåðåìåííóþ
	while ( !IsStopped() )
	{
		if ( GlobalVariableSet( strComment + "-return!", 0.0 ) > 0 ) { break; }
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 )
		{ Print( TradeInfoLib_ExpertId, ", ", TradeInfoLib_ExpertName, " ) - GlobalVariableSet ( \"", strComment, "-return!\", 0.0 ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" ); }

		Sleep(100);
	}
	
//---- Óñòàíàâëèâàåì ãëîáàëüíóþ ïåðåìåííóþ TradeIsBusy â 0
	TradeIsNotBusy();

//---- Ñîçäà¸ì îáúåêòû äëÿ âûâîäà èíôîðìàöèè
	int v_shag = 16;
	int h_shag = 350;
	switch ( Font_Size_Variant )
	{
		case 1:	TradeInfoLib_FontSize = 5;		TradeInfoLib_HeadFontSize = 5;	v_shag = 8;		h_shag = 180; break;
		case 2:	TradeInfoLib_FontSize = 6;		TradeInfoLib_HeadFontSize = 7;	v_shag = 9;		h_shag = 200; break;
		case 3:	TradeInfoLib_FontSize = 7;		TradeInfoLib_HeadFontSize = 8;	v_shag = 11;	h_shag = 230; break;
		case 4:	TradeInfoLib_FontSize = 8;		TradeInfoLib_HeadFontSize = 9;	v_shag = 13;	h_shag = 270; break;
		case 5:	TradeInfoLib_FontSize = 9;		TradeInfoLib_HeadFontSize = 11;	v_shag = 15;	h_shag = 310; break;
		case 6:	TradeInfoLib_FontSize = 10;	TradeInfoLib_HeadFontSize = 12;	v_shag = 16;	h_shag = 350; break;
		case 7:	TradeInfoLib_FontSize = 11;	TradeInfoLib_HeadFontSize = 13;	v_shag = 18;	h_shag = 390; break;
		case 8:	TradeInfoLib_FontSize = 12;	TradeInfoLib_HeadFontSize = 14;	v_shag = 20;	h_shag = 430; break;
		case 9:	TradeInfoLib_FontSize = 13;	TradeInfoLib_HeadFontSize = 15;	v_shag = 22;	h_shag = 480; break;
		case 10:	TradeInfoLib_FontSize = 14;	TradeInfoLib_HeadFontSize = 16;	v_shag = 24;	h_shag = 530; break;
		default:	TradeInfoLib_FontSize = 10;	TradeInfoLib_HeadFontSize = 12;	v_shag = 16;	h_shag = 350; break;
	}

	_LabelCreate ( "ExpertLog_00", 4, 15				);
	_LabelCreate ( "ExpertLog_01", 4, 15 + v_shag	);
	_LabelCreate ( "ExpertLog_02", 4, 15 + v_shag*2 );
	_LabelCreate ( "ExpertLog_03", 4, 15 + v_shag*3 );
	_LabelCreate ( "ExpertLog_04", 4, 15 + v_shag*4 );

	_LabelCreate ( "ExpertLog_10", h_shag, 15					);
	_LabelCreate ( "ExpertLog_11", h_shag, 15 + v_shag		);
	_LabelCreate ( "ExpertLog_12", h_shag, 15 + v_shag*2	);
	_LabelCreate ( "ExpertLog_13", h_shag, 15 + v_shag*3	);
	_LabelCreate ( "ExpertLog_14", h_shag, 15 + v_shag*4	);

//---- Âûâîäèì èíôîðìàöèþ îá èíèöèàëèçàöèè è çàïèñûâàåì å¸ â ôàéë
	string	AccountStatus	= stringReal;
	int		AccountColor	= 1;
	if ( IsDemo() )
	{
		AccountStatus	= stringDemo;
		AccountColor	= 0;
	}
	string	TradeStatus	= stringTradeAllow;
	int		TradeColor	= 1;
	if ( !IsTradeAllowed() )
	{
		TradeStatus	= stringTradeNotAllow;
		TradeColor	= 0;
	}
	clear_info ();
	_FileWrite	( 		"\n"																									);
	_FileWrite	( 		"++---------Initialization---------++"														);
	_info			( 1,	stringServer + ServerAddress()											, 0				);
	_info			( 2,	AccountStatus + AccountNumber() + " ( " + AccountName() + " )"	, AccountColor );
	_info			( 3,	TradeStatus																		, TradeColor	);
	_info			( 4,	stringLoaded																	, 0				);
	_FileWrite	( 		"++--------------------------------++\n"													);

//---- Ñïèì ñåêóíäó, ÷òîá ýòó ñàìóþ èíôîðìàöèþ ìîæíî áûëî ïðî÷èòàòü =)
	Sleep(1000);
}

/////////////////////////////////////////////////////////////////////////////////
/**/ bool IsOK()
/////////////////////////////////////////////////////////////////////////////////
// Ïðîâåðêà ëè÷íîé ãëîáàëüíîé ïåðåìåííîé ýêñïåðòà, êîëè÷åñòâà áàðîâ íà ãðàôèêå è Ðàçðåøåíèÿ òîðãîâàòü
//  ñëó÷àå óñïåøíîé ïðîâåðêè âîçâðàùàåò true, èíà÷å - false. Ïðè òåñòèðîâàíèè âîçâðàùàåò true.
// Ðåêîìåíäóåòñÿ â ñëó÷àå IsOK() == false ïðåêðàùàòü ðàáîòó ýêñïåðòà.
/////////////////////////////////////////////////////////////////////////////////
{
	if ( IsTesting() )
	{
		if ( IsVisualMode() ) clear_info();
		return(true);
	}

	_StopLevel	= NormalizeDouble ( ( MarketInfo( _Symbol, MODE_STOPLEVEL ) + 1 ) * _Point, _Digits );
	_Spread		= NormalizeDouble ( MarketInfo ( _Symbol, MODE_SPREAD ) * _Point, _Digits );

	clear_info();

	if ( GlobalVariableGet ( strComment + "-return!" ) < 0 )
	{
		_info( 1, stringGlobalStop, 1 );
		_info( 2, stringGlobalStop1 + "\"" + strComment + "-return!\" " + stringGlobalStop2, 1 );
		return(false);
	}
	if ( Bars < 100 )
	{
		_info( 1, stringNoBars, 1 );
		return(false);
	}
return(true);
}
/////////////////////////////////////////////////////////////////////////////////
/**/ void TradeInfoLib_Deinitialization()
/////////////////////////////////////////////////////////////////////////////////
// Óäàëåíèå îáúåêòîâ, ñîçäàíûõ áèáëèîòåêîé. Ïðè óñïåøíîì âûïîëíåíèè âîçâðàùàåò true, èíà÷å - false.
//
// Íåîáõîäèìî âñòàâèòü â deinit() ýêñïåðòà.
/////////////////////////////////////////////////////////////////////////////////
{
	int _GetLastError;
	
//---- Óäàëÿåì ëè÷íóþ ãëîáàëüíóþ ïåðåìåííóþ ýêñïåðòà
	if( !GlobalVariableDel( strComment + "-return!" ) )
	{
		_GetLastError = GetLastError();
		Print( "SU3D[v5]", strComment, "-return!\" ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
	}

	if ( !Allow_Info ) { return(0); }

//---- È âñå îáúåêòû äëÿ âûâîäà èíôîðìàöèè
	if ( !ObjectDelete ( "ExpertLog_00" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "00", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_01" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "01", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_02" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "02", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_03" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "03", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_04" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "04", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_10" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "10", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_11" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "11", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_12" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "12", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_13" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "13", _GetLastError );
	}
	if ( !ObjectDelete ( "ExpertLog_14" ) )
	{
		_GetLastError = GetLastError();
		TradeInfoLib_Deinit_print( "14", _GetLastError );
	}
}
void TradeInfoLib_Deinit_print ( string ExpertLog_Number, int Error )
{
	Print( "SU3D[v5]", ExpertLog_Number, "\" ) - Error #", Error, " ( ", ErrorDescription( Error ), " )" );
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void _info ( int LogNumber, string Text = "", int ColorVariant = 0, bool File_Log = true )
/////////////////////////////////////////////////////////////////////////////////
// Âûâîä èíôîðìàöèè íà ýêðàí, çàïèñü å¸ æå â ëîã-ôàéë ýêñïåðòà è â ëîã-ôàéë ÌÒ.
//
// LogNumber - íîìåð ñòðîêè íà ýêðàíå, â êîòîðóþ áóäåò âûâåäåíà èíôîðìàöèÿ:
// îò 1 äî 4 (4 ñòðîêè íà ëåâîé ïîëîâèíå ýêðàíà) è îò 10 äî 14 (5 ñòðîê - íà ïðàâîé) 
//
// Text - ñîáñòâåííî, òåêñò, âûâîäèìûé íà ýêðàí è çàïèñûâàåìûé â ëîã-ôàéëû
//
// ColorVariant - öâåò âûâîäà èíôîðìàöèè íà ýêðàí: 0 - Standart_Color, 1 - Warning_Color,
// 2 - Price_Up_Color, 3 - Price_Down_Color. Âñå 4 öâåòà ïðåäîïðåäåëÿþòñÿ âõîäÿùèìè ïåðåìåííûìè.
//
// File_Log - ôëàã, ðàçðåøàþùèé (çàïðåùàþùèé) çàïèñü èíôîðìàöèè â ëîã-ôàéë ýêñïåðòà:
// 1(true) - çàïèñü ðàçðåøåíà (ïî óìîë÷àíèþ), 0(false) - çàïèñü çàïðåùåíà.
/////////////////////////////////////////////////////////////////////////////////
{
	int _GetLastError;

	if ( Allow_Info )
	{
		string _infoLabelName;
		double _infoFontSize = TradeInfoLib_FontSize;
		switch ( LogNumber )
		{
			case 0:  _infoLabelName = "ExpertLog_00";	_infoFontSize = TradeInfoLib_HeadFontSize;	break;
			case 1:  _infoLabelName = "ExpertLog_01";																break;
			case 2:  _infoLabelName = "ExpertLog_02";																break;
			case 3:  _infoLabelName = "ExpertLog_03";																break;
			case 4:  _infoLabelName = "ExpertLog_04";																break;
			case 10: _infoLabelName = "ExpertLog_10";	_infoFontSize = TradeInfoLib_HeadFontSize;	break;
			case 11: _infoLabelName = "ExpertLog_11";																break;
			case 12: _infoLabelName = "ExpertLog_12";																break;
			case 13: _infoLabelName = "ExpertLog_13";																break;
			case 14: _infoLabelName = "ExpertLog_14";																break;
			default: _infoLabelName = "ExpertLog_01";																break;
		}
		color _infoColor;
		switch ( ColorVariant )
		{
			case 1:	_infoColor = Warning_Color;		break;
			case 2:	_infoColor = Price_Up_Color;		break;
			case 3:	_infoColor = Price_Down_Color;	break;
			default:	_infoColor = Standart_Color;		break;
		}

		if ( !ObjectSetText( "ExpertLog_00", "Expert log ( " + TimeToStr( TimeLocal(), TIME_SECONDS) + " )", TradeInfoLib_HeadFontSize, TradeInfoLib_Font, Standart_Color ) )
		{
			_GetLastError = GetLastError();
			Print( "( ", LogNumber, ", \"", Text, "\", ", ColorVariant, ", ", File_Log, " ) - ObjectSetText( \"ExpertLog_00\", \"Expert log ( ", TimeToStr( TimeLocal(), TIME_SECONDS), " )\", ", TradeInfoLib_HeadFontSize, ", ", TradeInfoLib_Font, ", ", Standart_Color, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
		}

		if ( !ObjectSetText( _infoLabelName, Text, _infoFontSize, TradeInfoLib_Font, _infoColor) )
		{
			_GetLastError = GetLastError();
			Print( "( ", LogNumber, ", \"", Text, "\", ", ColorVariant, ", ", File_Log, " ) - ObjectSetText( \"", _infoLabelName,"\", \"", Text, "\", ", _infoFontSize, ", ", TradeInfoLib_Font, ", ", _infoColor, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
		}
	}

	if ( Text != "" && File_Log ) { _FileWrite ( Text ); }
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void clear_info ()
/////////////////////////////////////////////////////////////////////////////////
// Î÷èñòêà ýêðàíà îò èíôîðìàöèè, âûâåäåííîé áèáëèîòåêîé íà ýêðàí.
/////////////////////////////////////////////////////////////////////////////////
{
	int _GetLastError;

	if ( !Allow_Info ) { return(0); }

	if ( !ObjectSetText ( "ExpertLog_00", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "00", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_01", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "01", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_02", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "02", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_03", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "03", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_04", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "04", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_10", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "10", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_11", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "11", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_12", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "12", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_13", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "13", _GetLastError ); }
	if ( !ObjectSetText ( "ExpertLog_14", "", 10 ) ) { _GetLastError = GetLastError(); clear_info_print ( "14", _GetLastError ); }
}
void clear_info_print ( string ExpertLog_Number, int Error )
{ Print( " ", ExpertLog_Number, " \", \"\", 10 ) - Error #", Error, " ( ", ErrorDescription( Error ), " )" ); }

/////////////////////////////////////////////////////////////////////////////////
/**/ void _LabelCreate ( string _LabelName, int _LabelXDistance, int _LabelYDistance, int _LabelCorner = 0 )
/////////////////////////////////////////////////////////////////////////////////
// Ñëóæåáíàÿ ô-öèÿ…
// Ñîçäàíèå îáúåêòà "Òåêñòîâàÿ ìåòêà" ñ èìåíåì _LabelName.
// Êîîðäèíàòû: õ = _LabelXDistance, ó = _LabelYDistance, óãîë - _LabelCorner.
/////////////////////////////////////////////////////////////////////////////////
{
	if ( !Allow_Info ) { return(false); }

	int _GetLastError;

	if ( !ObjectCreate( _LabelName, OBJ_LABEL, 0, 0, 0 ) )
	{
		_GetLastError = GetLastError();
		if ( _GetLastError != 4200 )
		{
			Print( "( \"", _LabelName, "\", ", _LabelXDistance, ", ", _LabelYDistance, ", ", _LabelCorner ," ) - ObjectCreate( \"", _LabelName, "\", OBJ_LABEL,0,0,0 ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			return(-1);
		}
	}
	if ( !ObjectSet( _LabelName, OBJPROP_CORNER, _LabelCorner ) )
	{
		_GetLastError = GetLastError();
		Print(_LabelName, "\", ", _LabelXDistance, ", ", _LabelYDistance, ", ", _LabelCorner ," ) - ObjectSet( \"", _LabelName, "\", OBJPROP_CORNER, ", _LabelCorner, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
	}
	if ( !ObjectSet( _LabelName, OBJPROP_XDISTANCE, _LabelXDistance ) )
	{
		_GetLastError = GetLastError();
		Print(_LabelName, "\", ", _LabelXDistance, ", ", _LabelYDistance, ", ", _LabelCorner ," ) - ObjectSet( \"", _LabelName, "\", OBJPROP_XDISTANCE, ", _LabelXDistance, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
	}
	if ( !ObjectSet( _LabelName, OBJPROP_YDISTANCE, _LabelYDistance ) )
	{
		_GetLastError = GetLastError();
		Print(_LabelName, "\", ", _LabelXDistance, ", ", _LabelYDistance, ", ", _LabelCorner ," ) - ObjectSet( \"", _LabelName, "\", OBJPROP_YDISTANCE, ", _LabelYDistance, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
	}
	if ( !ObjectSetText ( _LabelName, "", 10 ) )
	{
		_GetLastError = GetLastError();
		Print(_LabelName, "\", ", _LabelXDistance, ", ", _LabelYDistance, ", ", _LabelCorner ," ) - ObjectSetText( \"", _LabelName, "\", \"\", 10 ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void _FileWrite ( string text )
/////////////////////////////////////////////////////////////////////////////////
// Çàïèñü text â ëîã-ôàéë.
// (…\MetaTrader 4\experts\files\_ExpertLogs\Èìÿ ýêñïåðòà( Ñèìâîë, Ïåðèîä )\ãîä.ìåñÿö.äåíü.txt )
/////////////////////////////////////////////////////////////////////////////////
{
	if ( !Allow_LogFile ) { return(0); }

	int _GetLastError;

	string file_name = "_ExpertLogs\\" + strComment + "\\" + TimeToStr( TimeLocal(), TIME_DATE ) + ".txt";
	int file_handle = FileOpen ( file_name, FILE_READ | FILE_WRITE, " " );
	
	if ( file_handle > 0 )
	{
		if ( FileSeek ( file_handle, 0, SEEK_END ) )
		{
			if ( text != "\n" && text != "\r\n" ) { text = TimeToStr( TimeLocal(), TIME_SECONDS ) + " - - - " + text; }
			if ( FileWrite ( file_handle, text ) < 0 )
			{
				_GetLastError = GetLastError();
				Print( " _FileWrite( \"" + text + "\" ) - FileWrite ( ", file_handle, ", ", text, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			}
		}
		else
		{
			_GetLastError = GetLastError();
			Print( " _FileWrite( \"" + text + "\" ) - FileSeek ( " + file_handle + ", 0, SEEK_END ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
		}
		FileClose ( file_handle );
	}
	else
	{
		_GetLastError = GetLastError();
		Print( " _FileWrite( \"" + text + "\" ) - FileOpen( ", file_name, ", FILE_READ | FILE_WRITE, \" \" ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int _MagicNumber( int Expert_Id, int _Period )
/////////////////////////////////////////////////////////////////////////////////
// Ô-öèÿ ãåíåðèðóåò MagicNumber, óíèêàëüíûé äëÿ ñâÿçêè Expert_Id - _Period.
// 
// Òàêèì îáðàçîì, äàæå ñ îäèíàêîâûì Expert_Id ýêñïåðòû, ðàáîòàþùèå íà ðàçíûõ ÒÔ áóäóò èñïîëüçîâàòü ðàçíûå MagicNumber.
// Íàïðèìåð, ïðè Expert_Id = 1230 è _Period = PERIOD_H1,  MagicNumber áóäåò 12305
// À ýòîò æå ýêñïåðò, íî íà ãðàôèêå ñ ïåðèîäîì PERIOD_W1 áóäåò èìåòü MagicNumber = 12308
/////////////////////////////////////////////////////////////////////////////////
{
	return( Expert_Id );

	// ñòàðûé òåêñò ôóíêöèè:
	int Period_Id = 0;
	switch ( _Period )
	{
		case PERIOD_MN1: Period_Id = 9; break;
		case PERIOD_W1:  Period_Id = 8; break;
		case PERIOD_D1:  Period_Id = 7; break;
		case PERIOD_H4:  Period_Id = 6; break;
		case PERIOD_H1:  Period_Id = 5; break;
		case PERIOD_M30: Period_Id = 4; break;
		case PERIOD_M15: Period_Id = 3; break;
		case PERIOD_M5:  Period_Id = 2; break;
		case PERIOD_M1:  Period_Id = 1; break;
		default: Print( " _MagicNumber( ", Expert_Id, ", ", _Period, " ) - Invalid Period!" );
	}
	return(Expert_Id * 10 + Period_Id);
}

/////////////////////////////////////////////////////////////////////////////////
/**/ bool _IsExpertOrder ( int _MagicNumber )
/////////////////////////////////////////////////////////////////////////////////
// Ïîèñê ïîçèöèè/îðäåðà ñ çàäàííûì _MagicNumber è ñ òåêóùèì Ñèìâîëîì.
// Åñëè òàêîé åñòü, âûâîäèò èíôîðìàöèþ è âîçâðàùàåò true, åñëè íåò - âîçâðàùàåò false.
/////////////////////////////////////////////////////////////////////////////////
{
	int _GetLastError;

	int _OrdersTotal = OrdersTotal();
	for ( int z = _OrdersTotal - 1; z >= 0; z -- )
	{
		if ( !OrderSelect( z, SELECT_BY_POS ) )
		{
			_GetLastError = GetLastError();
			Print( " _IsExpertOrder( ", _MagicNumber, " ) - OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			continue;
		}
		if ( OrderMagicNumber() == _MagicNumber && OrderSymbol() == _Symbol )
		{
			if ( !Allow_Info ) { return(true); }

			int		_OrderTicket			= OrderTicket();
			int		_OrderType				= OrderType();
			string	_OrderSymbol			= OrderSymbol();
			double	_OrderLots				= NormalizeDouble( OrderLots(), 2 );
			double	_OrderOpenPrice		= NormalizeDouble( OrderOpenPrice(), _Digits );
			double	_OrderStopLoss			= NormalizeDouble( OrderStopLoss(), _Digits );
			double	_OrderProfit			= OrderProfit();

			_info ( 10, "" );
			_info ( 11, "" );
			_info ( 12, "" );
			_info ( 13, "" );
			_info ( 14, "" );

			if ( _OrderType <= OP_SELL )
			{
				double ProfitLoss = _OrderProfit + OrderSwap() + OrderCommission();
				double Point_Cost = LotCost( _OrderSymbol ) * _OrderLots;

				int _profit_color = 0;
				if ( ProfitLoss > 0 ) { _profit_color = 2; }
				if ( ProfitLoss < 0 ) { _profit_color = 3; }

				double ProfitLossPoints = MathAbs( _OrderProfit / Point_Cost );

				double MaxLossPoints;
				if ( _OrderType == OP_BUY )
				{ MaxLossPoints = ( _OrderStopLoss - _OrderOpenPrice ) / _Point; }
				else
				{ MaxLossPoints = ( _OrderOpenPrice - _OrderStopLoss ) / _Point; }
				double MaxLoss = MaxLossPoints * Point_Cost + OrderSwap() + OrderCommission();

				string ifNoStopLoss = DoubleToStr( MaxLoss, 2 ) + " " + AccountCurrency() + " (" + DoubleToStr( MathAbs( MaxLossPoints ), 0 ) + " points)";
				int _maxloss_color = 0;
				if ( MaxLossPoints > 0 ) { _maxloss_color = 2; }
				if ( MaxLossPoints < 0 ) { _maxloss_color = 3; }
				if ( _OrderStopLoss <= 0 ) { _maxloss_color = 1; ifNoStopLoss = "Ñòîï Ëîññ ÍÅ ÓÑÒÀÍÎÂËÅÍ!"; }
				
				_info ( 1, stringOpenedPosition, 0, 0 );
				_info ( 2, "#" + _OrderTicket + " - " + strOrderType ( _OrderType )	+ ",  " + DoubleToStr( _OrderLots, 2 ) + " lot(s)", 0, 0 );
				_info ( 3, "Ïðèáûëü/Óáûòîê:  " + DoubleToStr( ProfitLoss, 2 ) + " " + AccountCurrency() + " (" + DoubleToStr( ProfitLossPoints, 0 ) + " points)"		, _profit_color	, 0 );
				_info ( 4, "Äî ÑòîïËîññà:  " + " " + " " + " " + " " + ifNoStopLoss, _maxloss_color	, 0 );
			}
			else
			{
				int		_before_color	= 0;
				double	Price				= NormalizeDouble( MarketInfo( _OrderSymbol, MODE_BID ), _Digits );
				string	tmp_str			= ", Bid = " + DoubleToStr( Price, _Digits );
				if ( _OrderType == OP_BUYLIMIT || _OrderType == OP_BUYSTOP )
				{
					Price = NormalizeDouble( MarketInfo( _OrderSymbol, MODE_ASK ), _Digits );
					tmp_str = ", Ask = " + DoubleToStr( Price, _Digits );
				}

				if ( MathAbs( _OrderOpenPrice - Price ) / _Point <= 10 ) { _before_color = 1; }
			
				_info ( 1, _OrderSymbol + stringOpenedOrder																	, 0				, 0 );	
				_info ( 2, "¹ " + _OrderTicket + " - " + strOrderType ( _OrderType )								, 0				, 0 );
				_info ( 3, "Open Price = " + DoubleToStr( _OrderOpenPrice, _Digits )  + tmp_str					, 0				, 0 );
				_info	( 4, stringPointBefore + DoubleToStr( MathAbs( _OrderOpenPrice - Price ) / _Point, 0 ) , _before_color, 0 );
			}
			return(true);
		}
	}
return(false);
}

int _ExpertOrders = 0; int _MarketOrders = 0; int _PendingOrders = 0;
int _BuyTicket = 0; double _BuyLots = 0.0; double _BuyOpenPrice = 0.0; double _BuyStopLoss = 0.0; double _BuyTakeProfit = 0.0; datetime _BuyOpenTime = -1; double _BuyProfit = 0.0; double _BuySwap = 0.0; double _BuyCommission = 0.0; string _BuyComment = ""; 
int _SellTicket = 0; double _SellLots = 0.0; double _SellOpenPrice = 0.0; double _SellStopLoss = 0.0; double _SellTakeProfit = 0.0; datetime _SellOpenTime = -1; double _SellProfit = 0.0; double _SellSwap = 0.0; double _SellCommission = 0.0; string _SellComment = ""; 
int _BuyStopTicket = 0; double _BuyStopLots = 0.0; double _BuyStopOpenPrice = 0.0; double _BuyStopStopLoss = 0.0; double _BuyStopTakeProfit = 0.0; datetime _BuyStopOpenTime = -1; string _BuyStopComment = ""; datetime _BuyStopExpiration = -1;
int _SellStopTicket = 0; double _SellStopLots = 0.0; double _SellStopOpenPrice = 0.0; double _SellStopStopLoss = 0.0; double _SellStopTakeProfit = 0.0; datetime _SellStopOpenTime = -1; string _SellStopComment = ""; datetime _SellStopExpiration = -1;
int _BuyLimitTicket = 0; double _BuyLimitLots = 0.0; double _BuyLimitOpenPrice = 0.0; double _BuyLimitStopLoss = 0.0; double _BuyLimitTakeProfit = 0.0; datetime _BuyLimitOpenTime = -1; string _BuyLimitComment = ""; datetime _BuyLimitExpiration = -1;
int _SellLimitTicket = 0; double _SellLimitLots = 0.0; double _SellLimitOpenPrice = 0.0; double _SellLimitStopLoss = 0.0; double _SellLimitTakeProfit = 0.0; datetime _SellLimitOpenTime = -1; string _SellLimitComment = ""; datetime _SellLimitExpiration = -1;

/////////////////////////////////////////////////////////////////////////////////
/**/ void _ExpertOrdersInit( int _MagicNumber )
/////////////////////////////////////////////////////////////////////////////////
// Ìîæíî èñïîëüçîâàòü, åñëè ýêñïåðò óñòàíàâëèâàåò ìàêñèìóì ÎÄÈÍ îðäåð îäíîãî òèïà (OP_BUY, OP_SELL, è ò.ä.)
// Ïðèñâàèâàåò çíà÷åíèÿ ïåðåìåííûì, ïåðå÷èñëåííûì âûøå. Èõ ìîæíî èñïîëüçîâàòü èç ýêñïåðòà äëÿ óïðîùåíèÿ êîäà.
/////////////////////////////////////////////////////////////////////////////////
{
	int _GetLastError;

	_ExpertOrders = 0; _MarketOrders = 0; _PendingOrders = 0;
	_BuyTicket = 0; _BuyLots = 0.0; _BuyOpenPrice = 0.0; _BuyStopLoss = 0.0; _BuyTakeProfit = 0.0; _BuyOpenTime = -1; _BuyProfit = 0.0; _BuySwap = 0.0; _BuyCommission = 0.0; _BuyComment = "";
	_SellTicket = 0; _SellLots = 0.0; _SellOpenPrice = 0.0; _SellStopLoss = 0.0; _SellTakeProfit = 0.0; _SellOpenTime = -1; _SellProfit = 0.0; _SellSwap = 0.0; _SellCommission = 0.0; _SellComment = "";
	_BuyStopTicket = 0; _BuyStopLots = 0.0; _BuyStopOpenPrice = 0.0; _BuyStopStopLoss = 0.0; _BuyStopTakeProfit = 0.0; _BuyStopOpenTime = -1; _BuyStopComment = ""; _BuyStopExpiration = -1;
	_SellStopTicket = 0; _SellStopLots = 0.0; _SellStopOpenPrice = 0.0; _SellStopStopLoss = 0.0; _SellStopTakeProfit = 0.0; _SellStopOpenTime = -1; _SellStopComment = ""; _SellStopExpiration = -1;
	_BuyLimitTicket = 0; _BuyLimitLots = 0.0; _BuyLimitOpenPrice = 0.0; _BuyLimitStopLoss = 0.0; _BuyLimitTakeProfit = 0.0; _BuyLimitOpenTime = -1; _BuyLimitComment = ""; _BuyLimitExpiration = -1;
	_SellLimitTicket = 0; _SellLimitLots = 0.0; _SellLimitOpenPrice = 0.0; _SellLimitStopLoss = 0.0; _SellLimitTakeProfit = 0.0; _SellLimitOpenTime = -1; _SellLimitComment = ""; _SellLimitExpiration = -1;

	int _OrdersTotal = OrdersTotal();
	for ( int z = _OrdersTotal - 1; z >= 0; z -- )
	{
		if ( !OrderSelect( z, SELECT_BY_POS ) )
		{
			_GetLastError = GetLastError();
			Print( " _ExpertOrdersInit( ", _MagicNumber, " ) - OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			continue;
		}
		if ( OrderMagicNumber() == _MagicNumber && OrderSymbol() == _Symbol )
		{
			int		_OrderType			= OrderType();
			int		_OrderTicket		= OrderTicket();
			double	_OrderLots			= NormalizeDouble( OrderLots(), 2 );
			double	_OrderOpenPrice	= NormalizeDouble( OrderOpenPrice(), _Digits );
			double	_OrderStopLoss		= NormalizeDouble( OrderStopLoss(), _Digits );
			double	_OrderTakeProfit	= NormalizeDouble( OrderTakeProfit(), _Digits );
			datetime	_OrderOpenTime		= OrderOpenTime();
			double	_OrderProfit		= NormalizeDouble( OrderProfit(), 2 );
			double	_OrderSwap			= NormalizeDouble( OrderSwap(), 2 );
			double	_OrderCommission	= NormalizeDouble( OrderCommission(), 2 );
			string	_OrderComment		= OrderComment();
			datetime	_OrderExpiration	= OrderExpiration();

			if ( _OrderType == OP_BUY			) { _MarketOrders ++; _BuyTicket = _OrderTicket; _BuyLots = _OrderLots; _BuyOpenPrice = _OrderOpenPrice; _BuyStopLoss = _OrderStopLoss; _BuyTakeProfit = _OrderTakeProfit; _BuyOpenTime = _OrderOpenTime; _BuyProfit = _OrderProfit; _BuySwap = _OrderSwap; _BuyCommission = _OrderCommission; _BuyComment = _OrderComment; }
			if ( _OrderType == OP_SELL			) { _MarketOrders ++; _SellTicket = _OrderTicket; _SellLots = _OrderLots; _SellOpenPrice = _OrderOpenPrice; _SellStopLoss = _OrderStopLoss; _SellTakeProfit = _OrderTakeProfit; _SellOpenTime = _OrderOpenTime; _SellProfit = _OrderProfit; _SellSwap = _OrderSwap; _SellCommission = _OrderCommission; _SellComment = _OrderComment; }
			if ( _OrderType == OP_BUYSTOP		) { _PendingOrders ++; _BuyStopTicket = _OrderTicket; _BuyStopLots = _OrderLots; _BuyStopOpenPrice = _OrderOpenPrice; _BuyStopStopLoss = _OrderStopLoss; _BuyStopTakeProfit = _OrderTakeProfit; _BuyStopOpenTime = _OrderOpenTime; _BuyStopComment = _OrderComment; _BuyStopExpiration = _OrderExpiration; }
			if ( _OrderType == OP_SELLSTOP	) { _PendingOrders ++; _SellStopTicket = _OrderTicket; _SellStopLots = _OrderLots; _SellStopOpenPrice = _OrderOpenPrice; _SellStopStopLoss = _OrderStopLoss; _SellStopTakeProfit = _OrderTakeProfit; _SellStopOpenTime = _OrderOpenTime; _SellStopComment = _OrderComment; _SellStopExpiration = _OrderExpiration; }
			if ( _OrderType == OP_BUYLIMIT	) { _PendingOrders ++; _BuyLimitTicket = _OrderTicket; _BuyLimitLots = _OrderLots; _BuyLimitOpenPrice = _OrderOpenPrice; _BuyLimitStopLoss = _OrderStopLoss; _BuyLimitTakeProfit = _OrderTakeProfit; _BuyLimitOpenTime = _OrderOpenTime; _BuyLimitComment = _OrderComment; _BuyLimitExpiration = _OrderExpiration; }
			if ( _OrderType == OP_SELLLIMIT	) { _PendingOrders ++; _SellLimitTicket = _OrderTicket; _SellLimitLots = _OrderLots; _SellLimitOpenPrice = _OrderOpenPrice; _SellLimitStopLoss = _OrderStopLoss; _SellLimitTakeProfit = _OrderTakeProfit; _SellLimitOpenTime = _OrderOpenTime; _SellLimitComment = _OrderComment; _SellLimitExpiration = _OrderExpiration; }
		}
	}
	_ExpertOrders = _MarketOrders + _PendingOrders;
}

// ô-öèÿ minri, äîðàáîòàííàÿ ìíîé
/////////////////////////////////////////////////////////////////////////////////
/**/ double LotCost ( string _Symbol )
/////////////////////////////////////////////////////////////////////////////////
{
	if ( MarketInfo ( _Symbol, MODE_BID ) <= 0 ) { return(-1.0); }
	double Cost = -1.0;

	string FirstPart  = StringSubstr( _Symbol, 0, 3 );
	string SecondPart = StringSubstr( _Symbol, 3, 3 );

	double Base = MarketInfo ( _Symbol, MODE_LOTSIZE ) * MarketInfo ( _Symbol, MODE_POINT );
	if ( SecondPart == "USD" )
	{ Cost = Base; }
	else
	{
		if ( FirstPart == "USD" )
		{ Cost = Base / MarketInfo ( _Symbol, MODE_BID ); }
		else
		{
			if ( MarketInfo( "USD" + SecondPart, MODE_BID ) > 0 )
			{ Cost = Base / MarketInfo( "USD" + SecondPart, MODE_BID ); }
			else
			{ Cost = Base * MarketInfo( SecondPart + "USD", MODE_BID ); }
		}
	}
	return( NormalizeDouble(Cost, 2) );
}

string	Send_Symbol = "", Send_Comment = "";
int		Send_OrderType = 0, Send_Slippage = 0, Send_MagicNumber = 0, Send_StartTickCount = 0, Send_GetLastError = 0;
double	Send_Volume = 0.0, Send_OpenPrice = 0.0, Send_StopLoss = 0.0, Send_TakeProfit = 0.0;
datetime	Send_Expiration = 0;
color		Send_Color = CLR_NONE;
int		Send_Result = -1;

/////////////////////////////////////////////////////////////////////////////////
/**/ int _OrderSend ( string _Symbol, int _OrderType, double _Volume, double _OpenPrice, int _Slippage = -1, double _StopLoss = 0.0, double _TakeProfit = 0.0, string _Comment = "", int _MagicNumber = 0, datetime _Expiration = 0, color _Color = -2 )
/////////////////////////////////////////////////////////////////////////////////
// Ñòàíäàðòíàÿ ô-öèÿ OrderSend + ïðîâåðêà çíà÷åíèé.
// Ïðè óñïåøíîì âûïîëíåíèè âîçâðàùàåò OrderTicket, ïðè îøèáêå óñòàíîâêè âîçâðàùàåò "-1",
// ïðè îøèáêå ïðîâåðêè âîçâðàùàåò "-2". Åñëè ýêñïåðòó çàïðåùåíà òîðãîâëÿ, âîçâðàùàåò "-3".
/////////////////////////////////////////////////////////////////////////////////
{
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ
	Send_Symbol = _Symbol; Send_Comment = _Comment;
	Send_OrderType = _OrderType; Send_Slippage = _Slippage; Send_MagicNumber = _MagicNumber; Send_StartTickCount = GetTickCount();
	Send_Volume = _Volume; Send_OpenPrice = _OpenPrice; Send_StopLoss = _StopLoss; Send_TakeProfit = _TakeProfit;
	Send_Expiration = _Expiration;
	Send_Color = _Color;
	Send_Result = -1;
	StartTime = TimeLocal();

//---- Èçìåíÿåì òå ïåðåìåííûå, êîòîðûå ìîæíî ìåíÿòü è íîðìàëèçóåì èõ
	_OrderSend_SetValue();

//---- Âûâîäèì èíôîðìàöèþ
	_OrderSend_Info();

//---- Ïðîâåðÿåì ïàðàìåòðû. Åñëè åñòü îøèáêà - âûõîäèì
	if ( _OrderSend_Check() == false ) { return(-2); }

//---- Âñå íåîáõîäèìûå ïðîâåðêè, ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè, etc... Åñëè åñòü îøèáêà - âûõîäèì
	int _Check_ = _Check_(1);
	if ( _Check_ < 0 ) { return(_Check_); }

//---- Åñëè ô-öèÿ ðàáîòàåò áîëüøå ñåêóíäû,
	if ( GetTickCount() - Send_StartTickCount > 1000 )
	{
//---- îáíîâëÿåì ïåðåìåííûå
		_OrderSend_RefreshValue();
//---- è ïðîâåðÿåì èõ. Åñëè åñòü îøèáêà - âûõîäèì
		if ( _OrderSend_Check() == false ) { TradeIsNotBusy(); return(-2); }
	}

//---- Ñîáñòâåííî, îòêðûâàåìñÿ
	Send_Result = OrderSend ( Send_Symbol, Send_OrderType, Send_Volume, Send_OpenPrice, Send_Slippage, Send_StopLoss, Send_TakeProfit, Send_Comment, Send_MagicNumber, Send_Expiration, Send_Color );
	Send_GetLastError = GetLastError();

//---- Åñëè åñòü îøèáêà,
	if ( Send_Result < 0 || Send_GetLastError > 0 )
	{
//---- îòäà¸ì íà îòðàáîòêó êîä îøèáêè,
		Processing_Error ( Send_GetLastError, "OrderSend" );
//---- îñâîáîæäàåì òîðãîâûé ïîòîê,
		TradeIsNotBusy();
//---- âûâîäèì èíôîðìàöèþ â _TradeLog, â æóðíàë,
		_Return_ ( 1, "Error", Send_GetLastError, ErrorDescription( Send_GetLastError ), "OrderSend(...)", "Error #" + Send_GetLastError + " ( " + ErrorDescription( Send_GetLastError ) + " )" );
//---- è âûõîäèì, âîçâðàùàÿ -1.
		return(-1);
	}
//---- Åñëè âñ¸ õîðîøî,
//---- îñâîáîæäàåì òîðãîâûé ïîòîê,
	TradeIsNotBusy();

//---- ïðîâåðÿåì - äåéñòâèòåëüíî ëè îòêðûëàñü ïîçèöèÿ è, åñëè íåò, âûâîäèì èíôîðìàöèþ è âûõîäèì, âîçâðàùàÿ -4.
	int _GetLastError;
	for ( int x = 0; x < 5; x ++ )
	{
		Sleep(1000);
		if ( OrderSelect( Send_Result, SELECT_BY_TICKET ) ) { break; }
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 ) { _Print_ ( 1, "OrderSelect( " + Send_Result + ", SELECT_BY_TICKET )", "Error #" + _GetLastError + " ( " + ErrorDescription( _GetLastError ) + " )" ); continue; }
		Processing_Error ( 0, "OrderSend" );
		_Return_ ( 1, "Error", 0, "Îðäåð íå áûë óñòàíîâëåí/Ïîçèöèÿ íå áûëà îòêðûòà", "OrderSend(...)", "Îðäåð íå áûë óñòàíîâëåí/Ïîçèöèÿ íå áûëà îòêðûòà" );
		return(-4);
	}

//---- ñîçäà¸ì îïèñàíèÿ ê ñòðåëî÷êàì,
	_OrderSend_SetArrow();

//---- âûâîäèì èíôîðìàöèþ,
	_info ( 14, stringSuccessfully );
	_Return_ ( 1, "OK", 0, "", "OrderSend(...)", "OK. Ticket " + Send_Result );
//---- è âûõîäèì, âîçâðàùàÿ ¹ òèêåòà.
return(Send_Result);
}

void _OrderSend_SetValue ()
{
//---- Ïðîâåðÿåì _Slippage
	if ( Send_Slippage < 0 ) { Send_Slippage = Slippage; }
//---- Åñëè _Comment íå çàäàâàëñÿ, íàïèøåì "Èìÿ_Ýêñïåðòà( Ñèìâîë, Òàéìôðåéì )"
	if ( Send_Comment == "" ) { Send_Comment = strComment; }
//---- Åñëè öâåò íå çàäàâàëñÿ, óñòàíàâëèâàåì OrderSellColor(äëÿ "êîðîòêèõ" ïîçèöèé) èëè OrderBuyColor(äëÿ "äëèííûõ" ïîçèöèé)
	if ( Send_Color < -1 )
	{
		Send_Color = OrderSellColor;
		if ( Send_OrderType == OP_BUY || Send_OrderType == OP_BUYLIMIT || Send_OrderType == OP_BUYSTOP )
		{ Send_Color = OrderBuyColor; }
	}
	else
	{
		if ( Send_Color < 0 ) Send_Color = CLR_NONE;
	}

//---- Âûñòàâëÿåì öåíó îòêðûòèÿ è óäàëÿåì âðåìÿ èñòå÷åíèÿ äëÿ BUY è SELL ïîçèöèé
	if ( Send_OrderType == OP_BUY ) { Send_OpenPrice = NormalizeDouble( MarketInfo( Send_Symbol, MODE_ASK ), _Digits ); Send_Expiration = 0; }
	if ( Send_OrderType == OP_SELL ) { Send_OpenPrice = NormalizeDouble( MarketInfo( Send_Symbol, MODE_BID ), _Digits ); Send_Expiration = 0; }

//	Send_Volume = NormalizeDouble( Send_Volume, 2 );
	Send_OpenPrice = NormalizeDouble( Send_OpenPrice, _Digits );
	Send_StopLoss = NormalizeDouble( Send_StopLoss, _Digits );
	Send_TakeProfit = NormalizeDouble( Send_TakeProfit, _Digits );
}
void _OrderSend_Info ()
{
	if ( !Allow_Info && !Allow_LogFile ) { return(0); }
	string str_tmp = stringSendingOrder + strOrderType ( Send_OrderType ) + stringSendingOrder1;
	if ( Send_OrderType <= OP_SELL )
	{ str_tmp = stringSendingPosition + strOrderType ( Send_OrderType ) + stringSendingPosition1; }
	int _OrderType_ColorVariant = 3;
	if ( Send_OrderType == OP_BUY || Send_OrderType == OP_BUYLIMIT || Send_OrderType == OP_BUYSTOP ) { _OrderType_ColorVariant = 2; }

	_FileWrite ( "- - - - - - - - - - - - - - - - - OrderSend Start- - - - - - - - - - - - - - - - - - -" );
	_info ( 10, str_tmp, _OrderType_ColorVariant );
	_info ( 1, "Open Price = " + DoubleToStr( Send_OpenPrice, _Digits ) );
	_info ( 2, "Stop Loss = " + DoubleToStr( Send_StopLoss, _Digits ) );
	_info ( 3, "Take Profit = " + DoubleToStr( Send_TakeProfit, _Digits ) );
	_info ( 4, "Lot(s) = " + DoubleToStr( Send_Volume, 2 ) );

	_info ( 11, "Comment = " + Send_Comment, 0, 0 );
	_info ( 12, "MagicNumber = " + Send_MagicNumber, 0, 0 );
	_info ( 13, "" );
	_info ( 14, "" );
	
	if ( Send_Expiration > 0 ) { _FileWrite ( "Expiration Time = " + TimeToStr( Send_Expiration, TIME_DATE | TIME_SECONDS ) ); }
}
bool _OrderSend_Check ()
{
	if ( Allow_Info )	{ _info ( 13, stringCheck, 0, 0 ); }

	if ( _OrderCheck( Send_Symbol, Send_OrderType, Send_Volume, Send_OpenPrice, Send_StopLoss, Send_TakeProfit, Send_Expiration ) < 0 )
	{
		if ( Allow_Info )	{ _info ( 13, stringCheckError, 1, 0 ); }
		if ( Allow_LogFile ) { _FileWrite( "Îøèáêà ïðè ïðîâåðêå ïàðàìåòðîâ!" ); }
		_Return_ ( 1, "Error", 0, stringInvalidParameters, "_OrderSend_Check()", stringInvalidParameters );
		return(false);
	}

	if ( Allow_Info ) { _info ( 13, stringCheckOK, 0, 0 ); }

return(true);
}
void _OrderSend_RefreshValue ()
{
	bool refreshed = false;
//---- Îáíîâëÿåì öåíó îòêðûòèÿ äëÿ BUY è SELL ïîçèöèé
	if ( Send_OrderType == OP_BUY )
	{
		if ( NormalizeDouble( Send_OpenPrice, _Digits ) != NormalizeDouble( MarketInfo( Send_Symbol, MODE_ASK ), _Digits ) )
		{
			Send_OpenPrice = NormalizeDouble( MarketInfo( Send_Symbol, MODE_ASK ), _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - OrderSend Refresh  - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 1, "Refreshed Open Price = " + DoubleToStr( Send_OpenPrice, _Digits ) );
			}
		}
	}
	if ( Send_OrderType == OP_SELL )
	{
		if ( NormalizeDouble( Send_OpenPrice, _Digits ) != NormalizeDouble( MarketInfo( Send_Symbol, MODE_BID ), _Digits ) )
		{
			Send_OpenPrice = NormalizeDouble( MarketInfo( Send_Symbol, MODE_BID ), _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - OrderSend Refresh  - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 1, "Refreshed Open Price = " + DoubleToStr( Send_OpenPrice, _Digits ) );
			}
		}
	}
}
void _OrderSend_SetArrow ()
{
	if ( Send_Color == CLR_NONE ) { return(0); }
	string arrow_description = Send_Comment + "\nId " + Send_MagicNumber;
	string end_name;
	switch ( Send_OrderType )
	{
		case OP_BUY:			end_name = " buy "; break;
		case OP_SELL:			end_name = " sell "; break;
		case OP_BUYLIMIT:		end_name = " buy limit "; break;
		case OP_SELLLIMIT:	end_name = " sell limit "; break;
		case OP_BUYSTOP:		end_name = " buy stop "; break;
		case OP_SELLSTOP:		end_name = " sell stop "; break;
	}
	string open_name = "#" + Send_Result + end_name + DoubleToStr( Send_Volume, 2 ) + " " + Send_Symbol + " at " + DoubleToStr( Send_OpenPrice, _Digits );
	string sl_name = open_name + " stop loss at " + DoubleToStr( Send_StopLoss, _Digits );
	string tp_name = open_name + " take profit at " + DoubleToStr( Send_TakeProfit, _Digits );

	ObjectSetText( open_name, arrow_description, 10 );
	if ( NormalizeDouble( Send_StopLoss		, _Digits ) > 0 ) ObjectSetText( sl_name, arrow_description, 10 );
	if ( NormalizeDouble( Send_TakeProfit	, _Digits ) > 0 ) ObjectSetText( tp_name, arrow_description, 10 );
	GetLastError();
}

string	Modify_Symbol = "", Modify_OrderComment = "";
int		Modify_OrderTicket = 0, Modify_OrderType = 0, Modify_OrderMagicNumber = 0, Modify_StartTickCount = 0, Modify_GetLastError = 0;
double	Modify_OrderLots = 0.0, Modify_OrderOpenPrice = 0.0, Modify_OrderStopLoss = 0.0, Modify_OrderTakeProfit = 0.0;
double	Modify_New_OpenPrice = 0.0, Modify_New_StopLoss = 0.0, Modify_New_TakeProfit = 0.0;
datetime	Modify_OrderExpiration = 0, Modify_New_Expiration = 0;
color		Modify_Color = CLR_NONE;
bool		Modify_Result = false;

/////////////////////////////////////////////////////////////////////////////////
/**/ int _OrderModify ( int _OrderTicket, double New_OpenPrice = 0.0, double New_StopLoss = 0.0, double New_TakeProfit = 0.0, datetime New_Expiration = 0, color _Color = -2 )
/////////////////////////////////////////////////////////////////////////////////
// Ñòàíäàðòíàÿ ô-öèÿ OrderModify + ïðîâåðêè.
// Ïðè óñïåøíîì âûïîëíåíèè âîçâðàùàåò "1", ïðè îøèáêå ìîäèôèêàöèè âîçâðàùàåò "-1",
// ïðè îøèáêå âûáîðà îðäåðà âîçâðàùàåò "-2", ïðè îøèáêå ïðîâåðêè âîçâðàùàåò "-3".
// Åñëè ýêñïåðòó çàïðåùåíà òîðãîâëÿ, âîçâðàùàåò "-4", åñëè íåò ïàðàìåòðîâ äëÿ ìîäèôèêàöèè, âîçâðàùàåò "0".
/////////////////////////////////////////////////////////////////////////////////
{
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ
	Modify_Symbol = ""; Modify_OrderComment = "";
	Modify_OrderTicket = _OrderTicket; Modify_OrderType = 0; Modify_OrderMagicNumber = 0; Modify_StartTickCount = GetTickCount();
	Modify_OrderLots = 0.0; Modify_OrderOpenPrice = 0.0; Modify_OrderStopLoss = 0.0; Modify_OrderTakeProfit = 0.0;
	Modify_New_OpenPrice = NormalizeDouble( New_OpenPrice, _Digits ); Modify_New_StopLoss = NormalizeDouble( New_StopLoss, _Digits ); Modify_New_TakeProfit = NormalizeDouble( New_TakeProfit, _Digits );
	Modify_OrderExpiration = 0; Modify_New_Expiration = New_Expiration;
	Modify_Color = _Color;
	Modify_Result = false;
	StartTime = TimeLocal();

//---- Èçìåíÿåì òå ïåðåìåííûå, êîòîðûå ìîæíî ìåíÿòü è íîðìàëèçóåì èõ, åñëè îøèáêà ïðè âûáîðå îðäåðà - âûõîäèì
	if ( _OrderModify_SetValue() == false ) { return(-2); }

//---- Âûâîäèì èíôîðìàöèþ
	_OrderModify_Info();

//---- Ïðîâåðÿåì ïàðàìåòðû. Åñëè åñòü îøèáêà - âûõîäèì
	int Check = _OrderModify_Check();
	if ( Check < 0 ) { return(Check); }

//---- Âñå íåîáõîäèìûå ïðîâåðêè, ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè, etc... Åñëè åñòü îøèáêà - âûõîäèì
	int _Check_ = _Check_(2);
	if ( _Check_ < 0 ) { return(_Check_); }

//---- Åñëè ô-öèÿ ðàáîòàåò áîëüøå ñåêóíäû, îáíîâëÿåì ïåðåìåííûå è ïðîâåðÿåì èõ. Åñëè åñòü îøèáêà - âûõîäèì
	if ( GetTickCount() - Modify_StartTickCount > 1000 )
	{
		if ( _OrderModify_RefreshValue() == false ) { TradeIsNotBusy(); return(-2); }
		Check = _OrderModify_Check();
		if ( Check < 0 ) { TradeIsNotBusy(); return(Check); }
	}

//---- Ñîáñòâåííî, ìîäèôèêàöèÿ
	Modify_Result = OrderModify( Modify_OrderTicket, Modify_New_OpenPrice, Modify_New_StopLoss, Modify_New_TakeProfit, Modify_New_Expiration, Modify_Color );
	Modify_GetLastError = GetLastError();

//---- Åñëè åñòü îøèáêà,
	if ( !Modify_Result || Modify_GetLastError > 0 )
	{
//---- îòäà¸ì íà îòðàáîòêó êîä îøèáêè,
		Processing_Error ( Modify_GetLastError, "OrderModify" );
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
		TradeIsNotBusy();
//---- âûâîäèì èíôîðìàöèþ â _TradeLog, â æóðíàë,
		_Return_ ( 2, "Error", Modify_GetLastError, ErrorDescription( Modify_GetLastError ), "OrderModify(...)", "Error #" + Modify_GetLastError + " ( " + ErrorDescription( Modify_GetLastError ) + " )" );
//---- è âûõîäèì, âîçâðàùàÿ -1.
		return(-1);
	}
//---- Åñëè âñ¸ õîðîøî,
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
	TradeIsNotBusy();

//---- ïðîâåðÿåì - äåéñòâèòåëüíî ëè èçìåíèëèñü ïàðàìåòðû ïîçèöèè è, åñëè íåò, âûâîäèì èíôîðìàöèþ è âûõîäèì, âîçâðàùàÿ -4.
	for ( int x = 0; x < 5; x ++ )
	{
		Sleep(1000);
		if ( !OrderSelect( Modify_OrderTicket, SELECT_BY_TICKET ) )
		{
			Modify_GetLastError = GetLastError();
			_Print_ ( 2, "OrderSelect( " + Modify_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Modify_GetLastError + " ( " + ErrorDescription( Modify_GetLastError ) + " )" );
			continue;
		}
		if ( 	NormalizeDouble( Modify_OrderOpenPrice,  _Digits ) != NormalizeDouble( OrderOpenPrice(),  _Digits ) ||
				NormalizeDouble( Modify_OrderStopLoss,   _Digits ) != NormalizeDouble( OrderStopLoss(),   _Digits ) ||
				NormalizeDouble( Modify_OrderTakeProfit, _Digits ) != NormalizeDouble( OrderTakeProfit(), _Digits ) ||
				Modify_OrderExpiration != OrderExpiration() )
		{ break; }
		else
		{
			Processing_Error ( 0, "OrderModify" );
			_Return_ ( 2, "Error", 0, "Îðäåð íå áûë ìîäèôèöèðîâàí/Ïîçèöèÿ íå áûëà ìîäèôèöèðîâàíà", "OrderModify(...)", "Îðäåð íå áûë ìîäèôèöèðîâàí/Ïîçèöèÿ íå áûëà ìîäèôèöèðîâàíà" );
			return(-4);
		}
	}

//---- ñîçäà¸ì îïèñàíèÿ ê ñòðåëî÷êàì,
	_OrderModify_SetArrow();

//---- âûâîäèì èíôîðìàöèþ,
	_info ( 14, stringSuccessfully );
	_Return_ ( 2, "OK", 0, "", "OrderModify(...)", "OK" );

//---- è âûõîäèì, âîçâðàùàÿ 1.
return(1);
}

bool _OrderModify_SetValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Modify_OrderTicket, SELECT_BY_TICKET ) )
	{
		Modify_GetLastError = GetLastError();
		_Return_ ( 2,  "Error", Modify_GetLastError, ErrorDescription( Modify_GetLastError ), "OrderSelect( " + Modify_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Modify_GetLastError + " ( " + ErrorDescription( Modify_GetLastError ) + " )" );
		return(false);
	}

	Modify_Symbol				= OrderSymbol();
	Modify_OrderType			= OrderType();
	Modify_OrderLots			= NormalizeDouble ( OrderLots(), 2 );
	Modify_OrderOpenPrice	= NormalizeDouble ( OrderOpenPrice(), _Digits );
	Modify_OrderStopLoss		= NormalizeDouble ( OrderStopLoss(), _Digits );
	Modify_OrderTakeProfit	= NormalizeDouble ( OrderTakeProfit(), _Digits );
	Modify_OrderExpiration	= OrderExpiration();
	Modify_OrderMagicNumber = OrderMagicNumber();
	Modify_OrderComment		= OrderComment();

//---- Åñëè öâåò íå çàäàâàëñÿ, óñòàíàâëèâàåì OrderSellColor(äëÿ "êîðîòêèõ" ïîçèöèé) èëè OrderBuyColor(äëÿ "äëèííûõ" ïîçèöèé)
	if ( Modify_Color < -1 )
	{
		Modify_Color = OrderSellColor;
		if ( Modify_OrderType == OP_BUY || Modify_OrderType == OP_BUYLIMIT || Modify_OrderType == OP_BUYSTOP )
		{ Modify_Color = OrderBuyColor; }
	}
	else
	{
		if ( Modify_Color < 0 ) Modify_Color = CLR_NONE;
	}

//---- Åñëè ïàðàìåòðû äëÿ èçìåíåíèÿ íå çàäàâàëèñü, çàïîëíÿåì èõ ïàðàìåòðàìè îðäåðà
	if ( Modify_New_OpenPrice  < 0 )	{ Modify_New_OpenPrice	= NormalizeDouble( Modify_OrderOpenPrice, _Digits ); }
	if ( Modify_New_StopLoss   < 0 )	{ Modify_New_StopLoss	= NormalizeDouble( Modify_OrderStopLoss, 	_Digits ); }
	if ( Modify_New_TakeProfit < 0 )	{ Modify_New_TakeProfit	= NormalizeDouble( Modify_OrderTakeProfit, _Digits ); }
	if ( Modify_New_Expiration < 0 )	{ Modify_New_Expiration	= Modify_OrderExpiration; }

	if ( Modify_OrderType <= OP_SELL )
	{ Modify_New_OpenPrice = NormalizeDouble( Modify_OrderOpenPrice, _Digits ); Modify_New_Expiration = 0; }
	
return(true);
}
void _OrderModify_Info ()
{
	if ( !Allow_Info && !Allow_LogFile ) { return(0); }

	string str_tmp = "Ìîäèôèöèðóåì îðäåð ¹ ";
	if ( Modify_OrderType <= OP_SELL ) { str_tmp = "Ìîäèôèöèðóåì ïîçèöèþ ¹ "; }

	int _OpenPrice_ColorVariant = 0;
	bool _OpenPrice_FileWrite = false;
	if ( Modify_New_OpenPrice > Modify_OrderOpenPrice ) { _OpenPrice_ColorVariant = 2; _OpenPrice_FileWrite = true; }
	if ( Modify_New_OpenPrice < Modify_OrderOpenPrice ) { _OpenPrice_ColorVariant = 3; _OpenPrice_FileWrite = true; }
	int _StopLoss_ColorVariant = 0;
	bool _StopLoss_FileWrite = false;
	if ( Modify_New_StopLoss > Modify_OrderStopLoss ) { _StopLoss_ColorVariant = 2; _StopLoss_FileWrite = true; }
	if ( Modify_New_StopLoss < Modify_OrderStopLoss ) { _StopLoss_ColorVariant = 3; _StopLoss_FileWrite = true; }
	int _TakeProfit_ColorVariant = 0;
	bool _TakeProfit_FileWrite = false;
	if ( Modify_New_TakeProfit > Modify_OrderTakeProfit ) { _TakeProfit_ColorVariant = 2; _TakeProfit_FileWrite = true; }
	if ( Modify_New_TakeProfit < Modify_OrderTakeProfit ) { _TakeProfit_ColorVariant = 3; _TakeProfit_FileWrite = true; }

	_FileWrite ( " - - - - - - - - - - - - - - - - OrderModify Start - - - - - - - - - - - - - - - - - -" );
	_info ( 10, str_tmp + Modify_OrderTicket + ", " +  strOrderType( Modify_OrderType ) + "..." );
	_info ( 1, "Old Open Price = " + DoubleToStr( Modify_OrderOpenPrice, _Digits ), _OpenPrice_ColorVariant, _OpenPrice_FileWrite );
	_info ( 2, "Old Stop Loss = " + DoubleToStr( Modify_OrderStopLoss, _Digits ), _StopLoss_ColorVariant, _StopLoss_FileWrite );
	_info ( 3, "Old Take Profit = " + DoubleToStr( Modify_OrderTakeProfit, _Digits ), _TakeProfit_ColorVariant, _TakeProfit_FileWrite );
	_info ( 4, "" );

	_info ( 11, "New Open Price = " + DoubleToStr( Modify_New_OpenPrice, _Digits ), _OpenPrice_ColorVariant, _OpenPrice_FileWrite );
	_info ( 12, "New Stop Loss = " + DoubleToStr( Modify_New_StopLoss, _Digits ), _StopLoss_ColorVariant, _StopLoss_FileWrite );
	_info ( 13, "New Take Profit = " + DoubleToStr( Modify_New_TakeProfit, _Digits ), _TakeProfit_ColorVariant, _TakeProfit_FileWrite );
	_info ( 14, "" );

	if ( Modify_New_Expiration > 0 ) { _FileWrite ( "New Expiration Time = " + TimeToStr( Modify_New_Expiration, TIME_DATE | TIME_SECONDS ) ); }
}
int _OrderModify_Check ()
{
	if ( Allow_Info )	{ _info ( 14, stringCheck, 0, 0 ); }

//---- Åñëè íå÷åãî ìåíÿòü - âûõîäèì
	if ( 	NormalizeDouble( Modify_New_OpenPrice, _Digits ) == NormalizeDouble( Modify_OrderOpenPrice, _Digits ) &&
			NormalizeDouble( Modify_New_StopLoss, _Digits ) == NormalizeDouble( Modify_OrderStopLoss, _Digits ) &&
			NormalizeDouble( Modify_New_TakeProfit, _Digits ) == NormalizeDouble( Modify_OrderTakeProfit, _Digits ) &&
			Modify_New_Expiration == Modify_OrderExpiration )
	{
		if ( Allow_Info ) { _info ( 14, "Ïðîâåðÿåì ïàðàìåòðû.....Íåò íè îäíîãî ïàðàìåòðà äëÿ èçìåíåíèÿ. Ìîäèôèêàöèÿ îòìåíåíà..." ); }
		if ( Allow_LogFile ) { _FileWrite( "Íåò íè îäíîãî ïàðàìåòðà äëÿ èçìåíåíèÿ. Ìîäèôèêàöèÿ îòìåíåíà..." ); }
		_Return_ ( 2,  "Error", 0, "Íåò íè îäíîãî ïàðàìåòðà äëÿ èçìåíåíèÿ", "_OrderModify_Check()", "Íåò íè îäíîãî ïàðàìåòðà äëÿ èçìåíåíèÿ" );
		return(-1);
	}

//---- Ïðîâåðÿåì âñå ïàðàìåòðû OrderModify ( êðîìå _OrderTicket è _Color ),
//---- è åñëè åñòü îøèáêà - âûõîäèì
/*	if ( _OrderCheck( Modify_Symbol, Modify_OrderType, Modify_OrderLots, Modify_New_OpenPrice, Modify_New_StopLoss, Modify_New_TakeProfit, Modify_New_Expiration ) < 0 )
	{
		if ( Allow_Info )	{ _info ( 14, stringCheckError, 1, 0 ); }
		if ( Allow_LogFile ) { _FileWrite( "Îøèáêà ïðè ïðîâåðêå ïàðàìåòðîâ!" ); }
		_Return_ ( 2,  "Error", 0, "Îøèáêà ïðè ïðîâåðêå ïàðàìåòðîâ!", "_OrderModify_Check()", "Îøèáêà ïðè ïðîâåðêå ïàðàìåòðîâ!" );
		return(-3);
	}
*/
	if ( Allow_Info ) { _info ( 14, stringCheckOK, 0, 0 ); }

return(1);
}
bool _OrderModify_RefreshValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Modify_OrderTicket, SELECT_BY_TICKET ) )
	{
		Modify_GetLastError = GetLastError();
		_Return_ ( 2,  "Error", Modify_GetLastError, ErrorDescription( Modify_GetLastError ), "OrderSelect( " + Modify_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Modify_GetLastError + " ( " + ErrorDescription( Modify_GetLastError ) + " )" );
		return(false);
	}

	Modify_OrderLots			= NormalizeDouble ( OrderLots(), 2 );
	Modify_OrderOpenPrice	= NormalizeDouble ( OrderOpenPrice(), _Digits );
	Modify_OrderStopLoss		= NormalizeDouble ( OrderStopLoss(), _Digits );
	Modify_OrderTakeProfit	= NormalizeDouble ( OrderTakeProfit(), _Digits );
	Modify_OrderExpiration	= OrderExpiration();

	if ( Modify_New_OpenPrice  < 0 )	{ Modify_New_OpenPrice	= NormalizeDouble( Modify_OrderOpenPrice, _Digits ); }
	if ( Modify_New_StopLoss   < 0 )	{ Modify_New_StopLoss	= NormalizeDouble( Modify_OrderStopLoss, _Digits ); }
	if ( Modify_New_TakeProfit < 0 )	{ Modify_New_TakeProfit	= NormalizeDouble( Modify_OrderTakeProfit, _Digits ); }
	if ( Modify_New_Expiration < 0 )	{ Modify_New_Expiration	= Modify_OrderExpiration; }

return(true);
}
void _OrderModify_SetArrow ()
{
	if ( Modify_Color == CLR_NONE ) { return(0); }

	string arrow_description = Modify_OrderComment + "\nId " + Modify_OrderMagicNumber;
	string end_name;
	switch ( Modify_OrderType )
	{
		case OP_BUY:			end_name = " buy"; break;
		case OP_SELL:			end_name = " sell"; break;
		case OP_BUYLIMIT:		end_name = " buy limit"; break;
		case OP_SELLLIMIT:	end_name = " sell limit"; break;
		case OP_BUYSTOP:		end_name = " buy stop"; break;
		case OP_SELLSTOP:		end_name = " sell stop"; break;
	}
	end_name = end_name + " modified " + TimeToStr( CurTime() );
	
	string open_name = "#" + Modify_OrderTicket + end_name;
	string sl_name = "#" + Modify_OrderTicket + " sl modified ";
	string tp_name = "#" + Modify_OrderTicket + " tp modified ";

	if ( NormalizeDouble( Modify_New_OpenPrice, _Digits ) != NormalizeDouble( Modify_OrderOpenPrice, _Digits ) )
	{
		sl_name = sl_name + TimeToStr( CurTime() );
		tp_name = tp_name + TimeToStr( CurTime() );
	
		ObjectSetText( open_name, arrow_description, 10 );
	}
	if ( NormalizeDouble( Modify_New_StopLoss, _Digits ) != NormalizeDouble( Modify_OrderStopLoss, _Digits ) )
	{
		ObjectSetText( sl_name, arrow_description, 10 );
	}
	if ( NormalizeDouble( Modify_New_TakeProfit, _Digits ) != NormalizeDouble( Modify_OrderTakeProfit, _Digits ) )
	{
		ObjectSetText( tp_name, arrow_description, 10 );
	}
	GetLastError();
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int _OrderCheck ( string _Symbol, int _OrderType, double _Volume, double _OpenPrice, double _StopLoss, double _TakeProfit, datetime _Expiration )
/////////////////////////////////////////////////////////////////////////////////
// Ïðîâåðÿåò ðàññòîÿíèÿ OP,SL,TP, îáú¸ì è âðåìÿ èñòå÷åíèÿ äëÿ ô-öèé _OrderSend è _OrderModify.
// Ïðè óñïåøíîé ïðîâåðêå âîçâðàùàåò "1", ïðè îøèáêå âîçâðàùàåò "-1".
/////////////////////////////////////////////////////////////////////////////////
{
	int		_return				= 1;
	double	_Ask					= NormalizeDouble( MarketInfo( _Symbol, MODE_ASK ), _Digits );
	double	_Bid					= NormalizeDouble( MarketInfo( _Symbol, MODE_BID ), _Digits );
	
	string	_Ask_str				= DoubleToStr( _Ask, _Digits );
	string	_Bid_str				= DoubleToStr( _Bid, _Digits );
	string	_OpenPrice_str		= DoubleToStr( _OpenPrice, _Digits );
	string	_StopLoss_str		= DoubleToStr( _StopLoss, _Digits );
	string	_TakeProfit_str	= DoubleToStr( _TakeProfit, _Digits );
	string	_Expiration_str	= TimeToStr( _Expiration, TIME_DATE|TIME_SECONDS );

// _OrderType äîëæåí áûòü îò 0 äî 5
	if ( _OrderType < 0 || _OrderType > 5 )
	{
		_info ( 4, stringInvalidOrderType + " ( " + _OrderType + " )!!!", 1 );
		Send_GetLastError = 3;
		_return = -1;
	}

// Îáü¸ì äîëæåí áûòü >= 0.1
	if ( NormalizeDouble( MarketInfo( _Symbol, MODE_MINLOT ) - _Volume, 4 ) > 0.0 || NormalizeDouble( _Volume - MarketInfo( _Symbol, MODE_MAXLOT ), 4 ) > 0.0 )
	{
		_info ( 4, "Lot(s) = " + DoubleToStr( _Volume, 4 ) + stringInvalidVolume, 1 );
		Send_GetLastError = 131;
		_return = -1;
	}



// Ïðîâåðêè âñåõ "äëèííûõ" îðäåðîâ/ïîçèöèé
	if ( _OrderType == OP_BUY || _OrderType == OP_BUYLIMIT || _OrderType == OP_BUYSTOP )
	{
// - _StopLoss (åñëè åñòü) äîëæåí áûòü íèæå _OpenPrice
		if ( NormalizeDouble( _StopLoss, _Digits ) > 0 && NormalizeDouble( (_OpenPrice - _Spread) - _StopLoss, _Digits ) < NormalizeDouble( _StopLevel, _Digits )  )
		{
			if ( NormalizeDouble( _OpenPrice - _StopLoss, _Digits ) < 0 )
			{
				_info ( 2, "Stop Loss = " + _StopLoss_str + stringIncorrectAbove + " OpenPrice = " + _OpenPrice_str + ")!!!", 1 );
			}
// - - ìèíèìàëüíûé îòñòóï - _StopLevel
			else
			{
				_info ( 2, "Stop Loss = " + _StopLoss_str + stringIncorrectTooBeside + " OpenPrice = " + _OpenPrice_str + ")!!!", 1 );
			}
			Send_GetLastError = 130;
			_return = -1;
		}
// - _TakeProfit (åñëè åñòü) äîëæåí áûòü âûøå _OpenPrice
		if ( NormalizeDouble( _TakeProfit, _Digits ) > 0 && NormalizeDouble( _TakeProfit - (_OpenPrice - _Spread), _Digits ) < NormalizeDouble( _StopLevel, _Digits )  )
		{
			if ( NormalizeDouble( _TakeProfit - _OpenPrice, _Digits ) < 0 )
			{
				_info ( 3, "Take Profit = " + _TakeProfit_str + stringIncorrectBelow + " OpenPrice = " + _OpenPrice_str + ")!!!", 1 );
			}
// - - ìèíèìàëüíûé îòñòóï - _StopLevel
			else
			{
				_info ( 3, "Take Profit = " + _TakeProfit_str + stringIncorrectTooBeside + " OpenPrice = " + _OpenPrice_str + ")!!!", 1 );
			}
			Send_GetLastError = 130;
			_return = -1;
		}
	}

// Ïðîâåðêè âñåõ "êîðîòêèõ" îðäåðîâ/ïîçèöèé
	if ( _OrderType == OP_SELL || _OrderType == OP_SELLLIMIT || _OrderType == OP_SELLSTOP )
	{
// - _StopLoss (åñëè åñòü) äîëæåí áûòü âûøå _OpenPrice
		if ( NormalizeDouble( _StopLoss, _Digits ) > 0 && NormalizeDouble( _StopLoss - (_OpenPrice + _Spread), _Digits ) < NormalizeDouble( _StopLevel, _Digits )  )
		{
			if ( NormalizeDouble( _StopLoss - _OpenPrice, _Digits ) < 0 )
			{
				_info ( 2, "Stop Loss = " + _StopLoss_str + stringIncorrectBelow + " OpenPrice = " + _OpenPrice_str + ")!!!", 1 );
			}
// - - ìèíèìàëüíûé îòñòóï - _StopLevel
			else
			{
				_info ( 2, "Stop Loss = " + _StopLoss_str + stringIncorrectTooBeside + " OpenPrice = " + _OpenPrice_str + ")!!!", 1 );
			}
			Send_GetLastError = 130;
			_return = -1;
		}
// - _TakeProfit (åñëè åñòü) äîëæåí áûòü íèæå _OpenPrice
		if ( NormalizeDouble( _TakeProfit, _Digits ) > 0 && NormalizeDouble( (_OpenPrice + _Spread) - _TakeProfit, _Digits ) < NormalizeDouble( _StopLevel, _Digits )  )
		{
			if ( NormalizeDouble( _OpenPrice - _TakeProfit, _Digits ) < 0 )
			{
				_info ( 3, "Take Profit = " + _TakeProfit_str + stringIncorrectAbove + " OpenPrice = " + _OpenPrice_str + ")!!!", 1 );
			}
// - - ìèíèìàëüíûé îòñòóï - _StopLevel
			else
			{
				_info ( 3, "Take Profit = " + _TakeProfit_str + stringIncorrectTooBeside + " OpenPrice = " + _OpenPrice_str + ")!!!", 1 );
			}
			Send_GetLastError = 130;
			_return = -1;
		}
	}

// - Âðåìÿ èñòå÷åíèÿ
// - - Ìàðêåò-îðäåðà - âðåìÿ èñòå÷åíèÿ äîëæíî áûòü = 0
	if ( _OrderType <= OP_SELL )
	{
		if ( _Expiration != 0 )
		{
			_info ( 4, "Expiration Time = " + _Expiration_str + stringInvalidExpiration, 1 );
			Send_GetLastError = 3;
			_return = -1;
		}
	}
// - - Îòëîæåííûå îðäåðà - âðåìÿ èñòå÷åíèÿ (åñëè åñòü) äîëæíî áûòü > òåêóùåãî ñåðâåðíîãî âðåìåíè
	else
	{
		if ( _Expiration > 0 && _Expiration <= CurTime() )
		{
			_info ( 4, "Expiration Time = " + _Expiration_str + stringIncorrectExpiration, 1 );
			Send_GetLastError = 3;
			_return = -1;
		}
	}

// åñëè åñòü õîòü îäíà îøèáêà, âîçâðàùàåì -1
// åñëè âñå ïðîâåðêè ïðîøëè óñïåøíî, âîçâðàùàåì 1
return(_return);
}

string	Close_OrderSymbol = "", Close_ProfitLoss = "", Close_OrderComment = "";
int		Close_OrderTicket = 0, Close_OrderType = 0, Close_OrderMagicNumber = 0, Close_Slippage = 0, Close_StartTickCount = 0, Close_GetLastError = 0;
double	Close_Volume = 0.0, Close_OrderLots = 0.0, Close_OrderOpenPrice = 0.0, Close_ClosePrice = 0.0;
color		Close_Color = CLR_NONE;
bool		Close_Result = false;

/////////////////////////////////////////////////////////////////////////////////
/**/ int _OrderClose ( int _OrderTicket, double _Volume = 0.0, double ClosePrice = 0.0, int _Slippage = -1, color _Color = -2 )
/////////////////////////////////////////////////////////////////////////////////
// Ñòàíäàðòíàÿ ô-öèÿ OrderClose + ïðîâåðêè.
//
// Ïðè óñïåøíîì âûïîëíåíèè âîçâðàùàåò "1", ïðè îøèáêå çàêðûòèÿ âîçâðàùàåò "-1",
// ïðè îøèáêå âûáîðà îðäåðà âîçâðàùàåò "-2", ïðè îøèáêå ïðîâåðêè âîçâðàùàåò "-3".
// Åñëè ýêñïåðòó çàïðåùåíà òîðãîâëÿ, âîçâðàùàåò "-4".
/////////////////////////////////////////////////////////////////////////////////
{
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ
	Close_OrderSymbol = ""; Close_ProfitLoss = ""; Close_OrderComment = "";
	Close_OrderTicket = _OrderTicket; Close_OrderType = 0; Close_OrderMagicNumber = 0; Close_Slippage = _Slippage; Close_StartTickCount = GetTickCount();
	Close_Volume = _Volume; Close_OrderLots = 0.0; Close_OrderOpenPrice = 0.0; Close_ClosePrice = ClosePrice;
	Close_Color = _Color;
	Close_Result = false;
	StartTime = TimeLocal();

//---- Èçìåíÿåì òå ïåðåìåííûå, êîòîðûå ìîæíî ìåíÿòü è íîðìàëèçóåì èõ, åñëè îøèáêà ïðè âûáîðå îðäåðà - âûõîäèì
	if ( _OrderClose_SetValue() == false ) { return(-2); }

//---- Âûâîäèì èíôîðìàöèþ
	_OrderClose_Info();

//---- Ïðîâåðÿåì ïàðàìåòðû. Åñëè åñòü îøèáêà - âûõîäèì
	if ( _OrderClose_Check() == false ) { return(-3); }

//---- Âñå íåîáõîäèìûå ïðîâåðêè, ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè, etc... Åñëè åñòü îøèáêà - âûõîäèì
	int _Check_ = _Check_(3);
	if ( _Check_ < 0 ) { return(_Check_); }

//---- Åñëè ô-öèÿ ðàáîòàåò áîëüøå ñåêóíäû, îáíîâëÿåì ïåðåìåííûå è ïðîâåðÿåì èõ. Åñëè åñòü îøèáêà - âûõîäèì
	if ( GetTickCount() - Close_StartTickCount > 1000 )
	{
		if ( _OrderClose_RefreshValue() == false ) { TradeIsNotBusy(); return(-2); }
		if ( _OrderClose_Check() == false ) { TradeIsNotBusy(); return(-3); }
	}

//---- Ñîáñòâåííî, çàêðûâàåìñÿ
	Close_Result = OrderClose( Close_OrderTicket, Close_Volume, Close_ClosePrice, Close_Slippage, Close_Color );
	Close_GetLastError = GetLastError();

//---- Åñëè åñòü îøèáêà,
	if ( !Close_Result || Close_GetLastError > 0 )
	{
//---- îòäà¸ì íà îòðàáîòêó êîä îøèáêè,
		Processing_Error ( Close_GetLastError, "OrderClose" );
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
		TradeIsNotBusy();
//---- âûâîäèì èíôîðìàöèþ â _TradeLog, â æóðíàë,
		_Return_ ( 3, "Error", Close_GetLastError, ErrorDescription( Close_GetLastError ), "OrderClose(...)", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
//---- è âûõîäèì, âîçâðàùàÿ -1.
		return(-1);
	}

//---- Åñëè âñ¸ õîðîøî,
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
	TradeIsNotBusy();

//---- ïðîâåðÿåì - äåéñòâèòåëüíî ëè çàêðûëàñü ïîçèöèÿ è, åñëè íåò, âûâîäèì èíôîðìàöèþ è âûõîäèì, âîçâðàùàÿ -5
	for ( int x = 0; x < 5; x ++ )
	{
		Sleep(1000);
		if ( OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) )
		{
			if ( OrderCloseTime() <= 0 )
			{
				Processing_Error ( 0, "OrderClose" );
				_Return_ ( 3, "Error", 0, "Ïîçèöèÿ íå áûëà çàêðûòà", "OrderClose(...)", "Ïîçèöèÿ íå áûëà çàêðûòà" );
				return(-5);
			}
			else
			{ break; }
		}
		Close_GetLastError = GetLastError();
		_Print_ ( 3, "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
	}

//---- ñîçäà¸ì îïèñàíèÿ ê ñòðåëî÷êàì,
	_OrderClose_SetArrow();

//---- âûâîäèì èíôîðìàöèþ,
	_info ( 14, stringSuccessfully );
	_Return_ ( 3, "OK", 0, "", "OrderClose(...)", "OK" );

//---- è âûõîäèì, âîçâðàùàÿ 1.
return(1);
}

bool _OrderClose_SetValue ()
{
//---- Ïðîâåðÿåì _Slippage
	if ( Close_Slippage < 0 ) { Close_Slippage = Slippage; }

//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) )
	{
		Close_GetLastError = GetLastError();
		_Return_ ( 3, "Error", Close_GetLastError, ErrorDescription( Close_GetLastError ), "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
		return(false);
	}

	Close_OrderSymbol			= OrderSymbol();
	Close_OrderType			= OrderType();
	Close_ProfitLoss			= DoubleToStr( OrderProfit() + OrderSwap() + OrderCommission(), 2 );
	Close_OrderComment		= OrderComment();
	Close_OrderMagicNumber	= OrderMagicNumber();

Close_OrderOpenPrice = OrderOpenPrice();
//---- Ïðîâåðÿåì Close_Volume - åñëè áîëüøå OrderLots èëè ìåíüøå 0.1, ñòàâèì OrderLots.
	Close_OrderLots = NormalizeDouble( OrderLots(), _Digits );
	if ( NormalizeDouble( Close_Volume, 2 ) > NormalizeDouble( Close_OrderLots, 2 ) || NormalizeDouble( Close_Volume, 2 ) < NormalizeDouble( MarketInfo( _Symbol, MODE_MINLOT ), 2 ) )
	{ Close_Volume = NormalizeDouble( Close_OrderLots, 2 ); }

//---- Âûñòàâëÿåì Close_ClosePrice
	if ( Close_OrderType == OP_SELL ) { Close_ClosePrice = NormalizeDouble( MarketInfo ( Close_OrderSymbol, MODE_ASK ), _Digits ); }
	if ( Close_OrderType == OP_BUY ) { Close_ClosePrice = NormalizeDouble( MarketInfo ( Close_OrderSymbol, MODE_BID ), _Digits ); }

//---- Íîðìàëèçóåì ïåðåìåííûå
	Close_Volume = NormalizeDouble( Close_Volume, 2 );

//---- Åñëè öâåò íå çàäàâàëñÿ, óñòàíàâëèâàåì OrderSellColor(äëÿ "êîðîòêèõ" ïîçèöèé) èëè OrderBuyColor(äëÿ "äëèííûõ" ïîçèöèé)
	if ( Close_Color < -1 )
	{
		Close_Color = OrderSellColor;
		if ( Close_OrderType == OP_BUY || Close_OrderType == OP_BUYLIMIT || Close_OrderType == OP_BUYSTOP )
		{ Close_Color = OrderBuyColor; }
	}
	else
	{
		if ( Close_Color < 0 ) Close_Color = CLR_NONE;
	}
	return(true);
}
void _OrderClose_Info ()
{
	if ( !Allow_Info && !Allow_LogFile ) { return(0); }
	int _OrderType_ColorVariant = 3;
	if ( Close_OrderType == OP_BUY || Close_OrderType == OP_BUYLIMIT || Close_OrderType == OP_BUYSTOP ) { _OrderType_ColorVariant = 2; }

	_FileWrite ( "- - - - - - - - - - - - - - - - - OrderClose Start - - - - - - - - - - - - - - - - - -" );
	_info ( 10, "Çàêðûâàåì ïîçèöèþ ¹ " + Close_OrderTicket + ", " + strOrderType ( Close_OrderType ) + "...", _OrderType_ColorVariant );
	_info ( 1, "Ñlose Price = " + DoubleToStr( Close_ClosePrice, _Digits ) );
	_info ( 2, "Lot(s) = " + DoubleToStr( Close_Volume, 2 ) );
	_info ( 3, "Profit/Loss = " + Close_ProfitLoss );
	_info ( 4, "" );

	_info ( 11, "Comment = " + Close_OrderComment, 0, 0 );
	_info ( 12, "MagicNumber = " + Close_OrderMagicNumber, 0, 0 );
	_info ( 13, "" );
	_info ( 14, "" );
}
bool _OrderClose_Check ()
{
	if ( Allow_Info )	{ _info ( 13, stringCheck, 0, 0 ); }

	if ( Close_OrderType > OP_SELL )
	{
		if ( Allow_Info || Allow_LogFile )
		{
			_info ( 13, stringCheckError, 1, 0 );
			_info ( 4, "Îøèáî÷íûé OrderType() - " + Close_OrderType + ". Çàêðûòà ìîæåò áûòü òîëüêî OP_BUY èëè OP_SELL ïîçèöèÿ.", 1 );
		}
		_Return_ ( 3, "Error", 0, "Îøèáî÷íûé OrderType()", "_OrderClose_Check()", "Îøèáî÷íûé OrderType()" );
		return(false);
	}

	if ( Allow_Info ) { _info ( 13, stringCheckOK, 0, 0 ); }
return(true);
}
bool _OrderClose_RefreshValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) )
	{
		Close_GetLastError = GetLastError();
		_Return_ ( 3, "Error", Close_GetLastError, ErrorDescription( Close_GetLastError ), "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
		return(false);
	}

	bool refreshed = false;
	Close_OrderType = OrderType();
	Close_OrderLots = NormalizeDouble( OrderLots(), _Digits );

//---- Îáíîâëÿåì Close_ClosePrice
	if ( Close_OrderType == OP_SELL )
	{
		if ( NormalizeDouble( Close_ClosePrice, _Digits ) != NormalizeDouble( MarketInfo( Close_OrderSymbol, MODE_ASK ), _Digits ) )
		{
			Close_ClosePrice = NormalizeDouble( MarketInfo ( Close_OrderSymbol, MODE_ASK ), _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - OrderClose Refresh - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 1, "Refreshed Ñlose Price = " + DoubleToStr( Close_ClosePrice, _Digits ) );
			}
		}
	}
	if ( Close_OrderType == OP_BUY )
	{
		if ( NormalizeDouble( Close_ClosePrice, _Digits ) != NormalizeDouble( MarketInfo( Close_OrderSymbol, MODE_BID ), _Digits ) )
		{
			Close_ClosePrice = NormalizeDouble( MarketInfo( Close_OrderSymbol, MODE_BID ), _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - OrderClose Refresh - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 1, "Refreshed Ñlose Price = " + DoubleToStr( Close_ClosePrice, _Digits ) );
			}
		}
	}

//---- Ïðîâåðÿåì Close_Volume - åñëè áîëüøå OrderLots èëè ìåíüøå 0.1, ñòàâèì OrderLots.
	if ( NormalizeDouble( Close_Volume, 2 ) > NormalizeDouble( Close_OrderLots, 2 ) || NormalizeDouble( Close_Volume, 2 ) < NormalizeDouble( MarketInfo( _Symbol, MODE_MINLOT ), 2 ) )
	{
		Close_Volume = NormalizeDouble( Close_OrderLots, 2 );
		if ( Allow_Info || Allow_LogFile )
		{
			if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - OrderClose Refresh - - - - - - - - - - - - - - - - -" ); refreshed = true; }
			_info ( 2, "Refreshed Lot(s) = " + DoubleToStr( Close_Volume, 2 ) );
		}
	}
return(true);
}
void _OrderClose_SetArrow ()
{
	if ( Close_Color == CLR_NONE ) { return(0); }
	string arrow_description = Close_OrderComment + "\nId " + Close_OrderMagicNumber;
	string end_name;
	switch ( Close_OrderType )
	{
		case OP_BUY:	end_name = " buy "; break;
		case OP_SELL:	end_name = " sell "; break;
	}
	string close_name = "#" + Close_OrderTicket + end_name + DoubleToStr( Close_Volume, 2 ) + " " + Close_OrderSymbol + " at " + DoubleToStr( Close_OrderOpenPrice, _Digits ) + " close at " + DoubleToStr( Close_ClosePrice, _Digits );

	ObjectSetText( close_name, arrow_description, 10 );
	GetLastError();
}

string	Delete_OrderComment = "";
int		Delete_OrderTicket = 0, Delete_OrderType = 0, Delete_OrderMagicNumber = 0, Delete_StartTickCount = 0, Delete_GetLastError = 0;
bool		Delete_Result = false;

/////////////////////////////////////////////////////////////////////////////////
/**/ int _OrderDelete ( int _OrderTicket )
/////////////////////////////////////////////////////////////////////////////////
// Ñòàíäàðòíàÿ ô-öèÿ OrderDelete + ïðîâåðêè.
//
// Ïðè óñïåøíîì âûïîëíåíèè âîçâðàùàåò "1", ïðè îøèáêå óäàëåíèÿ âîçâðàùàåò "-1",
// ïðè îøèáêå âûáîðà îðäåðà âîçâðàùàåò "-2", ïðè îøèáêå ïðîâåðêè âîçâðàùàåò "-3".
// Åñëè ýêñïåðòó çàïðåùåíà òîðãîâëÿ, âîçâðàùàåò "-4".
/////////////////////////////////////////////////////////////////////////////////
{
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ
	Delete_OrderComment = "";
	Delete_OrderTicket = _OrderTicket; Delete_OrderType = 0; Delete_OrderMagicNumber = 0; Delete_StartTickCount = GetTickCount();
	Delete_Result = false;
	StartTime = TimeLocal();

//---- Èçìåíÿåì òå ïåðåìåííûå, êîòîðûå ìîæíî ìåíÿòü è íîðìàëèçóåì èõ, åñëè îøèáêà ïðè âûáîðå îðäåðà - âûõîäèì
	if ( _OrderDelete_SetValue() == false ) { return(-2); }

//---- Âûâîäèì èíôîðìàöèþ
	_OrderDelete_Info();

//---- Ïðîâåðÿåì ïàðàìåòðû. Åñëè åñòü îøèáêà - âûõîäèì
	if ( _OrderDelete_Check() == false ) { return(-3); }

//---- Âñå íåîáõîäèìûå ïðîâåðêè, ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè, etc... Åñëè åñòü îøèáêà - âûõîäèì
	int _Check_ = _Check_(3);
	if ( _Check_ < 0 ) { return(_Check_); }

//---- Åñëè ô-öèÿ ðàáîòàåò áîëüøå ñåêóíäû, îáíîâëÿåì ïåðåìåííûå è ïðîâåðÿåì èõ. Åñëè åñòü îøèáêà - âûõîäèì
	if ( GetTickCount() - Delete_StartTickCount > 1000 )
	{
		if ( _OrderDelete_RefreshValue() == false ) { TradeIsNotBusy(); return(-2); }
		if ( _OrderDelete_Check() == false ) { TradeIsNotBusy(); return(-3); }
	}

//---- Ñîáñòâåííî, óäàëÿåì
	Delete_Result = OrderDelete( Delete_OrderTicket );
	Delete_GetLastError = GetLastError();

//---- Åñëè åñòü îøèáêà,
	if ( !Delete_Result || Delete_GetLastError > 0 )
	{
//---- îòäà¸ì íà îòðàáîòêó êîä îøèáêè,
		Processing_Error ( Delete_GetLastError, "OrderDelete" );
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
		TradeIsNotBusy();
//---- âûâîäèì èíôîðìàöèþ â _TradeLog, â æóðíàë,
		_Return_ ( 4, "Error", Delete_GetLastError, ErrorDescription( Delete_GetLastError ), "OrderDelete(...)", "Error #" + Delete_GetLastError + " ( " + ErrorDescription( Delete_GetLastError ) + " )" );
//---- è âûõîäèì, âîçâðàùàÿ -1.
		return(-1);
	}

//---- Åñëè âñ¸ õîðîøî,
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
	TradeIsNotBusy();

//---- ïðîâåðÿåì - äåéñòâèòåëüíî ëè óäàë¸í îðäåð è, åñëè íåò, âûâîäèì èíôîðìàöèþ è âûõîäèì, âîçâðàùàÿ -5
	for ( int x = 0; x < 5; x ++ )
	{
		Sleep(1000);
		int _OrdersTotal = OrdersTotal();
		for ( int z = _OrdersTotal - 1; z >= 0; z -- )
		{
			if ( OrderSelect( z, SELECT_BY_POS ) )
			{
				if ( OrderTicket() == Delete_OrderTicket )
				{
					Processing_Error ( 0, "OrderDelete" );
					_Return_ ( 4, "Error", 0, "Îðäåð íå áûë óäàë¸í", "OrderDelete(...)", "Îðäåð íå áûë óäàë¸í" );
					return(-5);
				}
				if ( z == 0 ) { x = 5; break; }
			}
			else
			{
				Delete_GetLastError = GetLastError();
				_Print_ ( 4, "OrderSelect( " + z + ", SELECT_BY_POS )", "Error #" + Delete_GetLastError + " ( " + ErrorDescription( Delete_GetLastError ) + " )" );
			}
		}
	}

//---- âûâîäèì èíôîðìàöèþ,
	_info ( 14, stringSuccessfully );
	_Return_ ( 4, "OK", 0, "", "OrderDelete(...)", "OK" );
//---- è âûõîäèì, âîçâðàùàÿ 1.
return(1);
}

bool _OrderDelete_SetValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Delete_OrderTicket, SELECT_BY_TICKET ) )
	{
		Delete_GetLastError = GetLastError();
		_Print_ ( 4, "OrderSelect( " + Delete_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Delete_GetLastError + " ( " + ErrorDescription( Delete_GetLastError ) + " )" );
		return(false);
	}

	Delete_OrderType			= OrderType();
	Delete_OrderComment		= OrderComment();
	Delete_OrderMagicNumber	= OrderMagicNumber();

return(true);
}
void _OrderDelete_Info ()
{
	if ( !Allow_Info && !Allow_LogFile ) { return(0); }
	int _OrderType_ColorVariant = 3;
	if ( Delete_OrderType == OP_BUY || Delete_OrderType == OP_BUYLIMIT || Delete_OrderType == OP_BUYSTOP ) { _OrderType_ColorVariant = 2; }

	_FileWrite ( " - - - - - - - - - - - - - - - - OrderDelete Start - - - - - - - - - - - - - - - - - -" );
	_info ( 10, "Óäàëÿåì îðäåð ¹ " + Delete_OrderTicket + ", " + strOrderType ( Delete_OrderType ) + "...", _OrderType_ColorVariant );
	_info ( 1, "" );
	_info ( 2, "" );
	_info ( 3, "" );
	_info ( 4, "" );

	_info ( 11, "Comment = " + Delete_OrderComment, 0, 0 );
	_info ( 12, "MagicNumber = " + Delete_OrderMagicNumber, 0, 0 );
	_info ( 13, "" );
	_info ( 14, "" );
}
bool _OrderDelete_Check ()
{
	if ( Allow_Info )	{ _info ( 13, stringCheck, 0, 0 ); }

//---- Ïðîâåðÿåì _OrderType
	if ( Delete_OrderType <= OP_SELL )
	{
		if ( Allow_Info || Allow_LogFile )
		{
			_info ( 13, stringCheckError, 1, 0 );
			_info ( 14, "Îøèáî÷íûé OrderType() - " + Delete_OrderType + ". Óäàë¸í ìîæåò áûòü òîëüêî îòëîæåííûé îðäåð.", 1 );
		}
		_Return_ ( 4, "Error", 0, "Îøèáî÷íûé OrderType", "_OrderDelete_Check()", "Îøèáî÷íûé OrderType" );
		return(false);
	}

	if ( Allow_Info ) { _info ( 13, stringCheckOK, 0, 0 ); }

return(true);
}
bool _OrderDelete_RefreshValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Delete_OrderTicket, SELECT_BY_TICKET ) )
	{
		Delete_GetLastError = GetLastError();
		_Print_ ( 4, "OrderSelect( " + Delete_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Delete_GetLastError + " ( " + ErrorDescription( Delete_GetLastError ) + " )" );
		return(false);
	}

	Delete_OrderType = OrderType();
return(true);
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int _Reverse ( int _OrderTicket, int _Slippage = -1, color _CloseColor = CLR_NONE, color _SendColor = CLR_NONE )
/////////////////////////////////////////////////////////////////////////////////
// Ïåðåâîðîò. Ïîçèöèÿ ñ _OrderTicket çàêðûâàåòñÿ è îòêðûâàåòñÿ íîâàÿ ñ òàêèì æå ëîòîì íàâñòðå÷ó + ïðîâåðêè.
//
// Ïðè óñïåøíîì âûïîëíåíèè âîçâðàùàåò "1", ïðè òîðãîâîé îøèáêå âîçâðàùàåò "-1",
// ïðè îøèáêå âûáîðà îðäåðà âîçâðàùàåò "-2", ïðè îøèáêå ïðîâåðêè âîçâðàùàåò "-3".
// Åñëè ýêñïåðòó çàïðåùåíà òîðãîâëÿ, âîçâðàùàåò "-4".
/////////////////////////////////////////////////////////////////////////////////
{
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ
	Close_OrderSymbol = ""; Close_ProfitLoss = ""; Close_OrderComment = "";
	Close_OrderTicket = _OrderTicket; Close_OrderType = 0; Close_OrderMagicNumber = 0; Close_Slippage = _Slippage; Close_StartTickCount = GetTickCount();
	Close_Volume = 0.0; Close_OrderLots = 0.0; Close_ClosePrice = 0.0;
	Close_Color = _CloseColor;
	Close_Result = false;

	Send_Symbol = ""; Send_Comment = "";
	Send_OrderType = 0; Send_Slippage = _Slippage; Send_MagicNumber = 0;
	Send_Volume = 0.0; Send_OpenPrice = 0.0; Send_StopLoss = 0.0; Send_TakeProfit = 0.0;
	Send_Expiration = 0;
	Send_Color = _SendColor;
	Send_Result = -1;

	StartTime = TimeLocal();

//---- Èçìåíÿåì òå ïåðåìåííûå, êîòîðûå ìîæíî ìåíÿòü è íîðìàëèçóåì èõ, åñëè îøèáêà ïðè âûáîðå îðäåðà - âûõîäèì
	if ( _Reverse_SetValue() == false ) { return(-2); }

//---- Âûâîäèì èíôîðìàöèþ
	_Reverse_Info();

//---- Ïðîâåðÿåì ïàðàìåòðû. Åñëè åñòü îøèáêà - âûõîäèì
	if ( _Reverse_Check() == false ) { return(-3); }

//---- Âñå íåîáõîäèìûå ïðîâåðêè, ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè, etc... Åñëè åñòü îøèáêà - âûõîäèì
	int _Check_ = _Check_(5);
	if ( _Check_ < 0 ) { return(_Check_); }

//---- Åñëè ô-öèÿ ðàáîòàåò áîëüøå ñåêóíäû, îáíîâëÿåì ïåðåìåííûå è ïðîâåðÿåì èõ. Åñëè åñòü îøèáêà - âûõîäèì
	if ( GetTickCount() - Close_StartTickCount > 1000 )
	{
		if ( _Reverse_RefreshValue() == false ) { TradeIsNotBusy(); return(-2); }
		if ( _Reverse_Check() == false ) { TradeIsNotBusy(); return(-3); }
	}

//---- Ñîáñòâåííî, çàêðûâàåìñÿ
	Close_Result = OrderClose( Close_OrderTicket, Close_Volume, Close_ClosePrice, Close_Slippage, Close_Color );
	Close_GetLastError = GetLastError();

//---- Åñëè åñòü îøèáêà,
	if ( !Close_Result || Close_GetLastError > 0 )
	{
//---- îòäà¸ì íà îòðàáîòêó êîä îøèáêè,
		Processing_Error ( Close_GetLastError, "Reverse" );
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
		TradeIsNotBusy();
//---- âûâîäèì èíôîðìàöèþ â _TradeLog, â æóðíàë,
		_Return_ ( 5, "Error", Close_GetLastError, ErrorDescription( Close_GetLastError ), "Reverse(...)", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
//---- è âûõîäèì, âîçâðàùàÿ -1.
		return(-1);
	}
//---- Åñëè âñ¸ õîðîøî,
//---- ïðîâåðÿåì - äåéñòâèòåëüíî ëè çàêðûëàñü ïîçèöèÿ è, åñëè íåò, âûâîäèì èíôîðìàöèþ è âûõîäèì, âîçâðàùàÿ -5
	for ( int x = 0; x < 5; x ++ )
	{
		Sleep(1000);
		if ( OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) )
		{
			if ( OrderCloseTime() <= 0 )
			{
				Processing_Error ( 0, "OrderClose" );
				_Return_ ( 5, "Error", 0, "Ïîçèöèÿ íå áûëà çàêðûòà", "Reverse(...)", "Ïîçèöèÿ íå áûëà çàêðûòà" );
				return(-5);
			}
			else
			{ break; }
		}
		Close_GetLastError = GetLastError();
		_Print_ ( 5, "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
	}

//---- ñîçäà¸ì îïèñàíèÿ ê ñòðåëî÷êàì,
	_OrderClose_SetArrow();

//---- âûâîäèì èíôîðìàöèþ,
	_Return_ ( 5, "OK", 0, "", "OrderClose(...)", "OK" );

//---- è îòêðûâàåìñÿ íàâñòðå÷ó
	Send_Result = OrderSend ( Send_Symbol, Send_OrderType, Send_Volume, Send_OpenPrice, Send_Slippage, Send_StopLoss, Send_TakeProfit, Send_Comment, Send_MagicNumber, Send_Expiration, Send_Color );
	Send_GetLastError = GetLastError();

//---- Åñëè åñòü îøèáêà,
	if ( Send_Result < 0 || Send_GetLastError > 0 )
	{
//---- îòäà¸ì íà îòðàáîòêó êîä îøèáêè,
		Processing_Error ( Send_GetLastError, "Reverse" );
//---- îñâîáîæäàåì òîðãîâûé ïîòîê,
		TradeIsNotBusy();
//---- âûâîäèì èíôîðìàöèþ â _TradeLog, â æóðíàë,
		_Return_ ( 5, "Error", Send_GetLastError, ErrorDescription( Send_GetLastError ), "Revers(...)", "Error #" + Send_GetLastError + " ( " + ErrorDescription( Send_GetLastError ) + " )" );
//---- è âûõîäèì, âîçâðàùàÿ -1.
		return(-1);
	}
//---- Åñëè âñ¸ õîðîøî,
//---- îñâîáîæäàåì òîðãîâûé ïîòîê,
	TradeIsNotBusy();

//---- ïðîâåðÿåì - äåéñòâèòåëüíî ëè îòêðûëàñü ïîçèöèÿ è, åñëè íåò, âûâîäèì èíôîðìàöèþ è âûõîäèì, âîçâðàùàÿ -4.
	int _GetLastError;
	for ( x = 0; x < 5; x ++ )
	{
		Sleep(1000);
		if ( OrderSelect( Send_Result, SELECT_BY_TICKET ) ) { break; }
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 ) { _Print_ ( 6, "OrderSelect( " + Send_Result + ", SELECT_BY_TICKET )", "Error #" + _GetLastError + " ( " + ErrorDescription( _GetLastError ) + " )" ); continue; }
		Processing_Error ( 0, "Reverse" );
		_Return_ ( 6, "Error", 0, "Îðäåð íå áûë óñòàíîâëåí/Ïîçèöèÿ íå áûëà îòêðûòà", "Reverse(...)", "Îðäåð íå áûë óñòàíîâëåí/Ïîçèöèÿ íå áûëà îòêðûòà" );
		return(-4);
	}

//---- ñîçäà¸ì îïèñàíèÿ ê ñòðåëî÷êàì,
	_OrderSend_SetArrow();

//---- âûâîäèì èíôîðìàöèþ,
	_info ( 14, stringSuccessfully );
	_Return_ ( 6, "OK", 0, "", "OrderSend(...)", "OK. Ticket " + Send_Result );
//---- è âûõîäèì, âîçâðàùàÿ ¹ òèêåòà.
return(Send_Result);
}

bool _Reverse_SetValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) )
	{
		Close_GetLastError = GetLastError();
		_Return_ ( 5, "Error", Close_GetLastError, ErrorDescription( Close_GetLastError ), "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
		return(false);
	}
	Close_OrderSymbol			= OrderSymbol();
	Close_OrderType			= OrderType();
	Close_Volume				= NormalizeDouble( OrderLots(), _Digits );
	Close_ProfitLoss			= DoubleToStr( OrderProfit() + OrderSwap() + OrderCommission(), 2 );
	Close_OrderComment		= OrderComment();
	Close_OrderMagicNumber	= OrderMagicNumber();

//---- Âûñòàâëÿåì Close_ClosePrice
	if ( Close_OrderType == OP_SELL ) { Close_ClosePrice = NormalizeDouble( MarketInfo ( Close_OrderSymbol, MODE_ASK ), _Digits ); }
	if ( Close_OrderType == OP_BUY ) { Close_ClosePrice = NormalizeDouble( MarketInfo ( Close_OrderSymbol, MODE_BID ), _Digits ); }

	Send_Symbol			= Close_OrderSymbol;
	Send_Comment		= Close_OrderComment;
	Send_MagicNumber	= Close_OrderMagicNumber;
	Send_Volume			= Close_Volume;
	Send_StopLoss		= 0.0;
	Send_TakeProfit	= 0.0;
	Send_Expiration	= 0;

	if ( Close_OrderType == OP_BUY ) { Send_OrderType = OP_SELL; }
	if ( Close_OrderType == OP_SELL ) { Send_OrderType = OP_BUY; }

//---- Âûñòàâëÿåì öåíó îòêðûòèÿ è óäàëÿåì âðåìÿ èñòå÷åíèÿ äëÿ BUY è SELL ïîçèöèé
	if ( Send_OrderType == OP_BUY ) { Send_OpenPrice = NormalizeDouble( MarketInfo( Send_Symbol, MODE_ASK ), _Digits ); }
	if ( Send_OrderType == OP_SELL ) { Send_OpenPrice = NormalizeDouble( MarketInfo( Send_Symbol, MODE_BID ), _Digits ); }


//---- Ïðîâåðÿåì _Slippage
	if ( Send_Slippage < 0 ) { Send_Slippage = Slippage; }
	if ( Close_Slippage < 0 ) { Close_Slippage = Slippage; }
//---- Åñëè _Comment íå çàäàâàëñÿ, íàïèøåì "Èìÿ_Ýêñïåðòà( Ñèìâîë, Òàéìôðåéì )"
	if ( Send_Comment == "" ) { Send_Comment = strComment; }
//---- Åñëè öâåò íå çàäàâàëñÿ, óñòàíàâëèâàåì OrderSellColor(äëÿ "êîðîòêèõ" ïîçèöèé) èëè OrderBuyColor(äëÿ "äëèííûõ" ïîçèöèé)
	if ( Send_Color < -1 )
	{
		Send_Color = OrderSellColor;
		if ( Send_OrderType == OP_BUY || Send_OrderType == OP_BUYLIMIT || Send_OrderType == OP_BUYSTOP )
		{ Send_Color = OrderBuyColor; }
	}
	else
	{
		if ( Send_Color < 0 ) Send_Color = CLR_NONE;
	}
	if ( Close_Color < -1 )
	{
		Close_Color = OrderSellColor;
		if ( Close_OrderType == OP_BUY || Close_OrderType == OP_BUYLIMIT || Close_OrderType == OP_BUYSTOP )
		{ Close_Color = OrderBuyColor; }
	}
	else
	{
		if ( Close_Color < 0 ) Close_Color = CLR_NONE;
	}
	return(true);
}
void _Reverse_Info ()
{
	if ( !Allow_Info && !Allow_LogFile ) { return(0); }

	_FileWrite ( "- - - - - - - - - - - - - - - - - - Reverse Start  - - - - - - - - - - - - - - - - - -" );
	_info ( 10, "Ïåðåâîðîò ïîçèöèè ¹ " + Close_OrderTicket + ", " + strOrderType ( Close_OrderType ) + "..." );
	_info ( 1, "Ñlose Price = " + DoubleToStr( Close_ClosePrice, _Digits ) );
	_info ( 2, "Open Price = " + DoubleToStr( Send_OpenPrice, _Digits ) );
	_info ( 3, "Lot(s) = " + DoubleToStr( Close_Volume, 1 ) );
	_info ( 4, "" );

	_info ( 11, "Comment = " + Close_OrderComment, 0, 0 );
	_info ( 12, "MagicNumber = " + Close_OrderMagicNumber, 0, 0 );
	_info ( 13, "" );
	_info ( 14, "" );
}

bool _Reverse_Check ()
{
	if ( Allow_Info )	{ _info ( 13, stringCheck, 0, 0 ); }

//---- Ïðîâåðÿåì _OrderType
	if ( Close_OrderType > OP_SELL )
	{
		if ( Allow_Info || Allow_LogFile )
		{
			_info ( 13, stringCheckError, 1, 0 );
			_info ( 4, "Îøèáî÷íûé OrderType() - " + Close_OrderType + ". Çàêðûòà ìîæåò áûòü òîëüêî OP_BUY èëè OP_SELL ïîçèöèÿ.", 1 );
		}
		_Return_ ( 5, "Error", 0, "Îøèáî÷íûé OrderType()", "_Reverse_Check()", "Îøèáî÷íûé OrderType()" );
		return(false);
	}

//---- Ïðîâåðÿåì âñå ïàðàìåòðû OrderSend ( êðîìå Send_Symbol, _Slippage, _Comment, Send_MagicNumber è Send_Color ),
//---- è åñëè åñòü îøèáêà - âûõîäèì
	if ( _OrderCheck( Send_Symbol, Send_OrderType, Send_Volume, Send_OpenPrice, Send_StopLoss, Send_TakeProfit, Send_Expiration ) < 0 )
	{
		if ( Allow_Info )	{ _info ( 13, stringCheckError, 1, 0 ); }
		if ( Allow_LogFile ) { _FileWrite( "Îøèáêà ïðè ïðîâåðêå ïàðàìåòðîâ!" ); }
		_Return_ ( 6, "Error", 0, stringInvalidParameters, "_Reverse_Check()", "Error" );
		return(false);
	}

	if ( Allow_Info ) { _info ( 13, stringCheckOK, 0, 0 ); }
return(true);
}
bool _Reverse_RefreshValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) )
	{
		Close_GetLastError = GetLastError();
		_Return_ ( 5, "Error", Close_GetLastError, ErrorDescription( Close_GetLastError ), "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" );
		return(false);
	}

	bool refreshed = false;
	Close_OrderType = OrderType();
	Close_Volume	 = NormalizeDouble( OrderLots(), _Digits );

//---- Îáíîâëÿåì Close_ClosePrice
	if ( Close_OrderType == OP_SELL )
	{
		if ( NormalizeDouble( Close_ClosePrice, _Digits ) != NormalizeDouble( MarketInfo( Close_OrderSymbol, MODE_ASK ), _Digits ) )
		{
			Close_ClosePrice = NormalizeDouble( MarketInfo ( Close_OrderSymbol, MODE_ASK ), _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - - Reverse Refresh  - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 1, "Refreshed Ñlose Price = " + DoubleToStr( Close_ClosePrice, _Digits ) );
			}
		}
	}
	if ( Close_OrderType == OP_BUY )
	{
		if ( NormalizeDouble( Close_ClosePrice, _Digits ) != NormalizeDouble( MarketInfo( Close_OrderSymbol, MODE_BID ), _Digits ) )
		{
			Close_ClosePrice = NormalizeDouble( MarketInfo( Close_OrderSymbol, MODE_BID ), _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - - Reverse Refresh  - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 1, "Refreshed Ñlose Price = " + DoubleToStr( Close_ClosePrice, _Digits ) );
			}
		}
	}

	Send_Volume = NormalizeDouble( Close_Volume, 2 );
	if ( Close_OrderType == OP_BUY ) { Send_OrderType = OP_SELL; }
	if ( Close_OrderType == OP_SELL ) { Send_OrderType = OP_BUY; }

//---- Îáíîâëÿåì öåíó îòêðûòèÿ äëÿ BUY è SELL ïîçèöèé
	if ( Send_OrderType == OP_BUY )
	{
		if ( NormalizeDouble( Send_OpenPrice, _Digits ) != NormalizeDouble( MarketInfo( Send_Symbol, MODE_ASK ), _Digits ) )
		{
			Send_OpenPrice = NormalizeDouble( MarketInfo( Send_Symbol, MODE_ASK ), _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - - Reverse Refresh  - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 2, "Refreshed Open Price = " + DoubleToStr( Send_OpenPrice, _Digits ) );
			}
		}
	}
	if ( Send_OrderType == OP_SELL )
	{
		if ( NormalizeDouble( Send_OpenPrice, _Digits ) != NormalizeDouble( MarketInfo( Send_Symbol, MODE_BID ), _Digits ) )
		{
			Send_OpenPrice = NormalizeDouble( MarketInfo( Send_Symbol, MODE_BID ), _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - - - Reverse Refresh  - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 2, "Refreshed Open Price = " + DoubleToStr( Send_OpenPrice, _Digits ) );
			}
		}
	}
return(true);
}

string	Trailing_Symbol = "", Trailing_OrderComment = "";
int		Trailing_OrderTicket = 0, Trailing_TrailingStop = 0, Trailing_BreakEven_After = 0, Trailing_OrderType = 0, Trailing_OrderMagicNumber = 0, Trailing_StartTickCount = 0, Trailing_GetLastError = 0;
double	Trailing_OrderOpenPrice = 0.0, Trailing_OrderStopLoss = 0.0, Trailing_OrderTakeProfit = 0.0, Trailing_New_StopLoss = 0.0, Trailing_Bid = 0.0, Trailing_Ask = 0.0;
datetime	Trailing_OrderExpiration = 0;
color		Trailing_Color = CLR_NONE;
bool		Trailing_Result = false;

double Trailing_Luft = 0.0;

/////////////////////////////////////////////////////////////////////////////////
/**/ int _TrailingStop ( int _OrderTicket, int TrailingStop, color _Color = -2, int BreakEven_After = 0, int LuftPoints = -1 )
/////////////////////////////////////////////////////////////////////////////////
// TrailingStop + âûâîä èíôîðìàöèè
// Ïðè óñïåøíîì ñìåù¸íèè âîçâðàùàåò "1", ïðè îòñòóòñòâèè íåîáõîäèìîñòè äâèãàòü - "0", ïðè îøèáêå "-1", ïðè îøèáêå ¹ îðäåðà, âîçâðàùàåò "-2"
/////////////////////////////////////////////////////////////////////////////////
{
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ
	Trailing_Symbol = ""; Trailing_OrderComment = "";
	Trailing_OrderTicket = _OrderTicket; Trailing_TrailingStop = TrailingStop; Trailing_BreakEven_After = BreakEven_After; Trailing_OrderType = 0; Trailing_OrderMagicNumber = 0; Trailing_StartTickCount = GetTickCount();
	Trailing_OrderOpenPrice = 0.0; Trailing_OrderStopLoss = 0.0; Trailing_OrderTakeProfit = 0.0; Trailing_New_StopLoss = 0.0; Trailing_Bid = 0.0; Trailing_Ask = 0.0;
	Trailing_OrderExpiration = 0;
	Trailing_Color = _Color;
	Trailing_Result = false;
	StartTime = TimeLocal();

	if ( Trailing_TrailingStop <= 0 ) { return(0); }

	if ( LuftPoints < 0 ) { Trailing_Luft = _Spread; } else { Trailing_Luft = LuftPoints * _Point; }

//---- Èçìåíÿåì òå ïåðåìåííûå, êîòîðûå ìîæíî ìåíÿòü è íîðìàëèçóåì èõ, åñëè îøèáêà ïðè âûáîðå îðäåðà - âûõîäèì
	if ( _TrailingStop_SetValue() == false ) { return(-2); }

//---- Åñëè ïîçèöèÿ íå ïðèáûëüíàÿ, èëè ñòîïëîññ íå äîñòàòî÷íî äàëåêî îò öåíû äëÿ èçìåíåíèÿ, âûõîäèì
	if ( _TrailingStop_NoChange() == false ) { return(0); }

//---- Âûâîäèì èíôîðìàöèþ
	_TrailingStop_Info();

//---- Ïðîâåðÿåì ïàðàìåòðû. Åñëè åñòü îøèáêà - âûõîäèì
	if ( _TrailingStop_Check() == false ) { return(-1); }

//---- Âñå íåîáõîäèìûå ïðîâåðêè, ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè, etc... Åñëè åñòü îøèáêà - âûõîäèì
	int _Check_ = _Check_(7);
	if ( _Check_ < 0 ) { return(_Check_); }

//---- Åñëè ô-öèÿ ðàáîòàåò áîëüøå ñåêóíäû, îáíîâëÿåì ïåðåìåííûå è ïðîâåðÿåì èõ. Åñëè åñòü îøèáêà - âûõîäèì
	if ( GetTickCount() - Trailing_StartTickCount > 1000 )
	{
		if ( _TrailingStop_RefreshValue() == false ) { TradeIsNotBusy(); return(-2); }
		if ( _TrailingStop_Check() == false ) { TradeIsNotBusy(); return(-1); }
	}

//---- Ñîáñòâåííî, äâèãàåì
	Trailing_Result = OrderModify( Trailing_OrderTicket, Trailing_OrderOpenPrice, Trailing_New_StopLoss, Trailing_OrderTakeProfit, Trailing_OrderExpiration, Trailing_Color );
	Trailing_GetLastError = GetLastError();

//---- Åñëè åñòü îøèáêà,
	if ( !Trailing_Result || Trailing_GetLastError > 0 )
	{
//---- îòäà¸ì íà îòðàáîòêó êîä îøèáêè,
		Processing_Error ( Trailing_GetLastError, "TrailingStop" );
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
		TradeIsNotBusy();
//---- âûâîäèì èíôîðìàöèþ â _TradeLog, â æóðíàë,
		_Return_ ( 7, "Error", Trailing_GetLastError, ErrorDescription( Trailing_GetLastError ), "OrderModify(...)", "Error #" + Trailing_GetLastError + " ( " + ErrorDescription( Trailing_GetLastError ) + " )" );
//---- è âûõîäèì, âîçâðàùàÿ -1.
		return(-1);
	}
//---- Åñëè âñ¸ õîðîøî,
//---- îñâîáîæäàåì òîðãîâûé ïîòîê
	TradeIsNotBusy();

//---- ïðîâåðÿåì - äåéñòâèòåëüíî ëè èçìåíèëñÿ ñòîïëîññ è, åñëè íåò, âûâîäèì èíôîðìàöèþ è âûõîäèì, âîçâðàùàÿ -4.
	for ( int x = 0; x < 5; x ++ )
	{
		Sleep(1000);
		if ( !OrderSelect( Trailing_OrderTicket, SELECT_BY_TICKET ) )
		{
			Trailing_GetLastError = GetLastError();
			_Print_ ( 7, "OrderSelect( " + Trailing_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Trailing_GetLastError + " ( " + ErrorDescription( Trailing_GetLastError ) + " )" );
			continue;
		}
		if ( NormalizeDouble( Trailing_OrderStopLoss, _Digits ) != NormalizeDouble( OrderStopLoss(), _Digits ) )
		{ break; }
		else
		{
			Processing_Error ( 0, "TrailingStop" );
			_Return_ ( 7, "Error", 0, "Ñòîïëîññ íå áûë ìîäèôèöèðîâàí", "OrderModify(...)", "Ñòîïëîññ íå áûë ìîäèôèöèðîâàí" );
			return(-4);
		}
	}

//---- ñîçäà¸ì îïèñàíèÿ ê ñòðåëî÷êàì,
	_TrailingStop_SetArrow();

//---- âûâîäèì èíôîðìàöèþ,
	_info ( 14, stringSuccessfully );
	_Return_ ( 7, "OK", 0, "", "OrderModify(...)", "OK" );

//---- è âûõîäèì, âîçâðàùàÿ 1.
return(1);
}

bool _TrailingStop_SetValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Trailing_OrderTicket, SELECT_BY_TICKET ) )
	{
		Trailing_GetLastError = GetLastError();
		_Return_ ( 7,  "Error", Trailing_GetLastError, ErrorDescription( Trailing_GetLastError ), "OrderSelect( " + Trailing_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Trailing_GetLastError + " ( " + ErrorDescription( Trailing_GetLastError ) + " )" );
		return(false);
	}

	Trailing_Symbol				= OrderSymbol();
	Trailing_OrderComment		= OrderComment();
	Trailing_OrderType			= OrderType();
	Trailing_OrderMagicNumber	= OrderMagicNumber();
	Trailing_OrderOpenPrice		= NormalizeDouble ( OrderOpenPrice(), _Digits );
	Trailing_OrderStopLoss		= NormalizeDouble ( OrderStopLoss(), _Digits );
	Trailing_OrderTakeProfit	= NormalizeDouble ( OrderTakeProfit(), _Digits );
	Trailing_OrderExpiration	= OrderExpiration();

	Trailing_Bid					= NormalizeDouble( MarketInfo ( Trailing_Symbol, MODE_BID ), _Digits );
	Trailing_Ask					= NormalizeDouble( MarketInfo ( Trailing_Symbol, MODE_ASK ), _Digits );

//---- Åñëè öâåò íå çàäàâàëñÿ, óñòàíàâëèâàåì OrderSellColor(äëÿ "êîðîòêèõ" ïîçèöèé) èëè OrderBuyColor(äëÿ "äëèííûõ" ïîçèöèé)
	if ( Trailing_Color < -1 )
	{
		Trailing_Color = OrderSellColor;
		if ( Trailing_OrderType == OP_BUY || Trailing_OrderType == OP_BUYLIMIT || Trailing_OrderType == OP_BUYSTOP )
		{ Trailing_Color = OrderBuyColor; }
	}
	else
	{
		if ( Trailing_Color < 0 ) Trailing_Color = CLR_NONE;
	}

//---- Ñ÷èòàåì êóäà óñòàíàâëèâàòü íîâûé ñòîïëîññ
	if ( Trailing_OrderType == OP_BUY ) { Trailing_New_StopLoss = NormalizeDouble( Trailing_Bid - Trailing_TrailingStop * _Point, _Digits ); }
	if ( Trailing_OrderType == OP_SELL ) { Trailing_New_StopLoss = NormalizeDouble( Trailing_Ask + Trailing_TrailingStop * _Point, _Digits ); }

return(true);
}
bool _TrailingStop_NoChange ()
{
	if ( Trailing_OrderType == OP_BUY )
	{
		if ( NormalizeDouble( Trailing_Bid - Trailing_OrderOpenPrice, _Digits ) <= NormalizeDouble( Trailing_BreakEven_After * _Point, _Digits ) ) { return(false); }
		if ( NormalizeDouble( Trailing_OrderStopLoss, _Digits ) > 0 && NormalizeDouble( Trailing_New_StopLoss - Trailing_OrderStopLoss, _Digits ) <= NormalizeDouble( Trailing_Luft, _Digits ) ) { return(false); }
	}
	if ( Trailing_OrderType == OP_SELL )
	{
		if ( NormalizeDouble( Trailing_OrderOpenPrice - Trailing_Ask, _Digits ) <= NormalizeDouble( Trailing_BreakEven_After * _Point, _Digits ) ) { return(false); }
		if ( NormalizeDouble( Trailing_OrderStopLoss, _Digits ) > 0 && NormalizeDouble( Trailing_OrderStopLoss - Trailing_New_StopLoss, _Digits ) <= NormalizeDouble( Trailing_Luft, _Digits ) ) { return(false); }
	}
return(true);
}
void _TrailingStop_Info ()
{
	if ( !Allow_Info && !Allow_LogFile ) { return(0); }

	_FileWrite ( "- - - - - - - - - - - - - - - - TrailingStop Start - - - - - - - - - - - - - - - - - -" );

	_info ( 10, "Trailing Stop (" + Trailing_TrailingStop + " points) äëÿ ïîçèöèè ¹ " + Trailing_OrderTicket + ", " + strOrderType ( Trailing_OrderType ) + "..." );
	_info ( 1, "Old Stop Loss = " + DoubleToStr( Trailing_OrderStopLoss, _Digits ) );
	_info ( 2, "New Stop Loss = " + DoubleToStr( Trailing_New_StopLoss, _Digits ) );
	_info ( 3, "" );
	_info ( 4, "" );

	_info ( 11, "Comment = " + Trailing_OrderComment, 0, 0 );
	_info ( 12, "MagicNumber = " + Trailing_OrderMagicNumber, 0, 0 );
	_info ( 13, "" );
	_info ( 14, "" );
}
bool _TrailingStop_Check ()
{
	if ( Allow_Info )	{ _info ( 13, stringCheck, 0, 0 ); }

//---- Åñëè TrailingStop õî÷åò óñòàíîâèòü ÑË íà ðàññòîÿíèå, ìåíüøåå ìèíèìàëüíî âîçìîæíîãî, âûõîäèì.
	if ( Trailing_TrailingStop < MarketInfo( Trailing_Symbol, MODE_STOPLEVEL ) )
	{
		if ( Allow_Info ) { _info ( 13, "Ïðîâåðÿåì ïàðàìåòðû.....Íåëüçÿ óñòàíîâèòü ÑòîïËîññ òàê áëèçêî!", 1, 0 ); }
		if ( Allow_LogFile ) { _FileWrite( "Íåëüçÿ óñòàíîâèòü ÑòîïËîññ òàê áëèçêî! TrailingStop îòìåíåí..." ); }
		_Return_ ( 7, "Error", 0, "Íåëüçÿ óñòàíîâèòü ÑòîïËîññ òàê áëèçêî", "_TrailingStop_Check()", "Íåëüçÿ óñòàíîâèòü ÑòîïËîññ òàê áëèçêî" );
		return(false);
	}

	if ( Trailing_OrderType > OP_SELL )
	{
		if ( Allow_Info || Allow_LogFile )
		{
			_info ( 13, stringCheckError, 1, 0 );
			_info ( 14, "Îøèáî÷íûé OrderType() - " + Trailing_OrderType + ". Ô-öèÿ TrailingStop ïðåäíàçíà÷åíà òîëüêî äëÿ OP_BUY èëè OP_SELL ïîçèöèé.", 1 );
		}
		_Return_ ( 7, "Error", 0, "Îøèáî÷íûé OrderType()", "_TrailingStop_Check()", "Îøèáî÷íûé OrderType()" );
		return(false);
	}

	if ( Allow_Info ) { _info ( 13, stringCheckOK, 0, 0 ); }

return(true);
}
bool _TrailingStop_RefreshValue ()
{
//---- âûáèðàåì îðäåð, è åñëè âîçíèêàåò îøèáêà - âûõîäèì
	if ( !OrderSelect( Trailing_OrderTicket, SELECT_BY_TICKET ) )
	{
		Trailing_GetLastError = GetLastError();
		_Return_ ( 7,  "Error", Trailing_GetLastError, ErrorDescription( Trailing_GetLastError ), "OrderSelect( " + Trailing_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Trailing_GetLastError + " ( " + ErrorDescription( Trailing_GetLastError ) + " )" );
		return(false);
	}

	Trailing_Symbol				= OrderSymbol();
	Trailing_OrderComment		= OrderComment();
	Trailing_OrderType			= OrderType();
	Trailing_OrderMagicNumber	= OrderMagicNumber();
	Trailing_OrderOpenPrice		= NormalizeDouble ( OrderOpenPrice(), _Digits );
	Trailing_OrderStopLoss		= NormalizeDouble ( OrderStopLoss(), _Digits );
	Trailing_OrderTakeProfit	= NormalizeDouble ( OrderTakeProfit(), _Digits );
	Trailing_OrderExpiration	= OrderExpiration();

	Trailing_Bid					= NormalizeDouble( MarketInfo ( Trailing_Symbol, MODE_BID ), _Digits );
	Trailing_Ask					= NormalizeDouble( MarketInfo ( Trailing_Symbol, MODE_ASK ), _Digits );

	bool refreshed = false;
//---- Îáíîâëÿåì íîâûé óðîâåíü ñòîïëîññà
	if ( Trailing_OrderType == OP_BUY )
	{
		if ( NormalizeDouble( Trailing_New_StopLoss, _Digits ) != NormalizeDouble( Trailing_Bid - Trailing_TrailingStop * _Point, _Digits ) )
		{
			Trailing_New_StopLoss = NormalizeDouble( Trailing_Bid - Trailing_TrailingStop * _Point, _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - TrailingStop Refresh  - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 2, "Refreshed New Stop Loss = " + DoubleToStr( Trailing_New_StopLoss, _Digits ) );
			}
		}
	}
	if ( Trailing_OrderType == OP_SELL )
	{
		if ( NormalizeDouble( Trailing_New_StopLoss, _Digits ) != NormalizeDouble( Trailing_Ask + Trailing_TrailingStop * _Point, _Digits ) )
		{
			Trailing_New_StopLoss = NormalizeDouble( Trailing_Ask + Trailing_TrailingStop * _Point, _Digits );
			if ( Allow_Info || Allow_LogFile )
			{
				if ( !refreshed ) { _FileWrite ( "- - - - - - - - - - - - - - - - TrailingStop Refresh  - - - - - - - - - - - - - - - - -" ); refreshed = true; }
				_info ( 2, "Refreshed New Stop Loss = " + DoubleToStr( Trailing_New_StopLoss, _Digits ) );
			}
		}
	}
return(true);
}
void _TrailingStop_SetArrow ()
{
	if ( Trailing_Color == CLR_NONE ) { return(0); }

	string arrow_description = Trailing_OrderComment + "\nId " + Trailing_OrderMagicNumber + "\nModified by TrailingStop";

	string sl_name = "#" + Trailing_OrderTicket + " sl modified ";
	string new_arrow = "#" + Trailing_OrderTicket + " old sl" + TimeToStr( Time[1] );

	ObjectSetText( sl_name, arrow_description, 10 );
	GetLastError();
/*	if ( ObjectCreate( new_arrow, OBJ_ARROW, 0, Time[1], Trailing_OrderStopLoss ) )
	{
		if ( !ObjectSet( new_arrow, OBJPROP_ARROWCODE, 4 ) )
		{
			Trailing_GetLastError = GetLastError();
			_Print_ ( 7, "ObjectSet( " + new_arrow + ", OBJPROP_ARROWCODE, 4 )", "Error #" + Trailing_GetLastError + " ( " + ErrorDescription( Trailing_GetLastError ) + " )" );
		}
		if ( !ObjectSetText( new_arrow, arrow_description, 10 ) )
		{
			Trailing_GetLastError = GetLastError();
			_Print_ ( 7, "ObjectSetText( " + new_arrow + ", " + arrow_description + ", 10 )", "Error #" + Trailing_GetLastError + " ( " + ErrorDescription( Trailing_GetLastError ) + " )" );
		}
	}*/
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int _Check_( int FunctionId )
/////////////////////////////////////////////////////////////////////////////////
{
	if ( IsTesting() ) { return(0); }
	int _return = 0;
//---- Ïðîâåðÿåì ñîåäèíåíèå ñ ñåðâåðîì. Åñëè IsConnected == false - âûõîäèì
	int _IsConnected = _IsConnected();
	if ( _IsConnected < 0 )
	{
		if ( _IsConnected == -1 ) { _return = -300; _Return_( FunctionId, "Error", 0, stringNoConnection, "_IsConnected()", stringNoConnection ); }
		if ( _IsConnected == -2 ) { _return = -302; _Return_( FunctionId, "Error", 0, stringStopped, "_IsConnected()", stringStopped ); }
		if ( _IsConnected == -3 ) { _return = -303; _Return_( FunctionId, "Error", 0, stringTimeOut, "_IsConnected()", stringTimeOut ); }
		return(_return);
	}

//---- Ïðîâåðÿåì IsTradeAllowed. Åñëè IsTradeAllowed == false - âûõîäèì
	int _IsTradeAllowed = _IsTradeAllowed();
	if ( _IsTradeAllowed < 0 )
	{
		if ( _IsTradeAllowed == -1 ) { _return = -301; _Return_( FunctionId, "Error", 0, stringTradeNotAllow, "_IsTradeAllowed()", stringTradeNotAllow ); }
		if ( _IsTradeAllowed == -2 ) { _return = -302; _Return_( FunctionId, "Error", 0, stringStopped, "_IsTradeAllowed()", stringStopped ); }
		if ( _IsTradeAllowed == -3 ) { _return = -303; _Return_( FunctionId, "Error", 0, stringTimeOut, "_IsTradeAllowed()", stringTimeOut ); }
		return(_return);
	}

//---- Æä¸ì îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà è çàíèìàåì åãî
	int _TradeIsBusy = TradeIsBusy();
	if ( _TradeIsBusy < 0 )
	{
		if ( _TradeIsBusy == -2 ) { _return = -302; _Return_( FunctionId, "Error", 0, stringStopped, "TradeIsBusy()", stringStopped ); }
		if ( _TradeIsBusy == -3 ) { _return = -303; _Return_( FunctionId, "Error", 0, stringTimeOut, "TradeIsBusy()", stringTimeOut ); }
		return(_return);
	}

//---- Ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè
	int _PauseBeforeTrade = _PauseBeforeTrade();
	if ( _PauseBeforeTrade < 0 )
	{
		if ( _PauseBeforeTrade == -2 ) { _return = -302; _Return_( FunctionId, "Error", 0, stringStopped, "_PauseBeforeTrade()", stringStopped ); }
		if ( _PauseBeforeTrade == -3 ) { _return = -303; _Return_( FunctionId, "Error", 0, stringTimeOut, "_PauseBeforeTrade()", stringTimeOut ); }
		TradeIsNotBusy();
		return(_return);
	}
return(_return);
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void _Return_ ( int FunctionId, string TradeLog_Result, int TradeLog_GetLastError, string TradeLog_ErrorDescription, string SubFunction, string SubFunctionResult )
/////////////////////////////////////////////////////////////////////////////////
{
	_TradeLog_ 	( FunctionId, TradeLog_Result, TradeLog_GetLastError, TradeLog_ErrorDescription );
	_Print_ 		( FunctionId, SubFunction, SubFunctionResult );

	switch ( FunctionId )
	{
		case 1:  _FileWrite ( "- - - - - - - - - - - - - - - - - OrderSend Finish - - - - - - - - - - - - - - - - - -" ); break;
		case 2:  _FileWrite ( "- - - - - - - - - - - - - - - - - OrderModify Finish - - - - - - - - - - - - - - - - -" ); break;
		case 3:  _FileWrite ( "- - - - - - - - - - - - - - - - - OrderClose Finish  - - - - - - - - - - - - - - - - -" ); break;
		case 4:  _FileWrite ( "- - - - - - - - - - - - - - - - - OrderDelete Finish - - - - - - - - - - - - - - - - -" ); break;
		case 5:	break;
		case 6:  _FileWrite ( "- - - - - - - - - - - - - - - - - - Reverse Finish - - - - - - - - - - - - - - - - - -" ); break;
		case 7:  _FileWrite ( "- - - - - - - - - - - - - - - - - TrailingStop Finish  - - - - - - - - - - - - - - - -" ); break;
		default: Print( " _Return_( ", FunctionId, ", ", TradeLog_Result, ", ", TradeLog_GetLastError, ", ", TradeLog_ErrorDescription, ", ", SubFunction, ", ", SubFunctionResult, " ) - Unknown function with Id ", FunctionId );
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void _TradeLog_( int FunctionId, string TradeLog_Result, int TradeLog_GetLastError, string TradeLog_ErrorDescription )
/////////////////////////////////////////////////////////////////////////////////
{
	switch ( FunctionId )
	{
		case 1:  _TradeLog ( Send_Result, Send_MagicNumber, Send_Comment, "OrderSend ( \"" + Send_Symbol + "\", " + Send_OrderType + ", " + DoubleToStr( Send_Volume, 2 ) + ", " + DoubleToStr( Send_OpenPrice, _Digits ) + ", " + Send_Slippage + ", " + DoubleToStr( Send_StopLoss, _Digits ) + ", " + DoubleToStr( Send_TakeProfit, _Digits ) + ", " + Send_Comment + ", " + Send_MagicNumber + ", " + Send_Expiration + ", " + Send_Color + " )", TradeLog_Result, TradeLog_GetLastError, TradeLog_ErrorDescription, ( GetTickCount() - Send_StartTickCount ) / 1000 ); break;
		case 2:  _TradeLog ( Modify_OrderTicket, Modify_OrderMagicNumber, Modify_OrderComment, "OrderModify ( " + Modify_OrderTicket + ", " + DoubleToStr( Modify_New_OpenPrice, _Digits ) + ", " + DoubleToStr( Modify_New_StopLoss, _Digits ) + ", " + DoubleToStr( Modify_New_TakeProfit, _Digits ) + ", " + Modify_New_Expiration + ", " + Modify_Color + " )", TradeLog_Result, TradeLog_GetLastError, TradeLog_ErrorDescription, ( GetTickCount() - Modify_StartTickCount ) / 1000 ); break;
		case 3:  _TradeLog ( Close_OrderTicket, Close_OrderMagicNumber, Close_OrderComment, "OrderClose( " + Close_OrderTicket + ", " + DoubleToStr( Close_Volume, 2 ) + ", " + Close_Slippage + ", " + Close_Color + " )", TradeLog_Result, TradeLog_GetLastError, TradeLog_ErrorDescription, ( GetTickCount() - Close_StartTickCount ) / 1000 ); break;
		case 4:  _TradeLog ( Delete_OrderTicket, Delete_OrderMagicNumber, Delete_OrderComment, "OrderDelete( " + Delete_OrderTicket + " )", TradeLog_Result, TradeLog_GetLastError, TradeLog_ErrorDescription, ( GetTickCount() - Delete_StartTickCount ) / 1000 ); break;
		case 5:  _TradeLog ( Close_OrderTicket, Close_OrderMagicNumber, Close_OrderComment, "Reverse( " + Close_OrderTicket + ", " + Close_Slippage + ", " + Close_Color + ", " + Send_Color + " )" + " - - - " + "OrderClose( " + Close_OrderTicket + ", " + DoubleToStr( Close_Volume, 2 ) + ", " + Close_Slippage + ", " + Close_Color + " )", TradeLog_Result, TradeLog_GetLastError, TradeLog_ErrorDescription, ( GetTickCount() - Close_StartTickCount ) / 1000 ); break;
		case 6:  _TradeLog ( Send_Result, Send_MagicNumber, Send_Comment, "Reverse( " + Close_OrderTicket + ", " + Close_Slippage + ", " + Close_Color + ", " + Send_Color + " )" + " - - - " + "OrderSend ( \"" + Send_Symbol + "\", " + Send_OrderType + ", " + DoubleToStr( Send_Volume, 2 ) + ", " + DoubleToStr( Send_OpenPrice, _Digits ) + ", " + Send_Slippage + ", " + DoubleToStr( Send_StopLoss, _Digits ) + ", " + DoubleToStr( Send_TakeProfit, _Digits ) + ", " + Send_Comment + ", " + Send_MagicNumber + ", " + Send_Expiration + ", " + Send_Color + " )", TradeLog_Result, TradeLog_GetLastError, TradeLog_ErrorDescription, ( GetTickCount() - Close_StartTickCount ) / 1000 ); break;
		case 7:  _TradeLog ( Trailing_OrderTicket, Trailing_OrderMagicNumber, Trailing_OrderComment, "TrailingStop ( " + Trailing_OrderTicket + ", " + Trailing_TrailingStop + ", " + Trailing_Color + " )", TradeLog_Result, TradeLog_GetLastError, TradeLog_ErrorDescription, ( GetTickCount() - Trailing_StartTickCount ) / 1000 ); break;
		default: Print( " _TradeLog_( ", FunctionId, ", ", TradeLog_Result, ", ", TradeLog_GetLastError, ", ", TradeLog_ErrorDescription, " ) - Unknown function with Id ", FunctionId );
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void _Print_( int FunctionId, string SubFunction, string SubFunctionResult )
/////////////////////////////////////////////////////////////////////////////////
{
	switch ( FunctionId )
	{
		
		case 1:  Print( "OrderSend - ",SubFunctionResult,". Account ", AccountNumber()," - OK" ); break;
		case 2:  Print( "OrderModify ( ", Modify_OrderTicket, ", ", DoubleToStr( Modify_New_OpenPrice, _Digits ), ", ", DoubleToStr( Modify_New_StopLoss, _Digits ), ", ", DoubleToStr( Modify_New_TakeProfit, _Digits ), ", ", Modify_New_Expiration, ", ", Modify_Color, " ) - ", SubFunction, " - ", SubFunctionResult, ". Work time: ", ( GetTickCount() - Modify_StartTickCount ) / 1000, " sec." ); break;
		case 3:  Print( "OrderClose( ",Close_OrderTicket, " )" ); break;
		case 4:  Print( "OrderDelete( ", Delete_OrderTicket, " ) - ", SubFunction, " - ", SubFunctionResult, ". Work time: ", ( GetTickCount() - Delete_StartTickCount ) / 1000, " sec." ); break;
		case 5:  Print( "Reverse( " + Close_OrderTicket + ", " + Close_Slippage + ", " + Close_Color + ", " + Send_Color + " ) - - - " + "OrderClose( ", Close_OrderTicket, ", ", Close_Volume, ", ", Close_Slippage, ", ", Close_Color, " ) - ", SubFunction, " - ", SubFunctionResult, ". Work time: ", ( GetTickCount() - Close_StartTickCount ) / 1000, " sec." ); break;
		case 6:  Print( "Reverse( " + Close_OrderTicket + ", " + Close_Slippage + ", " + Close_Color + ", " + Send_Color + " ) - - - " + "OrderSend ( ", Send_Symbol, ", ", Send_OrderType, ", ", DoubleToStr( Send_Volume, 2 ), ", ", DoubleToStr( Send_OpenPrice, _Digits ), ", ", Send_Slippage, ", ", DoubleToStr( Send_StopLoss, _Digits ), ", ", DoubleToStr( Send_TakeProfit, _Digits ), ", ", Send_Comment, ", ", Send_MagicNumber, ", ", Send_Expiration, ", ", Send_Color, " ) - ", SubFunction, " - ", SubFunctionResult, ". Work time: ", ( GetTickCount() - Close_StartTickCount ) / 1000, " sec." ); break;
		case 7:  Print( "TrailingStop ( " + Trailing_OrderTicket + ", " + Trailing_TrailingStop + ", " + Trailing_Color + " ) - ", SubFunction, " - ", SubFunctionResult, ". Work time: ", ( GetTickCount() - Trailing_StartTickCount ) / 1000, " sec." ); break;
		default: Print( "Print_( ", FunctionId, ", ", SubFunction, ", ", SubFunctionResult, " ) - Unknown function with Id ", FunctionId );
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int TradeIsBusy()
/////////////////////////////////////////////////////////////////////////////////
// Óñòàíàâëèâàåì ãëîáàëüíóþ ïåðåìåííóþ TradeIsBusy â 1
// Åñëè óñïåøíî, âîçâðàùàåì 1
// Åñëè _IsStopped(), âîçâðàùàåì -2
// Åñëè _IsTimeOut(), âîçâðàùàåì -3
/////////////////////////////////////////////////////////////////////////////////
{
	if ( IsTesting() ) { return(1); }
	int _GetLastError;

	while( true )
	{
		if ( _IsStopped() ) { return(-2); }
		if ( _IsTimeOut() ) { return(-3); }
		if ( GlobalVariableCheck( "TradeIsBusy" ) ) { break; }
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 )
		{
			Print( " TradeIsBusy() - GlobalVariableCheck ( \"TradeIsBusy\" ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			Sleep(100);
			continue;
		}

		if ( GlobalVariableSet ( "TradeIsBusy", 1.0 ) > 0 ) { return(1); }
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 )
		{
			Print( " TradeIsBusy() - GlobalVariableSet ( \"TradeIsBusy\", 0.0 ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			Sleep(100);
			continue;
		}
		Sleep(100);
	}
	while( true )
	{
		if ( _IsStopped() ) { return(-2); }
		if ( _IsTimeOut() ) { return(-3); }
		if ( GlobalVariableSetOnCondition( "TradeIsBusy", 1.0, 0.0 ) ) { return(1); }
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 )
		{
			Print( " TradeIsBusy() - GlobalVariableSetOnCondition ( \"TradeIsBusy\", 1.0, 0.0 ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			continue;
		}

		_info ( 14, "Æä¸ì, ïîêà äðóãîé ýêñïåðò çàêîí÷èò òîðãîâàòü...", 0, 0 );
		Sleep(1000);
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int _PauseBeforeTrade ()
/////////////////////////////////////////////////////////////////////////////////
// Åñëè ñî âðåìåíè ïîñëåäíåé òîðãîâîé îïåðàöèè ïðîøëî ìåíüøå PauseBeforeTrade ñåê, æä¸ì...
// Óñòàíàâëèâàåì ãëîáàëüíóþ ïåðåìåííóþ LastTradeTime â ëîêàëüíîå âðåìÿ
// Åñëè óñïåøíî, âîçâðàùàåì 1
// Åñëè IsStopped(), âîçâðàùàåì -2
// Åñëè _IsTimeOut(), âîçâðàùàåì -3
/////////////////////////////////////////////////////////////////////////////////
{
	if ( IsTesting() ) { return(1); }
	int _GetLastError;
	GetLastError();

	while( true )
	{
		if ( _IsStopped() ) { TradeIsNotBusy(); return(-2); }
		if ( _IsTimeOut() ) { TradeIsNotBusy(); return(-3); }
		if ( GlobalVariableCheck( "LastTradeTime" ) ) break;
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 )
		{
			Print( " _PauseBeforeTrade() - GlobalVariableCheck ( \"LastTradeTime\" ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			continue;
		}

		if ( GlobalVariableSet ( "LastTradeTime", TimeLocal() ) > 0 )
		{
			_info ( 14, "" );
			return(1);
		}
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 ) Print( " _PauseBeforeTrade() - GlobalVariableSet ( \"LastTradeTime\", ", TimeLocal(), " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
	
		Sleep(100);
	}

	double _LastTradeTime, RealPauseBeforeTrade, RequirementPauseBeforeTrade;

	while( true )
	{
		if ( _IsStopped() ) { TradeIsNotBusy(); return(-2); }
		if ( _IsTimeOut() ) { TradeIsNotBusy(); return(-3); }

		_LastTradeTime = GlobalVariableGet ( "LastTradeTime" );
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 )
		{
			Print( " _PauseBeforeTrade() - GlobalVariableGet ( \"LastTradeTime\" ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			continue;
		}

		RealPauseBeforeTrade				= TimeLocal() - _LastTradeTime;
		RequirementPauseBeforeTrade	= PauseBeforeTrade;
		if ( RealPauseBeforeTrade < RequirementPauseBeforeTrade )
		{
			_info ( 14, "Ïàóçà ìåæäó òîðãîâûìè îïåðàöèÿìè. Îñòàëîñü " + DoubleToStr( RequirementPauseBeforeTrade - RealPauseBeforeTrade, 0 ) + " ñåê.", 0, 0 );
			Sleep(1000);
		}
		else
		{
			break;
		}
	}

	while( true )
	{
		if ( _IsStopped() ) { TradeIsNotBusy(); return(-2); }
		if ( _IsTimeOut() ) { TradeIsNotBusy(); return(-3); }
		if ( GlobalVariableSet ( "LastTradeTime", TimeLocal() ) > 0 )
		{
			_info( 14, "" );
			return(1);
		}

		_GetLastError = GetLastError();
		if ( _GetLastError != 0 ) Print( " _PauseBeforeTrade() - GlobalVariableSet ( \"LastTradeTime\", ", TimeLocal(), " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );

		Sleep(100);
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void TradeIsNotBusy ()
/////////////////////////////////////////////////////////////////////////////////
// Óñòàíàâëèâàåì ãëîáàëüíóþ ïåðåìåííóþ TradeIsBusy â 0
// Ðàáîòàåì "äî óïîðà", ò.å. ïîêà íå âûïîëíèì
/////////////////////////////////////////////////////////////////////////////////
{
	if ( IsTesting() ) { return(0); }
	int _GetLastError;
	GetLastError();
	while( true )
	{
		if ( GlobalVariableCheck( "TradeIsBusy" ) )
		{
			if ( GlobalVariableGet( "TradeIsBusy" ) == 0.0 ) return(1);
			_GetLastError = GetLastError();
			if ( _GetLastError != 0 )
			{
				Print( " TradeIsNotBusy() - GlobalVariableGet ( \"TradeIsBusy\" ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
				continue;
			}

			if ( GlobalVariableSet( "TradeIsBusy", 0.0 ) > 0 ) return(1);
			_GetLastError = GetLastError();
			if ( _GetLastError != 0 )
			{ Print( " TradeIsNotBusy() - GlobalVariableSet ( \"TradeIsBusy\", 0.0 ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" ); }

			Sleep(100);
		}
		else
		{
			_GetLastError = GetLastError();
			if ( _GetLastError != 0 )
			{
				Print( " TradeIsNotBusy() - GlobalVariableCheck ( \"TradeIsBusy\" ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
				continue;
			}
			return(1);
		}
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int _IsConnected ()
/////////////////////////////////////////////////////////////////////////////////
// Åñëè IsConnected() == true, âîçâðàùàåì 1
// Åñëè IsConnected() == false, âîçâðàùàåì -1
// Åñëè IsStopped(), âîçâðàùàåì -2
// Åñëè _IsTimeOut(), âîçâðàùàåì -3
/////////////////////////////////////////////////////////////////////////////////
{
	if ( IsTesting() ) { return(1); }
	for ( int z = 0; z < 50; z ++ )
	{
		if ( IsConnected() ) { return(1); }
		if ( _IsStopped() ) { return(-2); }
		if ( _IsTimeOut() ) { return(-3); }
		Sleep(100);
	}
	_info ( 14, stringNoConnection + "!", 1 );
return(-1);
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int _IsTradeAllowed ()
/////////////////////////////////////////////////////////////////////////////////
// Åñëè IsTradeAllowed() == true, âîçâðàùàåì 1
// Åñëè IsTradeAllowed() == false, âîçâðàùàåì -1
// Åñëè IsStopped(), âîçâðàùàåì -2
// Åñëè _IsTimeOut(), âîçâðàùàåì -3
/////////////////////////////////////////////////////////////////////////////////
{
	if ( IsTesting() ) { return(1); }
	for ( int z = 0; z < 50; z ++ )
	{
		if ( IsTradeAllowed() ) { return(1); }
		if ( _IsStopped() ) { return(-2); }
		if ( _IsTimeOut() ) { return(-3); }
		Sleep(100);
	}
	_info ( 14, stringTradeNotAllow + "!", 1 );
return(-1);
}

/////////////////////////////////////////////////////////////////////////////////
/**/ bool _IsStopped ()
/////////////////////////////////////////////////////////////////////////////////
{
	if ( IsStopped() )
	{
		_info ( 14, stringStopped + "!", 1 );
		return(true);
	}
	return(false);
}
/////////////////////////////////////////////////////////////////////////////////
/**/ bool _IsTimeOut ()
/////////////////////////////////////////////////////////////////////////////////
{
	if ( TimeLocal() - StartTime > MaxWaitingTime && MaxWaitingTime > 0 && StartTime > 0 )
	{
		_info ( 4, stringTimeOut + "!", 1 );
		return(true);
	}
	return(false);
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void Processing_Error ( int ErrorCode, string Function )
/////////////////////////////////////////////////////////////////////////////////
{
	int _GetLastError;

/*ERR_ORDER_LOCKED - â îáðàáîòêå íàõîäÿòñÿ äðóãèå îðäåðû, ñåðâåð íå ïðèíèìàåò íîâûõ çàÿâîê
ERR_OFF_QUOTES - íåò öåí, èìååò ñìûñë ïîâòîðèòü îïåðàöèþ ÷åðåç íåêîòîðîå ïðîäîëæèòåëüíîå âðåìÿ
ERR_PRICE_CHANGED - öåíà ÿâíî èçìåíèëàñü, íóæíî âçÿòü ïîñëåäíþþ ðûíî÷íóþ è ïîïðîáîâàòü ñíîâà
ERR_INVALID_PRICE - ÿâíàÿ îøèáêà â ýêñïåðòå ñ íåïðàâèëüíûìè öåíàìè, íè î êàêîé òîðãîâëå ðå÷ü íå ìîæåò èäòè. íóæíî îñòàíàâëèâàòüñÿ è ïðîâåðÿòü êîä ýêñïåðòà
ERR_REQUOTE - ÷èñòûé ðåêâîò, íåîáõîäèìî òóò æå áåç çàäåðæåê âçÿòü ðûíî÷íóþ öåíó è ñíîâà ïðîâåñòè òðåéä

*/	string ErrorDescription = ErrorDescription( ErrorCode );
	int ErrorAction = 0;
	if ( ErrorCode == 4   ||
		  ErrorCode == 6	 ||
		  ErrorCode == 8	 ||
		  ErrorCode == 132  ||
		  ErrorCode == 137  ||
		  ErrorCode == 141  ||
		  ErrorCode == 146 ) ErrorAction = 1;

	if ( ErrorCode == 5   ||
		  ErrorCode == 64  ||
		  ErrorCode == 65 ) ErrorAction = 2;

	string ActionStr = "Ýêñïåðò ïðîäîëæàåò ðàáîòó...";

	switch ( ErrorAction )
	{
		case 1:
		{
/*			ActionStr = "Ýêñïåðòû íå áóäóò òîðãîâàòü 5 ìèíóò...";
			while ( !IsStopped() )
			{
				if ( GlobalVariableSet ( "LastTradeTime", TimeLocal() + 300 ) > 0 ) { break; }
				_GetLastError = GetLastError();
				Print( " Processing_Error( ", ErrorCode, ", ", Function, " ) - GlobalVariableSet ( \"LastTradeTime\", ", TimeLocal() + 300, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
				Sleep(100);
			}
*/			break;
		}
		case 2:
		{
			ActionStr = "Ýêñïåðò ïðåêðàùàåò ðîáîòó...";
			while ( !IsStopped() )
			{
				if ( GlobalVariableSet ( strComment + "-return!", -ErrorCode ) > 0 ) { break; }
				_GetLastError = GetLastError();
				Print( " Processing_Error( ", ErrorCode, ", ", Function, " ) - GlobalVariableSet ( \"", strComment, "-return!\", ", -ErrorCode, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
				Sleep(100);
			}
			break;
		}
	}

	clear_info();
	_info ( 1, Function + " Error!!!", 1 );
	_info ( 2, "GetLastError = " + ErrorCode, 1 );
	_info ( 3, ErrorDescription, 1 );
	_info ( 4, ActionStr, 1 );

	string subject = strComment + " - Error #" + ErrorCode + " ( " + ErrorDescription + " )!";
	string mail_text = "Account#" + AccountNumber() + "  " + strComment + " - " + Function + "() Error #" + ErrorCode;
	string log_text =
	"+--------------------Expert-Information----------------------------+\n" +
	"+ ExpertName		= " + ExpertName + "\n" +
	"+ ChartSymbol		= " + _Symbol + "\n" +
	"+ ChartPeriod		= " + strPeriod + "\n" +
	"+------------------------------------------------------------------+\n" +
	"\n" +
	"+--------------------Error-Information-----------------------------+\n" +
	"+ LocalTime		= " + TimeToStr( TimeLocal(), TIME_DATE | TIME_SECONDS ) + "\n" +
	"+ Function		= " + Function + "\n" +
	"+ GetLastError		= " + ErrorCode + "\n" +
	"+ ErrorDescription	= " + ErrorDescription + "\n" +
	"+ Action		= " + ActionStr + "\n" +
	"+------------------------------------------------------------------+\n" +
	"\n" +
	"+--------------------Market-Information----------------------------+\n" +
	"+ Bid			= " + DoubleToStr( MarketInfo( _Symbol, MODE_BID ), _Digits ) + "\n" +
	"+ Ask			= " + DoubleToStr( MarketInfo( _Symbol, MODE_ASK ), _Digits ) + "\n" +
	"+ Spread		= " + DoubleToStr( _Spread, _Digits ) + "\n" +
	"+ StopLevel		= " + DoubleToStr( _StopLevel, _Digits ) + "\n" +
	"+------------------------------------------------------------------+\n" +
	"\n" +
	"+-------------------LastBar-Information----------------------------+\n" +
	"+ Time [0]		= " + TimeToStr( iTime( _Symbol, _Period, 0 ) )  + "\n" +
	"+ Open [0]		= " + DoubleToStr( iOpen( _Symbol, _Period, 0 ), _Digits ) + "\n" +
	"+ High [0]		= " + DoubleToStr( iHigh( _Symbol, _Period, 0 ), _Digits ) + "\n" +
	"+ Low  [0]		= " + DoubleToStr( iLow ( _Symbol, _Period, 0 ), _Digits ) + "\n" +
	"+ Close[0]		= " + DoubleToStr( iClose( _Symbol, _Period, 0 ), _Digits ) + "\n" +
	"+------------------------------------------------------------------+\n" +
	"\n" +
	"+--------------------Server-Information----------------------------+\n" +
	"+ ServerAddress		= " + ServerAddress()		+ "\n" +
	"+ ServerTime		= " + TimeToStr( CurTime(), TIME_DATE | TIME_SECONDS ) + "\n" +
	"+------------------------------------------------------------------+\n" +
	"\n" +
	"+--------------------Account-Information---------------------------+\n" +
	"+ AccountNumber		= " + AccountNumber()								+ "\n" +
	"+ AccountName		= " + AccountName()										+ "\n" +
	"+ AccountEquity		= " + DoubleToStr( AccountEquity(), 2 )		+ "\n" +
	"+ AccountFreeMargin	= " + DoubleToStr( AccountFreeMargin(), 2 )	+ "\n" +
	"+ AccountMargin		= " + DoubleToStr( AccountMargin(), 2 )		+ "\n" +
	"+ \n" +
	"+ AccountBalance	= " + DoubleToStr( AccountBalance(), 2 )			+ "\n" +
	"+ AccountProfit		= " + DoubleToStr( AccountProfit(), 2 )		+ "\n" +
	"+ AccountCredit		= " + DoubleToStr( AccountCredit(), 2 )		+ "\n" +
	"+ AccountCurrency	= " + AccountCurrency()								+ "\n" +
	"+ AccountLeverage	= " + AccountLeverage()								+ "\n" +
	"+------------------------------------------------------------------+\n";

	if ( Allow_ErrorMail && !IsTesting() )
	{
		if ( IsConnected() )
		{
			SendMail( mail_text, "" );
			_GetLastError = GetLastError();
			if ( _GetLastError > 0 )
			{ Print( " Processing_Error( ", ErrorCode, ", ", Function, " ) - SendMail ( ", subject, ", ", mail_text, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" ); }
		}
		else
		{
			Print( " Processing_Error( ", ErrorCode, ", ", Function, " ) - No connection with server. SendMail canceled" );
		}
	}
	
	if ( Allow_ErrorLogFile )
	{
		string file_name = "_ErrorLogs\\" + strComment + "\\" + TimeToStr( TimeLocal(), TIME_DATE ) + ".txt";
		int file_handle = FileOpen ( file_name, FILE_READ | FILE_WRITE, " " );
	
		if ( file_handle > 0 )
		{
			if ( FileSeek ( file_handle, 0, SEEK_END ) )
			{
				if ( FileWrite ( file_handle, subject + "\n", log_text, "\n\n" ) < 0 )
				{
					_GetLastError = GetLastError();
					Print( " Processing_Error( ", ErrorCode, ", ", Function, " ) - FileWrite (...) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
				}
			}
			else
			{
				_GetLastError = GetLastError();
				Print( " Processing_Error( ", ErrorCode, ", ", Function, " ) - FileSeek ( " + file_handle + ", 0, SEEK_END ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			}
			FileClose ( file_handle );
		}
		else
		{
			_GetLastError = GetLastError();
			Print( " Processing_Error( ", ErrorCode, ", ", Function, " ) - FileOpen( ", file_name, ", FILE_READ | FILE_WRITE, \" \" ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
		}
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void _TradeLog ( int Ticket, int MagicNumber, string _Comment, string Action, string Result = "OK", int Error = 0, string ErrorDescription = "", int WorkTime = 0 )
/////////////////////////////////////////////////////////////////////////////////
// Çàïèñü â ëîã-ôàéë èíôîðìàöèè î òîðãîâîé îïåðàöèè.
//
// Èìÿ ïðîåêòèðóåòñÿ ñ èñïîëüçîâàíèåì òåêóùåé äàòû.
// È âûãëÿäèò òàê ( äëÿ ïðèìåðà: äàòà çàïèñè - 2005.08.03):
// ...\MetaTrader 4\experts\files\_TradeLog\2005.08.03.csv
// Äëÿ óäîáî÷èòàåìîñòè ëîãîâ ìîæíî èñïîëüçîâàòü ìàêðîñ TradeLog_Format, ïðèâîäÿùèé ëîã â "ïðèëè÷íûé" âèä.
// Èíñòðóêöèè ïî èñïîëüçîâàíèþ â ñîîòâåòñòâóþùåé ãëàâå.
/////////////////////////////////////////////////////////////////////////////////
{
	if ( !Allow_TradeLogFile ) { return(0); }

	int _GetLastError;

	string file_name = "_TradeLogs\\" + TimeToStr( TimeLocal(), TIME_DATE ) + ".csv";
	int file_handle = FileOpen ( file_name, FILE_READ | FILE_WRITE );
	if ( file_handle > 0 )
	{
		if ( FileSeek ( file_handle, 0, SEEK_END ) )
		{
			string Error_str = DoubleToStr( Error, 0 );
			if ( FileWrite ( file_handle, TimeToStr( TimeLocal(), TIME_SECONDS ), ExpertName, _Symbol, _Period, "( " + strPeriod + " )", Ticket, MagicNumber, _Comment, Action, Result, ErrorDescription, Error_str, WorkTime ) < 0 )
			{
				_GetLastError = GetLastError();
				Print( " _TradeLog ( ", Ticket, ", ", MagicNumber, ", ", _Comment, ", ", Action, ", ", Result, ", ", Error, " ) - FileWrite ( ", TimeToStr( TimeLocal(), TIME_SECONDS ), ", ", ExpertName, ", ", _Symbol, ", ", _Period, ", ( " + strPeriod + " ), ", Ticket, ", ", MagicNumber, ", ", _Comment, ", ", Action, ", ", Result, ", ", Error, ", ", ErrorDescription, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			}
		}
		else
		{
			_GetLastError = GetLastError();
			Print( " _TradeLog ( ", Ticket, ", ", MagicNumber, ", ", _Comment, ", ", Action, ", ", Result, ", ", Error, " ) - FileSeek ( " + file_handle + ", 0, SEEK_END ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
		}
		FileClose ( file_handle );
	}
	else
	{
		_GetLastError = GetLastError();
		Print( " _TradeLog ( ", Ticket, ", ", MagicNumber, ", ", _Comment, ", ", Action, ", ", Result, ", ", Error, " ) - FileOpen( \"", file_name, "\", FILE_READ | FILE_WRITE ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ void ReportToCSV( string file_name = "", int magic = -1, string comment = "-1", string symbol = "-1", int magic1 = -1 )
/////////////////////////////////////////////////////////////////////////////////
{
	int Tickets[], _HistoryTotal = OrdersHistoryTotal(), _HistoryValidate = 0, _GetLastError;
	ArrayResize( Tickets, _HistoryTotal );

	for ( int i = 0; i < _HistoryTotal; i++ )
	{
		if ( !OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ) ) continue;
		if ( symbol != "-1" && OrderSymbol() != _Symbol ) continue;
		if ( comment != "-1" && StringFind( OrderComment(), comment, 0 ) < 0 ) continue;
		if ( magic != -1 && OrderMagicNumber() != magic )
		{
			if ( magic1 != -1 && OrderMagicNumber() != magic1 ) continue;
		}

		Tickets[_HistoryValidate] = OrderTicket();
		_HistoryValidate ++;
	}

	if ( _HistoryValidate <= 0 )
	{
		Print( "ReportToCSV: Íåò îðäåðîâ, îòâå÷àþùèõ óñëîâèÿì!" );
		return;
	}

	ArrayResize( Tickets, _HistoryValidate );
	ArraySort( Tickets );

	if ( file_name == "" ) file_name = "_Reports\\" + strComment + ".csv";
	int file_handle = FileOpen ( file_name, FILE_WRITE );
	if ( file_handle < 0 )
	{
		_GetLastError = GetLastError();
		Print( " ReportToCSV ( ", magic, ", ", comment, " ) - FileOpen( \"", file_name, "\", FILE_WRITE ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
		return(-1);
	}

	FileWrite( file_handle, 
		"Ticket", 
		"OpenTime", 
		"Type", 
		"Lots", 
		"Symbol", 
		"OpenPrice", 
		"StopLoss", 
		"TakeProfit", 
		"CloseTime", 
		"ClosePrice", 
		"Swap", 
		"Profit", 
		"Comment" );

	for ( i = 0; i < _HistoryValidate; i++ )
	{
		if ( !OrderSelect( Tickets[i], SELECT_BY_TICKET ) ) continue;
		FileWrite( file_handle, 
			Tickets[i], 
			TimeToStr( OrderOpenTime() ), 
			strOrderType( OrderType() ), 
			DoubleToStr( OrderLots(), 2 ), 
			Symbol(), 
			DoubleToStr( OrderOpenPrice()	, _Digits ), 
			DoubleToStr( OrderStopLoss()	, _Digits ), 
			DoubleToStr( OrderTakeProfit(), _Digits ), 
			TimeToStr( OrderCloseTime() ), 
			DoubleToStr( OrderClosePrice(), _Digits ), 
			DoubleToStr( OrderSwap(), 2 ), 
			DoubleToStr( OrderProfit(), 2 ), 
			OrderComment() );
	}
	FileClose( file_handle );
}

/////////////////////////////////////////////////////////////////////////////////
/**/ string strOrderType( int intOrderType )
/////////////////////////////////////////////////////////////////////////////////
// âîçâðàùàåò OrderType â âèäå òåêñòà
/////////////////////////////////////////////////////////////////////////////////
{
	switch ( intOrderType )
	{
		case OP_BUY:			return("Buy"					);
		case OP_SELL:			return("Sell"					);
		case OP_BUYLIMIT:		return("BuyLimit"				);
		case OP_BUYSTOP:		return("BuyStop"				);
		case OP_SELLLIMIT:	return("SellLimit"			);
		case OP_SELLSTOP:		return("SellStop"				);
		default:					return("UnknownOrderType"	);
	}
}
/////////////////////////////////////////////////////////////////////////////////
/**/ int intOrderType( string strOrderType )
/////////////////////////////////////////////////////////////////////////////////
// âîçâðàùàåò OrderType â âèäå òåêñòà
/////////////////////////////////////////////////////////////////////////////////
{
	if ( strOrderType == "Buy"			) { return(OP_BUY			); }
	if ( strOrderType == "Sell"		) { return(OP_SELL		); }
	if ( strOrderType == "BuyLimit"	) { return(OP_BUYLIMIT	); }
	if ( strOrderType == "BuyStop"	) { return(OP_BUYSTOP	); }
	if ( strOrderType == "SellLimit"	) { return(OP_SELLLIMIT	); }
	if ( strOrderType == "SellStop"	) { return(OP_SELLSTOP	); }
	return(-1);
}
/////////////////////////////////////////////////////////////////////////////////
/**/ int intOrderType2( string strOrderType )
/////////////////////////////////////////////////////////////////////////////////
// âîçâðàùàåò OrderType â âèäå òåêñòà
/////////////////////////////////////////////////////////////////////////////////
{
	if ( strOrderType == "Buy"			) { return(OP_BUY			); }
	if ( strOrderType == "Sell"		) { return(OP_SELL		); }
	if ( strOrderType == "Buy-limit"	) { return(OP_BUYLIMIT	); }
	if ( strOrderType == "Buy-stop"	) { return(OP_BUYSTOP	); }
	if ( strOrderType == "Sell-limit") { return(OP_SELLLIMIT	); }
	if ( strOrderType == "Sell-stop"	) { return(OP_SELLSTOP	); }
	return(-1);
}

/////////////////////////////////////////////////////////////////////////////////
/**/ string strPeriod( int intPeriod )
/////////////////////////////////////////////////////////////////////////////////
// âîçâðàùàåò Period â âèäå òåêñòà
/////////////////////////////////////////////////////////////////////////////////
{
	switch ( intPeriod )
	{
		case PERIOD_MN1: return("Monthly");
		case PERIOD_W1:  return("Weekly");
		case PERIOD_D1:  return("Daily");
		case PERIOD_H4:  return("H4");
		case PERIOD_H1:  return("H1");
		case PERIOD_M30: return("M30");
		case PERIOD_M15: return("M15");
		case PERIOD_M5:  return("M5");
		case PERIOD_M1:  return("M1");
		default:		     return("UnknownPeriod");
	}
}

/////////////////////////////////////////////////////////////////////////////////
/**/ int intPeriod( string strPeriod )
/////////////////////////////////////////////////////////////////////////////////
// âîçâðàùàåò Period â âèäå öåëîãî ÷èñëà
/////////////////////////////////////////////////////////////////////////////////
{
	if ( strPeriod == "Monthly"	)	{ return(PERIOD_MN1	); }
	if ( strPeriod == "Weekly"		)	{ return(PERIOD_W1	); }
	if ( strPeriod == "Daily"		)	{ return(PERIOD_D1	); }
	if ( strPeriod == "H4"			)	{ return(PERIOD_H4	); }
	if ( strPeriod == "H1"			)	{ return(PERIOD_H1	); }
	if ( strPeriod == "M30"			)	{ return(PERIOD_M30	); }
	if ( strPeriod == "M15"			)	{ return(PERIOD_M15	); }
	if ( strPeriod == "M5"			)	{ return(PERIOD_M5	); }
	if ( strPeriod == "M1"			)	{ return(PERIOD_M1	); }
	return(-1);
}


//---- ô-öèÿ èç stdlib.mq4 ñêîïèðîâàíà 10.08.2006 (build 208)
string ErrorDescription(int error_code)
  {
   string error_string;
//----
   switch(error_code)
     {
      //---- codes returned from trade server
      case 0:
      case 1:   error_string="no error";                                                  break;
      case 2:   error_string="common error";                                              break;
      case 3:   error_string="invalid trade parameters";                                  break;
      case 4:   error_string="trade server is busy";                                      break;
      case 5:   error_string="old version of the client terminal";                        break;
      case 6:   error_string="no connection with trade server";                           break;
      case 7:   error_string="not enough rights";                                         break;
      case 8:   error_string="too frequent requests";                                     break;
      case 9:   error_string="malfunctional trade operation (never returned error)";      break;
      case 64:  error_string="account disabled";                                          break;
      case 65:  error_string="invalid account";                                           break;
      case 128: error_string="trade timeout";                                             break;
      case 129: error_string="invalid price";                                             break;
      case 130: error_string="invalid stops";                                             break;
      case 131: error_string="invalid trade volume";                                      break;
      case 132: error_string="market is closed";                                          break;
      case 133: error_string="trade is disabled";                                         break;
      case 134: error_string="not enough money";                                          break;
      case 135: error_string="price changed";                                             break;
      case 136: error_string="off quotes";                                                break;
      case 137: error_string="broker is busy (never returned error)";                     break;
      case 138: error_string="requote";                                                   break;
      case 139: error_string="order is locked";                                           break;
      case 140: error_string="long positions only allowed";                               break;
      case 141: error_string="too many requests";                                         break;
      case 145: error_string="modification denied because order too close to market";     break;
      case 146: error_string="trade context is busy";                                     break;
      case 147: error_string="expirations are denied by broker";                          break;
      case 148: error_string="amount of open and pending orders has reached the limit";   break;
      //---- mql4 errors
      case 4000: error_string="no error (never generated code)";                                                 break;
      case 4001: error_string="wrong function pointer";                                   break;
      case 4002: error_string="array index is out of range";                              break;
      case 4003: error_string="no memory for function call stack";                        break;
      case 4004: error_string="recursive stack overflow";                                 break;
      case 4005: error_string="not enough stack for parameter";                           break;
      case 4006: error_string="no memory for parameter string";                           break;
      case 4007: error_string="no memory for temp string";                                break;
      case 4008: error_string="not initialized string";                                   break;
      case 4009: error_string="not initialized string in array";                          break;
      case 4010: error_string="no memory for array\' string";                             break;
      case 4011: error_string="too long string";                                          break;
      case 4012: error_string="remainder from zero divide";                               break;
      case 4013: error_string="zero divide";                                              break;
      case 4014: error_string="unknown command";                                          break;
      case 4015: error_string="wrong jump (never generated error)";                       break;
      case 4016: error_string="not initialized array";                                    break;
      case 4017: error_string="dll calls are not allowed";                                break;
      case 4018: error_string="cannot load library";                                      break;
      case 4019: error_string="cannot call function";                                     break;
      case 4020: error_string="expert function calls are not allowed";                    break;
      case 4021: error_string="not enough memory for temp string returned from function"; break;
      case 4022: error_string="system is busy (never generated error)";                   break;
      case 4050: error_string="invalid function parameters count";                        break;
      case 4051: error_string="invalid function parameter value";                         break;
      case 4052: error_string="string function internal error";                           break;
      case 4053: error_string="some array error";                                         break;
      case 4054: error_string="incorrect series array using";                             break;
      case 4055: error_string="custom indicator error";                                   break;
      case 4056: error_string="arrays are incompatible";                                  break;
      case 4057: error_string="global variables processing error";                        break;
      case 4058: error_string="global variable not found";                                break;
      case 4059: error_string="function is not allowed in testing mode";                  break;
      case 4060: error_string="function is not confirmed";                                break;
      case 4061: error_string="send mail error";                                          break;
      case 4062: error_string="string parameter expected";                                break;
      case 4063: error_string="integer parameter expected";                               break;
      case 4064: error_string="double parameter expected";                                break;
      case 4065: error_string="array as parameter expected";                              break;
      case 4066: error_string="requested history data in update state";                   break;
      case 4099: error_string="end of file";                                              break;
      case 4100: error_string="some file error";                                          break;
      case 4101: error_string="wrong file name";                                          break;
      case 4102: error_string="too many opened files";                                    break;
      case 4103: error_string="cannot open file";                                         break;
      case 4104: error_string="incompatible access to a file";                            break;
      case 4105: error_string="no order selected";                                        break;
      case 4106: error_string="unknown symbol";                                           break;
      case 4107: error_string="invalid price parameter for trade function";               break;
      case 4108: error_string="invalid ticket";                                           break;
      case 4109: error_string="trade is not allowed in the expert properties";            break;
      case 4110: error_string="longs are not allowed in the expert properties";           break;
      case 4111: error_string="shorts are not allowed in the expert properties";          break;
      case 4200: error_string="object is already exist";                                  break;
      case 4201: error_string="unknown object property";                                  break;
      case 4202: error_string="object is not exist";                                      break;
      case 4203: error_string="unknown object type";                                      break;
      case 4204: error_string="no object name";                                           break;
      case 4205: error_string="object coordinates error";                                 break;
      case 4206: error_string="no specified subwindow";                                   break;
      default:   error_string="unknown error";
     }
//----
   return(error_string);
  }

//+------------------------------------------------------------------+
//| ÎÒÑËÅÆÈÂÀÍÈÅ ÑÎÁÛÒÈÉ
//+------------------------------------------------------------------+

// ìàññèâ îòêðûòûõ ïîçèöèé ñîñòîÿíèåì íà ïðåäûäóùèé òèê
int pre_OrdersArray[][2]; // [êîëè÷åñòâî ïîçèöèé][¹ òèêåòà, òèï ïîçèöèè]

// ïåðåìåííûå ñîáûòèé
int eventBuyClosed_SL  = 0, eventBuyClosed_TP  = 0;
int eventSellClosed_SL = 0, eventSellClosed_TP = 0;
int eventBuyLimitDeleted_Exp  = 0, eventBuyStopDeleted_Exp  = 0;
int eventSellLimitDeleted_Exp = 0, eventSellStopDeleted_Exp = 0;
int eventBuyLimitOpened  = 0, eventBuyStopOpened  = 0;
int eventSellLimitOpened = 0, eventSellStopOpened = 0;

void CheckEvents( int magic = 0 )
{
	// ôëàã ïåðâîãî çàïóñêà
	static bool first = true;
	// êîä ïîñëåäíåé îøèáêè
	int _GetLastError = 0;
	// îáùåå êîëè÷åñòâî ïîçèöèé
	int _OrdersTotal = OrdersTotal();
	// êîë-âî ïîçèöèé, ñîîòâåòñòâóþùèõ êðèòåðèÿì (òåêóùèé èíñòðóìåíò è çàäàííûé MagicNumber),
	// ñîñòîÿíèåì íà òåêóùèé òèê
	int now_OrdersTotal = 0;
	// êîë-âî ïîçèöèé, ñîîòâåòñòâóþùèõ êðèòåðèÿì, ñîñòîÿíèåì íà ïðåäûäóùèé òèê
	static int pre_OrdersTotal = 0;
	// ìàññèâ îòêðûòûõ ïîçèöèé ñîñòîÿíèåì íà òåêóùèé òèê
	int now_OrdersArray[][2]; // [¹ â ñïèñêå][¹ òèêåòà, òèï ïîçèöèè]
	// òåêóùèé íîìåð ïîçèöèè â ìàññèâå now_OrdersArray (äëÿ ïåðåáîðà)
	int now_CurOrder = 0;
	// òåêóùèé íîìåð ïîçèöèè â ìàññèâå pre_OrdersArray (äëÿ ïåðåáîðà)
	int pre_CurOrder = 0;

	// ìàññèâ äëÿ õðàíåíèÿ êîëè÷åñòâà çàêðûòûõ ïîçèöèé êàæäîãî òèïà
	int now_ClosedOrdersArray[6][3]; // [òèï îðäåðà][òèï çàêðûòèÿ]
	// ìàññèâ äëÿ õðàíåíèÿ êîëè÷åñòâà ñðàáîòàâøèõ îòëîæåííûõ îðäåðîâ
	int now_OpenedPendingOrders[4]; // [òèï îðäåðà]

	// âðåìåííûå ôëàãè
	bool OrderClosed = true, PendingOrderOpened = false;
	// âðåìåííûå ïåðåìåííûå
	int ticket = 0, type = -1, close_type = -1;

	//îáíóëÿåì ïåðåìåííûå ñîáûòèé
	eventBuyClosed_SL  = 0; eventBuyClosed_TP  = 0;
	eventSellClosed_SL = 0; eventSellClosed_TP = 0;
	eventBuyLimitDeleted_Exp  = 0; eventBuyStopDeleted_Exp  = 0;
	eventSellLimitDeleted_Exp = 0; eventSellStopDeleted_Exp = 0;
	eventBuyLimitOpened  = 0; eventBuyStopOpened  = 0;
	eventSellLimitOpened = 0; eventSellStopOpened = 0;

	// èçìåíÿåì ðàçìåð ìàññèâà îòêðûòûõ ïîçèöèé ïîä òåêóùåå êîë-âî
	ArrayResize( now_OrdersArray, MathMax( _OrdersTotal, 1 ) );
	// îáíóëÿåì ìàññèâ
	ArrayInitialize( now_OrdersArray, 0.0 );

	// îáíóëÿåì ìàññèâû çàêðûòûõ ïîçèöèé è ñðàáîòàâøèõ îðäåðîâ
	ArrayInitialize( now_ClosedOrdersArray, 0.0 );
	ArrayInitialize( now_OpenedPendingOrders, 0.0 );

	//+------------------------------------------------------------------+
	//| Ïåðåáèðàåì âñå ïîçèöèè è çàïèñûâàåì â ìàññèâ òîëüêî òå, êîòîðûå
	//| ñîîòâåòñòâóþò êðèòåðèÿì
	//+------------------------------------------------------------------+
	for ( int z = _OrdersTotal - 1; z >= 0; z -- )
	{
		if ( !OrderSelect( z, SELECT_BY_POS ) )
		{
			_GetLastError = GetLastError();
			Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
			continue;
		}
		// Ñ÷èòàåì êîëè÷åñòâî îðäåðîâ ïî òåêóùåìó ñèìâîëó è ñ çàäàííûì MagicNumber
		if ( OrderMagicNumber() == magic && OrderSymbol() == Symbol() )
		{
			now_OrdersArray[now_OrdersTotal][0] = OrderTicket();
			now_OrdersArray[now_OrdersTotal][1] = OrderType();
			now_OrdersTotal ++;
		}
	}
	// èçìåíÿåì ðàçìåð ìàññèâà îòêðûòûõ ïîçèöèé ïîä êîë-âî ïîçèöèé, ñîîòâåòñòâóþùèõ êðèòåðèÿì
	ArrayResize( now_OrdersArray, MathMax( now_OrdersTotal, 1 ) );

	//+------------------------------------------------------------------+
	//| Ïåðåáèðàåì ñïèñîê ïîçèöèé ïðåäûäóùåãî òèêà, è ñ÷èòàåì ñêîëüêî çàêðûëîñü ïîçèöèé è
	//| ñðàáîòàëî îòëîæåííûõ îðäåðîâ
	//+------------------------------------------------------------------+
	for ( pre_CurOrder = 0; pre_CurOrder < pre_OrdersTotal; pre_CurOrder ++ )
	{
		// çàïîìèíàåì òèêåò è òèï îðäåðà
		ticket = pre_OrdersArray[pre_CurOrder][0];
		type   = pre_OrdersArray[pre_CurOrder][1];
		// ïðåäïîëîãàåì, ÷òî åñëè ýòî ïîçèöèÿ, òî îíà çàêðûëàñü
		OrderClosed = true;
		// ïðåäïîëàãàåì, ÷òî åñëè ýòî áûë îòëîæåííûé îðäåð, òî îí íå ñðàáîòàë
		PendingOrderOpened = false;

		// ïåðåáèðàåì âñå ïîçèöèè èç òåêóùåãî ñïèñêà îòêðûòûõ ïîçèöèé
		for ( now_CurOrder = 0; now_CurOrder < now_OrdersTotal; now_CurOrder ++ )
		{
			// åñëè ïîçèöèÿ ñ òàêèì òèêåòîì åñòü â ñïèñêå,
			if ( ticket == now_OrdersArray[now_CurOrder][0] )
			{
				// çíà÷èò ïîçèöèÿ íå áûëà çàêðûòà (îðäåð íå áûë óäàë¸í)
				OrderClosed = false;

				// åñëè å¸ òèï ïîìåíÿëñÿ,
				if ( type != now_OrdersArray[now_CurOrder][1] )
				{
					// çíà÷èò ýòî áûë îòëîæåííûé îðäåð, è îí ñðàáîòàë
					PendingOrderOpened = true;
				}
				break;
			}
		}
		// åñëè áûëà çàêðûòà ïîçèöèÿ (óäàë¸í îðäåð),
		if ( OrderClosed )
		{
			// âûáèðàåì å¸
			if ( !OrderSelect( ticket, SELECT_BY_TICKET ) )
			{
				_GetLastError = GetLastError();
				Print( "OrderSelect( ", ticket, ", SELECT_BY_TICKET ) - Error #", _GetLastError );
				continue;
			}
			// è îïðåäåëÿåì, ÊÀÊ çàêðûëàñü ïîçèöèÿ (óäàëèëñÿ îðäåð):
			if ( type < 2 )
			{
				// Áàé è Ñåëë: 0 - âðó÷íóþ, 1 - ÑË, 2 - ÒÏ
				close_type = 0;
				if ( StringFind( OrderComment(), "[sl]" ) >= 0 ) close_type = 1;
				if ( StringFind( OrderComment(), "[tp]" ) >= 0 ) close_type = 2;
			}
			else
			{
				// Îòëîæåííûå îðäåðà: 0 - âðó÷íóþ, 1 - âðåìÿ èñòå÷åíèÿ
				close_type = 0;
				if ( StringFind( OrderComment(), "expiration" ) >= 0 ) close_type = 1;
			}
			
			// è çàïèñûâàåì â ìàññèâ çàêðûòûõ îðäåðîâ, ÷òî îðäåð ñ òèïîì type 
			// çàêðûëñÿ ïðè îáñòîÿòåëüñòâàõ close_type
			now_ClosedOrdersArray[type][close_type] ++;
			continue;
		}
		// åñëè ñðàáîòàë îòëîæåííûé îðäåð,
		if ( PendingOrderOpened )
		{
			// çàïèñûâàåì â ìàññèâ ñðàáîòàâøèõ îðäåðîâ, ÷òî îðäåð ñ òèïîì type ñðàáîòàë
			now_OpenedPendingOrders[type-2] ++;
			continue;
		}
	}

	//+------------------------------------------------------------------+
	//| Âñþ íåîáõîäèìóþ èíôîðìàöèþ ñîáðàëè - íàçíà÷àåì ïåðåìåííûì ñîáûòèé íóæíûå çíà÷åíèÿ
	//+------------------------------------------------------------------+
	// åñëè ýòî íå ïåðâûé çàïóñê ýêñïåðòà
	if ( !first )
	{
		// ïåðåáèðàåì âñå ýëåìåíòû ìàññèâà ñðàáàòûâàíèÿ îòëîæåííûõ îðäåðîâ
		for ( type = 2; type < 6; type ++ )
		{
			// è åñëè ýëåìåíò íå ïóñòîé (îðäåð òàêîãî òèïà ñðàáîòàë), ìåíÿåì çíà÷åíèå ïåðåìåííîé
			if ( now_OpenedPendingOrders[type-2] > 0 )
				SetOpenEvent( type );
		}

		// ïåðåáèðàåì âñå ýëåìåíòû ìàññèâà çàêðûòûõ ïîçèöèé
		for ( type = 0; type < 6; type ++ )
		{
			for ( close_type = 0; close_type < 3; close_type ++ )
			{
				// è åñëè ýëåìåíò íå ïóñòîé (áûëà çàêðûòà ïîçèöèÿ), ìåíÿåì çíà÷åíèå ïåðåìåííîé
				if ( now_ClosedOrdersArray[type][close_type] > 0 )
					SetCloseEvent( type, close_type );
			}
		}
	}
	else
	{
		first = false;
	}

	//---- ñîõðàíÿåì ìàññèâ òåêóùèõ ïîçèöèé â ìàññèâ ïðåäûäóùèõ ïîçèöèé
	ArrayResize( pre_OrdersArray, MathMax( now_OrdersTotal, 1 ) );
	for ( now_CurOrder = 0; now_CurOrder < now_OrdersTotal; now_CurOrder ++ )
	{
		pre_OrdersArray[now_CurOrder][0] = now_OrdersArray[now_CurOrder][0];
		pre_OrdersArray[now_CurOrder][1] = now_OrdersArray[now_CurOrder][1];
	}
	pre_OrdersTotal = now_OrdersTotal;
}
void SetOpenEvent( int SetOpenEvent_type )
{
	switch ( SetOpenEvent_type )
	{
		case OP_BUYLIMIT: eventBuyLimitOpened ++; return(0);
		case OP_BUYSTOP: eventBuyStopOpened ++; return(0);
		case OP_SELLLIMIT: eventSellLimitOpened ++; return(0);
		case OP_SELLSTOP: eventSellStopOpened ++; return(0);
	}
}
void SetCloseEvent( int SetCloseEvent_type, int SetCloseEvent_close_type )
{
	switch ( SetCloseEvent_type )
	{
		case OP_BUY:
		{
			if ( SetCloseEvent_close_type == 1 ) eventBuyClosed_SL ++;
			if ( SetCloseEvent_close_type == 2 ) eventBuyClosed_TP ++;
			return(0);
		}
		case OP_SELL:
		{
			if ( SetCloseEvent_close_type == 1 ) eventSellClosed_SL ++;
			if ( SetCloseEvent_close_type == 2 ) eventSellClosed_TP ++;
			return(0);
		}
		case OP_BUYLIMIT:
		{
			if ( SetCloseEvent_close_type == 1 ) eventBuyLimitDeleted_Exp ++;
			return(0);
		}
		case OP_BUYSTOP:
		{
			if ( SetCloseEvent_close_type == 1 ) eventBuyStopDeleted_Exp ++;
			return(0);
		}
		case OP_SELLLIMIT:
		{
			if ( SetCloseEvent_close_type == 1 ) eventSellLimitDeleted_Exp ++;
			return(0);
		}
		case OP_SELLSTOP:
		{
			if ( SetCloseEvent_close_type == 1 ) eventSellStopDeleted_Exp ++;
			return(0);
		}
	}
}

bool LoadVariables( string& variables[], string file_name = "" )
{
	if ( IsTesting() ) return(true);

	int all = ArraySize( variables ), cur;
	for ( cur = 0; cur < all; cur ++ ) variables[cur] = "";

	if ( file_name == "" ) file_name = StringConcatenate( "_ExpertSaves\\", WindowExpertName(), " (", Symbol(), ", ", strPeriod( Period() ), ", ", _MagicNumber, ").dat" );
	int handle  = FileOpen( file_name, FILE_CSV | FILE_READ ), _GetLastError = 0;
	if ( handle < 0 )
	{
		_GetLastError = GetLastError();
		if ( _GetLastError != 4103 ) Print( " LoadVariables() - FileOpen( \"", file_name, "\", FILE_CSV | FILE_READ ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
		return(false);
	}

	for ( cur = 0; cur < all; cur ++ )
	{
		variables[cur] = FileReadString( handle );
		_GetLastError = GetLastError();
		if ( _GetLastError != 0 )
		{
			Print( " LoadVariables() - FileReadString( ", handle, " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			FileClose( handle );
			return(false);
		}
	}

	FileClose( handle );
	return(true);
}
void SaveVariables( string variables[], string file_name = "" )
{
	if ( IsTesting() ) return(true);

	if ( file_name == "" ) file_name = StringConcatenate( "_ExpertSaves\\", WindowExpertName(), " (", Symbol(), ", ", strPeriod( Period() ), ", ", _MagicNumber, ").dat" );
	int handle  = FileOpen( file_name, FILE_CSV | FILE_WRITE ), _GetLastError = 0;
	if ( handle < 0 )
	{
		_GetLastError = GetLastError();
		Print( " SaveVariables() - FileOpen( \"", file_name, "\", FILE_CSV | FILE_WRITE ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
		return(-1);
	}

	int all = ArraySize( variables ), cur;
	for ( cur = 0; cur < all; cur ++ )
	{
		if ( FileWrite( handle, variables[cur] ) < 0 )
		{
			_GetLastError = GetLastError();
			Print( " SaveVariables() - FileWrite( ", handle, ", ", variables[cur], " ) - Error #", _GetLastError, " ( ", ErrorDescription( _GetLastError ), " )" );
			break;
		}
	}

	FileClose( handle );
}


//=====START=================================================
int init()
{
	TradeInfoLib_Initialization ( Expert_Id, "SU3D[v5]" );
	return(0);
}

int deinit()
{
	TradeInfoLib_Deinitialization();
	return(0);
}

int start()
{


if (Symbol()== "GBPUSD" && Period()==60) {PipStep = 50; LotExponent=1.35;}
if (Symbol()== "EURUSD" && Period()==60) {PipStep = 40; LotExponent=1.35;}
if (Symbol()== "EURJPY" && Period()==60) {PipStep = 50; LotExponent=1.45;}
if (Symbol()== "USDJPY" && Period()==60) {PipStep = 40; LotExponent=1.35;}
if (Symbol()== "AUDCAD" && Period()==60) {PipStep = 30; LotExponent=1.35;}


if (TotalEquityRisk>5) TotalEquityRisk = 5;

//EURAUD TotalEquityRisk = 2; PipStep = 70; LotExponent=1.25; MaxTrades=18;++18000_89929
//EURCHF TotalEquityRisk = 5; PipStep = 40; LotExponent=1.35;MaxTrades=18;++14000_9577
//GBPCHF TotalEquityRisk = 3; PipStep = 60; LotExponent=1.25;MaxTrades=18;+++14000_89044
//AUDCHF TotalEquityRisk = 4; PipStep = 60; LotExponent=1.35; MaxTrades=18;+ 18000_56855
//AUDJPY TotalEquityRisk = 2; PipStep = 60; LotExponent=1.25; MaxTrades=18;+ 18000_54701
//AUDCAD TotalEquityRisk = 5; PipStep = 30; LotExponent=1.35; MaxTrades=18;+++10000_239558
//CADCHF TotalEquityRisk = 4; PipStep = 50; LotExponent=1.25; MaxTrades=18;12000_34508
//CADJPY TotalEquityRisk = 2; PipStep = 60; LotExponent=1.35; MaxTrades=18;16000_36902
//NZDJPY TotalEquityRisk = 3; PipStep = 50; LotExponent=1.25; MaxTrades=18;16000_55597 

if (Symbol()!= "GBPUSD" 
&& Symbol()!= "AUDCAD"
&& Symbol()!= "EURJPY" 
&& Symbol()!= "USDJPY" 
&& Symbol()!= "EURUSD") 
{Comment("=============================","\n",
"EXPERT STOPPED! Invalid Symbol",
"\n","=============================");
Print ("EXPERT STOPPED! Invalid Symbol");   
return(0);
}

if (Period()!=60)
{Comment("=============================","\n",
   "EXPERT STOPPED! Invalid Period ",
"\n","=============================");
Print ("EXPERT STOPPED! Invalid Period");   
   return(0);
}

StartLot_b = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts),3));
StartLot_s = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts),3));


 if ((StartLot_b < 0.02) || (StartLot_s < 0.02))
    {
     Comment("=============================","\n",
     "EXPERT STOPPED!","\n",
      "Ballans = $",AccountBalance(),"\n",
      "Ballans not less =$", (((10-TotalEquityRisk)*100000*Charts)*0.02)," for work on ",Charts," ñharts, ","Symbol - ", Symbol(),",",Period(),"\n",
      "=============================");
      
      Print ("EXPERT STOPPED! Ballans = $",AccountBalance()," Ballans not less =$", (((10-TotalEquityRisk)*100000*Charts)*0.02)," for work on ",Charts," ñharts"); 
      
      return(0);  
      }
//===================Date&Time===============================  
  if(Year()< 2008 )  return(0);// C êàêîãî ãîäà ðàáîòàåò ýêñïåðò!!!
  if (Year()== Years 
  && Month()>= Months// Åñëè âðåìÿ áîëåå âûõîä
  && Day()>= Days
   )  
     {
      Comment("\n","\n","\n","\n","=============================","\n",
      "Current time is ",TimeToStr(CurTime()),"\n",
      "WORK OF THE EXPERT UP TO ",Years,".","0",Months,".","0",Days,"\n",
      "For the help to mailto: sgibnev@bk.ru","\n","=============================");
      Print ("WORK OF THE EXPERT UP TO ",Years,".","0",Months,".","0",Days);
      
      return(0);  
       } 

//==================================================
  
//	if ( IsTesting()!= true )
//	if (IsVisualMode()!= true)
//	if (AccountNumber() != Account1 && AccountNumber() != Account2 && AccountNumber() != Account3) 
//	  	{	
				
//		Comment("=============================","\n",
 //    "EXPERT STOPPED! Invalid Account","\n",
 //    "For the help to mailto: sgibnev@bk.ru",
 //   "\n","=============================");
 //    Print ("EXPERT STOPPED! Invalid Account");   
 //    return(0);  
//	}


//====================================================

	if ( !IsOK() ) { return(0); }

	int _GetLastError, _OrdersTotal = OrdersTotal();

	double l, op;
	double max_lot_b = 0.0, level_b = 0.0, summ_lot_b = 0.0, ave_price_b = 0.0; int count_b = 0; static int last_b = 0;
	double max_lot_s = 0.0, level_s = 0.0, summ_lot_s = 0.0, ave_price_s = 0.0; int count_s = 0; static int last_s = 0;


	for ( int z = _OrdersTotal - 1; z >= 0; z -- )
	{
	//=============================
		 

	
		//================================================	
		if ( !OrderSelect( z, SELECT_BY_POS, MODE_TRADES ) )
		{
			_GetLastError = GetLastError();
			Print( "OrderSelect( ", z, ", SELECT_BY_POS, MODE_TRADES ) - Error #", _GetLastError );
			continue;
		}
		if ( OrderMagicNumber() != _MagicNumber || OrderSymbol() != _Symbol ) continue;

		l = OrderLots();
		op = OrderOpenPrice();

		if ( OrderType() == OP_BUY )
		{
			count_b ++;
			summ_lot_b += l;
			ave_price_b += op*l;
			if ( l > max_lot_b )
			{
				max_lot_b = l;
				level_b = op;
			}
		}

		if ( OrderType() == OP_SELL )
		{
			count_s ++;
			summ_lot_s += l;
			ave_price_s += op*l;
			if ( l > max_lot_s )
			{
				max_lot_s = l;
				level_s = op;
			}
		}
	}

	// check fo close
	if ( max_lot_b > 0.0 )
	{
		ave_price_b = NormalizeDouble( ave_price_b/summ_lot_b, _Digits );
		if ( NormalizeDouble( Bid - ave_price_b - TakeProfit*_Point, _Digits ) >= 0.0 )
		{
			if ( !CloseAll( OP_BUY ) ) return(-1);
			max_lot_b = 0.0;
		}
		if ( StopLoss > 0 && count_b >= MaxTrades )
		{
			if ( NormalizeDouble( level_b - Bid - StopLoss*_Point, _Digits ) >= 0.0 )
			{
				Print( "StopLoss for BUY!" );
				if ( !CloseAll( OP_BUY ) ) return(-1);
				max_lot_b = 0.0;
			}
		}
	}
	if ( max_lot_s > 0.0 )
	{
		ave_price_s = NormalizeDouble( ave_price_s/summ_lot_s, _Digits );
		if ( NormalizeDouble( ave_price_s - Ask - TakeProfit*_Point, _Digits ) >= 0.0 )
		{
			if ( !CloseAll( OP_SELL ) ) return(-1);
			max_lot_s = 0.0;
		}
		if ( StopLoss > 0 && count_s >= MaxTrades )
		{
			if ( NormalizeDouble( Ask - level_s - StopLoss*_Point, _Digits ) >= 0.0 )
			{
				Print( "StopLoss for SELL!" );
				if ( !CloseAll( OP_SELL ) ) return(-1);
				max_lot_s = 0.0;
			}
		}
	}

  if ( aSTLM[1]>0 && count_s>0) StartLot_b = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts/TotalEquityRisk/Profit*2),2));
  //  if ( L2A && count_s>0) StartLot_b = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts*TotalEquityRisk),3));
//  if ( L3 && count_s>0) StartLot_b = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts*TotalEquityRisk),3));
  
 if ( aSTLM[1]<0 && count_b>0) StartLot_s = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts/TotalEquityRisk/Profit*2),2));
//  if ( S2A && count_b>0) StartLot_s = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts*TotalEquityRisk),3));
//  if ( S3 && count_b>0) StartLot_s = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts*TotalEquityRisk),3));



//+------------------------------------------------------------------+
//|                                                       stdlib.mqh |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
RSTL = 
0.001754385964912*Open[shift]
 +0.001754385964912*Open[shift+1]
 +0.001754385964912*Open[shift+2]
 +0.001754385964912*Open[shift+3]
 +0.001754385964912*Open[shift+4]
 +0.001754385964912*Open[shift+5]
 +0.001754385964912*Open[shift+6]
 +0.001754385964912*Open[shift+7]
 +0.001754385964912*Open[shift+8]
 +0.001754385964912*Open[shift+9]
 +0.001754385964912*Open[shift+10]
 +0.001754385964912*Open[shift+11]
 +0.001754385964912*Open[shift+12]
 +0.001754385964912*Open[shift+13]
 +0.001754385964912*Open[shift+14]
 +0.001754385964912*Open[shift+15]
 +0.001754385964912*Open[shift+16]
 +0.001754385964912*Open[shift+17]
 +0.001754385964912*Open[shift+18]
 +0.001754385964912*Open[shift+19]
 +0.001754385964912*Open[shift+20]
 +0.001754385964912*Open[shift+21]
 +0.001754385964912*Open[shift+22]
 +0.001754385964912*Open[shift+23]
 +0.001754385964912*Open[shift+24]
 +0.001754385964912*Open[shift+25]
 +0.001754385964912*Open[shift+26]
 +0.001754385964912*Open[shift+27]
 +0.001754385964912*Open[shift+28]
 +0.001754385964912*Open[shift+29]
 +0.001754385964912*Open[shift+30]
 +0.001754385964912*Open[shift+31]
 +0.001754385964912*Open[shift+32]
 +0.001754385964912*Open[shift+33]
 +0.001754385964912*Open[shift+34]
 +0.001754385964912*Open[shift+35]
 +0.001754385964912*Open[shift+36]
 +0.001754385964912*Open[shift+37]
 +0.001754385964912*Open[shift+38]
 +0.001754385964912*Open[shift+39]
 +0.001754385964912*Open[shift+40]
 +0.001754385964912*Open[shift+41]
 +0.001754385964912*Open[shift+42]
 +0.001754385964912*Open[shift+43]
 +0.001754385964912*Open[shift+44]
 +0.001754385964912*Open[shift+45]
 +0.001754385964912*Open[shift+46]
 +0.001754385964912*Open[shift+47]
 +0.001754385964912*Open[shift+48]
 +0.001754385964912*Open[shift+49]
 +0.001754385964912*Open[shift+50]
 +0.001754385964912*Open[shift+51]
 +0.001754385964912*Open[shift+52]
 +0.001754385964912*Open[shift+53]
 +0.001754385964912*Open[shift+54]
 +0.001754385964912*Open[shift+55]
 +0.001754385964912*Open[shift+56]
 +0.001754385964912*Open[shift+57]
 +0.001754385964912*Open[shift+58]
 +0.001754385964912*Open[shift+59]
 +0.001754385964912*Open[shift+60]
 +0.001754385964912*Open[shift+61]
 +0.001754385964912*Open[shift+62]
 +0.001754385964912*Open[shift+63]
 +0.001754385964912*Open[shift+64]
 +0.001754385964912*Open[shift+65]
 +0.001754385964912*Open[shift+66]
 +0.001754385964912*Open[shift+67]
 +0.001754385964912*Open[shift+68]
 +0.001754385964912*Open[shift+69]
 +0.001754385964912*Open[shift+70]
 +0.001754385964912*Open[shift+71]
 +0.001754385964912*Open[shift+72]
 +0.001754385964912*Open[shift+73]
 +0.001754385964912*Open[shift+74]
 +0.001754385964912*Open[shift+75]
 +0.001754385964912*Open[shift+76]
 +0.001754385964912*Open[shift+77]
 +0.001754385964912*Open[shift+78]
 +0.001754385964912*Open[shift+79]
 +0.001754385964912*Open[shift+80]
 +0.001754385964912*Open[shift+81]
 +0.001754385964912*Open[shift+82]
 +0.001754385964912*Open[shift+83]
 +0.001754385964912*Open[shift+84]
 +0.001754385964912*Open[shift+85]
 +0.001754385964912*Open[shift+86]
 +0.001754385964912*Open[shift+87]
 +0.001754385964912*Open[shift+88]
 +0.001754385964912*Open[shift+89]
 +0.001754385964912*Open[shift+90]
 +0.001754385964912*Open[shift+91]
 +0.001754385964912*Open[shift+92]
 +0.001754385964912*Open[shift+93]
 +0.001754385964912*Open[shift+94]
 +0.001754385964912*Open[shift+95]
 +0.001754385964912*Open[shift+96]
 +0.001754385964912*Open[shift+97]
 +0.001754385964912*Open[shift+98]
 +0.001754385964912*Open[shift+99]
 +0.001754385964912*Open[shift+100]
 +0.001754385964912*Open[shift+101]
 +0.001754385964912*Open[shift+102]
 +0.001754385964912*Open[shift+103]
 +0.001754385964912*Open[shift+104]
 +0.001754385964912*Open[shift+105]
 +0.001754385964912*Open[shift+106]
 +0.001754385964912*Open[shift+107]
 +0.001754385964912*Open[shift+108]
 +0.001754385964912*Open[shift+109]
 +0.001754385964912*Open[shift+110]
 +0.001754385964912*Open[shift+111]
 +0.001754385964912*Open[shift+112]
 +0.001754385964912*Open[shift+113]
 +0.001754385964912*Open[shift+114]
 +0.001754385964912*Open[shift+115]
 +0.001754385964912*Open[shift+116]
 +0.001754385964912*Open[shift+117]
 +0.001754385964912*Open[shift+118]
 +0.001754385964912*Open[shift+119]
 +0.001754385964912*Open[shift+120]
 +0.001754385964912*Open[shift+121]
 +0.001754385964912*Open[shift+122]
 +0.001754385964912*Open[shift+123]
 +0.001754385964912*Open[shift+124]
 +0.001754385964912*Open[shift+125]
 +0.001754385964912*Open[shift+126]
 +0.001754385964912*Open[shift+127]
 +0.001754385964912*Open[shift+128]
 +0.001754385964912*Open[shift+129]
 +0.001754385964912*Open[shift+130]
 +0.001754385964912*Open[shift+131]
 +0.001754385964912*Open[shift+132]
 +0.001754385964912*Open[shift+133]
 +0.001754385964912*Open[shift+134]
 +0.001754385964912*Open[shift+135]
 +0.001754385964912*Open[shift+136]
 +0.001754385964912*Open[shift+137]
 +0.001754385964912*Open[shift+138]
 +0.001754385964912*Open[shift+139]
 +0.001754385964912*Open[shift+140]
 +0.001754385964912*Open[shift+141]
 +0.001754385964912*Open[shift+142]
 +0.001754385964912*Open[shift+143]
 +0.001754385964912*Open[shift+144]
 +0.001754385964912*Open[shift+145]
 +0.001754385964912*Open[shift+146]
 +0.001754385964912*Open[shift+147]
 +0.001754385964912*Open[shift+148]
 +0.001754385964912*Open[shift+149]
 +0.001754385964912*Open[shift+150]
 +0.001754385964912*Open[shift+151]
 +0.001754385964912*Open[shift+152]
 +0.001754385964912*Open[shift+153]
 +0.001754385964912*Open[shift+154]
 +0.001754385964912*Open[shift+155]
 +0.001754385964912*Open[shift+156]
 +0.001754385964912*Open[shift+157]
 +0.001754385964912*Open[shift+158]
 +0.001754385964912*Open[shift+159]
 +0.001754385964912*Open[shift+160]
 +0.001754385964912*Open[shift+161]
 +0.001754385964912*Open[shift+162]
 +0.001754385964912*Open[shift+163]
 +0.001754385964912*Open[shift+164]
 +0.001754385964912*Open[shift+165]
 +0.001754385964912*Open[shift+166]
 +0.001754385964912*Open[shift+167]
 +0.001754385964912*Open[shift+168]
 +0.001754385964912*Open[shift+169]
 +0.001754385964912*Open[shift+170]
 +0.001754385964912*Open[shift+171]
 +0.001754385964912*Open[shift+172]
 +0.001754385964912*Open[shift+173]
 +0.001754385964912*Open[shift+174]
 +0.001754385964912*Open[shift+175]
 +0.001754385964912*Open[shift+176]
 +0.001754385964912*Open[shift+177]
 +0.001754385964912*Open[shift+178]
 +0.001754385964912*Open[shift+179]
 +0.001754385964912*Open[shift+180]
 +0.001754385964912*Open[shift+181]
 +0.001754385964912*Open[shift+182]
 +0.001754385964912*Open[shift+183]
 +0.001754385964912*Open[shift+184]
 +0.001754385964912*Open[shift+185]
 +0.001754385964912*Open[shift+186]
 +0.001754385964912*Open[shift+187]
 +0.001754385964912*Open[shift+188]
 +0.001754385964912*Open[shift+189]
 +0.001754385964912*Open[shift+190]
 +0.001754385964912*Open[shift+191]
 +0.001754385964912*Open[shift+192]
 +0.001754385964912*Open[shift+193]
 +0.001754385964912*Open[shift+194]
 +0.001754385964912*Open[shift+195]
 +0.001754385964912*Open[shift+196]
 +0.001754385964912*Open[shift+197]
 +0.001754385964912*Open[shift+198]
 +0.001754385964912*Open[shift+199]
 +0.001754385964912*Open[shift+200]
 +0.001754385964912*Open[shift+201]
 +0.001754385964912*Open[shift+202]
 +0.001754385964912*Open[shift+203]
 +0.001754385964912*Open[shift+204]
 +0.001754385964912*Open[shift+205]
 +0.001754385964912*Open[shift+206]
 +0.001754385964912*Open[shift+207]
 +0.001754385964912*Open[shift+208]
 +0.001754385964912*Open[shift+209]
 +0.001754385964912*Open[shift+210]
 +0.001754385964912*Open[shift+211]
 +0.001754385964912*Open[shift+212]
 +0.001754385964912*Open[shift+213]
 +0.001754385964912*Open[shift+214]
 +0.001754385964912*Open[shift+215]
 +0.001754385964912*Open[shift+216]
 +0.001754385964912*Open[shift+217]
 +0.001754385964912*Open[shift+218]
 +0.001754385964912*Open[shift+219]
 +0.001754385964912*Open[shift+220]
 +0.001754385964912*Open[shift+221]
 +0.001754385964912*Open[shift+222]
 +0.001754385964912*Open[shift+223]
 +0.001754385964912*Open[shift+224]
 +0.001754385964912*Open[shift+225]
 +0.001754385964912*Open[shift+226]
 +0.001754385964912*Open[shift+227]
 +0.001754385964912*Open[shift+228]
 +0.001754385964912*Open[shift+229]
 +0.001754385964912*Open[shift+230]
 +0.001754385964912*Open[shift+231]
 +0.001754385964912*Open[shift+232]
 +0.001754385964912*Open[shift+233]
 +0.001754385964912*Open[shift+234]
 +0.001754385964912*Open[shift+235]
 +0.001754385964912*Open[shift+236]
 +0.001754385964912*Open[shift+237]
 +0.001754385964912*Open[shift+238]
 +0.001754385964912*Open[shift+239]
 +0.001754385964912*Open[shift+240]
 +0.001754385964912*Open[shift+241]
 +0.001754385964912*Open[shift+242]
 +0.001754385964912*Open[shift+243]
 +0.001754385964912*Open[shift+244]
 +0.001754385964912*Open[shift+245]
 +0.001754385964912*Open[shift+246]
 +0.001754385964912*Open[shift+247]
 +0.001754385964912*Open[shift+248]
 +0.001754385964912*Open[shift+249]
 +0.001754385964912*Open[shift+250]
 +0.001754385964912*Open[shift+251]
 +0.001754385964912*Open[shift+252]
 +0.001754385964912*Open[shift+253]
 +0.001754385964912*Open[shift+254]
 +0.001754385964912*Open[shift+255]
 +0.001754385964912*Open[shift+256]
 +0.001754385964912*Open[shift+257]
 +0.001754385964912*Open[shift+258]
 +0.001754385964912*Open[shift+259]
 +0.001754385964912*Open[shift+260]
 +0.001754385964912*Open[shift+261]
 +0.001754385964912*Open[shift+262]
 +0.001754385964912*Open[shift+263]
 +0.001754385964912*Open[shift+264]
 +0.001754385964912*Open[shift+265]
 +0.001754385964912*Open[shift+266]
 +0.001754385964912*Open[shift+267]
 +0.001754385964912*Open[shift+268]
 +0.001754385964912*Open[shift+269]
 +0.001754385964912*Open[shift+270]
 +0.001754385964912*Open[shift+271]
 +0.001754385964912*Open[shift+272]
 +0.001754385964912*Open[shift+273]
 +0.001754385964912*Open[shift+274]
 +0.001754385964912*Open[shift+275]
 +0.001754385964912*Open[shift+276]
 +0.001754385964912*Open[shift+277]
 +0.001754385964912*Open[shift+278]
 +0.001754385964912*Open[shift+279]
 +0.001754385964912*Open[shift+280]
 +0.001754385964912*Open[shift+281]
 +0.001754385964912*Open[shift+282]
 +0.001754385964912*Open[shift+283]
 +0.001754385964912*Open[shift+284]
 +0.001754385964912*Open[shift+285]
 +0.001754385964912*Open[shift+286]
 +0.001754385964912*Open[shift+287]
 +0.001754385964912*Open[shift+288]
 +0.001754385964912*Open[shift+289]
 +0.001754385964912*Open[shift+290]
 +0.001754385964912*Open[shift+291]
 +0.001754385964912*Open[shift+292]
 +0.001754385964912*Open[shift+293]
 +0.001754385964912*Open[shift+294]
 +0.001754385964912*Open[shift+295]
 +0.001754385964912*Open[shift+296]
 +0.001754385964912*Open[shift+297]
 +0.001754385964912*Open[shift+298]
 +0.001754385964912*Open[shift+299]
 +0.001754385964912*Open[shift+300]
 +0.001754385964912*Open[shift+301]
 +0.001754385964912*Open[shift+302]
 +0.001754385964912*Open[shift+303]
 +0.001754385964912*Open[shift+304]
 +0.001754385964912*Open[shift+305]
 +0.001754385964912*Open[shift+306]
 +0.001754385964912*Open[shift+307]
 +0.001754385964912*Open[shift+308]
 +0.001754385964912*Open[shift+309]
 +0.001754385964912*Open[shift+310]
 +0.001754385964912*Open[shift+311]
 +0.001754385964912*Open[shift+312]
 +0.001754385964912*Open[shift+313]
 +0.001754385964912*Open[shift+314]
 +0.001754385964912*Open[shift+315]
 +0.001754385964912*Open[shift+316]
 +0.001754385964912*Open[shift+317]
 +0.001754385964912*Open[shift+318]
 +0.001754385964912*Open[shift+319]
 +0.001754385964912*Open[shift+320]
 +0.001754385964912*Open[shift+321]
 +0.001754385964912*Open[shift+322]
 +0.001754385964912*Open[shift+323]
 +0.001754385964912*Open[shift+324]
 +0.001754385964912*Open[shift+325]
 +0.001754385964912*Open[shift+326]
 +0.001754385964912*Open[shift+327]
 +0.001754385964912*Open[shift+328]
 +0.001754385964912*Open[shift+329]
 +0.001754385964912*Open[shift+330]
 +0.001754385964912*Open[shift+331]
 +0.001754385964912*Open[shift+332]
 +0.001754385964912*Open[shift+333]
 +0.001754385964912*Open[shift+334]
 +0.001754385964912*Open[shift+335]
 +0.001754385964912*Open[shift+336]
 +0.001754385964912*Open[shift+337]
 +0.001754385964912*Open[shift+338]
 +0.001754385964912*Open[shift+339]
 +0.001754385964912*Open[shift+340]
 +0.001754385964912*Open[shift+341]
 +0.001754385964912*Open[shift+342]
 +0.001754385964912*Open[shift+343]
 +0.001754385964912*Open[shift+344]
 +0.001754385964912*Open[shift+345]
 +0.001754385964912*Open[shift+346]
 +0.001754385964912*Open[shift+347]
 +0.001754385964912*Open[shift+348]
 +0.001754385964912*Open[shift+349]
 +0.001754385964912*Open[shift+350]
 +0.001754385964912*Open[shift+351]
 +0.001754385964912*Open[shift+352]
 +0.001754385964912*Open[shift+353]
 +0.001754385964912*Open[shift+354]
 +0.001754385964912*Open[shift+355]
 +0.001754385964912*Open[shift+356]
 +0.001754385964912*Open[shift+357]
 +0.001754385964912*Open[shift+358]
 +0.001754385964912*Open[shift+359]
 +0.001754385964912*Open[shift+360]
 +0.001754385964912*Open[shift+361]
 +0.001754385964912*Open[shift+362]
 +0.001754385964912*Open[shift+363]
 +0.001754385964912*Open[shift+364]
 +0.001754385964912*Open[shift+365]
 +0.001754385964912*Open[shift+366]
 +0.001754385964912*Open[shift+367]
 +0.001754385964912*Open[shift+368]
 +0.001754385964912*Open[shift+369]
 +0.001754385964912*Open[shift+370]
 +0.001754385964912*Open[shift+371]
 +0.001754385964912*Open[shift+372]
 +0.001754385964912*Open[shift+373]
 +0.001754385964912*Open[shift+374]
 +0.001754385964912*Open[shift+375]
 +0.001754385964912*Open[shift+376]
 +0.001754385964912*Open[shift+377]
 +0.001754385964912*Open[shift+378]
 +0.001754385964912*Open[shift+379]
 +0.001754385964912*Open[shift+380]
 +0.001754385964912*Open[shift+381]
 +0.001754385964912*Open[shift+382]
 +0.001754385964912*Open[shift+383]
 +0.001754385964912*Open[shift+384]
 +0.001754385964912*Open[shift+385]
 +0.001754385964912*Open[shift+386]
 +0.001754385964912*Open[shift+387]
 +0.001754385964912*Open[shift+388]
 +0.001754385964912*Open[shift+389]
 +0.001754385964912*Open[shift+390]
 +0.001754385964912*Open[shift+391]
 +0.001754385964912*Open[shift+392]
 +0.001754385964912*Open[shift+393]
 +0.001754385964912*Open[shift+394]
 +0.001754385964912*Open[shift+395]
 +0.001754385964912*Open[shift+396]
 +0.001754385964912*Open[shift+397]
 +0.001754385964912*Open[shift+398]
 +0.001754385964912*Open[shift+399]
 +0.001754385964912*Open[shift+400]
 +0.001754385964912*Open[shift+401]
 +0.001754385964912*Open[shift+402]
 +0.001754385964912*Open[shift+403]
 +0.001754385964912*Open[shift+404]
 +0.001754385964912*Open[shift+405]
 +0.001754385964912*Open[shift+406]
 +0.001754385964912*Open[shift+407]
 +0.001754385964912*Open[shift+408]
 +0.001754385964912*Open[shift+409]
 +0.001754385964912*Open[shift+410]
 +0.001754385964912*Open[shift+411]
 +0.001754385964912*Open[shift+412]
 +0.001754385964912*Open[shift+413]
 +0.001754385964912*Open[shift+414]
 +0.001754385964912*Open[shift+415]
 +0.001754385964912*Open[shift+416]
 +0.001754385964912*Open[shift+417]
 +0.001754385964912*Open[shift+418]
 +0.001754385964912*Open[shift+419]
 +0.001754385964912*Open[shift+420]
 +0.001754385964912*Open[shift+421]
 +0.001754385964912*Open[shift+422]
 +0.001754385964912*Open[shift+423]
 +0.001754385964912*Open[shift+424]
 +0.001754385964912*Open[shift+425]
 +0.001754385964912*Open[shift+426]
 +0.001754385964912*Open[shift+427]
 +0.001754385964912*Open[shift+428]
 +0.001754385964912*Open[shift+429]
 +0.001754385964912*Open[shift+430]
 +0.001754385964912*Open[shift+431]
 +0.001754385964912*Open[shift+432]
 +0.001754385964912*Open[shift+433]
 +0.001754385964912*Open[shift+434]
 +0.001754385964912*Open[shift+435]
 +0.001754385964912*Open[shift+436]
 +0.001754385964912*Open[shift+437]
 +0.001754385964912*Open[shift+438]
 +0.001754385964912*Open[shift+439]
 +0.001754385964912*Open[shift+440]
 +0.001754385964912*Open[shift+441]
 +0.001754385964912*Open[shift+442]
 +0.001754385964912*Open[shift+443]
 +0.001754385964912*Open[shift+444]
 +0.001754385964912*Open[shift+445]
 +0.001754385964912*Open[shift+446]
 +0.001754385964912*Open[shift+447]
 +0.001754385964912*Open[shift+448]
 +0.001754385964912*Open[shift+449]
 +0.001754385964912*Open[shift+450]
 +0.001754385964912*Open[shift+451]
 +0.001754385964912*Open[shift+452]
 +0.001754385964912*Open[shift+453]
 +0.001754385964912*Open[shift+454]
 +0.001754385964912*Open[shift+455]
 +0.001754385964912*Open[shift+456]
 +0.001754385964912*Open[shift+457]
 +0.001754385964912*Open[shift+458]
 +0.001754385964912*Open[shift+459]
 +0.001754385964912*Open[shift+460]
 +0.001754385964912*Open[shift+461]
 +0.001754385964912*Open[shift+462]
 +0.001754385964912*Open[shift+463]
 +0.001754385964912*Open[shift+464]
 +0.001754385964912*Open[shift+465]
 +0.001754385964912*Open[shift+466]
 +0.001754385964912*Open[shift+467]
 +0.001754385964912*Open[shift+468]
 +0.001754385964912*Open[shift+469]
 +0.001754385964912*Open[shift+470]
 +0.001754385964912*Open[shift+471]
 +0.001754385964912*Open[shift+472]
 +0.001754385964912*Open[shift+473]
 +0.001754385964912*Open[shift+474]
 +0.001754385964912*Open[shift+475]
 +0.001754385964912*Open[shift+476]
 +0.001754385964912*Open[shift+477]
 +0.001754385964912*Open[shift+478]
 +0.001754385964912*Open[shift+479]
 +0.001754385964912*Open[shift+480]
 +0.001754385964912*Open[shift+481]
 +0.001754385964912*Open[shift+482]
 +0.001754385964912*Open[shift+483]
 +0.001754385964912*Open[shift+484]
 +0.001754385964912*Open[shift+485]
 +0.001754385964912*Open[shift+486]
 +0.001754385964912*Open[shift+487]
 +0.001754385964912*Open[shift+488]
 +0.001754385964912*Open[shift+489]
 +0.001754385964912*Open[shift+490]
 +0.001754385964912*Open[shift+491]
 +0.001754385964912*Open[shift+492]
 +0.001754385964912*Open[shift+493]
 +0.001754385964912*Open[shift+494]
 +0.001754385964912*Open[shift+495]
 +0.001754385964912*Open[shift+496]
 +0.001754385964912*Open[shift+497]
 +0.001754385964912*Open[shift+498]
 +0.001754385964912*Open[shift+499]
 +0.001754385964912*Open[shift+500]
 +0.001754385964912*Open[shift+501]
 +0.001754385964912*Open[shift+502]
 +0.001754385964912*Open[shift+503]
 +0.001754385964912*Open[shift+504]
 +0.001754385964912*Open[shift+505]
 +0.001754385964912*Open[shift+506]
 +0.001754385964912*Open[shift+507]
 +0.001754385964912*Open[shift+508]
 +0.001754385964912*Open[shift+509]
 +0.001754385964912*Open[shift+510]
 +0.001754385964912*Open[shift+511]
 +0.001754385964912*Open[shift+512]
 +0.001754385964912*Open[shift+513]
 +0.001754385964912*Open[shift+514]
 +0.001754385964912*Open[shift+515]
 +0.001754385964912*Open[shift+516]
 +0.001754385964912*Open[shift+517]
 +0.001754385964912*Open[shift+518]
 +0.001754385964912*Open[shift+519]
 +0.001754385964912*Open[shift+520]
 +0.001754385964912*Open[shift+521]
 +0.001754385964912*Open[shift+522]
 +0.001754385964912*Open[shift+523]
 +0.001754385964912*Open[shift+524]
 +0.001754385964912*Open[shift+525]
 +0.001754385964912*Open[shift+526]
 +0.001754385964912*Open[shift+527]
 +0.001754385964912*Open[shift+528]
 +0.001754385964912*Open[shift+529]
 +0.001754385964912*Open[shift+530]
 +0.001754385964912*Open[shift+531]
 +0.001754385964912*Open[shift+532]
 +0.001754385964912*Open[shift+533]
 +0.001754385964912*Open[shift+534]
 +0.001754385964912*Open[shift+535]
 +0.001754385964912*Open[shift+536]
 +0.001754385964912*Open[shift+537]
 +0.001754385964912*Open[shift+538]
 +0.001754385964912*Open[shift+539]
 +0.001754385964912*Open[shift+540]
 +0.001754385964912*Open[shift+541]
 +0.001754385964912*Open[shift+542]
 +0.001754385964912*Open[shift+543]
 +0.001754385964912*Open[shift+544]
 +0.001754385964912*Open[shift+545]
 +0.001754385964912*Open[shift+546]
 +0.001754385964912*Open[shift+547]
 +0.001754385964912*Open[shift+548]
 +0.001754385964912*Open[shift+549]
 +0.001754385964912*Open[shift+550]
 +0.001754385964912*Open[shift+551]
 +0.001754385964912*Open[shift+552]
 +0.001754385964912*Open[shift+553]
 +0.001754385964912*Open[shift+554]
 +0.001754385964912*Open[shift+555]
 +0.001754385964912*Open[shift+556]
 +0.001754385964912*Open[shift+557]
 +0.001754385964912*Open[shift+558]
 +0.001754385964912*Open[shift+559]
 +0.001754385964912*Open[shift+560]
 +0.001754385964912*Open[shift+561]
 +0.001754385964912*Open[shift+562]
 +0.001754385964912*Open[shift+563]
 +0.001754385964912*Open[shift+564]
 +0.001754385964912*Open[shift+565]
 +0.001754385964912*Open[shift+566]
 +0.001754385964912*Open[shift+567]
 +0.001754385964912*Open[shift+568]
 +0.001754385964912*Open[shift+569];
  

RFTL = 
-0.0025097319*Open[shift+0]
+0.0513007762*Open[shift+1]
+0.1142800493*Open[shift+2]
+0.1699342860*Open[shift+3]
+0.2025269304*Open[shift+4]
+0.2025269304*Open[shift+5]
+0.1699342860*Open[shift+6]
+0.1142800493*Open[shift+7]
+0.0513007762*Open[shift+8]
-0.0025097319*Open[shift+9]
-0.0353166244*Open[shift+10]
-0.0433375629*Open[shift+11]
-0.0311244617*Open[shift+12]
-0.0088618137*Open[shift+13]
+0.0120580088*Open[shift+14]
+0.0233183633*Open[shift+15]
+0.0221931304*Open[shift+16]
+0.0115769653*Open[shift+17]
-0.0022157966*Open[shift+18]
-0.0126536111*Open[shift+19]
-0.0157416029*Open[shift+20]
-0.0113395830*Open[shift+21]
-0.0025905610*Open[shift+22]
+0.0059521459*Open[shift+23]
+0.0105212252*Open[shift+24]
+0.0096970755*Open[shift+25]
+0.0046585685*Open[shift+26]
-0.0017079230*Open[shift+27]
-0.0063513565*Open[shift+28]
-0.0074539350*Open[shift+29]
-0.0050439973*Open[shift+30]
-0.0007459678*Open[shift+31]
+0.0032271474*Open[shift+32]
+0.0051357867*Open[shift+33]
+0.0044454862*Open[shift+34]
+0.0018784961*Open[shift+35]
-0.0011065767*Open[shift+36]
-0.0031162862*Open[shift+37]
-0.0033443253*Open[shift+38]
-0.0022163335*Open[shift+39]
+0.0002573669*Open[shift+40]
+0.0003650790*Open[shift+41]
+0.0060440751*Open[shift+42]
+0.0018747783*Open[shift+43];	

	FATL = 
0.4360409450*Open[shift+0]
+0.3658689069*Open[shift+1]
+0.2460452079*Open[shift+2]
+0.1104506886*Open[shift+3]
-0.0054034585*Open[shift+4]
-0.0760367731*Open[shift+5]
-0.0933058722*Open[shift+6]
-0.0670110374*Open[shift+7]
-0.0190795053*Open[shift+8]
+0.0259609206*Open[shift+9]
+0.0502044896*Open[shift+10]
+0.0477818607*Open[shift+11]
+0.0249252327*Open[shift+12]
-0.0047706151*Open[shift+13]
-0.0272432537*Open[shift+14]
-0.0338917071*Open[shift+15]
-0.0244141482*Open[shift+16]
-0.0055774838*Open[shift+17]
+0.0128149838*Open[shift+18]
+0.0226522218*Open[shift+19]
+0.0208778257*Open[shift+20]
+0.0100299086*Open[shift+21]
-0.0036771622*Open[shift+22]
-0.0136744850*Open[shift+23]
-0.0160483392*Open[shift+24]
-0.0108597376*Open[shift+25]
-0.0016060704*Open[shift+26]
+0.0069480557*Open[shift+27]
+0.0110573605*Open[shift+28]
+0.0095711419*Open[shift+29]
+0.0040444064*Open[shift+30]
-0.0023824623*Open[shift+31]
-0.0067093714*Open[shift+32]
-0.0072003400*Open[shift+33]
-0.0047717710*Open[shift+34]
+0.0005541115*Open[shift+35]
+0.0007860160*Open[shift+36]
+0.0130129076*Open[shift+37]
+0.0040364019*Open[shift+38];

SATL = 
0.0982862174*Open[shift+0]
+0.0975682269*Open[shift+1]
+0.0961401078*Open[shift+2]
+0.0940230544*Open[shift+3]
+0.0912437090*Open[shift+4]
+0.0878391006*Open[shift+5]
+0.0838544303*Open[shift+6]
+0.0793406350*Open[shift+7]
+0.0743569346*Open[shift+8]
+0.0689666682*Open[shift+9]
+0.0632381578*Open[shift+10]
+0.0572428925*Open[shift+11]
+0.0510534242*Open[shift+12]
+0.0447468229*Open[shift+13]
+0.0383959950*Open[shift+14]
+0.0320735368*Open[shift+15]
+0.0258537721*Open[shift+16]
+0.0198005183*Open[shift+17]
+0.0139807863*Open[shift+18]
+0.0084512448*Open[shift+19]
+0.0032639979*Open[shift+20]
-0.0015350359*Open[shift+21]
-0.0059060082*Open[shift+22]
-0.0098190256*Open[shift+23]
-0.0132507215*Open[shift+24]
-0.0161875265*Open[shift+25]
-0.0186164872*Open[shift+26]
-0.0205446727*Open[shift+27]
-0.0219739146*Open[shift+28]
-0.0229204861*Open[shift+29]
-0.0234080863*Open[shift+30]
-0.0234566315*Open[shift+31]
-0.0231017777*Open[shift+32]
-0.0223796900*Open[shift+33]
-0.0213300463*Open[shift+34]
-0.0199924534*Open[shift+35]
-0.0184126992*Open[shift+36]
-0.0166377699*Open[shift+37]
-0.0147139428*Open[shift+38]
-0.0126796776*Open[shift+39]
-0.0105938331*Open[shift+40]
-0.0084736770*Open[shift+41]
-0.0063841850*Open[shift+42]
-0.0043466731*Open[shift+43]
-0.0023956944*Open[shift+44]
-0.0005535180*Open[shift+45]
+0.0011421469*Open[shift+46]
+0.0026845693*Open[shift+47]
+0.0040471369*Open[shift+48]
+0.0052380201*Open[shift+49]
+0.0062194591*Open[shift+50]
+0.0070340085*Open[shift+51]
+0.0076266453*Open[shift+52]
+0.0080376628*Open[shift+53]
+0.0083037666*Open[shift+54]
+0.0083694798*Open[shift+55]
+0.0082901022*Open[shift+56]
+0.0080741359*Open[shift+57]
+0.0077543820*Open[shift+58]
+0.0073260526*Open[shift+59]
+0.0068163569*Open[shift+60]
+0.0062325477*Open[shift+61]
+0.0056078229*Open[shift+62]
+0.0049516078*Open[shift+63]
+0.0161380976*Open[shift+64];


PCCI = Open[shift]-FATL ;

FTLM = FATL - RSTL ;
STLM = SATL - RSTL ;
RBCI = FATL - SATL ;

aRBCI[4]=aRBCI[3] ; 
aRBCI[3]=aRBCI[2] ; 
aRBCI[2]=aRBCI[1] ; 
aRBCI[1]=RBCI ;

aSATL[4]=aSATL[3] ; 
aSATL[3]=aSATL[2] ; 
aSATL[2]=aSATL[1] ; 
aSATL[1]=SATL ;

aFATL[4]=aFATL[4] ; 
aFATL[3]=aFATL[2] ; 
aFATL[2]=aFATL[1] ; 
aFATL[1]=FATL ;

aRFTL[4]=aRFTL[3] ; 
aRFTL[3]=aRFTL[2] ; 
aRFTL[2]=aRFTL[1] ; 
aRFTL[1]=RFTL ;

aRSTL[4]=aRSTL[3] ; 
aRSTL[3]=aRSTL[2] ; 
aRSTL[2]=aRSTL[1] ; 
aRSTL[1]=RSTL ;

aFTLM[4]=aFTLM[3] ; 
aFTLM[3]=aFTLM[2] ; 
aFTLM[2]=aFTLM[1] ; 
aFTLM[1]=FTLM ;

aSTLM[4]=aSTLM[3] ; 
aSTLM[3]=aSTLM[2] ; 
aSTLM[2]=aSTLM[1] ; 
aSTLM[1]=STLM ;


aPCCI[4]=aPCCI[3] ; 
aPCCI[3]=aPCCI[2] ; 
aPCCI[2]=aPCCI[1] ; 
aPCCI[1]=PCCI ;
//===================ARCTAN==================
tFATL = MathArctan(MathAbs(aFATL[1]-aFATL[2])/0.0005)*180/3.1415926;
tRFTL = MathArctan(MathAbs(aRFTL[1]-aRFTL[2])/0.0005)*180/3.1415926;
tSATL = MathArctan(MathAbs(aSATL[1]-aSATL[2])/0.0005)*180/3.1415926;
tRSTL = MathArctan(MathAbs(aRSTL[1]-aRSTL[2])/0.0005)*180/3.1415926;
tFTLM = MathArctan(MathAbs(aFTLM[1]-aFTLM[2])/0.0005)*180/3.1415926;
tRBCI = MathArctan(MathAbs(aRBCI[1]-aRBCI[2])/0.0005)*180/3.1415926;
tSTLM = MathArctan(MathAbs(aSTLM[1]-aSTLM[2])/0.0005)*180/3.1415926;
tPCCI = MathArctan(MathAbs(aPCCI[1]-aPCCI[2])/0.0005)*180/3.1415926;
       
atFATL[2]=atFATL[1];
atFATL[1]=tFATL;





//========== S I G N A L S ========

//================== 1 ============

//================ 5 ================       
L5=


aPCCI[1]<0
//&& aPCCI[2]<0
//&& aPCCI[1]<aPCCI[2]
&& aRBCI[1]<0
//aSTLM[1]>0
//&& aSATL[1]>aSATL[2]
//&& MathAbs(aRBCI[1])>(RBCImax*Point)
//&& MathAbs(aPCCI[1])>(PCCImax*Point)
;
S5=
aPCCI[1]>0
//&& aPCCI[2]>0
//&& aPCCI[1]>aPCCI[2]
&& aRBCI[1]>0
//aSTLM[1]<0
//&& aSATL[1]<aSATL[2]
//&& MathAbs(aRBCI[1])>(RBCImax*Point)
//&& MathAbs(aPCCI[1])>(PCCImax*Point)
;
//================ 6 ===============


Comment 
(
//"\n","\n","\n","\n",
"----------------------------------------------------------------","\n",
"Charts = ",Charts,"\n",
"TotalEquityRisk  = ",TotalEquityRisk,"\n",
"----------------------------------------------------------------","\n",
"Symbol - ", Symbol(),",",Period(),"\n",
"----------------------------------------------------------------","\n",
"AccountNumber # ",AccountNumber(),"\n",
"AccountName - ",AccountName(),"\n",
"----------------------------------------------------------------","\n",
"Ballans = $",NormalizeDouble(AccountBalance(),2),"\n",
"Equity  = $",AccountEquity (),"\n",
//"Margin  = $",AccountMargin (),"\n",
"----------------------------------------------------------------","\n",
"StartLot    LONG = ",NormalizeDouble(StartLot_b,2),"\n",
"ORDERS  LONG = ",count_b,"\n","\n",
"StartLot   SHORT = ",NormalizeDouble(StartLot_s,2),"\n",
"ORDERS SHORT = ",count_s,"\n",
"----------------------------------------------------------------","\n",
"Current time is   ",TimeToStr(CurTime()),"\n",
"EXPERT UP TO ",Years,".","0",Months,".",Days,"\n",
//"Account1=",Account1,", Account2=",Account2,", Account3=",Account3,"\n",
"----------------------------------------------------------------","\n",
"For the help to mailto: sgibnev@bk.ru");


	if ( TradeDirection >= 0    
      &&   count_b < MaxTrades)
	{
		if ( count_b == 0 )
		{
			if (Time[0] > last_b 
//&& L1
//|| L2A
 //|| L3

// || L8
			      )
					{
if(L1 == true) Print("L1 by order opened"," StartLot=", StartLot_b);
if(L2A == true) Print("L2A by order opened"," StartLot=", StartLot_b);
if(L5 == true) Print("L5 by order opened"," StartLot=", StartLot_b);
if(L6 == true) Print("L6 by order opened"," StartLot=", StartLot_b);

//  StartLot = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts),3));

 

			  
			
        //Print( "LastStopLoss for SELL!" );
	    //	if ( !CloseAll( OP_SELL ) ) return(-1);
		//	max_lot_s = 0.0;
		

		
			}
		}
		else

		{
		   //PipStep = PipStep+StepMode;
			if ( level_b -(PipStep*Point)>= Ask ) OpenBuy( LotExponent*max_lot_b );
	       		}
	}

	// check fo sell
	if (TradeDirection <= 0 
      &&  count_s < MaxTrades)
	{
		if ( count_s == 0 )
		{
			if ( Time[0] > last_s 
// && S1
 //|| S2A

			)
				
			{
if(S1 == true) Print("S1 sell order opened"," StartLot=", StartLot_s);
if(S2A == true) Print("S2A sell order opened"," StartLot=", StartLot_s);
if(S5 == true) Print("S5 sell order opened"," StartLot=", StartLot_s);
if(S6 == true) Print("S6 sell order opened"," StartLot=", StartLot_s);
 
 // StartLot = (NormalizeDouble(AccountBalance()/((10-TotalEquityRisk)*100000*Charts),3));

		
		//	 StartLot = (NormalizeDouble(AccountEquity()/((10-TotalEquityRisk)*100000),2));
		
         // Print( "LastStopLoss for BUY!" );
	//	if ( !CloseAll( OP_BUY ) ) return(-1);

		
	//	max_lot_b = 0.0;
                      
           
			}
		}
		else
		
		{
			//if (StepMode>0)OpenSell(PipStep*LotExponent*count_s);
			
			if ( level_s +(PipStep*Point)<= Bid ) OpenSell(LotExponent*max_lot_s);
	//	if (StepMode>0)	PipStepShort = (StepMode*count_s*LotExponent);
		
		}
	}

	return(0);
}
		
			
void OpenBuy( double Lot )
{
	double _OpenPriceLevel, _StopLossLevel = 0.0, _TakeProfitLevel = 0.0;
	_OpenPriceLevel = NormalizeDouble( Ask, _Digits );
	_TakeProfitLevel = 0.0; //NormalizeDouble( Ask + (TakeProfit + 25)*_Point, _Digits );

	double 	lot_min		= MarketInfo( _Symbol, MODE_MINLOT  );
	double 	lot_max		= MarketInfo( _Symbol, MODE_MAXLOT  );
	double 	lot_step		= MarketInfo( _Symbol, MODE_LOTSTEP );

	Lot = NormalizeDouble( Lot / lot_step, 0 ) * lot_step;
	if ( Lot < lot_min ) Lot = lot_min;
	if ( Lot > lot_max ) Lot = lot_max;

	double needmargin = AccountFreeMarginCheck( Symbol(), OP_BUY, Lot );

	if ( needmargin < 5 || GetLastError() == 134 )
	{
		Print( "We have no money!!!" );
		return(-1);
	}

	if ( _OrderSend ( _Symbol, OP_BUY, Lot, _OpenPriceLevel, Slippage, _StopLossLevel, _TakeProfitLevel, "", _MagicNumber ) < 0 )
		Alert( strComment, ": Error opening Long position!" );
}

void OpenSell( double Lot )
{
	double _OpenPriceLevel, _StopLossLevel = 0.0, _TakeProfitLevel = 0.0;
	_OpenPriceLevel = NormalizeDouble( Bid, _Digits );
	_TakeProfitLevel = 0.0; //NormalizeDouble( Bid - (TakeProfit + 25)*_Point, _Digits );

	double 	lot_min		= MarketInfo( _Symbol, MODE_MINLOT  );
	double 	lot_max		= MarketInfo( _Symbol, MODE_MAXLOT  );
	double 	lot_step		= MarketInfo( _Symbol, MODE_LOTSTEP );

	Lot = NormalizeDouble( Lot / lot_step, 0 ) * lot_step;
	if ( Lot < lot_min ) Lot = lot_min;
	if ( Lot > lot_max ) Lot = lot_max;

	double needmargin = AccountFreeMarginCheck( Symbol(), OP_SELL, Lot );

	if ( needmargin < 5 || GetLastError() == 134 )
	{
		Print( "We have no money!!!" );
		return(-1);
	}

	if ( _OrderSend ( _Symbol, OP_SELL, Lot, _OpenPriceLevel, Slippage, _StopLossLevel, _TakeProfitLevel, "", _MagicNumber ) < 0 )
		Alert( strComment, ": Error opening SHORT position!" );
}

bool CloseAll( int type = -1 )
{
	bool result = true;
	int _GetLastError, _OrdersTotal = OrdersTotal();
	for ( int z = _OrdersTotal - 1; z >= 0; z -- )
	{
		if ( !OrderSelect( z, SELECT_BY_POS, MODE_TRADES ) )
		{
			_GetLastError = GetLastError();
			Print( "OrderSelect( ", z, ", SELECT_BY_POS, MODE_TRADES ) - Error #", _GetLastError );
			result = false;
			continue;
		}
		if ( OrderMagicNumber() != _MagicNumber || OrderSymbol() != _Symbol ) continue;
		if ( OrderType() > 1 ) continue;
		if ( type >= 0 && OrderType() != type ) continue;

		if ( _OrderClose( OrderTicket() ) < 0 ) result = false;
	}
	return(result);
}



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
It Closes Orders by itself
Checks for the total of closed orders

Other Features:


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

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for SU3D[v5]


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: