//+------------------------------------------------------------------+
//|                                                         TMA .mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots            = 0.1;
extern double  MaximumRisk     = 0.03;
extern double  DecreaseFactor  = 3.0;
extern string  ___             = "  Шаг Баланса";
extern double  balans          = 500;
extern int     Slippage        = 5;
extern int     Magic           = 123;
extern int     TakeProfit      = 45;
extern int     StopLoss        = 20;

extern string  _________       = "MACD";
extern int    fast_ema_period      = 12;
extern int    slow_ema_period      = 26;
extern int    signal_period        =  9;
extern string  _______         = "Stohastic";
extern int Kperiod                 =  14;
extern int Dperiod                 =  5;
extern int slowing                 =  3;

extern string  ___________         = "Bands";
extern int period                  = 20;
extern int deviation               = 2.0;
extern int bands_shift             = 0;


int ticket;
double Macd,MacdSignal,Stoh,StohSignal,SL,Macd_1,MacdSignal_1;
double bbUP,bbDOWN,TP,Stoh_1,StohSignal_1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
if(Digits()== 3||Digits()== 5)
{
Slippage   *= 10;
TakeProfit *= 10;
StopLoss   *= 10;
}
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
CloseOrders();
  
  
 Macd=iMACD(Symbol(),PERIOD_H1,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_MAIN,0);
 MacdSignal=iMACD(Symbol(),PERIOD_H1,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_SIGNAL,0);
 Macd_1=iMACD(Symbol(),PERIOD_H1,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_MAIN,2);
 MacdSignal_1=iMACD(Symbol(),PERIOD_H1,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_SIGNAL,2);
  

  Stoh=iStochastic(Symbol(),PERIOD_M15,Kperiod,Dperiod,slowing,MODE_SMA,0,MODE_MAIN,0);
  StohSignal=iStochastic(Symbol(),PERIOD_M15,Kperiod,Dperiod,slowing,MODE_SMA,0,MODE_SIGNAL,0);
  Stoh_1=iStochastic(Symbol(),PERIOD_M15,Kperiod,Dperiod,slowing,MODE_SMA,0,MODE_MAIN,1);
  StohSignal_1=iStochastic(Symbol(),PERIOD_M15,Kperiod,Dperiod,slowing,MODE_SMA,0,MODE_SIGNAL,1);
  
  
  
  bbUP=iBands(Symbol(),PERIOD_M5,period,deviation,bands_shift,PRICE_CLOSE,1,0);
  bbDOWN=iBands(Symbol(),PERIOD_M5,period,deviation,bands_shift,PRICE_CLOSE,2,0);

if(OrdersTotal() == 0 && CountBuy() == 0 && CountSell()== 0)
{
if((Macd_1 > MacdSignal_1 &&  Stoh_1 < StohSignal_1 && Stoh > StohSignal && Stoh < 20 && Ask <= bbDOWN) ||
     (Macd > MacdSignal   &&  Stoh_1 < StohSignal_1 && Stoh > StohSignal && Stoh < 20 && Ask <= bbDOWN))

ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage,0,0,"",Magic,0,Green);
if(ticket>0)
 {
 SL=NormalizeDouble(OrderOpenPrice()-StopLoss * Point,Digits );
 TP=NormalizeDouble(OrderOpenPrice()+TakeProfit * Point,Digits ); //Macd<MacdSigna
 OrderModify(ticket,OrderOpenPrice(),SL,TP,0,Blue);
 }

if((Macd_1 < MacdSignal_1 && Stoh_1 > StohSignal_1 && Stoh<StohSignal   && Stoh > 80 && Bid >= bbUP) ||
     (Macd < MacdSignal   && Stoh_1 > StohSignal_1 && Stoh > StohSignal && Stoh > 80 && Bid >= bbUP))
ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,Slippage,0,0,"",Magic,0,Red);
if(ticket>0)
 {
 SL=NormalizeDouble(OrderOpenPrice()+StopLoss * Point,Digits );
 TP=NormalizeDouble(OrderOpenPrice()-TakeProfit * Point,Digits );
 OrderModify(ticket,OrderOpenPrice(),SL,TP,0,clrDeepPink);

    }
   }
  }
//+------------------------------------------------------------------+
double LotsOptimized() {
       double minlot = MarketInfo(Symbol(), MODE_MINLOT);
       double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);       
       double lot = Lots;
       int orders = OrdersHistoryTotal();
       int losses = 0;
       lot = NormalizeDouble(AccountFreeMargin() * MaximumRisk / balans, 2);
       if (DecreaseFactor > 0.0) {
for (int i = orders - 1; i >= 0; i--) {
       if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == FALSE) {
       Print("Error in history!");
       break;
       }
if (OrderSymbol() != Symbol() || OrderType() > OP_SELL) continue;
if (OrderProfit() > 0.0) break;
if (OrderProfit() < 0.0) losses++;
}
if (losses > 1) lot = NormalizeDouble(lot - lot * losses / DecreaseFactor, 2);
}
if(lot < minlot) lot = minlot;
if(lot > maxlot) lot = maxlot; 
return (lot);}
//+------------------------------------------------------------------+


int CountBuy()
 {
 int count = 0;
 for(int trade = OrdersTotal()-1; trade >=0; trade--)
 {
 OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
 if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
 {
 if(OrderType() == OP_BUY)
 count++;
 }
 }
 return(count);
 }
 //+------------------------------------------------------------------+
  int CountSell()
 {
 int count = 0;
 for(int trade = OrdersTotal()-1; trade >=0; trade--)
 {
 OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
 if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
 {
 if(OrderType() == OP_SELL)
 count++;
 }
 }
 return(count);
 }
 //+------------------------------------------------------------------+
void CloseOrders()  
{
 bbUP=0;
 bbDOWN=0;
  bbUP=iBands(Symbol(),PERIOD_M15,period,deviation,bands_shift,PRICE_CLOSE,1,0);
  bbDOWN=iBands(Symbol(),PERIOD_M15,period,deviation,bands_shift,PRICE_CLOSE,2,0);
  
for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY) 
{
if(Bid>=bbUP)
{
OrderClose(OrderTicket(),OrderLots(),Bid,1,Aqua);
}//if(Bid>=bbUP_1)
}//if (OrderType() == OP_BUY)
else
if (OrderType() == OP_SELL)
{
if(Ask<=bbDOWN)
{
OrderClose(OrderTicket(),OrderLots(),Ask,1,Aqua);
}//if(Ask<=bbDWN_1)
}//if (OrderType() == OP_SELL)
}//if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
}//if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//for(int i = OrdersTotal()-1; i>=0; i--)
}