Navigation:Home > Content >

Ilan1.7byNikolaus.mq4

Time: 2017-07-11 | Download file:Ilan1.7byNikolaus.mq4

//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
#property copyright "SLAVIK" 
#property link      "http://ilan-forum.ru/"
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
extern double LotExponent = 1.4;   // на сколько умножать лот при выставлении следующего колена. пример: первый лот 0.1, серия: 0.16, 0.26, 0.43 ...
extern bool    DynamicPips = true; 
extern int     DefaultPips = 12;
extern int Glubina = 24;
extern int DEL = 3;
extern double slip = 3.0;           // на сколько может отличаться цена в случае если ДЦ запросит реквоты (в последний момент немного поменяет цену)
extern double Lots = 0.1;           // разер лота для начала торгов
extern int lotdecimal = 1;          // сколько знаков после запятой в лоте рассчитывать 0 - нормальные лоты (1), 1 - минилоты (0.1), 2 - микро (0.01)
extern double TakeProfit = 10.0;    // по достижении скольких пунктов прибыли закрывать сделку
extern double RsiMinimum = 5.0;    // нижняя граница RSI
extern double RsiMaximum = 95.0;    // верхняя граница RSI
int MagicNumber = 0; 
bool Prohod1=True;
extern int MagicBuy = 111;
extern int MagicSell = 222;
int PipStep=0;
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
extern int MaxTrades = 10;                 // максимально количество одновременно открытых ордеров
extern bool UseEquityStop = FALSE;
extern double TotalEquityRisk = 20.0;
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
extern bool TSLast = True;
extern int TSStartLast = 15;
extern int TSStopLast = 7;
extern int PlusKoleno = 2;
extern bool RecalcTP=TRUE;
extern bool FirstTP = false;
extern int StKoleno=9;
extern int AddPips = 2;
int ftp = 0;
extern bool TPforSL = false;

string s2="For dynamic lot";
bool DynLots = false;
double MyLots;
int Prosadka = 400;
int LastBars = 0;
bool UseMargin = false;
double errcheck=0;
bool buypr=false;
bool sellpr=false;

extern string s3="New for Trail all";
extern bool TrailAll = false;
extern int TrailAllStart = 2;
extern int TrailAllStop = 5;
extern bool TPforTrailAll = false;
bool FirstTrail = false;
bool SecondTrail = false;

extern string s4="New for LocOrder";
extern bool EqLoc = false;
extern double LocEquity = 20.0;
extern bool PointLoc = false;
extern int LocPoint = 30;
extern double LocLot = 1;
extern bool TrailLoc = false;
extern int TrailLocStop = 20;
extern int LocSL = 0;
extern bool Antisliv = true;
extern int AntiPoint=1;
extern bool CloseOver=true;
double PrevRSI, CurRSI;
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
double PriceTarget, StartEquity, BuyTarget, SellTarget;
double AveragePrice, SellLimit, BuyLimit;
double LastBuyPrice, LastSellPrice;
bool flag;
string EAName="I1.7N";
int timeprev = 0;
int NumOfTrades = 0;
double iLots;
int cnt = 0, total;
bool TradeNow = FALSE, LongTrade = FALSE, ShortTrade = FALSE;
int ticket;
int OldCount=0;
bool  NewOrdersPlaced = FALSE;
bool RecalcProfit = FALSE;
double AccountEquityHighAmt, PrevEquity;
int RightDirect = 1;
int RD=0;
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
int init() 
   {
      MyLots = Lots;
      return (0);
   }
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
int deinit() 
   {
      return (0);
   }
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
int start()
 {
   if (Prohod1) MagicNumber = MagicBuy;
   if (!Prohod1) MagicNumber = MagicSell;
   
   if (!FirstTP) ftp=1;
   total = CountTrades();
   if (total!=OldCount && RecalcTP) RecalcProfit=true;
   OldCount=total;
   int mod=0;
   if (total>StKoleno) mod=(total-StKoleno)*AddPips;
   if (total <= 1 && Prohod1) FirstTrail = false;
   if (total <= 1 && !Prohod1) SecondTrail = false;
   
   if (total==1 && !FirstTP)
   {
      for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
            if (OrderStopLoss()==0) RightDirect=1;
            if (OrderStopLoss()>0) RightDirect=-1;
         }
      }
   }
   
   if (total==1 && !FirstTP)
   {
      for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
            if (OrderTakeProfit()>0) OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, Aqua);
         }
      }
   }
   
 
 if (DynamicPips)  
   {
     double hival=High[iHighest(NULL,0,MODE_HIGH,Glubina,1)]; 
     double loval=Low[iLowest(NULL,0,MODE_LOW,Glubina,1)];   
     PipStep=NormalizeDouble((hival-loval)/DEL/Point,0);
     if (PipStep<(DefaultPips+mod)) PipStep = DefaultPips+mod; 
   }
   else  PipStep=DefaultPips+mod;
   
   double PrevCl;
   double CurrCl;
   
   if (TrailAll) TrailingAlls();
   if (TSLast) TrailingLast();

   if (timeprev == Time[0] && !RecalcProfit) return (0);
   if (Prohod1) buypr = true;
   if (!Prohod1) sellpr = true;
   if (buypr && sellpr) 
   {
      timeprev = Time[0];
      buypr = false;
      sellpr = false;
      PrevRSI=CurRSI;
      CurRSI = iRSI(NULL, Period(), 14, PRICE_CLOSE, 1);
   }
   
   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;
      }
   }
   
      if (EqLoc)
      {
         if (CurrentPairProfit < 0.0 && MathAbs(CurrentPairProfit) > LocEquity / 100.0 * AccountEquityHigh()) 
         {
            OpenLocOrder();
         }
      }
      
      if (PointLoc)
      {
         double neardist=1000;
         for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
            OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
            {
               if (Prohod1)
               {
                  if (neardist > ((OrderOpenPrice()-Bid)/Point)) neardist = (OrderOpenPrice()-Bid)/Point;
               }
               if (!Prohod1) 
               {
                  if (neardist > (Ask-OrderOpenPrice())/Point) neardist = (Ask-OrderOpenPrice())/Point;
               }
            }
         }
         if ((neardist > LocPoint) && (total==MaxTrades+1)) OpenLocOrder();
      }

      if ( (CCProfit()+CalculateProfit() >1) && CCProfit() >1 && CloseOver)
      {
         CloseThisSymbolAll();
      }
   if (total == 0) flag = FALSE;
   for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
      {
         if (OrderType() == OP_BUY) 
         {
            LongTrade = TRUE;
            ShortTrade = FALSE;
            break;
         }
      }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
      {
         if (OrderType() == OP_SELL) 
         {
            LongTrade = FALSE;
            ShortTrade = TRUE;
            break;
         }
      }
   }

   if (total==1 && !FirstTP)
   {
      for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
           if ((OrderStopLoss()+OrderTakeProfit())==0) RightDirect=1;
           if ((OrderStopLoss()+OrderTakeProfit())>0) RightDirect=-1;
           if (RightDirect==-1) RD +=1;
         }
      }
   }
   errcheck=0;
   if (total>1 && !FirstTP)
   {
      for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
            errcheck +=OrderStopLoss();
            errcheck +=OrderTakeProfit();
         }
      }
         if  (errcheck == 0) 
         {
            RightDirect=1;
            RecalcProfit=true;
         }
      }  

   if ((total > 0 && total <= MaxTrades) ||(total > MaxTrades && RightDirect==-1))
   {
      RefreshRates();
      LastBuyPrice = FindLastBuyPrice();
      LastSellPrice = FindLastSellPrice();
      
      if ((LongTrade && (LastBuyPrice - Ask)*RightDirect >= PipStep * Point)&&(NearestBuyPrice()>(DefaultPips+mod))) TradeNow = TRUE;
      if ((ShortTrade && (Bid - LastSellPrice)*RightDirect >= PipStep * Point)&&(NearestSellPrice()>(DefaultPips+mod))) 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(Lots * MathPow(LotExponent, NumOfTrades), lotdecimal);
         RefreshRates();
         if (RightDirect==-1) iLots = NormalizeDouble(Lots * MathPow(LotExponent, PlusKoleno-1), lotdecimal);
         ticket = OpenPendingOrder(1, iLots, Bid, slip, Ask, 0, 0, EAName + "-" + Symbol() + "-" + NumOfTrades + "-" + PipStep, MagicNumber, 0, HotPink);
         if (ticket < 0) 
         {
            Print("Error: ", GetLastError());
            return (0);
         }
         LastSellPrice = FindLastSellPrice();
         TradeNow = FALSE;
         NewOrdersPlaced = TRUE;
      } 
      else 
      {
         if (LongTrade) 
         {
            NumOfTrades = total;
            iLots = NormalizeDouble(Lots * MathPow(LotExponent, NumOfTrades), lotdecimal);
            RefreshRates();
            if (RightDirect==-1) iLots = NormalizeDouble(Lots * MathPow(LotExponent, PlusKoleno-1), lotdecimal);
            ticket = OpenPendingOrder(0, iLots, Ask, slip, Bid, 0, 0, EAName + "-" + Symbol() + "-" + NumOfTrades + "-" + PipStep, MagicNumber, 0, Lime);
            if (ticket < 0) 
            {
               Print("Error: ", GetLastError());
               return (0);
            }
            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 (DynLots) Lots= CalcDynLots();
      else Lots = MyLots;
      if (!ShortTrade && !LongTrade) 
      {
         NumOfTrades = total;
         iLots = NormalizeDouble(Lots * MathPow(LotExponent, NumOfTrades), lotdecimal);
         if ((PrevCl > CurrCl) && !Prohod1) 
         {
            if (iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE, 1) > RsiMinimum ) 
            {
               ticket = OpenPendingOrder(1, iLots, SellLimit, slip, SellLimit, 0, 0, EAName + "-" + Symbol() + "-" + NumOfTrades, MagicNumber, 0, HotPink);
               if (ticket < 0) 
               {
                  Print("Error: ", GetLastError());
                  return (0);
               }
               LastBuyPrice = FindLastBuyPrice();
               NewOrdersPlaced = TRUE;
            }
         } 
         else if (Prohod1) 
         {
            if (iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE, 1) < RsiMaximum ) 
            {
               ticket = OpenPendingOrder(0, iLots, BuyLimit, slip, BuyLimit, 0, 0, EAName + "-" + Symbol() + "-" + NumOfTrades, MagicNumber, 0, Lime);
               if (ticket < 0) 
               {
                  Print("Error: ", GetLastError());
                  return (0);
               }
               LastSellPrice = FindLastSellPrice();
               NewOrdersPlaced = TRUE;
            }
         }
         TradeNow = FALSE;
      }
   }
   total = CountTrades();
   
   AveragePrice = 0;
   double Count = 0;
   for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
      {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) 
         {
            AveragePrice += OrderOpenPrice() * OrderLots();
            Count += OrderLots();
         }
      }
   }
   if (total > 0) AveragePrice = NormalizeDouble(AveragePrice / Count, Digits);
   if (NewOrdersPlaced || RecalcProfit) 
   {
      for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
            if (OrderType() == OP_BUY) 
            {
               PriceTarget = AveragePrice + TakeProfit * Point;
               BuyTarget = PriceTarget;
               flag = TRUE;
            }
         }
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
            if (OrderType() == OP_SELL) 
            {
               PriceTarget = AveragePrice - TakeProfit * Point;
               SellTarget = PriceTarget;
               flag = TRUE;
            }
         }
      }
   }
   if ((NewOrdersPlaced || RecalcProfit)&& (total>ftp) && (RightDirect>0)) 
   {
      if (flag == TRUE) 
      {
         for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
            OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderStopLoss()>0) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
            if ((NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(PriceTarget,Digits)))
            {
               OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), NormalizeDouble(PriceTarget,Digits), 0, Yellow);
            }
            NewOrdersPlaced = FALSE;
            RecalcProfit = FALSE;
         }
      }
   }
  
    Prohod1 = !Prohod1;
   return (0);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
void SecondLock()
{
      int Lock1=0;
      int Lock2=0;
      int Lock1Ticket;
         for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
            OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            if (OrderSymbol() != Symbol() || (OrderMagicNumber() != MagicNumber+1 && OrderMagicNumber() != MagicNumber+2)) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber+1) 
            {
               Lock1 +=1;
               Lock1Ticket = OrderTicket();
            }
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber+2) 
            {
               LocSave(cnt);
               return(0);
            }
         }
      if (Lock1==0) return(0);
      OrderSelect(Lock1Ticket, SELECT_BY_TICKET);
      if (OrderType()==OP_BUY && Bid<=(OrderOpenPrice()-10*Point) && iRSI(NULL,  Period(), 14, PRICE_CLOSE, 1)>70)
      {
         ticket = OpenPendingOrder(1, OrderLots(), Bid, slip, 0, 0, 0, EAName + "-LOC2", MagicNumber+2, 0, Red);
      }
      
      if (OrderType()==OP_SELL && Ask>=(OrderOpenPrice()+10*Point)&& iRSI(NULL,  Period(), 14, PRICE_CLOSE, 1)<30)
      {
         ticket = OpenPendingOrder(0, OrderLots(), Ask, slip, 0, 0, 0, EAName + "-LOC2", MagicNumber+2, 0, Red);
      }
}

//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

void TrailLoc()
{
      for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
      {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) 
         {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber+1) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber+1) 
            {
               if (OrderType() == OP_BUY) 
               {
                  if (OrderStopLoss() == 0) continue;
                  if (OrderStopLoss() >= StopLong(Bid, TrailLocStop)) continue;
                  else OrderModify(OrderTicket(), OrderOpenPrice(), StopLong(Bid, TrailLocStop), 0, 0, Aqua);
               }
               if (OrderType() == OP_SELL) 
               {
                  if (OrderStopLoss() == 0) continue;
                  if (OrderStopLoss() <= StopShort(Ask, TrailLocStop)) continue;
                  else OrderModify(OrderTicket(), OrderOpenPrice(), StopShort(Ask, TrailLocStop), 0, 0, Red);
               }
            }
            Sleep(500); 
         }
      }
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

void LocSave(int ticketLoc)
{
   OrderSelect(ticketLoc, SELECT_BY_POS, MODE_TRADES);
   if (OrderType() == OP_BUY) 
   {
      if (OrderStopLoss() >= (OrderOpenPrice()+AntiPoint*Point)) return(0);
      if (Bid > ((MarketInfo(Symbol(), MODE_SPREAD)+AntiPoint)*Point+OrderOpenPrice()))
      {
         OrderModify(OrderTicket(), OrderOpenPrice(), (OrderOpenPrice()+AntiPoint*Point), OrderTakeProfit(), 0, Red);
      }
   }
   if (OrderType() == OP_SELL) 
   {
      if (OrderStopLoss() <= (OrderOpenPrice()-AntiPoint*Point) && OrderStopLoss()!=0) return(0);
      if (Bid < (OrderOpenPrice()-(MarketInfo(Symbol(), MODE_SPREAD)+AntiPoint)*Point))
      {
         OrderModify(OrderTicket(), OrderOpenPrice(), (OrderOpenPrice()-AntiPoint*Point), OrderTakeProfit(), 0, Red);
      }
   }
}

//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
void OpenLocOrder()
{
   for (int trade1 = OrdersTotal() - 1; trade1 >= 0; trade1--) 
   {
      OrderSelect(trade1, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber+1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber+1) 
      {
         if (TrailLoc) TrailLoc();
         if (Antisliv) LocSave(trade1);
         return(0);
      }
   }
   double SumLot=0;
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         SumLot += OrderLots();
   }
   if ((SumLot*LocLot)> (AccountFreeMargin()*0.99/MarketInfo(Symbol(),MODE_MARGINREQUIRED)))  SumLot=(AccountFreeMargin()*0.99/MarketInfo(Symbol(),MODE_MARGINREQUIRED));
   else SumLot = SumLot*LocLot;
   
   //double PrevCl = iClose(Symbol(), 0, 2);
   //double CurrCl = iClose(Symbol(), 0, 1);
   if ( (PrevRSI>CurRSI) && Prohod1 && CurRSI>=70)
   {
      ticket = OpenPendingOrder(1, SumLot, Bid, slip, 0, LocSL, 0, EAName + "-LOC", MagicNumber+1, 0, Yellow);
   } 
   if ( (PrevRSI= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
      if (OrderType() == OP_SELL || OrderType() == OP_BUY) count++;
   }
   return (count);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

void CloseThisSymbolAll() 
{
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || OrderMagicNumber() == MagicNumber+1) ) 
         {
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, slip, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, slip, Red);
         }
         Sleep(500);
      }
   }
}


//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

int OpenPendingOrder(int pType, double pLots, double pLevel, int sp, double pr, int sl, int tp, string pComment, int pMagic, int pDatetime, color pColor) 
{
   int ticket = 0;
   int err = 0;
   int c = 0;
   int NumberOfTries = 100;
   switch (pType) 
   {
   case 0:
      for (c = 0; c < NumberOfTries; c++) 
      {
         RefreshRates();
         ticket = OrderSend(Symbol(), OP_BUY, pLots, NormalizeDouble(Ask,Digits), sp, NormalizeDouble(StopLong(Bid, sl),Digits), NormalizeDouble(TakeLong(Ask, tp),Digits), pComment, pMagic, pDatetime, pColor);
         err = GetLastError();
         if (err == 0/* NO_ERROR */) break;
         if (!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
      }
      break;
   case 1:
      for (c = 0; c < NumberOfTries; c++) 
      {
         ticket = OrderSend(Symbol(), OP_SELL, pLots, NormalizeDouble(Bid,Digits), sp, NormalizeDouble(StopShort(Ask, sl),Digits), NormalizeDouble(TakeShort(Bid, tp),Digits), pComment, pMagic, pDatetime, pColor);
         err = GetLastError();
         if (err == 0/* NO_ERROR */) break;
         if (!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break;
         Sleep(5000);
      }
   }
   return (ticket);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
double StopLong(double price, int stop) 
{
   if (stop == 0) return (0);
   else return (price - stop * Point);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double StopShort(double price, int stop) 
{
   if (stop == 0) return (0);
   else return (price + stop * Point);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double TakeLong(double price, int stop) 
{
   if (stop == 0) return (0);
   else return (price + stop * Point);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double TakeShort(double price, int stop) 
{
   if (stop == 0) return (0);
   else return (price - stop * Point);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
double CalculateProfit() 
{
   double Profit = 0;
   for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) Profit += OrderProfit()+OrderSwap();
   }
   return (Profit);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
double CCProfit() 
{
   double Profit = 0;
   for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber+1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber+1)
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) Profit += OrderProfit()+OrderSwap();
   }
   return (Profit);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

void TrailingAlls() 
{
double ordTP1, ordTP2;
int trade;
if (Prohod1)
   {
      for (trade = OrdersTotal() - 1; trade >= 0; trade--) 
      {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) 
         {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) ordTP1 = OrderTakeProfit();
         }
      }
      if (ordTP1 == 0 && !FirstTrail) return(0);
      if ((MathAbs(Bid - ordTP1) <= TrailAllStart*Point) || FirstTrail)
      {
         FirstTrail = true;
         for (trade = OrdersTotal() - 1; trade >= 0; trade--) 
         {
            if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) 
            {
               if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
               if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
               {
                  if (TPforTrailAll) 
                  {
                     if (OrderStopLoss() < (Bid-TrailAllStop*Point)) OrderModify(OrderTicket(), OrderOpenPrice(), (Bid-TrailAllStop*Point), OrderTakeProfit(), 0, Aqua);
                  }
                  else
                  {
                     if (OrderStopLoss() < (Bid-TrailAllStop*Point)) OrderModify(OrderTicket(), OrderOpenPrice(), (Bid-TrailAllStop*Point), 0, 0, Aqua);
                  }
               }
            }
         }
      }
   }
   
   
if (!Prohod1)
   {
      for (trade = OrdersTotal() - 1; trade >= 0; trade--) 
      {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) 
         {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) ordTP2 = OrderTakeProfit();
         }
      }
      if ( (MathAbs(Ask - ordTP2) <= TrailAllStart*Point) || SecondTrail)
      {
         SecondTrail = true;
         for (trade = OrdersTotal() - 1; trade >= 0; trade--) 
         {
            if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) 
            {
               if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
               if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
               {
                  if (TPforTrailAll) 
                  {
                     if ((OrderStopLoss() > (Ask+TrailAllStop*Point)) || OrderStopLoss() ==0) OrderModify(OrderTicket(), OrderOpenPrice(), (Ask+TrailAllStop*Point), OrderTakeProfit(), 0, Red);
                  }
                  else
                  {
                     if ((OrderStopLoss() > (Ask+TrailAllStop*Point)) || OrderStopLoss() ==0) OrderModify(OrderTicket(), OrderOpenPrice(), (Ask+TrailAllStop*Point), 0, 0, Red);
                  }
               }
            }
         }
      }
   }
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

void TrailingLast()
{
   double stopcal;
   int lastkolvo;
   int profit;
   double ordsl;
      for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
      {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) 
         {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
            {
               ordsl = OrderStopLoss();
               if (OrderType() == OP_BUY) 
               {
                  profit = NormalizeDouble((Bid - OrderOpenPrice()) / Point, 0);
                  if (profit < TSStartLast) continue;
                  if ((ordsl > (Bid - TSStopLast * Point))) continue;
                  stopcal = (Bid - TSStopLast * Point);
                  if (TPforSL) 
                  {
                     if (stopcal != ordsl) OrderModify(OrderTicket(), OrderOpenPrice(), stopcal, OrderTakeProfit(), 0, Aqua);
                  }
                  else
                  {
                     if (stopcal != ordsl) OrderModify(OrderTicket(), OrderOpenPrice(), stopcal, 0, 0, Aqua);
                  }
               }
               if (OrderType() == OP_SELL) 
               { 
                  profit = NormalizeDouble((OrderOpenPrice() - Ask) / Point, 0);
                  if (profit < TSStartLast) continue;
                  stopcal = Ask + TSStopLast * Point;
                  if ((ordsl < stopcal)&& ordsl !=0) continue;
                  if (TPforSL) 
                  {
                     if (stopcal != ordsl) OrderModify(OrderTicket(), OrderOpenPrice(), stopcal, OrderTakeProfit(), 0, Red);
                  }
                  else 
                  {
                     if (stopcal != ordsl) OrderModify(OrderTicket(), OrderOpenPrice(), stopcal, 0, 0, Red);
                  }
               }
            }
            Sleep(500); 
         }
      }
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

double AccountEquityHigh() 
{ 
   if (CountTrades() == 0) AccountEquityHighAmt = AccountEquity();
   if (AccountEquityHighAmt < PrevEquity) AccountEquityHighAmt = PrevEquity;
   else AccountEquityHighAmt = AccountEquity();
   PrevEquity = AccountEquity();
   return (AccountEquityHighAmt);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

double FindLastBuyPrice() 
{
   double oldorderopenprice;
   int oldticketnumber;
   double unused = 0;
   int ticketnumber = 0;
   for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) 
      {
         oldticketnumber = OrderTicket();
         if (oldticketnumber > ticketnumber) 
         {
            oldorderopenprice = OrderOpenPrice();
            unused = oldorderopenprice;
            ticketnumber = oldticketnumber;
         }
      }
   }
   return (oldorderopenprice);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
double NearestBuyPrice() 
{
double np;
np=Ask;
   for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) 
      {
         if (np>(MathAbs(OrderOpenPrice()-Ask))) np = MathAbs(OrderOpenPrice()-Ask);
      }
   
   }
np=np*MathPow(10,MarketInfo(Symbol(),MODE_DIGITS));
   return (np);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
double NearestSellPrice() 
{
double np;
np=Bid;
   for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) 
      {
         if (np>(MathAbs(OrderOpenPrice()-Bid))) np = MathAbs(OrderOpenPrice()-Bid);
      }
   
   }
np=np*MathPow(10,MarketInfo(Symbol(),MODE_DIGITS));
   return (np);
}

//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

double FindLastSellPrice() 
{
   double oldorderopenprice;
   int oldticketnumber;
   double unused = 0;
   int ticketnumber = 0;
   for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) 
      {
         oldticketnumber = OrderTicket();
         if (oldticketnumber > ticketnumber) 
         {
            oldorderopenprice = OrderOpenPrice();
            unused = oldorderopenprice ;
            ticketnumber = oldticketnumber;
         }
      }
   }
   return (oldorderopenprice);
}

//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
 
double CalcDynLots()
{
   int digits=MarketInfo(Symbol(),MODE_DIGITS);
   Lots=MyLots;
   if (LastBars >0)
   {
     double hival=High[iHighest(NULL,0 ,MODE_HIGH,LastBars,1)]; 
     double loval=Low[iLowest(NULL,0,MODE_LOW,LastBars,1)];
     Prosadka = (hival-loval)*MathPow(10,digits);
   }
   double FreeEq = AccountBalance();
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
   double newlot;
   if (UseMargin) FreeEq = AccountFreeMargin();
   int sumpips = DefaultPips*MaxTrades/LotExponent;
   double j;
   for (j=Lots; j<=(AccountFreeMargin()*TotalEquityRisk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED)); j +=NormalizeDouble(Step, lotdecimal))
   {
      newlot=0;
      double sumlot=0;
      newlot=j;
      for (int i=0; i<=MaxTrades; i++)
      {
         sumlot += NormalizeDouble(newlot * MathPow(LotExponent, i), lotdecimal);
      }
      double StopLoss2=NormalizeDouble(((FreeEq*TotalEquityRisk/100)/sumlot)/LotVal, 0)+sumpips;
      if (StopLoss2Max_Lot) j=Max_Lot;
   return (j);
}
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

Recommend