//+------------------------------------------------------------------+
//|                                                  ft_prohvost.mq4 |
//|                                     Copyright 2012, FORTRADER.RU |
//|                                              http://fortrader.ru |
//| http://fortrader.ru/services/ea/single?id=4
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, FORTRADER.RU"
#property link      "http://fortrader.ru"

extern int    golova=10;  
extern int    telo=0;  

extern int    numbarclose=0;

extern double InpLots      =0.1; 
extern int      EA_Magic=12354;  

int barnb,barns;

extern int    InpStopLoss  =50;  

extern int maxopenbuy = 0;

extern bool bbu_enable=true;
extern bool tralingstop_enable=true;


int bars;

  double bbu_size_buy, trailingstop_size_buy,bbu_size_sell, trailingstop_size_sell;

int start()
  {
  if(Bars!=bars)
  {
    bars=Bars;
  
     double s_golova = golova;
     double s_telo = telo;

    double TKP = InpStopLoss;

   if(Digits==5 || Digits==3)
     {
      s_golova = golova*10;
      s_telo = telo*10;

      TKP = TKP*10;
     }
     

  if((High[1]-Close[1]>s_golova*Point) && (Close[1]-Open[1]>s_telo*Point) && timecontrol()==1 && (CountPos(1)<=maxopenbuy) /*&& Ask<ma*/)
  {
  barnb=0;
  OpenOrderOnMarket(0,TKP,High[1]);
  bbu_size_buy=(High[1]-Ask)/2;
  trailingstop_size_buy=(High[1]-Ask)/2;
  }
  
    if((Close[1]-Low[1]>s_golova*Point) && (Open[1]-Close[1]>s_telo*Point) && timecontrol()==1 && (CountPos(0)<=maxopenbuy) /*&& Ask>ma*/)
  {
  barns=0;
  OpenOrderOnMarket(1,TKP,Low[1]);
  bbu_size_sell=(Ask-Low[1])/2;
  trailingstop_size_sell=(Ask-Low[1])/2;
  }
  
  
  if((barnb>=numbarclose && SummPos(1)<0 && numbarclose>0) /*|| Ask>=ma*/){CloseAllPos(1);}
  if((barns>=numbarclose && SummPos(0)<0 && numbarclose>0) /*|| Ask<=ma*/){CloseAllPos(0);}

   
   barnb++; barns++;
  } 
  
  if(bbu_enable==1){BBU();}
  if(tralingstop_enable==1){TrailingStop();}
  
   return(0);
  }


int  TrailingStop()
{int i;bool err;




   for( i=1; i<=OrdersTotal(); i++)        
   {
      if(OrderSelect(i-1,SELECT_BY_POS)==true)
       {  
        if(trailingstop_size_buy>0 && OrderType()==OP_BUY && OrderSymbol()==Symbol())  
        {                
                      
        Print("trailingstop_size_buy"+trailingstop_size_buy);

         if(Bid-OrderOpenPrice()>=trailingstop_size_buy && trailingstop_size_buy>0 && (Bid-trailingstop_size_buy)>OrderStopLoss())
          {
           if(((Bid-trailingstop_size_buy)-OrderStopLoss())>=trailingstop_size_buy)
           {
            Print("ТРЕЙЛИМ");
            err=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-trailingstop_size_buy,OrderTakeProfit(),0,Green);
            if(err==false){return(-1);}
            GlobalVariableSet(DoubleToStr(OrderTicket(),0),Bid);
           }//if(Bid>=OrderStopLoss()
          }//if(Bid-OrderOpenPrice()
         }//if(BBUSize>0
        }//if(OrderSelect(i
           
       if(OrderSelect(i-1,SELECT_BY_POS)==true)
       {
        if(OrderType()==OP_SELL && OrderSymbol()==Symbol() )  
        {        

         if(OrderOpenPrice()-Ask>=trailingstop_size_sell && trailingstop_size_sell>0 && OrderStopLoss()>(Ask+trailingstop_size_sell))
          {
           if((OrderStopLoss()-(Ask+trailingstop_size_sell))>trailingstop_size_sell)
           {
            Print("ТРЕЙЛИМ");
            err=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+trailingstop_size_sell,OrderTakeProfit(),0,Green);
            if(err==false){return(-1);}
           }//if(Ask<=OrderStopLoss()
          }//if(OrderOpenPrice()
         }//if(BBUSize>0 
       }// if(OrderSelect
    }// for( i=1;
return(0);
}

  

 //Проверяет ордера на безубыток
 int  BBU()
{int i;bool err;

   for( i=1; i<=OrdersTotal(); i++)        
   {
      if(OrderSelect(i-1,SELECT_BY_POS)==true)
       {  
        if(bbu_size_buy>0 && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderStopLoss()<OrderOpenPrice() && OrderMagicNumber()==EA_Magic)  
        {                
         if(Bid-OrderOpenPrice()>=bbu_size_buy && bbu_size_buy>0 )
          {
           Print("ПОРА В БезуБыток");
           err=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+1*Point,OrderTakeProfit(),0,Red);
           if(err==false){return(-1);}
          }//if(Bid-OrderOpenPrice()
         }//if(BBUSize>0
        }//if(OrderSelect(i
           
       if(OrderSelect(i-1,SELECT_BY_POS)==true)
       {
        if(bbu_size_sell>0 && OrderType()==OP_SELL && OrderSymbol()==Symbol() && (OrderStopLoss()>OrderOpenPrice() || OrderStopLoss()==0) && OrderMagicNumber()==EA_Magic)  
        {        
         if(OrderOpenPrice()-Ask>=bbu_size_sell && bbu_size_sell>0)
          {
           Print("ПОРА В БезуБыток");
           err=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-1*Point,OrderTakeProfit(),0,Red);
           if(err==false){return(-1);}
          }//if(OrderOpenPrice()
         }//if(BBUSize>0
       }// if(OrderSelect
    }// for( i=1;
return(0);
}  
  
//Цена последней открытия последней закрытой сделки
double ProfitLastPosHist(int type) 
{int i;datetime time;double price;
   for( i=1; i<=OrdersHistoryTotal(); i++)         
   {
      if(OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY)==true) 
       {                                   
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1 && OrderOpenTime()>time){time=OrderOpenTime();price=OrderProfit();}
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==0 && OrderOpenTime()>time){time=OrderOpenTime();price=OrderProfit();}
       }
    }   
return(price);
}  

//Цена последней открытия последней закрытой сделки
double LotLastPosHist(int type) 
{int i;datetime time;double price;
   for( i=1; i<=OrdersHistoryTotal(); i++)         
   {
      if(OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY)==true) 
       {                                   
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1 && OrderOpenTime()>time){time=OrderOpenTime();price=OrderLots();}
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==0 && OrderOpenTime()>time){time=OrderOpenTime();price=OrderLots();}
       }
    }   
return(price);
}  
  
//количество позиций
int CountPos(int type) 
{int i,b,s;
   for( i=1; i<=OrdersTotal(); i++)         
   {
      if(OrderSelect(i-1,SELECT_BY_POS)==true) 
       {                                   
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol()){b=b+1;}
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol()){s=s+1;}
       }
    }   
    if(type==0){return(s);}
    if(type==1){return(b);}
}

  
extern int starttime = 0; 
extern int stoptime = 0; 

//Ограничение по времени
int timecontrol()
{// Подробное описание http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=1
   if ( ( (Hour()>=0 && Hour()<=stoptime-1) ||  (Hour()>=starttime && Hour()<=23)) && starttime>stoptime)
      {
      return(1);
      }  
      if ( (Hour()>=starttime && Hour()<=stoptime-1) && starttime<stoptime)
      {
      return(1);
      }  
      
   if(starttime==0 && stoptime==0){ return(1);}
     
return(0);
}
  
 //суммирует результат позиций по типу
double SummPos(int type) 
{//подробное описание: http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=100

   int i;double summ;
   for( i=0; i<=OrdersTotal(); i++)         
   {
           if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

       {                                   
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1){summ=summ+OrderProfit();}
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==0){summ=summ+OrderProfit();}
       }
    }   
return(summ);
}  

//Закрываем все позиции по типу
int CloseAllPos(int type)
{//Описание функции: http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=72
int buy=1; int sell=1;
int i,b=0;int ordertiket;
 
 if(type==1)
   {
   while(buy==1)
     {
        buy=0;
        for( i=0;i<OrdersTotal();i++)
         {
           if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() ){buy=1; OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);}
           }else{buy=0;}
         }  
         if(buy==0){return(0);}
      } 
   }
   
   if(type==0)
   {
      while(sell==1)
     {
        sell=0;
        for( i=0;i<OrdersTotal();i++)
         {
           if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() ){sell=1;OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); }
           }else{sell=0;}
         }  
         
        if(sell==0){return(0);}
      } 
     }
   return(0);
   }  

int OpenOrderOnMarket(int type,double slpips,double tppips)
{double op,sl,tp;int err;

double LotB=InpLots;
double LotS=InpLots;

   
   if(type==0)
   {
   op=Ask;if(slpips>0){sl=op-slpips*Point;}if(tppips>0){tp=tppips;}
   err=OrderSend(Symbol(),OP_BUY,LotB,NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),"FORTRADER.RU",EA_Magic,0,Red);
   if(err<0){Print("OrderSend()-  Ошибка OP_BUY.  op "+op+" sl "+sl+" tp "+tp+" "+" LOT "+LotB+" "+GetLastError());return(-1);}
   }
   
   if(type==1)
   {
    op=Bid;if(slpips>0){sl=op+slpips*Point;}if(tppips>0){tp=tppips;}
    err=OrderSend(Symbol(),OP_SELL,LotS,NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),"FORTRADER.RU",EA_Magic,0,Red);
    if(err<0){Print("OrderSend()-  Ошибка OP_SELL.  op "+op+" sl "+sl+" tp "+tp+" "+" LOT "+LotS+" "+GetLastError());return(-1);}
   }
return(0);
}