Ilan1.6_Reg_v1.7

Author:
Price Data Components
Series array that contains close prices for each bar
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself It automatically opens orders when conditions are reached
0 Views
0 Downloads
0 Favorites
Ilan1.6_Reg_v1.7
// ïîìíèòå !!! ñîâåòíèêîì íóæíî óïðàâëÿòü ñ ãîëîâîé ! 
// íà ïîëíîì àâòîìàòå ñîëüåòå êîãäà-íèáóäü ...

// Áóäó ïðèçíàòåëåí åñëè Âû ñîîáùèòå îá îøèáêàõ â ðàáîòå äàííîãî ñîâåòíèêà èëè ïðåäëîæåíèÿ ïî äîðàáîòêå.
// Âàðèàíòîâ ðàáîòû î÷åíü ìíîãî, ïîýòîìó áóäó ïðèçíàòåëåí åñëè ïðèøëåòå ïðèëè÷íûé ñåò ngb2008[a]mail.ru
// Åñëè Âû ðåøèëè ìîäèôèöèðîâàòü äàííûé ñîâåòíèê, òî ïîæàëóéñòà. Ìíå áëèçêà èäåÿ çàëîæåííàÿ â ëèöåíçèè GNU.
// Íå çàêðûâàéòå ñâîáîäíî ðàñïðîñòðàíÿåìûé êîä è íå îáúÿâëÿéòå åãî ñâîèì.
// Åñëè Âàì ïîíðàâèëñÿ äàííûé ñîâåòíèê è Âû èì çàðàáàòûâàåòå, 
// òî ìîæåòå ñêàçàòü ñïàñèáî :)  ñèñòåìå âåáìàíè Z182368142593
// óêàçûâàéòå ÷òî ýòî çà ñîâåòíèê (èìÿ ôàéëà) è ñâîé ýë. àäðåñ (ïðèøëþ íîâóþ âåðñèþ, ýòà íàäåþñü íå ïîñëåäíÿÿ áóäåò)
// ñ óâ. ðóíèê

#property copyright ""
#property link      ""

extern double LotExponent = 1.1;

extern string a = "Åñëè risk=0, èñïîëüçóåò ïàðàìåòð Lot";
extern double Lot = 0.1;
extern string b = "Åñëè risk>0, ðàáîòàåò ÌÌ";
extern double Reinvest = 1000;
extern int lotdecimal = 2;
extern double TakeProfit = 50;
extern double PipStep = 40.0;
extern int MaxTrades = 20;
extern int slip = 3;
extern string _tmp1_ = " Ëîêèðîâàíèå ñåðèè";
extern double LockS=2; // âîîáùåì ïûòàåìñÿ ëîêèðîâàòü ÷àñòü ïîçèöèé è ïîëó÷èòü äîïîëíèòåëüíóþ ïðèáûëü, åñëè =0 òî íå ðàáîòàåò, åñëè =0,5, òî ëîêèðóåì 50% ïîçèöèé ñåðèè
extern int LMagN=689; // ìàãè÷åñêèé íîìåð äëÿ ëîêîâîé ïîçû
extern int NumLockMin=4; // ïîñëå êàêîãî ïî ñ÷åòó êîëåíà îòêðûâàòü ëîêîâûé îðäåð åñëè èíäèêàòîð èçìåíèë íàïðàâëåíèå
extern int NumLoc=8; // ïîñëå êàêîãî ïî ñ÷åòó êîëåíà îòêðûâàòü ëîêîâûé îðäåð åñëè êîëè÷åñòâî îðäåðîâ ïðîñòî ñòàëî áîëüøèì

//-----------------------------------------------------------
extern string _tmp2_ = " --- i-Regr --- ñ áîëüøèì ïåðèîäîì";
extern int Regr.degree1 = 6; // ïîðÿäîê ðåãðåññèè 
extern double Regr.kstd1 = 5; // øèðèíà êàíàëà, åñëè =0 òî ðèñóåòñÿ òîëüêî ñðåäíÿÿ ëèíèÿ
extern int kanal=2; 
int Regr.shift1 = 0; // ñìåùåíèå îòíîñèòåëüíî òåêóùåãî áàðà
extern int SPer = 800; // ïåðèîä áàðîâ
extern int TFS=7;     // òàéìôðåéì íà êîòîðîì ðàáîòàåò èíäèêàòîð
extern string _tmp3_ = " --- i-Regr --- ñ ìàëûì ïåðèîäîì";
extern int IndStep =  4; // øàã ñ êîòîðîãî íà÷èíàåì ñìîòðåòü íà èíäèêàòîð äëÿ îòêðûòèÿ êîëåí
extern int Regr.degree1mall = 3; // ïîðÿäîê ðåãðåññèè 
extern double Regr.kstd1mall = 1.5; // øèðèíà êàíàëà, åñëè =0 òî ðèñóåòñÿ òîëüêî ñðåäíÿÿ ëèíèÿ
int Regr.shift1mall = 0; // ñìåùåíèå îòíîñèòåëüíî òåêóùåãî áàðà
extern int SPermall = 150; // ïåðèîä áàðîâ
extern int TFSmall=3;     // òàéìôðåéì íà êîòîðîì ðàáîòàåò èíäèêàòîð
int mper[10]={0,1,5,15,30,60,240,1440,10080,43200};
extern int TFIlanX=0;    // òàéìôðåéì íà êîòîðîì èëàí îòêðûâàåò ñäåëêè ñì. mper ïðè = 5 - H1
extern int UseTrailingStop = 0; // 0-íå èñïîëüçóåì òðàë, 1 - ñòóïåí÷àòûé òðàë, 2 - òðàë òèïà åñìàðò

extern int ProfitTrailDist = 30; // ðàññòîÿíèå îò òî÷êè áåçóáûòêà, ïîñëå êîòîðîé âêëþ÷àåì òðàë  //+------------------------------------------------------------------+
extern int TrailDist = 20; // ðàññòîÿíèå íà êîòîðîì òÿíåòñÿ ñòîïëîññ                            //| ÒÐÅÉËÈÍà ÑÒÀÍÄÀÐÒÍÛÉ-ÑÒÓÏÅÍ×ÀÑÒÛÉ                                |
extern int TrailStep = 10; // ìîäèôèöèðóåì îðäåðà êàæäûå 5 ïóíêòîâ                              //| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ðàññòîÿíèå îò êóðñà îòêðûòèÿ,  |
extern int NumIT = 3; // ïîñëå êàêîãî êîëè÷åñòâà ñäåëîê âêëþ÷àåòñÿ òðàë                         //| íà êîòîðîì òðåéëèíã çàïóñêàåòñÿ (ïóíêòîâ) è "øàã", ñ êîòîðûì îí ïåðåíîñèòñÿ (ïóíêòîâ)   |
                                                                                                //| Ïðèìåð: ïðè +30 ñòîï íà +10, ïðè +40 - ñòîï íà +20 è ò.ä.        |
extern double xtral=2; // îçíà÷àåò ÷òî, ðàññòîÿíèå îò òî÷êè áåçóáûòêà äî ñòîïëîññà â xtral ðàç ìåíüøå ÷åì îò òî÷êè áó äî öåíû, íàïðèìåð öåíà óøëà íà 90 ï â +, çíà÷èò ñòîï íà óðîâíå 30 ï â ïëþñ ïåðåíîñèì     
//-----------------------------------------------------------

bool UseEquityStop = FALSE;
double TotalEquityRisk = 20.0;

bool UseTimeOut = FALSE;
double MaxTradeOpenHours = 48.0;
extern int MagN = 1997;
double g_price_180;
double gd_188;
double gd_unused_196;
double gd_unused_204;
double g_price_212;
double g_bid_220;
double g_ask_228;
double gd_236;
double gd_244;
double gd_260;
bool gi_268;
string gs_ilan_272 = "Ilan";
int gi_280 = 0;
int gi_284;
int gi_288 = 0;
double gd_292;
int g_pos_300 = 0;
int gi_304;
double gd_308 = 0.0;
bool gi_316 = FALSE;
bool gi_320 = FALSE;
bool gi_324 = FALSE;
int gi_328;
bool gi_332 = FALSE;
double gd_336;
double gd_344;
int TFIlan=0;int timeprev=0;
int BrokerDecimal = 1;
int ClLock=0;

int init() {
// Åñëè áðîêåð äàåò êîòèðîâêè ïî âàëþòå ñ òî÷íîñòüþ â ïÿòü çíàêîâ - ïèïñ áóäåò ìåíüøå ñòàíäàðòíîãî â 10 ðàç - ââîäèì ìíîæèòåëü   
if(Digits==3 || Digits==5) BrokerDecimal=10; 
// Ïåðåìíîæèòü âñå óðîâíè â ïèïñàõ íà ìíîæèòåëü
PipStep      = PipStep * BrokerDecimal;
//StopLoss     = StopLoss * BrokerDecimal; 
TakeProfit   = TakeProfit * BrokerDecimal;
ProfitTrailDist = ProfitTrailDist * BrokerDecimal;
slip      = slip*BrokerDecimal;
TrailDist     = TrailDist*BrokerDecimal;
TrailStep     = TrailStep*BrokerDecimal;
  
   gd_260 = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   return (0);
}

int deinit() {
   return (0);
}

int start() {

   double l_iclose_8;
   double l_iclose_16;
   int ct=CountTrades(MagN);
   if (UseTrailingStop >0 && ct>=NumIT) TrailingAlls();
   if (UseTimeOut) {
      if (TimeCurrent() >= gi_284) {
         CloseThisSymbolAll(MagN);
         Print("Closed All due to TimeOut");
      }
   }
   //if (gi_280 == Time[0]) return (0);
   //gi_280 = Time[0];
   
     if (LockS>0) {int lm=CountTrades(LMagN); }
     
     if (LockS>0 && lm>0) // ëîêèðóåì ñåðèþ
     {
     // Ïðîâåðêà íà òî ÷òîáû çàêðûòü ëîê åñëè ñåðèÿ çàêðûòà
     if (ct<NumLockMin) { ClLock =1; }
     if (ClLock==1)
       { 
       if (Balance("buy","Balance",LMagN)+Balance("sell","Balance",LMagN)>0) {CloseThisSymbolAll(LMagN);return(0);}     
       } 
     }
     
   TFIlan=TFIlanX;
   if (timeprev == iTime(NULL,mper[TFIlan],0)) return (0);   
   timeprev = iTime(NULL,mper[TFIlan],0);

   if (LockS>0 && ct>NumLockMin) // ëîêèðóåì ñåðèþ
     {    
     int ld=Dir(MagN); // îïðåäåëÿåì íàïðàâëåíèå ñåðèè 0 èëè 1

     // ïðîâåðêà åñòü ëè ëîê ?
     int a=alert();
     if (lm>0) // 
      { 
      // ïðîâåðêà íàäî ëè çàêðûòü ëîê ñåé÷àñ && a<0&& a>0
      if (Balance("buy","Balance",LMagN)+Balance("sell","Balance",MagN)>0) {CloseThisSymbolAll(LMagN);CloseThisSymbolAll(MagN);}
      if (Balance("buy","Balance",MagN)+Balance("sell","Balance",LMagN)>0) {CloseThisSymbolAll(MagN);CloseThisSymbolAll(LMagN);}
      
      }
      else // îòêðûâàåì ëîê
      {
      double al=CountLots(MagN);          
   
     // Print ("   ct   ",ct,"  ld   ",ld,"  al  ",al,"   a   ",a ); 
      if ((ld==0 && a<0) || (ct>=NumLoc && ld==0 ))  //&&      
      {
      ClLock =0; 
      gi_328 = OpenPendingOrder(1, LotSiz(LockS*al), Bid, slip, Ask, 0, 0, gs_ilan_272 + "-Lock" , LMagN, 0, Red);
                  if (gi_328 < 0) { Print("Error: ", GetLastError());again();return (0);      }
       }
      if ((ld==1 && a>0) || (ld==1 && ct>=NumLoc))//&& a>0
      {
      ClLock =0; 
      gi_328 = OpenPendingOrder(0, LotSiz(LockS*al), Ask, slip, Bid, 0, 0, gs_ilan_272 + "-Lock", LMagN, 0, Blue);
            if (gi_328 < 0) { Print("Error: ", GetLastError());again();return (0);}
      }
      
      }
     
     }
      
   double ld_0 = CalculateProfit();
   if (UseEquityStop) {
      if (ld_0 < 0.0 && MathAbs(ld_0) > TotalEquityRisk / 100.0 * AccountEquityHigh()) {
         CloseThisSymbolAll(MagN);
         Print("Closed All due to Stop Out");
         gi_332 = FALSE;
      }
   }
   gi_304 = CountTrades(MagN);
   if (gi_304 == 0) gi_268 = FALSE;
   for (g_pos_300 = OrdersTotal() - 1; g_pos_300 >= 0; g_pos_300--) {
      OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN) {
         if (OrderType() == OP_BUY) {
            gi_320 = TRUE;
            gi_324 = FALSE;
            break;
         }
      }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN) {
         if (OrderType() == OP_SELL) {
            gi_320 = FALSE;
            gi_324 = TRUE;
            break;
         }
      }
   }
   if (gi_304 > 0 && gi_304 <= MaxTrades) {
      RefreshRates();
      gd_236 = FindLastBuyPrice();
      gd_244 = FindLastSellPrice();
      if (gi_320 && gd_236 - Ask >= PipStep * Point && alert()>0) gi_316 = TRUE;
      if (gi_324 && Bid - gd_244 >= PipStep * Point && alert()<0) gi_316 = TRUE;
   }
   if (gi_304 < 1) {
      gi_324 = FALSE;
      gi_320 = FALSE;
      gi_316 = TRUE;
      gd_188 = AccountEquity();
   }
   if (gi_316) {
      gd_236 = FindLastBuyPrice();
      gd_244 = FindLastSellPrice();
      if (gi_324) {
         gi_288 = gi_304;
         gd_292 = NormalizeDouble(GetLots() * MathPow(LotExponent, gi_288), lotdecimal);
         RefreshRates();
         gi_328 = OpenPendingOrder(1, gd_292, Bid, slip, Ask, 0, 0, gs_ilan_272 + "-" + gi_288, MagN, 0, Red);
         if (gi_328 < 0) {
            Print("Error: ", GetLastError());
            again();
            return (0);
         }
         gd_244 = FindLastSellPrice();
         gi_316 = FALSE;
         gi_332 = TRUE;
      } else {
         if (gi_320) {
            gi_288 = gi_304;
            gd_292 = NormalizeDouble(GetLots() * MathPow(LotExponent, gi_288), lotdecimal);
            gi_328 = OpenPendingOrder(0, gd_292, Ask, slip, Bid, 0, 0, gs_ilan_272 + "-" + gi_288, MagN, 0, Blue);
            if (gi_328 < 0) {
               Print("Error: ", GetLastError());
               again();
               return (0);
            }
            gd_236 = FindLastBuyPrice();
            gi_316 = FALSE;
            gi_332 = TRUE;
         }
      }
   }
   if (gi_316 && gi_304 < 1) {
      l_iclose_8 = iClose(Symbol(), 0, 2);
      l_iclose_16 = iClose(Symbol(), 0, 1);
      g_bid_220 = Bid;
      g_ask_228 = Ask;
      if (!gi_324 && !gi_320) {
         gi_288 = gi_304;
         gd_292 = NormalizeDouble(GetLots() * MathPow(LotExponent, gi_288), lotdecimal);
         if (alert()<0) {
         //if (l_iclose_8 > l_iclose_16 && alert()<0) {
               gi_328 = OpenPendingOrder(1, gd_292, g_bid_220, slip, g_bid_220, 0, 0, gs_ilan_272 + "-" + gi_288, MagN, 0, Red);
               if (gi_328 < 0) {
                  Print("Error: ", GetLastError());
                  again();
                  return (0);
               }
               gd_236 = FindLastBuyPrice();
               gi_332 = TRUE;
            }
         if (alert()>0)
         //if (l_iclose_8 < l_iclose_16 && alert()>0)
          {
               gi_328 = OpenPendingOrder(0, gd_292, g_ask_228, slip, g_ask_228, 0, 0, gs_ilan_272 + "-" + gi_288, MagN, 0, Blue);
               if (gi_328 < 0) {
                  Print("Error: ", GetLastError());
                  again();
                  return (0);
               }
               gd_244 = FindLastSellPrice();
               gi_332 = TRUE;
            }
         if (gi_328 > 0) gi_284 = TimeCurrent() + 60.0 * (60.0 * MaxTradeOpenHours);
         gi_316 = FALSE;
      }
   }
   gi_304 = CountTrades(MagN);
   g_price_212 = 0;
   double ld_24 = 0;
   for (g_pos_300 = OrdersTotal() - 1; g_pos_300 >= 0; g_pos_300--) {
      OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN) {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
            g_price_212 += OrderOpenPrice() * OrderLots();
            ld_24 += OrderLots();
         }
      }
   }
   if (gi_304 > 0) g_price_212 = NormalizeDouble(g_price_212 / ld_24, Digits);
   if (gi_332) {
      for (g_pos_300 = OrdersTotal() - 1; g_pos_300 >= 0; g_pos_300--) {
         OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN) {
            if (OrderType() == OP_BUY) {
               g_price_180 = g_price_212 + TakeProfit * Point;
               gd_unused_196 = g_price_180;
               
               gi_268 = TRUE;
            }
         }
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN) {
            if (OrderType() == OP_SELL) {
               g_price_180 = g_price_212 - TakeProfit * Point;
               gd_unused_204 = g_price_180;               
               gi_268 = TRUE;
            }
         }
      }
   }
   if (gi_332) {
      if (gi_268 == TRUE) {
         for (g_pos_300 = OrdersTotal() - 1; g_pos_300 >= 0; g_pos_300--) {
            OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN) OrderModify(OrderTicket(), g_price_212, OrderStopLoss(), g_price_180, 0, Yellow);
            gi_332 = FALSE;
         }
      }
   }
   return (0);
}

int CountTrades(int mn) {
   int l_count_0 = 0;
   for (int l_pos_4 = OrdersTotal() - 1; l_pos_4 >= 0; l_pos_4--) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != mn) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) l_count_0++;
   }
   return (l_count_0);
}

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

int OpenPendingOrder(int ai_0, double a_lots_4, double a_price_12, int a_slippage_20, 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 (ai_0) {
   case 2:
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_BUYLIMIT, a_lots_4, a_price_12, a_slippage_20, StopLong(ad_24, ai_32), TakeLong(a_price_12, 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(1000);
      }
      break;
   case 4:
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_BUYSTOP, a_lots_4, a_price_12, a_slippage_20, StopLong(ad_24, ai_32), TakeLong(a_price_12, 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, a_lots_4, ND(Ask), a_slippage_20, 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, a_lots_4, a_price_12, a_slippage_20, StopShort(ad_24, ai_32), TakeShort(a_price_12, 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, a_lots_4, a_price_12, a_slippage_20, StopShort(ad_24, ai_32), TakeShort(a_price_12, 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, a_lots_4, ND(Bid), a_slippage_20, 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 (g_pos_300 = OrdersTotal() - 1; g_pos_300 >= 0; g_pos_300--) {
      OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN)
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) ld_ret_0 += OrderProfit();
   }
   return (ld_ret_0);
}



double AccountEquityHigh() {
   if (CountTrades(MagN) == 0) gd_336 = AccountEquity();
   if (gd_336 < gd_344) gd_336 = gd_344;
   else gd_336 = AccountEquity();
   gd_344 = AccountEquity();
   return (gd_336);
}

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--) {
      OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN && 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--) {
      OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN && 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);
}


double LotSiz(double ltt)
{
double ls=0;
double minlot=MarketInfo(Symbol(), MODE_MINLOT);
double maxlot=MarketInfo(Symbol(), MODE_MAXLOT);
double steplot=MarketInfo(Symbol(), MODE_LOTSTEP);

int LotsDigits = MathCeil(MathAbs(MathLog(steplot)/MathLog(10)));
ls = NormalizeDouble(ltt,LotsDigits);

if (ltt<minlot)    {   ls=minlot;  }
if (ltt>maxlot)    {   ls=maxlot;  }

//int LotsDigits = MathCeil(MathAbs(MathLog( MarketInfo(Symbol(),MODE_MINLOT))/MathLog(10)));
//Êîëè÷åñòâî çíà÷àùèõ öèôð ïîñëå çàïÿòîé â ðàçìåðå ïîçèöèè. 


return(ls);
}

double GetLots() 
{
	double 	lot_min		= MarketInfo( Symbol(), MODE_MINLOT  );
	double 	lot_max		= MarketInfo( Symbol(), MODE_MAXLOT  );
	double 	lot_step		= MarketInfo( Symbol(), MODE_LOTSTEP );
	double 	balance	   = AccountBalance();
	double		margin		= AccountFreeMargin();
	double 		required		= MarketInfo( Symbol(), MODE_MARGINREQUIRED );
if(Reinvest!=0)
 {
   //double lot = NormalizeDouble( balance * risk*0.01 * leverage / lotsize, 2 );
   double lot = NormalizeDouble(MathFloor( balance / Reinvest)/100,2);
   if(lot < lot_min) lot = lot_min;
   if(lot >lot_max) lot = lot_max;
  }
  else lot=Lot; 
   return(lot);
} 

void again() {
   gi_280 = Time[1];
   return (0);
} 
//---
int alert()       
{
   int x=0;
   string ind_name = "i-Regr";
   double ma = iCustom(NULL, mper[TFS], ind_name,    Regr.degree1, Regr.kstd1, SPer, Regr.shift1,0, 0);
   double ma1 = iCustom(NULL, mper[TFS], ind_name,    Regr.degree1, Regr.kstd1, SPer, Regr.shift1,0, 1);   
   if (kanal==1)
   {
   double m_up = iCustom(NULL, mper[TFS], ind_name,    Regr.degree1, Regr.kstd1, SPer, Regr.shift1,1, 0);
   double m_d = iCustom(NULL, mper[TFS], ind_name,    Regr.degree1, Regr.kstd1, SPer, Regr.shift1,2, 0);      
   if (ma>ma1 && Bid>m_d) x=1;
   if (ma<ma1  && Ask<m_up) x=-1;
   }
   if (kanal==0)
   {
   if (ma>ma1) x=1;
   if (ma<ma1) x=-1;
   }   
   if (kanal==2)
   {
   m_up = iCustom(NULL, mper[TFS], ind_name,    Regr.degree1, Regr.kstd1, SPer, Regr.shift1,1, 0);
   m_d = iCustom(NULL, mper[TFS], ind_name,    Regr.degree1, Regr.kstd1, SPer, Regr.shift1,2, 0);      
   if (ma>ma1 && Bid>m_d && Ask<m_up && alerts(1)==1) x=1;
   if (ma<ma1  && Ask<m_up && Bid>m_d && alerts(-1)==-1) x=-1;
   }   
return(x);
}

int alerts(int d6) 
{
if (CountTrades(MagN)<IndStep) return(d6);
int x=0;
   string ind_name = "i-Regr";
   double ma = iCustom(NULL, mper[TFSmall], ind_name,    Regr.degree1mall, Regr.kstd1mall, SPermall, Regr.shift1mall,0, 0);
   double ma1 = iCustom(NULL, mper[TFSmall], ind_name,    Regr.degree1mall, Regr.kstd1mall, SPermall, Regr.shift1mall,0, 1); 
   double m_up = iCustom(NULL, mper[TFSmall], ind_name,    Regr.degree1mall, Regr.kstd1mall, SPermall, Regr.shift1mall,1, 0);
   double m_d = iCustom(NULL, mper[TFSmall], ind_name,    Regr.degree1mall, Regr.kstd1mall, SPermall, Regr.shift1mall,2, 0);      
   if (ma>ma1 && Bid>m_d && Ask<m_up ) x=1;
   if (ma<ma1  && Ask<m_up && Bid>m_d ) x=-1;
return(x);
}

double ND(double p)
{
return(NormalizeDouble(p,Digits));
}

void TrailingAlls() 
{     
   int  total2=CountTrades(MagN);   
   if (CalculateProfit()<=0 || total2==0) return(0);

  
   double AveragePrice2 = 0;
   double Count2 = 0;
   int dir=-1;
   for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagN) {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
            AveragePrice2 += OrderOpenPrice() * OrderLots();
            Count2 += OrderLots();
            if (OrderType() == OP_BUY) dir=0;
            if (OrderType() == OP_SELL) dir=1;            
         }
      }
   }
   if (total2 > 0) 
    {   
    
    AveragePrice2 = RoundToTickSize(AveragePrice2/Count2);    
    } 
       
     if (dir==0) 
      {
       if (AveragePrice2>Bid-ProfitTrailDist*Point) return(0);
      } 
     if (dir==1) 
      {
       if (AveragePrice2<Bid+ProfitTrailDist*Point) return(0);
      }        
      for (int i = OrdersTotal() - 1; i >= 0; i--) 
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagN) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagN) 
              {
              if (UseTrailingStop==1) TrailingStairs(OrderTicket(),TrailDist,TrailStep,AveragePrice2);
              if (UseTrailingStop==2) TrailingStairs2(OrderTicket(),TrailDist,TrailStep,AveragePrice2);
              }
            }
            
          }
      }
      
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÑÒÀÍÄÀÐÒÍÛÉ-ÑÒÓÏÅÍ×ÀÑÒÛÉ                                |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ðàññòîÿíèå îò êóðñà îòêðûòèÿ,  |
//| íà êîòîðîì òðåéëèíã çàïóñêàåòñÿ (ïóíêòîâ) è "øàã", ñ êîòîðûì îí  |
//| ïåðåíîñèòñÿ (ïóíêòîâ)                                            |
//| Ïðèìåð: ïðè +30 ñòîï íà +10, ïðè +40 - ñòîï íà +20 è ò.ä.        |
//+------------------------------------------------------------------+
void TrailingStairs(int ticket,int trldistance,int trlstep,double avg)
   {  
   double nextstair; // áëèæàéøåå çíà÷åíèå êóðñà, ïðè êîòîðîì áóäåì ìåíÿòü ñòîïëîññ

   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingStairs() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      } 
   
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ
      // åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä
      if ((OrderStopLoss()==0))
      nextstair = avg + trldistance*Point;
         
      // èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä
      else
      nextstair = OrderStopLoss() + trldistance*Point;

      // åñëè òåêóùèé êóðñ (Bid) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé
      if (Bid>=nextstair)
      if ((OrderStopLoss()==0)) 
      OrderModify(ticket,OrderOpenPrice(),avg + trlstep*Point,OrderTakeProfit(),OrderExpiration());
      else
      OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration());
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ
      // åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä
      if ((OrderStopLoss()==0) )
      nextstair = avg - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
      
      // èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä
      else
      nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
       
      // åñëè òåêóùèé êóðñ (Àñê) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé
      if (Ask<=nextstair)
      if ((OrderStopLoss()==0))
      OrderModify(ticket,OrderOpenPrice(),avg - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      else
      OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      }      
   }

void TrailingStairs2(int ticket,int trldistance,int trlstep,double avg)
   {  
   double nextstair; // áëèæàéøåå çíà÷åíèå êóðñà, ïðè êîòîðîì áóäåì ìåíÿòü ñòîïëîññ

   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingStairs2() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      } 
   
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ
      // åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä
      if ((OrderStopLoss()==0))
      nextstair = avg + trldistance*Point;
         
      // èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä
      else
      {double trl=(OrderStopLoss()-avg)/Point;
      nextstair = OrderStopLoss() + xtral*trl*Point;}

      // åñëè òåêóùèé êóðñ (Bid) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé
      if (Bid>=nextstair)
      if ((OrderStopLoss()==0)) 
      OrderModify(ticket,OrderOpenPrice(),avg + trlstep*Point,OrderTakeProfit(),OrderExpiration());
      else
      OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration());
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ
      // åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä
      if ((OrderStopLoss()==0) )      
      nextstair = avg - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
      
      // èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä
      else
      {trl=(avg-OrderStopLoss())/Point;
      nextstair = OrderStopLoss() - (trl*xtral + MarketInfo(Symbol(),MODE_SPREAD))*Point;
      }
       
      // åñëè òåêóùèé êóðñ (Àñê) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé
      if (Ask<=nextstair)
      if ((OrderStopLoss()==0))
      OrderModify(ticket,OrderOpenPrice(),avg - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      else
      OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      }      
   }
   
   double RoundToTickSize(double price){return(NormalizeDouble(MathRound(price/MarketInfo(Symbol(), MODE_TICKSIZE))*MarketInfo(Symbol(), MODE_TICKSIZE), MarketInfo(Symbol(), MODE_DIGITS)));}
   
   int Dir(int mn)
   {
   int r=-1;
   for (int i = OrdersTotal() - 1; i >= 0; i--) 
   {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != mn) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) {
         if (OrderType() == OP_BUY) 
         {
            r=0;
       
         }
      }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) {
         if (OrderType() == OP_SELL) {
            r=1;
   
         }
      }
   }
   return(r);
   }
   
   
   int ProfitPip (int mn) // ñóììàðíûé ïðîôèò â ïèïñàõ ïî âñåì ñäåëêàì ñ ìàäæèêíóìáåðîì mn
   {
   double p;
      int prb,prs,pr=0,dg,k=OrdersTotal();
      for (int i=0; i<k; i++) {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
      if (OrderMagicNumber()==mn) {  
         dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
      if (StringFind(OrderSymbol(),"JPY")<0) dg=4; else dg=2;
         p=MarketInfo(OrderSymbol(), MODE_POINT);
      if (StringFind(OrderSymbol(),"JPY")<0) p=0.0001; else p=0.01;
      if (OrderType()==OP_BUY) {
         prb+=(NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID)/p,dg)-NormalizeDouble(OrderOpenPrice()/p,dg));}
      if (OrderType()==OP_SELL) {
         prs+=(NormalizeDouble(OrderOpenPrice()/p,dg)-NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK)/p,dg));}
      pr=(prb+prs);
      }}}
  return(pr); 
   }
   
   
   double CountLots(int mn) {
   double l_count_0 = 0;
   for (int i = OrdersTotal() - 1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != mn) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) l_count_0=l_count_0+OrderLots();
   }
   return (l_count_0);
}

double Balance(string OrdType, string inf, int mn)
{
   double result=0, FProf = 0;
   int trade;
   for(trade=OrdersTotal()-1;trade>=0;trade--)
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=mn) continue;
      if(OrderSymbol()==Symbol()&&OrderMagicNumber()==mn)
      {
         if (OrdType == "buy")
         {
            if(OrderType()==OP_BUY)
            {
               if (inf=="Balance") result=result+OrderProfit()-OrderSwap()-OrderCommission();
               if (inf=="Lot")     result=result+OrderLots();
               //if (inf=="FP") result=result + (OrderLots()*100000*(OrderTakeProfit()-OrderOpenPrice())/AccountLeverage());
               
            }
         }
         
         if (OrdType == "sell")
         {
            if(OrderType()==OP_SELL )
            {
               if (inf=="Balance") result=result+OrderProfit()-OrderSwap()-OrderCommission();
               if (inf=="Lot")     result=result+OrderLots();
               //if (inf=="FP")  result=result + (OrderLots()*100000*(-OrderTakeProfit()+OrderOpenPrice())/AccountLeverage());     
            }
         }
         
         
      }   
   }
  return(result);    
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---