#include <stdlib.mqh>
#include <stderror.mqh> 
//+------------------------------------------------------------------+
//|                                       Kuklovod_USD.1.2_Auto..mq4 |
//|                                     Copyright 2013, Klonoz Denis |
//|                        skype-denis77515  http://cool-master.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, Klonoz Denis"
#property link      "skype-denis77515  http://cool-master.net/"
#property version   "1.00"
#property strict
extern double Lots         = 0.01;
extern double Multipler    = 1.68;
extern int    Slippage     = 5;
extern double Percent      = 20.0;
extern int    Magic        = 11111;
extern double indi_plus    = 70.0;
extern double indi_plus1   = 70.5;
extern double indi_plusM1  = 80.0;
extern double indi_plusM_1 = 80.5;
extern double indi_plusM2  = 90.0;
extern double indi_plusM_2 = 90.5;
//--------------------------------+
extern double indi_minus    = -70.0;
extern double indi_minus1   = -70.5;
extern double indi_minusM1  = -80.0;
extern double indi_minusM_1 = -80.5;
extern double indi_minusM2  = -90.0;
extern double indi_minusM_2 = -90.5;
extern double CloseProfitPlus  = -1.0;
extern double CloseProfitMinus = 1.0;
double usd,ubitok;
int ticket,Size,size,retries;
string sy[] = {"USDCAD","USDCHF","USDJPY"};
string sym[] = {"EURUSD","GBPUSD","AUDUSD","NZDUSD"};

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
if(Digits == 5 || Digits == 3)
{
Slippage *= 10;
}
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
usd = iCustom(Symbol(),PERIOD_D1,"Kuklovod_USD",7,0);

if(CountTrades() == 0)
{
if(usd >= indi_plus && usd <= indi_plus1)
Open_Plus();
}
//else
// cдесь должны начаться условия для усреднения.
if(CountTrades() == 0)
{
if(usd <= indi_minus && usd >= indi_minus1)
Open_Minus();
}
//else
// cдесь должны начаться условия для усреднения.
if(usd <=  CloseProfitPlus)
{
Close_Profit(OP_BUY);
}
if(usd >=  CloseProfitMinus)
{
Close_Profit(OP_BUY);
}
ubitok = NormalizeDouble(OrderProfit() - AccountBalance() / 100 * Percent,2);
if(ubitok && OrderProfit() < 0)
{
Close_losse(OP_BUY);
}
//---
}
//--------------Функция закрытия убытка от баланса-----------------------+
void Close_losse(int otypex)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber() == Magic)
{
if(OrderType() == otypex)
{
if(OrderType() == OP_BUY && OrderType() == OP_SELL)
{
if(OrderType() == OP_BUY ) if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrBlue)) Print("Ордер закрыт успешно"+OrderSymbol());else Alert("Ошибка закрытия №"+IntegerToString(GetLastError())+"Ордера","Cимвол"+OrderSymbol());
if(OrderType() == OP_SELL) if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrBlue)) Print("Ордер закрыт успешно"+OrderSymbol());else Alert("Ошибка закрытия №"+IntegerToString(GetLastError())+"Ордера","Cимвол"+OrderSymbol());
     }
    }
   }
  }
 }
}
//------------------Функция закрытия профита---------------------------+
void Close_Profit(int otype)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber() == Magic)
{
if(OrderType() == otype)
{
if(OrderType() == OP_BUY && OrderType() == OP_SELL)
{
if(OrderType() == OP_BUY ) if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrBlue))Print("Ордер закрыт успешно"+OrderSymbol());else Alert("Ошибка закрытия №"+IntegerToString(GetLastError())+"Ордера","Cимвол"+OrderSymbol());
if(OrderType() == OP_SELL) if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrBlue))Print("Ордер закрыт успешно"+OrderSymbol());else Alert("Ошибка закрытия №"+IntegerToString(GetLastError())+"Ордера","Cимвол"+OrderSymbol());
     }
    }
   }
  }
 }
}

//-------------------Функция открытия ордеров-------------------+
void Open_Minus()
{
Size = ArraySize(sym);
size = ArraySize(sy);

 for(int c=Size-1; c >=0; c--)
 {
 OrderSendReliable(sym[c],OP_SELL,Lots,Bid,Slippage,0,0,"Кукловод -70",Magic,0,clrRed);
 }
 for(int e=size-1; e>=0; e--)
 {
 OrderSendReliable(sy[e],OP_BUY,Lots,Ask,Slippage,0,0,"Кукловод -70",Magic,0,clrGreen);
 }
}

//+------------------Функция открытия ордеров--------------------+
void Open_Plus()
{
Size = ArraySize(sym);
size = ArraySize(sy);

 for(int a=Size-1; a >=0; a--)
 {
 OrderSendReliable(sym[a],OP_BUY,Lots,Ask,Slippage,0,0,"Кукловод +70",Magic,0,clrGreen);
 }
 for(int b=size-1; b>=0; b--)
 {
 OrderSendReliable(sy[b],OP_SELL,Lots,Bid,Slippage,0,0,"Кукловод +70",Magic,0,clrRed);
 }
}

//+---------------Функция перебора ордеров с праверкой на магик-----------------------+
int CountTrades()
{
int count = 0;
for(int i=OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber() == Magic)
count++;
}
}
return(count);
}
//----------------Функция оброботки ошибок---------------------------+
int OrderSendReliable(string asymbol, int cmd, double volume, double aprice,
					  int slippage, double stoploss, double takeprofit,
					  string acomment, int magic, datetime expiration = 0, 
					  color arrow_color = CLR_NONE) 
{
	int err = GetLastError(); 
	err = 0; 
	bool exit_loop = false;
	bool limit_to_market = false; 

	err = GetLastError(); 
	err = 0; 
	ticket = -1;

	if ((cmd == OP_BUY) || (cmd == OP_SELL)) 
	{
		int cnt = 0;
		while (!exit_loop) 
		{
			if (IsTradeAllowed()) 
			{
				ticket = OrderSend(asymbol, cmd, volume, aprice, slippage, 
									stoploss, takeprofit, acomment, magic, 
									expiration, arrow_color);
				err = GetLastError();
			} 
			else 
			{
				cnt++;
			} 
			switch (err) 
			{
				case ERR_NO_ERROR:
					exit_loop = true;
					break;
					
				case ERR_SERVER_BUSY:
				case ERR_NO_CONNECTION:
				case ERR_INVALID_PRICE:
				case ERR_OFF_QUOTES:
				case ERR_BROKER_BUSY:
				case ERR_TRADE_CONTEXT_BUSY: 
					cnt++;
					break;
					
				case ERR_PRICE_CHANGED:
				case ERR_REQUOTE:
					RefreshRates();
					continue; 
					
				default:
					exit_loop = true;
					break; 
					
			}  // end switch 

			if (cnt > retries) 
			 	exit_loop = true; 
			 	
			if (!exit_loop) 
			{
				Sleep(1000); 
				RefreshRates(); 
			}
			
			if (exit_loop) 
			{
				if (err != ERR_NO_ERROR) 
				{
					Alert("Ошибка : " + IntegerToString(err)); 
				}
			}
		}
		
		if (err == ERR_NO_ERROR) 
		{
			if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) 
			return(ticket);
		} 
		Alert("Ошибка открытия ордера после " + IntegerToString(cnt) + " попыток.");
		Alert("Ошибка : " + IntegerToString(err)); 
		return(-1); 
	}
	return(-1);
}
//+------------------------------------------------------------------+