Navigation:Home > Content >

sistema.mq4

Time: 2015-01-21 | Download file:sistema.mq4

// Имитация_Фредди.mq4

// Имитация робота FreddyFX, имитирующего робот Гринштейна
// Отрихтовано by Ale


#import "user32.dll"
	int PostMessageA(int a0, int a1, int a2, int a3);
#import

extern string	`									= "Настройки стратегии:";
extern bool		Разрешить_Buy			= true;
extern bool		Разрешить_Sell		= true;
extern bool		Бесконечный_цикл	= true;
extern int		Шаг_сети					= 10;
extern double	Целевой_процент_депо = 2;		// Необходимая для закрытия сети прибыль. В % от депозита
extern int		Рисковый_процент_депо = 30;	// Доля депозита которую допустимо потерять в одном трейде. В %
extern string	``								= "TP / SL";
			 int		StopLoss					= 0;
extern int		TakeProfit				= 30;
extern int		StopLoss_1				= 10;
extern int		StopLoss_2				= 20;
extern int		StopLoss_3				= 30;
extern string	```								= "Лоты. 0 = выкл";
extern double	OrderLots_1				= 0.1;
extern double	OrderLots_2				= 0.1;
extern double	OrderLots_3				= 0.1;
			 bool		Использовать_трал	= false;
			 int		Шаг_трала					= 0;
			 int		Дистанция_трала		= 100;
extern string	ID_эксперта				= "Ими А";
extern int		Slippage					= 1;
extern int		Попыток_открыть_ордер = 4;
			 double Фиксированный_лот	= 0.0;
extern int		Мэджик						= 2013;
extern string ````							= "Расписание работы.";
extern bool	Всегда_в_рынке			= true;
extern bool		Сессия_А					= true;
extern string	Время_А						= "07:30-14:00";
extern bool		Сессия_Б					= false;
extern string	Время_Б						= "14:00-22:00";
extern bool		Сессия_В					= false;
extern string	Время_В						= "22:00-7:30";


double
	gd_Target_Rate, gd_Risk_Rate,
	gd_Digits_Multiplier = 1,
	gd_Start_Depo = 0,
	gd_Bid = 0,
	gd_Lot_Min, gd_Lot_Max, gd_Lot_Step, gd_Lot_Margin
;
string
	gs_Comment,
	gs_Prefix = "ими ",
	gs_Symbol
;
int
	gi_Connect_Wait = 2,
	gia_Sessions[6],
	gt_Start_Time = 0
;
bool
	gb_Can_Trade = true
;


int init() {
	gs_Symbol = Symbol();
	gd_Digits_Multiplier = MathPow(10, (MathRound(Digits * 0.5) != Digits * 0.5));
	StopLoss *= gd_Digits_Multiplier;
	StopLoss_1 *= gd_Digits_Multiplier;
	StopLoss_2 *= gd_Digits_Multiplier;
	StopLoss_3 *= gd_Digits_Multiplier;
	TakeProfit *= gd_Digits_Multiplier;
	Шаг_сети *= gd_Digits_Multiplier;
	Slippage *= gd_Digits_Multiplier;
	Дистанция_трала *= gd_Digits_Multiplier;
	gd_Target_Rate = Целевой_процент_депо / 100.0;
	gd_Risk_Rate = Рисковый_процент_депо / 100.0;
	gd_Lot_Min = MarketInfo(gs_Symbol, MODE_MINLOT);
	gd_Lot_Max = MarketInfo(gs_Symbol, MODE_MAXLOT);
	gd_Lot_Step = MarketInfo(gs_Symbol, MODE_LOTSTEP);
	gd_Lot_Margin = MarketInfo(gs_Symbol, MODE_MARGINREQUIRED);
	gs_Comment = ID_эксперта + " " + Period_To_String(Period()) + ";";
	
	// расфасуем строку временных интервалов в 2 массива начал и окончаний интервалов:
	string
		sa_Array[],
		sString = StringTrimLeft(StringTrimRight(Время_А))
	;
	if(StringLen(sString) > 2) {
		StringToArray(sString, sa_Array, "-");
		if(StringLen(sa_Array[0]) < 3) sa_Array[0] = sa_Array[0] + ":00";
		if(StringLen(sa_Array[1]) < 3) sa_Array[1] = sa_Array[1] + ":00";
		gia_Sessions[0] = StrToTime(sa_Array[0]);
		gia_Sessions[1] = StrToTime(sa_Array[1]);
	}
	sString = StringTrimLeft(StringTrimRight(Время_Б));
	if(StringLen(sString) > 2) {
		StringToArray(sString, sa_Array, "-");
		if(StringLen(sa_Array[0]) < 3) sa_Array[0] = sa_Array[0] + ":00";
		if(StringLen(sa_Array[1]) < 3) sa_Array[1] = sa_Array[1] + ":00";
		gia_Sessions[2] = StrToTime(sa_Array[0]);
		gia_Sessions[3] = StrToTime(sa_Array[1]);
	}
	sString = StringTrimLeft(StringTrimRight(Время_В));
	if(StringLen(sString) > 2) {
		StringToArray(sString, sa_Array, "-");
		if(StringLen(sa_Array[0]) < 3) sa_Array[0] = sa_Array[0] + ":00";
		if(StringLen(sa_Array[1]) < 3) sa_Array[1] = sa_Array[1] + ":00";
		gia_Sessions[4] = StrToTime(sa_Array[0]);
		gia_Sessions[5] = StrToTime(sa_Array[1]);
	}
	
	// проверка настроек:
	int iStopLevel = MarketInfo(gs_Symbol, MODE_STOPLEVEL);
	if(StopLoss_1 != 0 && StopLoss_1 < iStopLevel) {
		Alert(gs_Symbol, ": StopLoss_1 должен быть больше ", (iStopLevel - 1), " пп!");
		return;
	}
	if(StopLoss_2 != 0 && StopLoss_2 < iStopLevel) {
		Alert(gs_Symbol, ": StopLoss_2 должен быть больше ", (iStopLevel - 1), " пп!");
		return;
	}
	if(StopLoss_3 != 0 && StopLoss_3 < iStopLevel) {
		Alert(gs_Symbol, ": StopLoss_3 должен быть больше ", (iStopLevel - 1), " пп!");
		return;
	}
	if(TakeProfit < iStopLevel) {
		Alert(gs_Symbol, ": TakeProfit должен быть больше ", (iStopLevel - 1), " пп! Значение установлено в ноль");
		TakeProfit = 0;
	}
	Мэджик = Get_Magic(true);
	
	return (0);
}



int start() {
	if(gd_Start_Depo > 0.0) { // есть цикл в работе
		if(AccountEquity() / gd_Start_Depo >= 1 + gd_Target_Rate) { // цель достигнута, закончить цикл
			Print("Профит");
			if(KillEm(Мэджик) > 0) {
				gd_Start_Depo = 0;
				gd_Bid = 0;
			}
		} else if(AccountEquity() / gd_Start_Depo <= 1 - gd_Risk_Rate) { // убыток вышел за рамки допустимого, закончить цикл
			Print("Лось");
			if(KillEm(Мэджик) > 0) {
				gd_Start_Depo = 0;
				gd_Bid = 0;
			}
		}
	}
	
	Show_Info(Is_Allowed_Hour());
	if(gt_Start_Time == 0 || Бесконечный_цикл) {
		Make_Grid();
		gt_Start_Time = Time[0];
	}
	return (0);
}



int deinit() {
	RemoveObjects(gs_Prefix);
	return (0);
}


void Make_Grid() {
	int
		iBid_Pips_Prev,
		iBid_Pips_Curr,
		iAsk_Pips, iBid_Pips,
		iOpen_Price_Pips
	;
	bool
		bGrid_Point = false
	;
	
	if(!Is_Allowed_Hour()) return;
	
	if(gd_Bid == 0.0) { // новый старт
		gd_Start_Depo = AccountBalance();
		bGrid_Point = true;
		gd_Bid = Bid;
	} else {
		if(Бесконечный_цикл) {
			iBid_Pips_Prev = gd_Bid / Point / gd_Digits_Multiplier;
			iBid_Pips_Curr = Bid / Point / gd_Digits_Multiplier;
			if(iBid_Pips_Curr == iBid_Pips_Prev) bGrid_Point = true;
			else {
				if(iBid_Pips_Curr > iBid_Pips_Prev) {
					while (iBid_Pips_Curr > iBid_Pips_Prev) {
						iBid_Pips_Curr -= Шаг_сети / gd_Digits_Multiplier;
						if(iBid_Pips_Curr == iBid_Pips_Prev) {
							bGrid_Point = true;
							break;
						}
					}
				} else {
					if(iBid_Pips_Curr < iBid_Pips_Prev) {
						while (iBid_Pips_Curr < iBid_Pips_Prev) {
							iBid_Pips_Curr += Шаг_сети / gd_Digits_Multiplier;
							if(iBid_Pips_Curr == iBid_Pips_Prev) {
								bGrid_Point = true;
								break;
							}
						}
					}
				}
			}
			
			if(bGrid_Point) {
				for (int iOrder = 0; iOrder < OrdersTotal(); iOrder++) {
					if((OrderSelect(iOrder, SELECT_BY_POS) && OrderMagicNumber() == Мэджик)) {
						iBid_Pips = Bid / Point / gd_Digits_Multiplier;
						iAsk_Pips = Ask / Point / gd_Digits_Multiplier;
						iOpen_Price_Pips = OrderOpenPrice() / Point / gd_Digits_Multiplier;
						if((OrderType() == OP_SELL && MathAbs(iOpen_Price_Pips - iBid_Pips) < 2.0) || (OrderType() == OP_BUY && MathAbs(iOpen_Price_Pips - iAsk_Pips) < 2.0)) {
							bGrid_Point = false;
							break;
						}
					}
				}
			}
		}
	}
	if(bGrid_Point) {
		if(Разрешить_Buy) {
			Send_Order(Попыток_открыть_ордер, OP_BUY, OrderLots_1, Ask, gs_Comment, get_SL(OP_BUY, StopLoss_1), get_TP(OP_BUY, TakeProfit));
			Send_Order(Попыток_открыть_ордер, OP_BUY, OrderLots_2, Ask, gs_Comment, get_SL(OP_BUY, StopLoss_2), get_TP(OP_BUY, TakeProfit));
			Send_Order(Попыток_открыть_ордер, OP_BUY, OrderLots_3, Ask, gs_Comment, get_SL(OP_BUY, StopLoss_3), get_TP(OP_BUY, TakeProfit));
		}
		if(Разрешить_Sell) {
			Send_Order(Попыток_открыть_ордер, OP_SELL, OrderLots_1, Bid, gs_Comment, get_SL(OP_SELL, StopLoss_1), get_TP(OP_SELL, TakeProfit));
			Send_Order(Попыток_открыть_ордер, OP_SELL, OrderLots_2, Bid, gs_Comment, get_SL(OP_SELL, StopLoss_2), get_TP(OP_SELL, TakeProfit));
			Send_Order(Попыток_открыть_ордер, OP_SELL, OrderLots_3, Bid, gs_Comment, get_SL(OP_SELL, StopLoss_3), get_TP(OP_SELL, TakeProfit));
		}
	}
}


void RemoveObjects(string sName="", bool bExact=false) {
	// Удаляет объекты с графика
	int iObjectID = ObjectsTotal();
	while(iObjectID > 0) {
		iObjectID--;
		if(sName == "") ObjectDelete(ObjectName(iObjectID)); // если имя не указано - косим всех!
		else {
			if(bExact) { // если задано удалить только того, чьё имя указано
				if(ObjectName(iObjectID) == sName) ObjectDelete(ObjectName(iObjectID)); // kill'em
			}
			else {
				if(StringFind(ObjectName(iObjectID), sName) != 0) continue; // если имя граф.объекта не начинается с указанного - не наш клиент :(
				ObjectDelete(ObjectName(iObjectID)); // kill'em
			}
		}
	}
	
	return(0);
}


void StringToArray (string sInput, string& asOutput[], string sDelim) {
	ArrayResize(asOutput, 0);
	int iStartPos = 0;
	while(iStartPos < StringLen(sInput)) {
		int iDelPos = StringFind(sInput, sDelim, iStartPos);
		if(iDelPos < 0) {
			string sNextElem = StringSubstr(sInput, iStartPos);
			iStartPos = StringLen(sInput);
		}
		else {
			sNextElem = StringSubstr(sInput, iStartPos, iDelPos - iStartPos);
			iStartPos = iDelPos + 1;
		}
		ArrayResize(asOutput, ArraySize(asOutput) + 1);
		asOutput[ArraySize(asOutput)-1] = sNextElem;
	}
}


double get_SL(int iOp_Type, int iSL, double dPrice_Curr=0.0) {
	if(iSL == 0) return (0);
	
	double
		dSL_Level = 0,
		dStopLevel = MarketInfo(gs_Symbol, MODE_STOPLEVEL) * Point
	;
	if(iOp_Type == 0 || iOp_Type == 2 || iOp_Type == 4) {
		if(dPrice_Curr == 0.0) {
			RefreshRates();
			dPrice_Curr = Ask;
		}
		dSL_Level = dPrice_Curr - iSL * Point;
		if(dSL_Level > dPrice_Curr - dStopLevel) dSL_Level = dPrice_Curr - dStopLevel;
	}
	if(iOp_Type == 1 || iOp_Type == 3 || iOp_Type == 5) {
		if(dPrice_Curr == 0.0) {
			RefreshRates();
			dPrice_Curr = Bid;
		}
		dSL_Level = dPrice_Curr + iSL * Point;
		if(dSL_Level < dPrice_Curr + dStopLevel) dSL_Level = dPrice_Curr + dStopLevel;
	}
	return (dSL_Level);
}


double get_TP(int iOp_Type, int iTP, double dPrice_Curr = 0.0) {
	if(iTP == 0) return (0);
		
	double
		dTP_Level = 0,
		dStopLevel = MarketInfo(gs_Symbol, MODE_STOPLEVEL) * Point
	;
	if(iOp_Type == 0 || iOp_Type == 2 || iOp_Type == 4) {
		if(dPrice_Curr == 0.0) {
			RefreshRates();
			dPrice_Curr = Ask;
		}
		dTP_Level = dPrice_Curr + iTP * Point;
		if(dTP_Level < dPrice_Curr + dStopLevel) dTP_Level = dPrice_Curr + dStopLevel;
	}
	if(iOp_Type == 1 || iOp_Type == 3 || iOp_Type == 5) {
		if(dPrice_Curr == 0.0) {
			RefreshRates();
			dPrice_Curr = Bid;
		}
		dTP_Level = dPrice_Curr - iTP * Point;
		if(dTP_Level > dPrice_Curr - dStopLevel) dTP_Level = dPrice_Curr - dStopLevel;
	}
	dTP_Level = NormalizeDouble(dTP_Level, Digits);
	return (dTP_Level);
}


int Get_Magic(bool bRead_From_Order=false) {
	int iMagic;
	
	if(!IsTesting()) iMagic = WindowHandle(gs_Symbol, 0);
	else if(!IsVisualMode()) iMagic = 2013;
	
	if(bRead_From_Order) {
		for (int iOrder = OrdersTotal() - 1; iOrder >= 0; iOrder--) {
			OrderSelect(iOrder, SELECT_BY_POS);
			if(OrderSymbol() == gs_Symbol) {
				if(
					StringSubstr(OrderComment(), 0, StringLen(ID_эксперта)) == ID_эксперта &&
					StringFind(OrderComment(), " ", StringLen(ID_эксперта) + 1) == -1 ||
					StringSubstr(OrderComment(), StringFind(OrderComment(), " ", StringLen(ID_эксперта) + 1) + 1, StringLen(Period_To_String(Period()))) == Period_To_String(Period())
				) {
					Print("Мэджик взят из ордера " + OrderTicket());
					iMagic = OrderMagicNumber();
					break;
				}
			}
		}
	}
	
	return (iMagic);
}


string Period_To_String(int iPeriod=0) {
	if(iPeriod == 0) iPeriod = Period();
	switch (iPeriod) {
		case PERIOD_M1: return ("M1");
		case PERIOD_M5: return ("M5");
		case PERIOD_M15: return ("M15");
		case PERIOD_M30: return ("M30");
		case PERIOD_H1: return ("H1");
		case PERIOD_H4: return ("H4");
		case PERIOD_D1: return ("D1");
		case PERIOD_W1: return ("W1");
		case PERIOD_MN1: return ("MN1");
	}
	
	return ("");
}


bool Is_Allowed_Hour() {
	// Проверка запрета на торговлю по времени
	// Глобальные переменные: Всегда_в_рынке, Сессия_А, Сессия_Б, Сессия_В, gia_Sessions
	
	if(Всегда_в_рынке) return (true);
	
	int iDay_Seconds = StrToTime(TimeToStr(TimeCurrent(), TIME_SECONDS));
	if(Сессия_А) {
		if(gia_Sessions[0] < gia_Sessions[1]) {
			if(iDay_Seconds >= gia_Sessions[0] && iDay_Seconds < gia_Sessions[1]) return (true);
		} else
			if((iDay_Seconds >= gia_Sessions[0] && iDay_Seconds <= StrToTime("23:59:59")) || iDay_Seconds < gia_Sessions[1]) return (true);
	}
	if(Сессия_Б) {
		if(gia_Sessions[2] < gia_Sessions[3]) {
			if(iDay_Seconds >= gia_Sessions[2] && iDay_Seconds < gia_Sessions[3]) return (true);
		} else
			if((iDay_Seconds >= gia_Sessions[2] && iDay_Seconds <= StrToTime("23:59:59")) || iDay_Seconds < gia_Sessions[3]) return (true);
	}
	if(Сессия_В) {
		if(gia_Sessions[4] < gia_Sessions[5]) {
			if(iDay_Seconds >= gia_Sessions[4] && iDay_Seconds < gia_Sessions[5]) return (true);
		} else
			if((iDay_Seconds >= gia_Sessions[4] && iDay_Seconds <= StrToTime("23:59:59")) || iDay_Seconds < gia_Sessions[5]) return (true);
	}
	
	return (false);
}


int KillEm(int iMagic, int iType = -1) {
	// Закрытие и удаление ордеров
	// Отрицательные значения iType означают:
	// iType = -1 : закрыть всё
	// iType = -10 : закрыть все рыночные
	// iType = -20 : закрыть все отложенные
	// Глобальные переменные: gs_Symbol, Slippage, Мэджик, gs_Prefix
	int
		iNet_Orders = 0, // кол-во закрытых ордеров
		iTicket = -1,
		iOrder = OrdersTotal() // общее кол-во рыночных ордеров
	;
	if(iOrder < 1) return(0); // нет ордеров
	double
		dNet_Profit = 0 // профит
	;
	
	while(iOrder > 0) { // перебор ордеров
		iOrder--;
		if(OrderSelect(iOrder, SELECT_BY_POS, MODE_TRADES))
			if(OrderSymbol() == gs_Symbol)
				if(OrderMagicNumber() == iMagic) { // наш клиент
					iTicket = -1;
					if(OrderType() == OP_BUY && (iType == OP_BUY || iType == -1 || iType == -10)) // это была покупка
						iTicket = OrderClose(OrderTicket(), OrderLots(), Ask, Slippage);
					else if(OrderType() == OP_SELL && (iType == OP_SELL || iType == -1 || iType == -10)) // это была продажа
						iTicket = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
					else // это была отложка
						if(iType == OrderType() || iType == -1 || iType == -20) if(OrderDelete(OrderTicket())) iTicket = 1;
					if(iTicket > -1) {
//						dNet_Profit += OrderProfit() + OrderSwap(); // учтём прибыль/убыток и своп
						iNet_Orders++; // счётчик закрытых ордеров
					}
				}
	}
	
	return(iNet_Orders);
}


void Show_Info(bool bWork_Time) {
	// Отображение статуса робота и баланса
	// Глобальные переменные: gs_Prefix, gd_Start_Depo
	
	if(IsTesting() && !IsVisualMode()) return; // ускорение оптимизации
	
	color cColor = Silver;
	static double dBalance_Prev = -1000000;
	double dValue;
	int
		iX_Pos = 10, iY_Pos = 5
	;
	string
		sString
	;
	
	// Время:
	if(!Всегда_в_рынке) {
		if(ObjectFind(gs_Prefix + "время") == -1) {
			ObjectCreate(gs_Prefix + "время", OBJ_LABEL, 0, 0, 0);
			ObjectSet(gs_Prefix + "время", OBJPROP_CORNER, 2);
			ObjectSet(gs_Prefix + "время", OBJPROP_XDISTANCE, 10);
			ObjectSet(gs_Prefix + "время", OBJPROP_YDISTANCE, 5);
		}
		
		sString = TimeToStr(TimeCurrent(), TIME_MINUTES) + " - торговля ";
		cColor = Lime;
		if(!bWork_Time) sString = sString + "разрешена";
		else {
			sString = sString + "запрещена";
			cColor = HotPink;
		}
		Label_Handle(gs_Prefix + " время", sString, "Arial", 12, cColor, 3, iX_Pos, iY_Pos);
		iY_Pos += 20;
	}
	// Профит:
	cColor = Lime;
	dValue = 100 * (AccountEquity() / ((gd_Start_Depo == 0.0) + gd_Start_Depo) - 1); // с защитой от деления на 0
	if(dValue < 0.0) cColor = HotPink;
	Label_Handle(gs_Prefix + " прибыль", DoubleToStr(dValue, 2) +  "% прибыли", "Arial", 12, cColor, 3, iX_Pos, iY_Pos);
	// Баланс:
	iY_Pos += 20;
	cColor = Silver;
	dValue = AccountBalance();
	if(dBalance_Prev != -1000000) {
		if(dValue > dBalance_Prev) cColor = Lime;
		if(dValue < dBalance_Prev) cColor = HotPink;
	}
	dBalance_Prev = dValue;
	Label_Handle(gs_Prefix + " баланс", DoubleToStr(dValue, 2) +  " баланс", "Arial", 12, cColor, 3, iX_Pos, iY_Pos);
	// Свободные средства:
	iY_Pos += 20;
	dValue = AccountEquity();
	if(dBalance_Prev == 0.0) cColor = Silver;
	else if(dValue / dBalance_Prev > 1.0) cColor = Lime;
	else if(dValue / dBalance_Prev > 0.75) cColor = Silver;
	else if(dValue / dBalance_Prev > 0.5) cColor = Yellow;
	else if(dValue / dBalance_Prev > 0.25) cColor = DarkOrange;
	else cColor = HotPink;
	Label_Handle(gs_Prefix + " свободно", DoubleToStr(dValue, 2) + " свободно", "Arial", 12, cColor, 3, iX_Pos, iY_Pos);
}


int Error_Handle(int iError) {
	// На базе функции by Nikolay Khrushchev N.A.Khrushchev@gmail.com
	// Глобальные переменные: Журнал
	switch(iError) {
		// группа 1: не прекращать попытки
		case 2: Print("Общая ошибка (", iError, ")"); return(0);
		case 4: Print("Торговый сервер занят (", iError, ")"); return(0);
		case 8: Print("Слишком частые запросы (", iError, ")"); return(0);
		case 129: Print("Неправильная цена (", iError, ")"); return(0);
		case 135: Print("Цена изменилась (", iError, ")"); return(0);
		case 136: Print("Нет цен (", iError, ")"); return(0);
		case 137: Print("Брокер занят (", iError, ")"); return(0);
		case 138: Print("Новые цены (", iError, ")"); return(0);
		case 141: Print("Слишком много запросов (", iError, ")"); return(0);
		case 146: Print("Подсистема торговли занята (", iError, ")"); return(0);
		// группа 2: прекращаем попытки
		case 0: Print("Ошибка отсутствует (", iError, ")"); return(1);
		case 1: Print("Нет ошибки, но результат не известен (", iError, ")"); return(1);
		case 3: Print("Неправильные параметры (", iError, ")"); return(1);
		case 6: Print("Нет связи с торговым сервером (", iError, ")"); return(1);
		case 128: Print("Истек срок ожидания совершения сделки (", iError, ")"); return(1);
		case 130: Print("Неправильные стопы (", iError, ")"); return(1);
		case 131: Print("Неправильный объем (", iError, ")"); return(1);
		case 132: Print("Рынок закрыт (", iError, ")"); return(1);
		case 133: Print("Торговля запрещена (", iError, ")"); return(1);
		case 134: Print("Недостаточно денег для совершения операции (", iError, ")"); return(1);
		case 139: Print("Ордер заблокирован и уже обрабатывается (", iError, ")"); return(1);
		case 145: Print("Модификация запрещена, так как ордер слишком близок к рынку (", iError, ")"); return(1);
		case 148: Print("Количество открытых и отложенных ордеров достигло предела, установленного брокером (", iError, ")"); return(1);
		// группа 3: завершаем работу
		case 5: Print("Старая версия клиентского терминала (", iError, ")"); return(2);
		case 7: Print("Недостаточно прав (", iError, ")"); return(2);
		case 9: Print("Недопустимая операция нарушающая функционирование сервера (", iError, ")"); return(2);
		case 64: Print("Счет заблокирован (", iError, ")"); return(2);
		case 65: Print("Неправильный номер счета (", iError, ")"); return(2);
		case 140: Print("Разрешена только покупка (", iError, ")"); return(2);
		case 147: Print("Использование даты истечения ордера запрещено брокером (", iError, ")"); return(2);
		case 149: Print("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено (", iError, ")"); return(2);
		case 150: Print("Попытка закрыть позицию по инструменту в противоречии с правилом FIFO (", iError, ")"); return(2);
	}
}                     


int Send_Order(int iAttempts, int iOrder_Type, double dLots, double dPrice, string sComment="", double dSL=0, double dTP=0) {
	// Отправка запроса на выставление ордера
	// Глобальные переменные: gs_Symbol, Slippage, Мэджик, gi_Connect_Wait, gb_Can_Trade
	// Использует функции: Error_Handle()
	int
		iTry = iAttempts,
		iTicket = -1
	;
	
	while(iTry > 0) { // попытки выставить
		iTry--;
		if (IsTradeAllowed())
			iTicket = OrderSend(gs_Symbol, iOrder_Type, dLots, NormalizeDouble(dPrice, Digits), Slippage, dSL, dTP, sComment, Мэджик);
		else {Sleep(gi_Connect_Wait); continue;}
		if (iTicket >= 0) break;
		switch(Error_Handle(GetLastError())) {
			case 0: RefreshRates(); Sleep(gi_Connect_Wait); break;
			case 1: return(iTicket);
			case 2: gb_Can_Trade = false; return(iTicket);
		}
	}
	return(iTicket);
}


void Label_Handle(string sLabelName, string sLabelText = "", string sLabelFontName = "Arial", int iLabelFontSize = 10, color cLabelFontColor = Bisque, int iCorner = 0, int iXpos = 0, int iYpos = 0, int iAngle = 0, int iWindow = 0, bool bBackground=false) {
	// Инфо-надписи в углах графика
	if(ObjectFind(sLabelName) != -1) ObjectDelete(sLabelName);
	if(sLabelText != "") {
		ObjectCreate(sLabelName, OBJ_LABEL, iWindow, 0, 0);
		ObjectSet(sLabelName, OBJPROP_CORNER, iCorner);
		ObjectSet(sLabelName, OBJPROP_XDISTANCE, iXpos);
		ObjectSet(sLabelName, OBJPROP_YDISTANCE, iYpos);
		ObjectSet(sLabelName, OBJPROP_ANGLE, iAngle);
		ObjectSet(sLabelName, OBJPROP_BACK, bBackground);
		ObjectSetText(sLabelName, sLabelText, iLabelFontSize, sLabelFontName, cLabelFontColor);
	}
}

Recommend