/*

надо доработать советник
первоначальный лот 0.01, множитель 3 и максимальный убыток 4(можно изменять) ордера подряд в одну сторону
0.01
0.03
0.09
0.27

сам написал не всё может по этому не получается ограничивать количество убыточных ордеров подряд

*/
#property copyright "Copyright 2017, http://vk.com/id266344775"
#property link      "http://vk.com/id266344775"
#property version   "1.00"
#property strict

extern int     a           =20;     // Тейк профит
extern int     b           =30;     // Стоп лосс
extern string  t           = "При 3000 долларах первначальный лот равен 0.01";
extern string  t2          = "При агрессивной торговле лот равен 0.1";
extern double  Lots        = 0.01;  // Первоначаьный лот
extern int     Loss        = 4;     // Убыток подряд
extern int     Slippage    = 5;     // Проскальзывание
extern int     multipler   = 3;     // Увеличение убыточного ордера
extern int     Magic       = 12345;   // Магик

double Lots_sell,Lots_buy,SL,TP,Lots_end;
int global_lastTick = -1,ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {double multiplier;
   if(Digits == 2 || Digits == 4) 
   multiplier = 1;
   if(Digits == 3 || Digits == 5) 
   multiplier = 1;
   if(Digits == 6) multiplier = 10;   
   a  *= multiplier;
   b  *= multiplier;
   Slippage *= multiplier;
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason){}
void OnTick()
{
Comment("МАКСИМАЛЬНОЕ КОЛИЧЕСТВО УБЫТОЧНЫХ ОРДЕРОВ ДО РЕСТАРТА - ",Loss,"\n",
"Объём ордера BUY = ", GetLotLastPos(Symbol(),OP_BUY,Magic) +"    Объём ордера SELL = "+  GetLotLastPos(Symbol(),OP_SELL,Magic));
//+------------------------------------------------------------------+
if (isCloseLastPosByStop(Symbol(),OP_SELL,-1))
   {NormalizeDouble(Lots_sell=GetLotLastPos(Symbol(),OP_SELL,Magic)*multipler,2);}
else
   {Lots_sell=Lots;}
if (isCloseLastPosByStop(Symbol(),OP_BUY,-1))
   {NormalizeDouble(Lots_buy=GetLotLastPos(Symbol(),OP_BUY,Magic)*multipler,2);}
else
   {Lots_buy=Lots;}

//+------------------------------------------------------------------+  
 if(CountSell()==0 && CountBuy()==0)
    {    SL=NormalizeDouble(Bid+b*0.0001,4);
         TP=NormalizeDouble(Bid-a*0.0001,4);
         ticket=OrderSend(Symbol(),OP_SELL, Lots_sell, Bid,Slippage,SL,TP,"oposit",Magic,0,Red);
         if(ticket<0)
         {Print("Не удалось открыть ордер на продажу");
         }
    
         SL=NormalizeDouble(Ask-b*0.0001,4);
         TP=NormalizeDouble(Ask+a*0.0001,4);
         ticket=OrderSend(Symbol(),OP_BUY, Lots_buy, Ask,Slippage,SL,TP,"oposit",Magic,0,Blue);
         if(ticket<0)
         {Print("Не удалось открыть ордер на покупку");
         }
    }
}
//+------------------------------------------------------------------+
int CountSell()
{  int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
   {if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)==true && 
       OrderMagicNumber()==Magic&&
       OrderType()==OP_SELL)
      {count++;}}return(count);}
int CountBuy()
{  int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
   {if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)==true && 
       OrderMagicNumber()==Magic&&
       OrderType()==OP_BUY)
      {count++;}}return(count);}
//+------------------------------------------------------------------+


bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") 
      {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}

double GetLotLastPos(string sy="", int op=-1, int mn=-1) 
{
  datetime d;
  double   lot=-1;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) 
  { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) 
    { if (OrderSymbol()==sy || sy=="") 
      { if (OrderType()==OP_BUY || OrderType()==OP_SELL) 
        { if (op<0 || OrderType()==op) 
          { if (mn<0 || OrderMagicNumber()==mn) 
            { if (d<OrderCloseTime()) 
              { d=OrderCloseTime();
                lot=OrderLots();
                /*
                Lots_end = Lots * Loss + Lots;
                if(lot>=Lots_end)
                {
                   lot=Lots;
                }*/
                }}}}}}}
  return(lot);
}