//+--------------------------------------------------------------------------------------------------------+
//|	FXBegin 1
//|	Copyright © 2013, Fedorov Valeriy
//+--------------------------------------------------------------------------------------------------------+
#property copyright "Copyright © 2013, Fedorov Valeriy"
#property link      ""


//+--------------------------------------------------------------------------------------------------------+
//+--------------------------------------------------------------------------------------------------------+
//Параметры советника
extern string	__________s1	= "***Время начала и окончания работы***";
extern int	BeginHour				=	10;
extern int	BeginMinute			=	30;
extern int	EndHour					=	13;
extern int	EndMinute				=	30;

//Запас в пунктах 
extern string	__________s2	= "***Запас в пунктах над/под HIGH/LOW***";
extern int	HLMargin				=50;
//лот
extern string	__________s3	= "Лот";
extern double	Lot						=	0.1;

//волшебный номер и комментарии
extern string	__________s4	= "***Волшебный номер и комментарии***";
extern int	MagicNumber			= 111;
extern string	BotComments		=	"OWL1";

//+--------------------------------------------------------------------------------------------------------+
//+--------------------------------------------------------------------------------------------------------+
//Глобальные переменные
double hlm;
//+--------------------------------------------------------------------------------------------------------+
//+--------------------------------------------------------------------------------------------------------+
int init()
{
	hlm=NormalizeDouble(HLMargin*Point,Digits);
	return(0);
}
//+--------------------------------------------------------------------------------------------------------+
int deinit()
{
	return(0);
}
//+--------------------------------------------------------------------------------------------------------+

int start()
{
	int T1,T2;
	Comment(Hour(), ":", Minute(),"\n");
	
	if(OpenConditions())	
		{
		T1=PendOrder(OP_BUYSTOP, Lot, High[1]+hlm, Low[1]-hlm , 0, MagicNumber, BotComments, 0);
		T2=PendOrder(OP_SELLSTOP, Lot, Low[1]-hlm, High[1]+hlm , 0, MagicNumber, BotComments, 0);
		}
	
	if(CloseConditions())
		{
		Print(Hour()+ ":"+Minute());
		CloseAll(-1, MagicNumber);
		}
}
//+--------------------------------------------------------------------------------------------------------+
//Проверка условий для открытия
bool OpenConditions()
{
	bool res=false;
	if(OrdersTotal()==0)
		if(Hour()==BeginHour && Minute()==BeginMinute) 
			res=true;
	return(res);
}
//+--------------------------------------------------------------------------------------------------------+
//Проверка условий для закрытия
bool CloseConditions()
{
	bool res=false;
	if(Hour()>=EndHour && Minute()>=EndMinute) return(true);
	return(res);
}
//+---------------------------------------------------------------------------------------------------------------------------------+
//Установка отложенных ордеров
/*
Параметры:
	OType  - тип ордера. Значения: 
		OP_BUYLIMIT 	2
		OP_SELLLIMIT 	3
		OP_BUYSTOP 		4
		OP_SELLSTOP 	5
	vol - лот
	sl 	- стоплосс
	tp 	- тейкпрофит
	nm 	- magic
	cm 	- comments
	exp	- expiration
	
Возвращаемые значения: 
	-1 - позиция не открыта
	>0 - тикет открытой позиции
*/
int PendOrder(int OType, double vol, double pr, double sl, double tp, int mn, string cm, datetime exp)
{
	int j;
	int T=0;
  int tries=10;				//количество попыток открытия/закрытия/модификации ордера
  
  if((OType!=OP_BUYLIMIT) && (OType!=OP_BUYSTOP) && (OType!=OP_SELLLIMIT) && (OType!=OP_SELLSTOP))
  	return(-1);
  
	if(OType==OP_BUYLIMIT || OType==OP_BUYSTOP)
		{
		if(sl!=0 && tp!=0 && sl>=tp)	
			return(0);
		}
	if(OType==OP_SELLLIMIT || OType==OP_SELLSTOP)
		{
		if(sl!=0 && tp!=0 && sl<=tp)	return(0);		
		}
	
	pr=NormalizeDouble(pr,Digits);
	sl=NormalizeDouble(sl,Digits);
	tp=NormalizeDouble(tp,Digits);
	
	for(j=1; j<=tries; j++)
		{
		T=OrderSend(Symbol(), OType, vol, pr, 3, sl, tp, cm, mn, exp, Blue);
		if(T>0) break;
		Sleep(500);
		RefreshRates();
		}
	if(j>tries)
		Print("Ошибка №", GetLastError() ," при установке ордера ", OType, " Ask=", Ask, " Bid=", Bid, " SL=", sl, " TP=", tp);
	else
		Print("Ордер установлен успешно. №", T);
	
	
	return(T);
}
//+--------------------------------------------------------------------------------------------------------+
//Закрытие позиций
/*
Параметры:
	ticket - номер ордера. Если -1, то применяется ко всем открытым ордерам
	OType  - тип ордера. Закрываются ордера только этого типа. Работает при ticket=-1
						Значения: -1 								- закрываются все ордера 
											OP_BUY (или 0) 		- закрываются ордера BUY, 
											OP_SELL (или 1) 	- ордера SELL
	nm - magic
	
Возвращаемые значения: - 
*/
int CloseAll(int OType, int magic)
{
	int i;
	for(i=0; i<OrdersTotal(); i++)
		if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
			if(OrderMagicNumber()==magic)
				{
				if(OrderType()==OP_BUY || OrderType()==OP_SELL)
					CloseOrder(OrderTicket());
				else
					{
					OrderDelete(OrderTicket());
					}
				}
	
	return(0);
}
//+--------------------------------------------------------------------------------------------------------+
//Закрытие ордера
/*
Параметры:
	ticket - номер ордера. Если -1, то применяется ко всем открытым ордерам
	nm - magic
	
Возвращаемые значения:
 true		- закрыт удачно
 false	- не закрыт
*/
bool CloseOrder(int ticket)
{
	int j;
	double price;
	bool res;
  int tries=10;				//количество попыток открытия/закрытия/модификации ордера
	
	res=false;
	//Закрываем конкретный ордер
	if(ticket>0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
		{
		if(OrderType()==OP_BUY) price=Bid;
		if(OrderType()==OP_SELL) price=Ask;
		for(j=1; j<=tries; j++)
			{
			if(OrderClose(OrderTicket(),OrderLots(),price,3,Red)) break;
			Sleep(500);
			RefreshRates();
			}
		if(j>tries)
			Print("Ошибка №", GetLastError() ," при закрытии ордера №",ticket, " ", OrderType(), " Ask=", Ask, " Bid=", Bid);
		else
			res=true;
		}
	return(res);
}