//====================== Locomotive v1.00 ======================== 

#property description "timeframe M5, pair EurUsd, GbpUsd, UsdJpy, EurJpy or or EurGbp recommended"
#property description "                                           "
#property description "Recommended using a cent account for 100 usd capital"
#property description "                                           "
//------------------------------------------------------------------------------ 

input bool    buy            = true;
input bool    sell           = true;

input double  take_profit    = 15;
input double  lot            = 0.01;
input double  lot_factor_1   = 1.6;
input double  step_1         = 25;
input double  set_2          = 4;
input double  lot_factor_2   = 1.7;
input double  step_2         = 35;
input double  set_3          = 8;
input double  hedje_factor   = 0.5;
input double  hedje_plus     = 0.05;
input string  menucomment02  = "||||||||||||||||||||||||||||||||||||||||||||| Прочие параметры |||||||||||||||||||||||||||||||||||||||||||||";
input int     magic          = 1543;
input int     magic2         = 1544;
//double        Sensitivity    = 10;
input int     TryToTrade     = 20;
int           WaitTime       = 1500;
input int     CommetSize     = 7;
input int     ATR_Period = 60;
input int     ATR_Factor = 3;
input int     CCI_Period = 10;
input int     CCI_Level = 110; 
input bool    AlertSystem = true;
input int     AlertPasuse = 60;
input bool    Send_Push_Notifications = true;
int           bars = 10000;
input double  Layer_Multiplier = 10.5;
//input int     sellvalue =0;
//input int     buyvalue=0;
//-----------------------------------------------------------------------------------------------------------------------------
input int     Stoploss      = 0;    // Стоп-лосс
input int     Takeprofit    = 0;    // Тейк-профит
input int     TrailingStop  = 5;    // Длина трала
input int     TrailingStart = 5;    // Минимальная прибыль для старта
input int     TrailingStep  = 1;    // Шаг трала
//------------------------------------------------------------------------------------
extern bool    AllSymbol   = false;
extern int     Magic       = -1;    //Magic (-1 all)
extern int     DayProfit   = 1;//за какое кол-во дней считать накопленный профит
extern double  ProfitMin   = 1.00;//неснижаемый накопленный профит
extern int     MinLoss     = 100;//минимальный убыток сделки подлежащей закрытию (пункт)
extern string Font      = "Times New Roman";
extern int    Width     = 10;
extern long   X=30;
extern long   Y=30;
extern bool   CloseFar   = false;

double STOPLEVEL;
string AC;

string Default   = "Default set All Pair";
string Timeframe = "TimeFrame M5";
enum M      
{   
  a, //x2
  B, //x1.9
  c, //x1.8
  d, //x1.7
  e, //x1.6
  f, //x1.5
  g, //x1.4
  h, //x1.3 
  I, //x1.2(Default)
  j, //x1.1 
  k  //x1
}; 
enum N
{
l, //1
m, //2
n, //3
o, //4
};
//íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí
double stoploss = 5000.0;           
double TrailStart = 100.0;
double TrailStop = 100.0;
double   Info;
//íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí
extern double StartingLots = 0.01;          
extern double TakeProfit = 58.0;  
double Multiplier;
input M Layer_multiplier = I;
extern double PipStep = 48.0;      
bool AutoCompound = false;
//-----------------------------------------------------------------------------------------------------------------------------
double slip = 30.0;           
int MaxTrades = 99999;                 
int identifier = 2;          
input N Identifier = l;
//===============================================Внутренние переменные============================================================ 
string MoneyManagement = "AutoLot";
bool AutoMoneyManagement = false;
double PercentToRisk = 0.02;
double TahananModal = 10000.0;

bool UseEquityStop = false;
double TotalEquityRisk = 20.0;
bool UseTrailingStop = false;
bool UseTimeOut = false;
double MaxTradeOpenHours = 48.0;

double PriceTarget, StartEquity, BuyTarget, SellTarget ;
double AveragePrice, SellLimit, BuyLimit ;
double LastBuyPrice, LastSellPrice, Spread;
bool flag;

int timeprev = 0, expiration;
int NumOfTrades = 0;
double iLots;
int cnt = 0, total;
double Stopper = 0.0;
bool TradeNow = false, LongTrade = false, ShortTrade = false;
int ticket;
bool NewOrdersPlaced = false;
double AccountEquityHighAmt, PrevEquity;

double    TrallB        = 0;
double    TrallS        = 0;
int       slippage      =30;
//====================================================================================================================== 
int i, Ticket, DG, LastError, TimeB, TimeS;
bool TickeT, Work=true;
double Pp, Mnoj, Mnoj2;
string Symb,CommentBox[],cm2;
string indicator;
double BuySignal,SellSignal,BuyLine,SellLine ;
datetime t;

double lt[30],lt_h[30],step[30];
//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986
void start() {
   if (Work==false) return;
   if(buy) buyf();
   if(sell) sellf();
   BuySignal = iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 3, 1);
      SellSignal = iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 2, 1);
      BuyLine = iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 0, 1);
      SellLine = iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 1, 1);
  {
   double OOP,SL;
   int b=0,s=0,tip,TicketB=0,TicketS=0;
   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            tip = OrderType();
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            if(tip==OP_BUY)
              {
               b++;
               TicketB=OrderTicket();
               if(Stoploss!=0   && Bid<=OOP - Stoploss   * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;}
               if(Takeprofit!=0 && Bid>=OOP + Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;}
               if(TrailingStop>0)
                 {
                  SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                  if(SL>=OOP+TrailingStart*Point && (TrallB==0 || TrallB+TrailingStep*Point<SL)) TrallB=SL;
                 }
              }
            if(tip==OP_SELL)
              {
               s++;
               if(Stoploss!=0   && Ask>=OOP + Stoploss   * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;}
               if(Takeprofit!=0 && Ask<=OOP - Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;}
               TicketS=OrderTicket();
               if(TrailingStop>0)
                 {
                  SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                  if(SL<=OOP-TrailingStart*Point && (TrallS==0 || TrallS-TrailingStep*Point>SL)) TrallS=SL;
                 }
              }
           }
        }
     }
   if(b!=0)
     {
      if(b>1) Print("Трал корректно работает только с 1 ордером");
      else
      if(TrallB!=0)
        {
         Print("Тралим ордер ",TicketB);
         DrawHline("SL Buy",TrallB,clrBlue,1);
         if(Bid<=TrallB)
           {
            if(OrderSelect(TicketB,SELECT_BY_TICKET))
               if(OrderProfit()>0)
                  if(!OrderClose(TicketB,OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrRed))
                     Print("Ошибка закрытия ордера ",GetLastError());
           }
        }
     }
   else {TrallB=0;ObjectDelete("SL Buy");}
//---
   if(s!=0)
     {
      if(s>1) Print("Трал корректно работает только с 1 ордером");
      else
      if(TrallS!=0)
        {
         Print("Тралим ордер ",TicketS);
         DrawHline("SL Sell",TrallS,clrRed,1);
         if(Ask>=TrallS)
           {
            if(OrderSelect(TicketS,SELECT_BY_TICKET))
               if(OrderProfit()>0)
                  if(!OrderClose(TicketS,OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrRed))
                     Print("Ошибка закрытия ордера ",GetLastError());
           }
        }
     }
   else {TrallS=0;ObjectDelete("SL Sell");}
//---
   int err;
   if(IsTesting() && OrdersTotal()==0)
     {
      double Lot=0.02;
      err=OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,"тест",0);
      err=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,0,"тест",0);
      
     }
   
  }
  
//=====================================================================

     //+------------------------------------------------------------------+
//int OnInit()
{
   AC=" "+AccountCurrency();
   EventSetTimer(1);
   //return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//void OnDeinit(const int reason)
{
   //if (reason==REASON_REMOVE) ObjectsDeleteAll(0,"cm_FAR");
   ObjectsDeleteAll(0,"cm__");
}
//--------------------------------------------------------------------
//void OnTick() {OnTimer();}
//void OnTimer()
{
   if (ObjectFind("cm_FAR")==0)
   {
      ObjectGetInteger(0,"cm_FAR",OBJPROP_XDISTANCE,0,X);
      ObjectGetInteger(0,"cm_FAR",OBJPROP_YDISTANCE,0,Y);
   }
   else
   {
      RectLabelCreate(0,"cm_FAR",0,X,Y,200,105,clrWhite,clrBlack,STYLE_SOLID,3,false,true,true,0);
   }
   RectLabelCreate(0,"cm__fon1"        ,0,X+1  ,Y+1 ,198,103,clrLemonChiffon,clrLightGray,STYLE_SOLID,1,false,false,true,0);
   RectLabelCreate(0,"cm__0_" ,0 ,X+1,Y+1,198,18,clrBlue,clrLightGray,STYLE_SOLID,1,false,false,true,0);
   RectLabelCreate(0,"cm__fon2"        ,0,X+3  ,Y+40 ,194,39,clrWhite,clrLightGray,STYLE_SOLID,1,false,false,true,0);
   
   LabelCreate(0    ,"cm__00",0 ,X+10,Y+10,CORNER_LEFT_UPPER,"ea Close Far",Font,Width+0,clrWhite,0,ANCHOR_LEFT,false,false,true,0);
   LabelCreate(0    ,"cm__01",0 ,X+10,Y+30,CORNER_LEFT_UPPER,StringConcatenate("Profit ",!AllSymbol?Symbol():"all symbols"),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);

   ButtonCreate(0,"cm__kn 01"  ,0,X+3  ,Y+82,97,18 ,"All Symbols",Font,Width,clrBlack,clrLightGray,AllSymbol);
   ButtonCreate(0,"cm__kn 02"  ,0,X+100,Y+82,97,18 ,"Close FAR",Font,Width,clrBlack,clrLightGray,CloseFar);

   AllSymbol = ObjectGetInteger(0,"cm__kn 01",OBJPROP_STATE);
   CloseFar  = ObjectGetInteger(0,"cm__kn 02",OBJPROP_STATE);
   
   //---
   
   RefreshRates();

   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double PriceFar=0,LossFar=0,LotFar=0;
   int TicketFar=0;
   int TicketLoss=0;
   double Loss=0,LotLoss=0,ProfitLoss=0;
   //int i;
   double Profit=0;
   string symb=NULL;
   for (i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()!=Symbol()   && !AllSymbol) continue;
         if (Magic!=OrderMagicNumber() && Magic!=-1) continue;
         Profit=OrderProfit()+OrderCommission()+OrderSwap();
         if (Loss>Profit) 
         {
            Loss=Profit; 
            TicketLoss=OrderTicket();
            LotLoss = OrderLots();
         }
         OOP=OrderOpenPrice();
         if (MathAbs(OOP-(Ask+Bid)/2)>PriceFar && MathAbs(OOP-(Ask+Bid)/2)/Point >=MinLoss && Profit<0)  
         {
            LossFar=Profit; 
            TicketFar=OrderTicket();
            PriceFar=MathAbs(OOP-(Ask+Bid)/2);
            LotFar = OrderLots();
            symb = OrderSymbol();
         }
      }
   }
   
   LabelCreate(0    ,"cm__03",0 ,X+10,Y+50,CORNER_LEFT_UPPER,StringConcatenate("Loss ",TicketLoss),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);
   LabelCreate(0    ,"cm__04",0 ,X+190,Y+50,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(Loss,2),AC),Font,Width+0,clrBlack,0,ANCHOR_RIGHT,false,false,true,0);
   LabelCreate(0    ,"cm__05",0 ,X+10,Y+50,CORNER_LEFT_UPPER,StringConcatenate("Far ",TicketFar),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);
   LabelCreate(0    ,"cm__06",0 ,X+190,Y+50,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(LossFar,2),AC),Font,Width+0,clrBlack,0,ANCHOR_RIGHT,false,false,true,0);
   LabelCreate(0    ,"cm__07",0 ,X+10,Y+70,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(LotFar,2),"  ",symb),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);

   //---
   
   Profit=0;
   for (i=OrdersHistoryTotal()-1; i>=0; i--)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol()!=Symbol()   && !AllSymbol) continue;
         if (Magic!=OrderMagicNumber() && Magic!=-1) continue;
         if (OrderCloseTime()>=iTime(NULL,1440,DayProfit)) 
            Profit+=OrderProfit()+OrderSwap()+OrderCommission();
      } 
   }
   LabelCreate(0,"cm__02",0 ,X+190,Y+30,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(Profit,2),AC),Font,Width+0,clrBlack,0,ANCHOR_RIGHT,false,false,true,0);
   
   //---Comment(" Profit=",Profit," LossFar=",LossFar);
   
   if (CloseFar && Profit>ProfitMin)
   {
      if (LossFar+Profit-ProfitMin>0)
      {
         if (OrderSelect(TicketFar,SELECT_BY_TICKET))
         { 
             tip = OrderType(); 
            int DIGITS = (int)MarketInfo(OrderSymbol(),MODE_DIGITS);
            if (tip==OP_BUY)             
            {  
               if (OrderClose(TicketFar,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),DIGITS),100,clrNONE)) 
                  Alert("ea Close Far Order <<",TicketFar,">> ",OrderSymbol(),"  Loss=",DoubleToString(OrderProfit()+OrderSwap()+OrderCommission(),2),AC);
            }                                         
            if (tip==OP_SELL)        
            {
               if (OrderClose(TicketFar,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),DIGITS),100,clrNONE)) 
                  Alert("ea Close Far Order <<",TicketFar,">> ",OrderSymbol(),"  Loss=",DoubleToString(OrderProfit()+OrderSwap()+OrderCommission(),2),AC);
            }
         }
      }
   }
}
//=====================================================================   
 if(Info)

 if(Info)
double Lots = MarketInfo(Symbol(),MODE_MINLOT);  
switch(Layer_multiplier)
   {
   case a:
      Multiplier = 2;
      break;
   case B:
      Multiplier = 1.9;
      break;
   case c:
      Multiplier = 1.8;
      break;
   case d:
      Multiplier = 1.7;
      break;
   case e:
      Multiplier = 1.6;
      break;
   case f:
      Multiplier = 1.5;
      break;
   case g:
      Multiplier = 1.4;
      break;
   case h:
      Multiplier = 1.3;
      break;
   case I:
      Multiplier = 1.2;
      break;
   case j:
      Multiplier = 1.1;
      break;
   case k:
      Multiplier = 1;
      break;
      }
//íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí
switch(identifier)
   {
   case l:
      identifier = 1;
      break;
   case m:
      identifier = 2;
      break;
   case n:
      identifier = 3;
      break;
   case o:
      identifier = 4;
      break; 
       }
 double Ld_40 = PercentToRisk / TahananModal;
 if (AutoCompound==true) StartingLots = NormalizeDouble(AccountBalance() * Ld_40 / MarketInfo(Symbol(), MODE_TICKVALUE), 2);
   
 
   double PrevCl;
   double CurrCl;
   if (UseTrailingStop) TrailingAlls(TrailStart, TrailStop, AveragePrice);
   if (UseTimeOut) {
      if (TimeCurrent() >= expiration) {
         CloseThisSymbolAll();
         Print("Closed All due to TimeOut");
      }
   }
   if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double CurrentPairProfit = CalculateProfit();
   if (UseEquityStop) {
      if (CurrentPairProfit < 0.0 && MathAbs(CurrentPairProfit) > TotalEquityRisk / 100.0 * AccountEquityHigh()) {
         CloseThisSymbolAll();
         Print("Closed All due to Stop Out");
         NewOrdersPlaced = false;
      }
   }
   total = CountTrades();
   if (total == 0) flag = false;
   for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
      (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) {
         if (OrderType() == OP_BUY) {
            LongTrade = true;
            ShortTrade = false;
            break;
         }
      }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) {
         if (OrderType() == OP_SELL) {
            LongTrade = false;
            ShortTrade = true;
            break;
         }
      }
   }
   if (total > 0 && total <= MaxTrades) {
      RefreshRates();
      LastBuyPrice = FindLastBuyPrice();
      LastSellPrice = FindLastSellPrice();
      if (LongTrade && LastBuyPrice - Ask >= PipStep * Point) TradeNow = true;
      if (ShortTrade && Bid - LastSellPrice >= PipStep * Point) TradeNow = true;
   }
   if (total < 1) {
      ShortTrade = false;
      LongTrade = false;
      TradeNow = true;
      StartEquity = AccountEquity();
   }
   if (TradeNow) {
      LastBuyPrice = FindLastBuyPrice();
      LastSellPrice = FindLastSellPrice();
      if (ShortTrade) {
         NumOfTrades = total;
         iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
         RefreshRates();
         ticket = OpenPendingOrder(1, iLots, Bid, slip, Ask, 0, 0, NumOfTrades, magic, 0, HotPink);
         if (ticket < 0) {
            Print("Error: ", GetLastError());
            return;
         }
         LastSellPrice = FindLastSellPrice();
         TradeNow = false;
         NewOrdersPlaced = true;
      } else {
         if (LongTrade) {
            NumOfTrades = total;
            iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
            ticket = OpenPendingOrder(0, iLots, Ask, slip, Bid, 0, 0, NumOfTrades, magic, 0, Lime);
            if (ticket < 0) {
               Print("Error: ", GetLastError());
               return;
            }
            LastBuyPrice = FindLastBuyPrice();
            TradeNow = false;
            NewOrdersPlaced = true;
         }
      }
   }
   if (TradeNow && total < 1) {
      PrevCl = iClose(Symbol(), 0, 2);
      CurrCl = iClose(Symbol(), 0, 1);
      SellLimit = Bid;
      BuyLimit = Ask;
      if (!ShortTrade && !LongTrade) {
         NumOfTrades = total;
         iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
         if (PrevCl > CurrCl) {
            if (iRSI(NULL, PERIOD_M15, 5, PRICE_CLOSE, 1) > 56.0) { //áîëüøå  >
               ticket = OpenPendingOrder(1, iLots, SellLimit, slip, SellLimit, 0, 0, NumOfTrades, magic, 0, HotPink);
               if (ticket < 0) {
                  Print("Error: ", GetLastError());
                  return;
               }
               LastBuyPrice = FindLastBuyPrice();
               NewOrdersPlaced = true;
            }
         } else {
            if (iRSI(NULL, PERIOD_M15, 5, PRICE_CLOSE, 1) < 36.0) { // ìåíüøå  <
               ticket = OpenPendingOrder(0, iLots, BuyLimit, slip, BuyLimit, 0, 0, NumOfTrades, magic, 0, Lime);
               if (ticket < 0) {
                  Print("Error: ", GetLastError());
                  return;
               }
               LastSellPrice = FindLastSellPrice();
               NewOrdersPlaced = true;
            }
         }
         if (ticket > 0) expiration = TimeCurrent() + 60.0 * (60.0 * MaxTradeOpenHours);
         TradeNow = false;
      }
   }
   total = CountTrades();
   AveragePrice = 0;
   double Count = 0;
   for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
      (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
            AveragePrice += OrderOpenPrice() * OrderLots();
            Count += OrderLots();
         }
      }
   }
   if (total > 0) AveragePrice = NormalizeDouble(AveragePrice / Count, Digits);
   if (NewOrdersPlaced) {
      for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
         (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) {
            if (OrderType() == OP_BUY) {
               PriceTarget = AveragePrice + TakeProfit * Point;
               BuyTarget = PriceTarget;
               Stopper = AveragePrice - stoploss * Point;
               flag = true;
            }
         }
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) {
            if (OrderType() == OP_SELL) {
               PriceTarget = AveragePrice - TakeProfit * Point;
               SellTarget = PriceTarget;
               Stopper = AveragePrice + stoploss * Point;
               flag = true;
            }
         }
      }
   }
   if (NewOrdersPlaced) {
      if (flag == true) {
         for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
            (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) (int)OrderModify(OrderTicket(), AveragePrice, OrderStopLoss(), PriceTarget, 0, Yellow);
            NewOrdersPlaced = false;
         }
      }
   }
   return;
} 
//      Print ("SellSignal ",SellSignal);      
//      Print ("BuySignal ",BuySignal);
//Print ("0",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 0, 1));
//Print ("1",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 1, 1));
//Print ("2",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 2, 1));
//Print ("3",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 3, 1));
//Print ("4",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 4, 1));
//Print ("5",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 5, 1));
//Print ("6",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 6, 1));
//Print ("7",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 7, 1));
//Print ("8",iCustom(NULL, 0, "MarketInsider_v1.2.ex4", ATR_Period, ATR_Factor, CCI_Period, CCI_Level, AlertSystem,AlertPasuse,Send_Push_Notifications, bars , 8, 1));


//==========================================================================================
void buyf()
     {
   int market,lock;
   double lastprice;
         double price,slot;
   double del_price, del_slot;
   for(i=OrdersTotal()-1;i>=0;i--) 
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic) 
      {
         if(OrderType()==0)
       {
            market++;                                                         //счётчик buy
            if(OrderOpenPrice()<lastprice || lastprice==0) lastprice=OrderOpenPrice();          //обновление lastprice по цене последнего открытого ордера buy
            }
            else
            {
            lock++;                                                           //счётчик sell
            }
         }
      }
   if(market!=0 || lock!=0) 
      {
      for(i=OrdersHistoryTotal()-1;i>=0;i--) 
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symb && OrderMagicNumber()==magic && OrderCloseTime()>TimeB)
        {
         del_price=OrderOpenPrice();
         del_slot=OrderLots();
//            DeleteAll(magic);                                //при закрытии самого старого ордера закрываются все остальные
//==============================================

      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic) {
            if(OrderType()==0) slot+=OrderLots(); else slot-=OrderLots();
            }
         }
      slot =slot-del_slot;
      for(i=OrdersTotal()-1;i>=0;i--) 
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic&&slot>0) 
         {
            if(OrderType()==0) price+=OrderOpenPrice()*(OrderLots()/slot); else price-=OrderOpenPrice()*(OrderLots()/slot);
            }
         }
      price = price - del_price;
      price=NormalizeDouble(price+take_profit*Pp,Digits);
     for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic) {
            if(OrderType()==0) OrderModify(OrderTicket(),-1,1,price);
                          else OrderModify(OrderTicket(),-1,price+(Ask-Bid),1);
            }
         }
//==============================

            TimeB=TimeCurrent();                               //обновление TimeB по нынешнему времени
            
            return;
            }
         }
      }
   if(market==0 && (BuyLine<2147483647&&BuyLine>0&&BuySignal<2147483647&&BuySignal>0)&&iBarShift(NULL,0,t)>0) {
      TimeB=TimeCurrent();
      SendOrder(0,lt[0],-1,1,1500,1,0,magic);                    //открытие ордера на покупку если нет открытых buy
      t=iTime(NULL,0,0);
      }
   if(market>0 && Ask<lastprice-step[market-1]*Pp && (BuyLine<2147483647&&BuyLine>0&&BuySignal<2147483647&&BuySignal>0)&&iBarShift(NULL,0,t)>0) {                    //если есть ордер на покупку и цена ask меньше чем последняя цена по buy с учётом уставки и шага
      SendOrder(0,lt[market],-1,1,1500,1,0,magic);
      t=iTime(NULL,0,0);
      if(market>=set_3-1 && (SellLine<2147483647&&SellLine>0&&SellSignal<2147483647&&SellSignal>0)&&iBarShift(NULL,0,t)>0) {
      SendOrder(1,lt_h[market],-1,1,1500,1,0,magic);   //открытие хеджирующего ордера при достижении отметки на set_3
      t=iTime(NULL,0,0);
      }
      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic) {
         //ordprofit= ordprofit+OrderProfit();
            if(OrderType()==0) slot+=OrderLots(); else slot-=OrderLots();
            }
         }
      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic&& slot>0) {
            if(OrderType()==0) price+=OrderOpenPrice()*(OrderLots()/slot); 
            
            else price-=OrderOpenPrice()*(OrderLots()/slot);
            }
         }
      price=NormalizeDouble(price+take_profit*Pp,Digits);
      //if (ordprofit/lot>NormalizeDouble(take_profit, Digits)) DeleteAll(magic);
            
      
      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic) {
           // ordprofit= ordprofit+OrderProfit();
            
            if(OrderType()==0) OrderModify(OrderTicket(),-1,-1,price);
                          else OrderModify(OrderTicket(),-1,price+(Ask-Bid),-1);
      }
         }
      }
   }
//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986
void sellf() {
   int market,lock;
   double lastprice;
   double price,slot, ordprofit;
   double del_price, del_slot;
   for(i=OrdersTotal()-1;i>=0;i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2) {
         if(OrderType()==1) {
            market++;
            if(OrderOpenPrice()>lastprice) lastprice=OrderOpenPrice();
            }else{
            lock++;
            }
         }
      }
   if(market!=0 || lock!=0) {
      for(i=OrdersHistoryTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symb && OrderMagicNumber()==magic2 && OrderCloseTime()>TimeS) {
//            DeleteAll(magic2);
//==============================================

      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2) {
//         ordprofit= ordprofit+OrderProfit();
            if(OrderType()==0) slot+=OrderLots(); else slot-=OrderLots();
            }
         }
      slot =slot-del_slot;
      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2&&slot>0) {
            if(OrderType()==0) price+=OrderOpenPrice()*(OrderLots()/slot); else price-=OrderOpenPrice()*(OrderLots()/slot);
            }
         }
      price = price - del_price;
      price=NormalizeDouble(price-take_profit*Pp,Digits);
 //     if (ordprofit/lot>NormalizeDouble(take_profit, Digits)) DeleteAll(magic); 
      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2) {
            if(OrderType()==0) OrderModify(OrderTicket(),-1,-1,price);
                          else OrderModify(OrderTicket(),-1,price-(Ask-Bid),-1);
         }
         }
//==============================
            TimeS=TimeCurrent();
            return;
            }
         }
      }
   if(market==0 && (SellLine<2147483647&&SellLine>0&&SellSignal<2147483647&&SellSignal>0)&&iBarShift(NULL,0,t)>0) {
      TimeS=TimeCurrent();
      SendOrder(1,lt[0],-1,1,1500,1,0,magic2);
      t=iTime(NULL,0,0);
      }
   if(market>0 && Bid>lastprice+step[market-1]*Pp && (SellLine<2147483647&&SellLine>0&&SellSignal<2147483647&&SellSignal>0)&&iBarShift(NULL,0,t)>0) {
      SendOrder(1,lt[market],-1,1,1500,1,0,magic2);
      t=iTime(NULL,0,0);
      if(market>=set_3-1 && (BuyLine<2147483647&&BuyLine>0&&BuySignal<2147483647&&BuySignal>0)&&iBarShift(NULL,0,t)>0) {
      SendOrder(0,lt_h[market],-1,1,1500,1,0,magic2);
      t=iTime(NULL,0,0);
      }
//      double price,slot;
      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2) {
            ordprofit= ordprofit+OrderProfit();
            if(OrderType()==1) slot+=OrderLots(); else slot-=OrderLots();
            }
         }
      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2&&slot>0) {
            if(OrderType()==1) price+=OrderOpenPrice()*(OrderLots()/slot); 
            else price-=OrderOpenPrice()*(OrderLots()/slot);
            }
         }
      price=NormalizeDouble(price-take_profit*Pp,Digits);
      if (ordprofit/lot>NormalizeDouble(take_profit, Digits)) DeleteAll(magic2);
      for(i=OrdersTotal()-1;i>=0;i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2) {
            if(OrderType()==1) OrderModify(OrderTicket(),-1,-1,price);
                          else OrderModify(OrderTicket(),-1,price-(Ask-Bid),-1);
         }
         }
      }
   }
//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986
bool SendOrder(int Type,double LT,double OP,int ModeSL,double SL,int ModeTP,double TP,int MG) {
   color CL;
   if (Type==0) CL=Blue; else  if (Type==1) CL=Red; else  if (Type==2 || Type==4) CL=DarkTurquoise; else if (Type==3 || Type==5) CL=Orange;
   // првоерка объема
   if (LT<MarketInfo(Symbol(),MODE_MINLOT)) LT=MarketInfo(Symbol(),MODE_MINLOT);
   if (LT>MarketInfo(Symbol(),MODE_MAXLOT)) LT=MarketInfo(Symbol(),MODE_MAXLOT);
   if (LT*MarketInfo(Symbol(),MODE_MARGINREQUIRED)>AccountEquity()) {
      PnC(StringConcatenate("Нехватает денег для октрытия сделки",Type," объемом: ",DoubleToStr(LT,DG)),0);
      return(false);
      }
   // проверка отложенных ордеров
   double Slv=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
   if (Type>1) {
      if (Type==2 && Ask-OP<Slv) OP=Ask-Slv;
      if (Type==3 && OP-Bid<Slv) OP=Bid+Slv;
      if (Type==4 && OP-Ask<Slv) OP=Ask+Slv;
      if (Type==5 && Bid-OP<Slv) OP=Bid-Slv;
      }
   // открытие
   for(int k=0;k<=TryToTrade;k++) {
      if (Type==0) OP=Ask; 
      if (Type==1) OP=Bid;  
      PnC(StringConcatenate("Открытие ордера, тип: ",Type," объем: ",DoubleToStr(LT,DG)," цена: ",DoubleToStr(OP,Digits)),0); 
      if (IsTradeAllowed()) {
          Ticket=OrderSend(Symbol(),Type,LT,NormalizeDouble(OP,Digits),3,0,0,NULL,MG,0,CL);
         }else{ PnC(StringConcatenate("Торговый поток занят, ждем ",k),0); 
         Sleep(WaitTime); 
         continue; }
      if (Ticket >= 0) { PnC(StringConcatenate("Открыт ордер ",Ticket),0); 
      break; }
      ResetLastError();
      LastError=Fun_Error(GetLastError());
      if (LastError==0) { 
         RefreshRates(); Sleep(WaitTime); 
         if (k==TryToTrade) return(false); }
      if (LastError==1) return(false);
      if (LastError==2) { Work=false; return(false); }
       }
   if (SL==0 && TP==0) return(true);
   Ticket=OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
   // проверка и расчет стопов
   if (ModeSL==0) {
      if (MathAbs(OrderOpenPrice()-SL)<Slv && SL!=0) {
         if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-Slv; else SL=OrderOpenPrice()+Slv;
         }
      }else{
      if (SL!=0) {
         if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;
         if (Type==1 || Type==3 || Type==5) SL=OrderOpenPrice()+SL*Pp;
         }
      }
   if (ModeTP==0) {
      if (MathAbs(OrderOpenPrice()-TP)<Slv && TP!=0) {
         if (Type==0 || Type==2 || Type==4) TP=OrderOpenPrice()+Slv; else TP=OrderOpenPrice()-Slv;
         }
      }else{
      if (TP!=0) {
         if (Type==0 || Type==2 || Type==4) TP=OrderOpenPrice()+TP*Pp;
         if (Type==1 || Type==3 || Type==5) TP=OrderOpenPrice()-TP*Pp;
         }
      }
   // выставляем стопы
   for(k=0;k<=TryToTrade;k++) {
      PnC(StringConcatenate("Установка стопов на ордер: ",Ticket," с/л: ",DoubleToStr(SL,Digits)," т/п: ",DoubleToStr(TP,Digits)),0);
      if (IsTradeAllowed()) {
         TickeT=OrderModify(Ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(TP,Digits),0,CLR_NONE);
         }else{ PnC(StringConcatenate("Торговый поток занят, ждем ",k),0); 
         Sleep(WaitTime); continue; }
      if (TickeT == true) { PnC(StringConcatenate("Модифицирован ордер ",Ticket),0);
       break; }
       ResetLastError();
      LastError=Fun_Error(GetLastError());
      if (LastError==0) { 
         RefreshRates(); Sleep(WaitTime); 
         if (k==TryToTrade) return(false); }
      if (LastError==1) return(false);
      if (LastError==2) { Work=false; return(false); }
   }
   return(true);
   }
 //====================================================================================================================================

//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986
void CloseOrder(int Number,double LT) {
   if (!OrderSelect(Number,SELECT_BY_TICKET,MODE_TRADES)) return;
   bool Type=OrderType();
   if (Type>1) return;
   if(LT==-1) LT=NormalizeDouble(OrderLots(),DG); else LT=NormalizeDouble(LT,DG);
   double OCP;
   for(int k=0;k<=TryToTrade;k++) 
    {
      if (Type==0) OCP=Bid; else OCP=Ask;
      PnC(StringConcatenate("Закрытие ордера: ",Number," тип: ",Type," объем: ",DoubleToStr(LT,DG)," по цене: ",DoubleToStr(OCP,Digits)),0);
      if (IsTradeAllowed()) 
      {
         TickeT=OrderClose(Number,LT,NormalizeDouble(OCP,Digits),30,White);
         }else{ PnC(StringConcatenate("Торговый поток занят, ждем ",k),0); Sleep(WaitTime); continue; }
      if (TickeT) { PnC("Закрыт ордер ",0); return; }
      LastError=Fun_Error(GetLastError());
      if (LastError==0)
       { 
         RefreshRates(); Sleep(WaitTime); 
         if (k==TryToTrade) return;
          }
      if (LastError==1) return;
      if (LastError==2) { Work=false; return;
       }
      }
   return;
   }
//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986
void DeleteAll(int MG) {
   for(i=OrdersTotal()-1;i>=0;i--) {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==MG) {
         if (OrderType()<2) CloseOrder(OrderTicket(),OrderLots()); else bool d=OrderDelete(OrderTicket());
         }
      }
   }
//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986
void OrderModify (int Tick,double OP=-1,double SL=-1,double TP=-1) 
{
   if (OrderSelect(Tick,SELECT_BY_TICKET,MODE_TRADES)==false) return;
   string cm;
   if(OP<0) OP=OrderOpenPrice(); else cm="цена " + DoubleToStr(OrderOpenPrice(),Digits) + " => " + DoubleToStr(OP,Digits) + "; ";
   if(SL<0) SL=OrderStopLoss(); else cm=cm+"с/л " + DoubleToStr(OrderStopLoss(),Digits) + " => " + DoubleToStr(SL,Digits) + "; ";
   if(TP<0) TP=OrderTakeProfit(); else cm=cm+"т/п " + DoubleToStr(OrderTakeProfit(),Digits) + " => " + DoubleToStr(TP,Digits) + "; ";
   for(int k=0;k<=TryToTrade;k++) {
      PnC(StringConcatenate("Модификация ордера: ",Tick," ",cm),0);
      if (IsTradeAllowed()) {
         TickeT=OrderModify(OrderTicket(),NormalizeDouble(OP,Digits),NormalizeDouble(SL,Digits),NormalizeDouble(TP,Digits),0,CLR_NONE);
         }else{ PnC(StringConcatenate("Торговый поток занят, ждем ",k),0); Sleep(WaitTime); continue; }
      if (TickeT ==true) { PnC("Ордер модифицирован ",0); return; }
      LastError=Fun_Error(GetLastError());
      if (LastError==0) { 
         RefreshRates(); Sleep(WaitTime); 
         if (k==TryToTrade) return; }
      if (LastError==1) return;
      if (LastError==2) { Work=false; return; }
      }
   }
//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986
void init() {
   Pp=Point;
   Mnoj2=1/Pp;
   if (Pp==0.00001 || Pp==0.001) Pp*=10; 
   Mnoj=1/Pp;
   Symb=Symbol();
   if (MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2;
   if (MarketInfo(Symb,MODE_LOTSTEP)==0.1)  DG=1;
   if(CommetSize>0) ArrayResize(CommentBox,CommetSize);
   for(i=0;i<CommetSize;i++) CommentBox[i]="";
   lt[0]=NormalizeDouble(lot,DG);
   step[0]=step_1;
   for(i=1;i<30;i++) 
   {
      if(i<set_2) 
      {
         lt[i]=NormalizeDouble(lt[i-1]*lot_factor_1,DG); 
         if (lt[i]>lt[0]*Layer_Multiplier) lt[i]=lt[0]*Layer_Multiplier;
         step[i]=step_1;
         }
         else
         { 
         lt[i]=NormalizeDouble(lt[i-1]*lot_factor_2,DG);
         if (lt[i]>lt[0]*Layer_Multiplier) lt[i]=lt[0]*Layer_Multiplier;
         step[i]=step_2;
         }
      if(i>=set_3-1) lt_h[i]=NormalizeDouble(lt[i]*(hedje_factor+hedje_plus*(set_3-1-i)),DG);
      if (lt_h[i]>lt[0]*Layer_Multiplier) lt_h[i]=lt[0]*Layer_Multiplier;
      }
   for(i=OrdersTotal()-1;i>=0;i--) 
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb) 
      {
         if(OrderMagicNumber()==magic && TimeB<OrderOpenTime()) TimeB=OrderOpenTime();
         if(OrderMagicNumber()==magic2 && TimeS<OrderOpenTime()) TimeS=OrderOpenTime();
         }
      }   
   return;
   }
 //====================================================================================================================================
extern double Risk = 5;
extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок
extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2
string lock_signalsymbol = "AllSymbol";
static double lock_eqviti,lock_last, lock_lot;
static bool lock_flag,flagADX,old_uptrend;

//2. Функцию start() переименовываем в start_main() и добавляем над ней:
int start_main(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}

//3. В функцию init() добавляем

/*init_lock();
return(0);
}
*/
//4. Ниже добавляем:
int init_lock()
{
lock_eqviti=AccountBalance();
lock_lot = 0;
lock_last = Close[0];
flagADX=true;
old_uptrend=false;
signal();
lock_flag = false;
return(0);
}

void start_lock(){
int sig,Step;
if(OrdersTotal()<1){init_lock();return;}
notakeprofit();
if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock();
return;
}
else{
sig=signal();
Step =MathAbs(sig);
if (Step<lock_min_step) 
return;
if (Ask>lock_last+(Step*Point) && sig>0 ){
if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue))
lock_last = Ask;
}
if (Bid<lock_last-(Step*Point) && sig<0){
if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part);
RefreshRates();
if(OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue))
lock_last = Bid;
}
}
return;
}

int signal() {
int I, j, result;
double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax;
SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1));
for (j = 120; j >= 0; j--) {
SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j);
for (I = j; I <= j + SSP - 1; I++) {
price = iHigh(lock_signalsymbol, PERIOD_M5,i);
if (SsMax < price)SsMax = price;
price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;}
smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30;
if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;}
if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;}
result = 0;
if (flagADX != old_uptrend && flagADX == true) result = +1;
if (flagADX != old_uptrend && flagADX == false) result = -1;
old_uptrend = flagADX;
}
if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result);
 return(0);
 }

void CloseAllFirstProfit() {
int I, k=OrdersTotal();
for (I=k-1; I>=0; I--) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
k=OrdersTotal();
for (I=k-1; i>=0; I--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}

void ClosePosBySelect() 
{
if (OrderType()==OP_BUY) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE))
if (OrderType()==OP_SELL) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE))
return;
}

double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int I,k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (I=0; I<k; I++) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots();
return(l);
}

bool notakeprofit(){
bool ok=true;
for (int I=OrdersTotal(); I >=0; I--) if ( OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE))
ok=false;return(ok);
}
return(ok);
}

double NormalizeLot(double lo, bool ro=True, string sy="") {
double l, k;
if (sy=="" || sy=="0") sy=Symbol();
double ls=MarketInfo(sy, MODE_LOTSTEP);
double ml=MarketInfo(sy, MODE_MINLOT);
double mx=MarketInfo(sy, MODE_MAXLOT);
if (ml==0) ml=0.1;
if (mx==0) mx=100;
if (ls>0) k=1/ls; else k=1/ml;
if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;
if (l<ml) l=ml;
if (l>mx) l=mx;
return(l);
}

 //====================================================================================================================================  
int CountTrades() {
   int count = 0;
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      (int)OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) count++;
   }
   return (count);
}
//==================================================== Выбор лота ===================================================== 

void CloseThisSymbolAll() {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      (int)OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) {
            if (OrderType() == OP_BUY) (int)OrderClose(OrderTicket(), OrderLots(), Bid, slip, Blue);
            if (OrderType() == OP_SELL) (int)OrderClose(OrderTicket(), OrderLots(), Ask, slip, Red);
         }
         Sleep(7000);
      }
   }
}

//================================================== Доливка СЕЛЛ =========================================================
//==========================================  Закрытие локовых ордеров   ================================================================
int OpenPendingOrder(int pType, double pLots, double pPrice, int pSlippage, double ad_24, int ai_32, int ai_36, string a_comment_40, int a_magic_48, int a_datetime_52, color a_color_56) {
   int l_ticket_60 = 0;
   int l_error_64 = 0;
   int l_count_68 = 0;
   int li_72 = 100;
   switch (pType) {
   case 2:
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_BUYLIMIT, pLots, pPrice, pSlippage, StopLong(ad_24, ai_32), TakeLong(pPrice, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError();
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
      }
      break;
   case 4:
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_BUYSTOP, pLots, pPrice, pSlippage, StopLong(ad_24, ai_32), TakeLong(pPrice, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError();
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
      }
      break;
   case 0:
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         RefreshRates();
         l_ticket_60 = OrderSend(Symbol(), OP_BUY, pLots, Ask, pSlippage, StopLong(Bid, ai_32), TakeLong(Ask, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError();
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
      }
      break;
   case 3:
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_SELLLIMIT, pLots, pPrice, pSlippage, StopShort(ad_24, ai_32), TakeShort(pPrice, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError();
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
                                 }
      break;
   case 5:
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_SELLSTOP, pLots, pPrice, pSlippage, StopShort(ad_24, ai_32), TakeShort(pPrice, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError();
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
                                 }
      break;
   case 1:
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_SELL, pLots, Bid, pSlippage, StopShort(Ask, ai_32), TakeShort(Bid, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError();
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
                               }
                         }
   return (l_ticket_60);
}

double StopLong(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   else return (ad_0 - ai_8 * Point);
}
//_______________________________________________________________________
double StopShort(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   else return (ad_0 + ai_8 * Point);
}

double TakeLong(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   else return (ad_0 + ai_8 * Point);
}
//_______________________________________________________________________
double TakeShort(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   else return (ad_0 - ai_8 * Point);
}
//_______________________________________________________________________
double CalculateProfit() {
   double ld_ret_0 = 0;
   for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
      (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) ld_ret_0 += OrderProfit();
   }
   return (ld_ret_0);
}
//-----------
void TrailingAlls(int pType, int ai_4, double a_price_8) {
   int l_ticket_16;
   double l_ord_stoploss_20;
   double l_price_28;
   if (ai_4 != 0) {
      for (int l_pos_36 = OrdersTotal() - 1; l_pos_36 >= 0; l_pos_36--) {
         if (OrderSelect(l_pos_36, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == magic) {
               if (OrderType() == OP_BUY) {
                  l_ticket_16 = NormalizeDouble((Bid - a_price_8) / Point, 0);
                  if (l_ticket_16 < pType) continue;
                  l_ord_stoploss_20 = OrderStopLoss();
                  l_price_28 = Bid - ai_4 * Point;
                  if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 > l_ord_stoploss_20)) (int)OrderModify(OrderTicket(), a_price_8, l_price_28, OrderTakeProfit(), 0, Aqua);
               }
               if (OrderType() == OP_SELL) {
                  l_ticket_16 = NormalizeDouble((a_price_8 - Ask) / Point, 0);
                  if (l_ticket_16 < pType) continue;
                  l_ord_stoploss_20 = OrderStopLoss();
                  l_price_28 = Ask + ai_4 * Point;
                  if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 < l_ord_stoploss_20)) (int)OrderModify(OrderTicket(), a_price_8, l_price_28, OrderTakeProfit(), 0, Red);
               }
            }
            Sleep(7000);
         }
      }
  }
}
//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986
double AccountEquityHigh() {
   if (CountTrades() == 0) AccountEquityHighAmt = AccountEquity();
   if (AccountEquityHighAmt < PrevEquity) AccountEquityHighAmt = PrevEquity;
   else AccountEquityHighAmt = AccountEquity();
   PrevEquity = AccountEquity();
   return (AccountEquityHighAmt);
}

double FindLastBuyPrice() {
   double l_ord_open_price_8;
   int l_ticket_24;
   double ld_unused_0 = 0;
   int l_ticket_20 = 0;
   for (int l_pos_16 = OrdersTotal() - 1; l_pos_16 >= 0; l_pos_16--) {
      (int)OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderType() == OP_BUY) {
         l_ticket_24 = OrderTicket();
         if (l_ticket_24 > l_ticket_20) {
            l_ord_open_price_8 = OrderOpenPrice();
            ld_unused_0 = l_ord_open_price_8;
            l_ticket_20 = l_ticket_24;
         }
      }
   }
   return (l_ord_open_price_8);
}
//======================================================================================================================
double FindLastSellPrice() {
   double l_ord_open_price_8;
   int l_ticket_24;
   double ld_unused_0 = 0;
   int l_ticket_20 = 0;
   for (int l_pos_16 = OrdersTotal() - 1; l_pos_16 >= 0; l_pos_16--) {
      (int)OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderType() == OP_SELL) {
         l_ticket_24 = OrderTicket();
         if (l_ticket_24 > l_ticket_20) {
            l_ord_open_price_8 = OrderOpenPrice();
            ld_unused_0 = l_ord_open_price_8;
            l_ticket_20 = l_ticket_24;
         }
      }
   }
   return (l_ord_open_price_8);
}

     

//+------------------------------------------------------------------+
bool ButtonCreate(const long              chart_ID=0,               // ID графика
                  const string            name="Button",            // имя кнопки
                  const int               sub_window=0,             // номер подокна
                  const long               x=0,                     // координата по оси X
                  const long               y=0,                     // координата по оси y
                  const int               width=50,                 // ширина кнопки
                  const int               height=18,                // высота кнопки
                  const string            text="Button",            // текст
                  const string            font="Arial",             // шрифт
                  const int               font_size=10,             // размер шрифта
                  const color             clr=clrNONE,
                  const color             back_clr=clrNONE,
                  const bool              state=false)              // нажата/отжата
  {
   if (ObjectFind(chart_ID,name)==-1)
   {
      ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
      ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,1);
      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
      ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,clrNONE);
        }
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
   return(true);
}
//--------------------------------------------------------------------
bool RectLabelCreate(const long             chart_ID=0,               // ID графика
                     const string           name="RectLabel",         // имя метки
                     const int              sub_window=0,             // номер подокна
                     const long              x=0,                     // координата по оси X
                     const long              y=0,                     // координата по оси y
                     const int              width=50,                 // ширина
                     const int              height=18,                // высота
                     const color            back_clr=clrNONE,         // цвет фона
                     const color            clr=clrNONE,              //цвет плоской границы (Flat)
                     const ENUM_LINE_STYLE  style=STYLE_SOLID,        // стиль плоской границы
                     const int              line_width=1,             // толщина плоской границы
                     const bool             back=false,               // на заднем плане
                     const bool             selection=false,          // выделить для перемещений
                     const bool             hidden=true,              // скрыт в списке объектов
                     const long             z_order=0)                // приоритет на нажатие мышью
  {
   ResetLastError();
   if (ObjectFind(chart_ID,name)==-1)
   {
      ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,BORDER_FLAT);
      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
      ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
      ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
   }
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
   return(true);
}
//+------------------------------------------------------------------+
bool LabelCreate(const long              chart_ID=0,               // ID графика
                 const string            name="Label",             // имя метки
                 const int               sub_window=0,             // номер подокна
                 const long              x=0,                      // координата по оси X
                 const long              y=0,                      // координата по оси y
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                 const string            text="Label",             // текст
                 const string            font="Arial",             // шрифт
                 const int               font_size=10,             // размер шрифта
                 const color             clr=clrNONE,      
                 const double            angle=0.0,                // наклон текста
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
                 const bool              back=false,               // на заднем плане
                 const bool              selection=false,          // выделить для перемещений
                 const bool              hidden=true,              // скрыт в списке объектов
                 const long              z_order=0)                // приоритет на нажатие мышью
{
   ResetLastError();
   if (ObjectFind(chart_ID,name)==-1)
   {
      if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
      {
         Print(__FUNCTION__,": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
         return(false);
      }
      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
      ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
      ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
      ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
      ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
   }
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
   return(true);
  }
//|                                                                  |
//+------------------------------------------------------------------+
void DrawHline(string name,double P,color clr,int WIDTH)
  {
   if(ObjectFind(name)!=-1) ObjectDelete(name);
   ObjectCreate(name,OBJ_HLINE,0,0,P,0,0,0,0);
   ObjectSet(name,OBJPROP_COLOR,clr);
   ObjectSet(name,OBJPROP_STYLE,2);
   ObjectSet(name,OBJPROP_WIDTH,WIDTH);
  }
//------------------------------------------------------------------------------------------
void PnC(string txt,int Mode)
 {
   int j;
   if(Mode!=2)
    {
      string HR=DoubleToStr(Hour(),0);    if (StringLen(HR)<2) HR="0"+HR;
      string MN=DoubleToStr(Minute(),0);  if (StringLen(MN)<2) MN="0"+MN;
      string SC=DoubleToStr(Seconds(),0); if (StringLen(SC)<2) SC="0"+SC;
      txt=HR+":"+MN+":"+SC+"; "+txt;
      Print(txt);
      if(IsTesting() && !IsVisualMode()) return;
      if (Mode>0) Alert(txt);
      for(j=CommetSize-1;j>=1;j--) CommentBox[j]=CommentBox[j-1];
      CommentBox[0]=txt;
      }
   if(CommetSize>0)
     { 
      string cm;
      for(j=CommetSize-1;j>=0;j--) if(CommentBox[j]!="") cm=cm+CommentBox[j]+"\n";
      cm=cm+"\n"+cm2;
      Comment(cm); 
      }
   }
//896896896869869869869869689686986986986986968869869869869689689686986986986986986968968986   switch(error)
int Fun_Error(int er)
                {
   switch(er) 
   {
      // группа {1: не прекращать попытки
      case 2: PnC("Общая ошибка",0); return(0);
      case 4: PnC("Торговый сервер занят",0); return(0);
      case 8: PnC("Слишком частые запросы",0); return(0);
      case 129: PnC("Неправильная цена",0); return(0);
      case 135: PnC("Цена изменилас",0); return(0);
      case 136: PnC("Нет цен",0); return(0);
      case 137: PnC("Брокер занят",0); return(0);
      case 138: PnC("Новые цены",0); return(0);
      case 141: PnC("Слишком много запросов",0); return(0);
      case 146: PnC("Подсистема торговли занята",0); return(0);
      // группа 2: прекращаем попытки
      case 0: PnC("Ошибка отсутствует",0); return(1);
      case 1: PnC("Нет ошибки, но результат не известен",0); return(1);
      case 3: PnC("Неправильные параметры",0); return(1);
      case 6: PnC("Нет связи с торговым сервером",0); return(1);
      case 128: PnC("Истек срок ожидания совершения сделки",0); return(1);
      case 130: PnC("Неправильные стопы",0); return(1);
      case 131: PnC("Неправильный объем",0); return(1);
      case 132: PnC("Рынок закрыт",0); return(1);
      case 133: PnC("Торговля запрещена",0); return(1);
      case 134: PnC("Недостаточно денег для совершения операции",0); return(1);
      case 139: PnC("Ордер заблокирован и уже обрабатывается",0); return(1);
      case 145: PnC("Модификация запрещена, так как ордер слишком близок к рынку",0); return(1);
      case 148: PnC("Количество открытых и отложенных ордеров достигло предела, установленного брокером",0); return(1);
      // группа 3: завершаем работу
      case 5: PnC("Старая версия клиентского терминала",1); return(2);
      case 7: PnC("Недостаточно прав",1); return(2);
      case 9: PnC("Недопустимая операция нарушающая функционирование сервера",1); return(2);
      case 64: PnC("Счет заблокирован",1); return(2);
      case 65: PnC("Неправильный номер счета",1); return(2);
      case 140: PnC("Разрешена только покупка",1); return(2);
      case 147: PnC("Использование даты истечения ордера запрещено брокером",1); return(2);
      case 149: PnC("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено",1); return(2);
      case 150: PnC("Попытка закрыть позицию по инструменту в противоречии с правилом FIFO",1); return(2);
      
      }return(0);
   }                     


