AG_AT





#property library   
 
#import "AG_Lib.ex4"
   int AG_Magic_Number();                          // Âû÷èñëåíèå MN 
   int AG_Message(string& Message[], string _Text);// Çàïèñü ñîîáùåíèé â ìàññèâ Message[]
#import

bool FatalError, FreeMarginAlert;
datetime LastBar = 0;
double Spread, StopLevel, TP, SL, Lots, Koeff, Tick,
       UpFractal1, DownFractal1, UpFractal2, DownFractal2;
int Signal, MagicNumber, TU1, TU2, TD1, TD2;
int FastMACD = 12;
int SlowMACD = 26;
int SignalMACD = 9;
string Comm = "AG_AT";                          // Êîììåíòàðèé (ðåêîìåíäóåòñÿ "AG_AT")

int AG_AT(int Parol_AT, double Order[][], string Object[], double Instrument[][][][], 
          int Ddraw_Object[][], double& Tuning[], double& Manager[][], string& Message[])
   {    
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   Lots = NormalizeDouble(Tuning[1],2);       // Çíà÷åíèå ëîòîâ
   int Slip  = NormalizeDouble(Tuning[3],0);       // Ïðîñêàëüçûâàíèå (ïóíêòîâ)
// ------------ Ïîëó÷åíèå íàñòðîåê ýêñïåðòà ---------------------------------------------
   Koeff = NormalizeDouble(Instrument[0][0][1][0], 0);  // AT_1
   if (Koeff <= 0) Koeff = 0.85;
   int MagicNumber = Period();
// --------------------------------------------------------------------------------------   
// - 1 -  == Ðàçðåøåíî ëè ñîâåòíèêó ðàáîòàòü? ===========================================
   if (FatalError)             // Îòêëþ÷àåòñÿ ðàáîòà ñîâåòíèêà, åñëè ôóíêöèÿ
    return(0);                //  âûêëþ÷åíèå ñòðàòåãèè, åñëè èìåëà ìåñòî ôàòàëüíàÿ îøèáêà
// - 1 -  == Îêîí÷àíèå áëîêà ============================================================

// - 2 - == Óäàëåíèå îòëîæåííîãî îðäåðà ïðè çàêðûòèè ïåðâè÷íîé ïîçèöèè ïî ïðîôèòó =======
   DeletePending();
// - 2 -  == Îêîí÷àíèå áëîêà ============================================================

// - 3 -  == Êîíòðîëü îòêðûòèÿ íîâîãî áàðà ==============================================
   if (LastBar == Time[0])     //Åñëè âðåìÿ ïîñ÷èòàííîãî áàðà ðàâíî âðåìåíè òåêóùåãî áàðà
     return(1);                         // òî ýòî îçíà÷àåò, ÷òî íîâûé áàð åùå íå îòêðûëñÿ
// - 3 -  == Îêîí÷àíèå áëîêà ============================================================

// - 4 - == Ñáîð èíôîðìàöèè îá óñëîâèÿõ òîðãîâëè ========================================
   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);                         // ìèíèìàëüíûé òèê
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                  // òåêùèé ñïðýä
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // òåêóùèé óðîâåíü ñòîïîâ 
// - 4 -  == Îêîí÷àíèå áëîêà ============================================================
     
// - 5 - == Ðàñ÷åò òåêóùåãî ñèãíàëà =====================================================
   GetSignal();
// - 5 -  == Îêîí÷àíèå áëîêà ============================================================
   
// - 6 - == Îòêðûòèå äëèííîé  ïîçèöèè ===================================================
   if (Signal == 1)
     {
      int Res = CheckOrdersReal(OP_SELL);            // Ïðîòèâîïîëîæíóþ ïîçèöèþ - çàêðûòü
      if (Res == 0)                                          // åñëè íåò îòêðûòûõ ïîçèöèé
        {
         if (!CheckPendingsReal(OP_BUYSTOP)) return(0);       // è íåò îòëîæåííûõ îðäåðîâ
         RefreshRates();
         if (ND(Bid-SL-StopLevel) > 0)
           if (!OpenOrder(OP_BUY, ND(Ask), ND(SL), ND(TP), 0, Message)) // åñëè íå óäàëîñü îòêðûòü
             return(1);                                // òî ïîïðîáóåì ñî ñëåäóþùèì òèêîì
        }
      if(Res == 1) return(1); //çàêðûòü ïðîòèâîïîëîæíóþ íå âûøëî, æäåì äî ñëåäóþùåãî òèêà
     }
// - 6 -  == Îêîí÷àíèå áëîêà ============================================================
     
// - 7 - == Îòêðûòèå êîðîòêîé ïîçèöèè ===================================================
   if (Signal == 2)
     {
      Res = CheckOrdersReal(OP_BUY);                 // Ïðîòèâîïîëîæíóþ ïîçèöèþ - çàêðûòü
      if (Res == 0)                                          // åñëè íåò îòêðûòûõ ïîçèöèé
        {
         if (!CheckPendingsReal(OP_SELLSTOP)) return(0);               // è íåò SELL STOP
         RefreshRates();
         if (ND(SL-Ask-StopLevel) > 0)
           if (!OpenOrder(OP_SELL, ND(Bid), ND(SL), ND(TP), 0, Message))// åñëè íå óäàëîñü îòêðûòü
             return(1);                                // òî ïîïðîáóåì ñî ñëåäóþùèì òèêîì
        }
      if (Res == 1) return(1);//çàêðûòü ïðîòèâîïîëîæíóþ íå âûøëî, æäåì äî ñëåäóþùåãî òèêà 
     }
// - 7 -  == Îêîí÷àíèå áëîêà ============================================================

// - 8 - == Äîáàâëåíèå îòëîæåííîãî îðäåðà ê ïåðâè÷íîé ïîçèöèè ===========================
    if (!AddPending(Message)) return(1);
// - 8 -  == Îêîí÷àíèå áëîêà ============================================================

   LastBar = Time[0];                                            // íîâûé áàð "ïîñ÷èòàëè"   return(1);
   return(1);
   }
   
//+-------------------------------------------------------------------------------------+
//| Ðàñ÷åò êîýôôèöèåíòîâ K è B â óðàâíåíèè ïðÿìîé ïî äâóì òî÷êàì                        |
//| Óðàâíåíèå ïðÿìîé Y = K*X + B, ïîýòîìó ñîñòàâèâ ñèñòåìó èç äâóõ óðàâíåíèé,           |
//| ìîæíî íàéòè íåèçâåñòíûå K è B, åñëè èçâåñòíû Y1, Y2, X1, X2                         |
//+-------------------------------------------------------------------------------------+
void DirectLineCalc(int XB, double YB, int XE, double YE, double &B, double &K) 
{
 B = (YB*XE - YE*XB)/(XE - XB);
 K = (YE - B)/XE;
} 

//+-------------------------------------------------------------------------------------+
//| Ðàñ÷åò ñèãíàëà ïî MACD è êàíàëó, îáðàçîâàííîãî ôðàêòàëàìè                           |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
 Signal = 0;                                                         // îáíóëåíèå ñèãíàëà
 
// - 1 - == Áåðåì çíà÷åíèÿ MACD íà 1-4 áàðàõ ============================================
 double MACD1, MACD2, MACD3, MACD4, SMACD;
 MACD1 = iMACD(Symbol(), 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_MAIN, 1);
 MACD2 = iMACD(Symbol(), 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_MAIN, 2);
 MACD3 = iMACD(Symbol(), 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_MAIN, 3);
 MACD4 = iMACD(Symbol(), 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_MAIN, 4);
 SMACD = iMACD(Symbol(), 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_SIGNAL, 1);
// - 1 - == Îêîí÷àíèå áëîêà =============================================================

// - 2 - == Ñèãíàë îòêðûòèÿ BUY =========================================================
 double DirectB = 0, DirectK = 0;
 if (SMACD < MACD1 && MACD1 < MACD2 && MACD2 > MACD3 && MACD3 > MACD4)   // îòêàò íà MACD
   if (FindFractals() == 1)                                  // ïîñòðîåí âîñõîäÿùèé êàíàë
     {                                      
      double ThirdFractal = DownFractal1;   // â êà÷åñòâå îäíîãî íèæíåãî ôðàêòàëà ñíà÷àëà                 
      int ThirdNumber = TD1;                               // áåðåì ïåðâûé íèæíèé ôðàêòàë
      DirectLineCalc(TU1, UpFractal1, TU2, UpFractal2, DirectB, DirectK); // ðàñ÷åò K è B
      double ParallelB = DownFractal1 - DirectK*TD1;    // Ðàñ÷åò B íèæíåé ãðàíèöû êàíàëà
      if (DownFractal2 < DirectK*TD2+ParallelB)//Åñëè âòîðîé íèæíèé ôðàêòàë íå ïîìåùàåòñÿ
        {                  // â ïîëó÷åííûé êàíàë, òî ïåðåñ÷èòûâàåì íèæíþþ ãðàíèöó ïî íåìó
         ThirdFractal = DownFractal2;
         ThirdNumber = TD2;
         ParallelB = DownFractal2 - DirectK*TD2;
        }           
                   // Ïðîâåðÿåì, ïîïàäàþò ëè öåíû çàêðûòèÿ âñåõ ñâå÷åé â ïîëó÷åííûé êàíàë
      for (int i = MathMax(TD2, TU2); i >= MathMax(TD1, TU1); i--)
        if (Close[i] < DirectK*i+ParallelB || Close[i] > DirectK*i+DirectB)
          {
           DirectK = 0;                      // åñëè íå ïîïàäàþò, òî êàíàë íå ñôîðìèðîâàí
           break;
          } 
      // ---------------
      if (DirectK != 0 && ND(Bid+StopLevel) < ND((DirectB+ParallelB)/2))
        {   // âñå öåíû çàêðûòèÿ ïîïàëè â êàíàë è öåíà íàõîäèòñÿ â íèæíåé ïîëîâèíå êàíàëà
         TP = (DirectB-ParallelB)*Koeff+ParallelB;
         SL = ThirdFractal-2*Tick;
         Signal = 1;                                        // òî ýòî ñèãíàë îòêðûòèÿ BUY
        } 
     } 
// - 2 - == Îêîí÷àíèå áëîêà =============================================================

// - 3 - == Ñèãíàë îòêðûòèÿ SELL ========================================================
 if (SMACD > MACD1 && MACD1 > MACD2 && MACD2 < MACD3 && MACD3 < MACD4)   // îòêàò íà MACD
   if (FindFractals() == 2)                                  // ïîñòðîåí íèñõîäÿùèé êàíàë
     {
      ThirdFractal = UpFractal1;    // â êà÷åñòâå îäíîãî âåðõíåãî ôðàêòàëà ñíà÷àëà  áåðåì
      ThirdNumber = TU1;                                        // ïåðâûé âåðõíèé ôðàêòàë
      DirectLineCalc(TD1, DownFractal1, TD2, DownFractal2, DirectB, DirectK);    // K è B
      ParallelB = UpFractal1 - DirectK*TU1;//Ðàñ÷åò êîýôôèöèåíòà B âåðõíåé ãðàíèöû êàíàëà
      if (UpFractal2 > DirectK*TU2+ParallelB)// Åñëè âòîðîé âåðõíèé ôðàêòàë íå ïîìåùàåòñÿ
        {                 // â ïîëó÷åííûé êàíàë, òî ïåðåñ÷èòûâàåì âåðõíþþ ãðàíèöó ïî íåìó
         ThirdFractal = UpFractal2;
         ThirdNumber = TU2;
         ParallelB = UpFractal2 - DirectK*TU2;
        }           
                   // Ïðîâåðÿåì, ïîïàäàþò ëè öåíû çàêðûòèÿ âñåõ ñâå÷åé â ïîëó÷åííûé êàíàë
      for (i = MathMax(TD2, TU2); i >= MathMax(TD1, TU1); i--)
        if (Close[i] > DirectK*i+ParallelB || Close[i] < DirectK*i+DirectB)
          {
           DirectK = 0;                      // åñëè íå ïîïàäàþò, òî êàíàë íå ñôîðìèðîâàí
           break;
          } 
      // ---------------
      if (DirectK != 0 && ND(Bid-StopLevel) > ND((DirectB+ParallelB)/2))
        {  // âñå öåíû çàêðûòèÿ ïîïàëè â êàíàë è öåíà íàõîäèòñÿ â âåðõíåé ïîëîâèíå êàíàëà
         SL = ThirdFractal + Spread + 2*Tick;
         TP = ParallelB - (ParallelB - DirectB)*Koeff+Spread;
         Signal = 2;                                       // òî ýòî ñèãíàë îòêðûòèÿ SELL
        }
     }   
// - 3 - == Îêîí÷àíèå áëîêà =============================================================
}  

//+-------------------------------------------------------------------------------------+
//| Îæèäàíèå òîðãîâîãî ïîòîêà. Åñëè ïîòîê ñâîáîäåí, òî ðåçóëüòàò True, èíà÷å - False    |
//+-------------------------------------------------------------------------------------+  
bool WaitForTradeContext()
{
 int P = 0;
 // öèêë "ïîêà"
 while(IsTradeContextBusy() && P < 5)
   {
    P++;
    Sleep(1000);
   }
 // -------------  
 if(P == 5)
   return(False);
 return(True);    
}
 
//+-------------------------------------------------------------------------------------+
//| Íàõîäèì äâà ïîñëåäíèõ íèæíèõ è âåðõíèõ ôðàêòàëà, ïî êîòîðûì îïðåäåëÿåì òåêóùèé òðåíä|
//| (0 - íåò, 1 - âîñõîäÿùèé, 2 - íèñõîäÿùèé)                                           |
//+-------------------------------------------------------------------------------------+
int FindFractals()
{
// - 1 - ======= Ïîèñê ôðàêòàëîâ ========================================================
   UpFractal1 = 0;
   UpFractal2 = 0;
   DownFractal1 = 0;
   DownFractal2 = 0;
   int i = 3;
   while ((UpFractal1 == 0 || UpFractal2 == 0 || DownFractal1 == 0 || DownFractal2 == 0)
           && i < Bars)   // öèêë ïðîäîëæàåòñÿ, ïîêà íå áóäóò íàéäåíû âñå ÷åòûðå ôðàêòàëà
     {
      double Up = iFractals(Symbol(), 0, MODE_UPPER, i);               // âåðõíèé ôðàêòàë
      double Dn = iFractals(Symbol(), 0, MODE_LOWER, i);                // íèæíèé ôðàêòàë
      if (Up != 0)                           // åñëè íà òåêóùåì áàðå åñòü âåðõíèé ôðàêòàë
        if (UpFractal1 == 0)                    // è ýòî ïåðâûé íàéäåííûé âåðõíèé ôðàêòàë
          {
           UpFractal1 = Up;                                     // ñîõðàíÿåì åãî çíà÷åíèå
           TU1 = i;                                            // è çàïîìèíàåì íîìåð áàðà
          } 
         else
          if (UpFractal2 == 0)           // åñëè ýòî óæå âòîðîé íàéäåííûé âåðõíèé ôðàêòàë
            {
             UpFractal2 = Up;           // òî ñîõðàíÿåì åãî çíà÷åíèå âî âòîðóþ ïåðåìåííóþ
             TU2 = i;                                    // è ñíîâà çàïîìèíàåì íîìåð áàðà
            } 
      if (Dn != 0)                            // åñëè íà òåêóùåì áàðå åñòü íèæíèé ôðàêòàë
        if (DownFractal1 == 0)                   // è ýòî ïåðâûé íàéäåííûé íèæíèé ôðàêòàë
          { 
           DownFractal1 = Dn;                                   // ñîõðàíÿåì åãî çíà÷åíèå
           TD1 = i;                                            // è çàïîìèíàåì íîìåð áàðà
          } 
         else
          if (DownFractal2 == 0)          // åñëè ýòî óæå âòîðîé íàéäåííûé íèæíèé ôðàêòàë
            {
             DownFractal2 = Dn;         // òî ñîõðàíÿåì åãî çíà÷åíèå âî âòîðóþ ïåðåìåííóþ
             TD2 = i;                                    // è ñíîâà çàïîìèíàåì íîìåð áàðà
            }
      i++;
     }
// - 1 - ======= Îêîí÷àíèå áëîêà ========================================================
      
// - 2 - ======= Àíàëèç ïîëó÷åííûõ ðåçóëüòàòîâ ==========================================
   if (UpFractal1 == 0 || DownFractal1 == 0 ||       // Åñëè íå íàéäåí îäèí èç ôðàêòàëîâ, 
       UpFractal2 == 0 || DownFractal2 == 0)// òî ýòî îøèáêà è ôóíêöèÿ âåðíåò çíà÷åíèå -1
     {
      Print("Îøèáêà â èñòîðèè. Íå íàéäåí îäèí èç ôðàêòàëîâ!");
      return(-1);
     }
     
   // Îïðåäåëåíèå òðåíäà
   if(UpFractal1 > UpFractal2 && DownFractal1 > DownFractal2)
     return(1);   // Âîñõîäÿùèé
     
   if(UpFractal1 < UpFractal2 && DownFractal1 < DownFractal2)
     return(2);   // Íèñõîäÿùèé
// - 2 - ======= Îêîí÷àíèå áëîêà ========================================================
     
   return(0); // íåò òðåíäà
   // ------------------  
}  
 
//+-------------------------------------------------------------------------------------+
//| Ïðèâåäåíèå çíà÷åíèé ê òî÷íîñòè îäíîãî ïóíêòà                                        |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
 return(NormalizeDouble(A, Digits));
}  

//+-------------------------------------------------------------------------------------+
//| Ðàñøèôðîâêà ñîîáùåíèÿ îá îøèáêå                                                     |
//+-------------------------------------------------------------------------------------+
string ErrorToString(int Error)
{
 switch(Error)
   {
    case 2: return("çàôèêñèðîâàíà îáùàÿ îøèáêà, îáðàòèòåñü â òåõïîääåðæêó."); 
    case 5: return("ó âàñ ñòàðàÿ âåðñèÿ òåðìèíàëà, îáíîâèòå åå."); 
    case 6: return("íåò ñâÿçè ñ ñåðâåðîì, ïîïðîáóéòå ïåðåçàãðóçèòü òåðìèíàë."); 
    case 64: return("ñ÷åò çàáëîêèðîâàí, îáðàòèòåñü â òåõïîääåðæêó.");
    case 132: return("ðûíîê çàêðûò."); 
    case 133: return("òîðãîâëÿ çàïðåùåíà."); 
    case 149: return("çàïðåùåíî ëîêèðîâàíèå."); 
   }
}
  
//+-------------------------------------------------------------------------------------+
//| Îòêðûòèå ïîçèöèè                                                                    |
//| Âîçâðàùàåò:                                                                         |
//|   True - Ïîçèöèÿ îòêðûòà óñïåøíî                                                    |
//|   False - Îøèáêà îòêðûòèÿ                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenOrder(int Type, double Price, double SL, double TP, int Num, string& Message[])
{
 // Áëîê ïðîâåðêè äîñòàòî÷íîñòè ñâîáîäíûõ ñðåäñòâ
 if(AccountFreeMarginCheck(Symbol(), OP_BUY, Lots) <= 0 || GetLastError() == 134) 
  {
   if(!FreeMarginAlert)
    {
     AG_Message(Message, "Íåäîñòàòî÷íî ñðåäñòâ äëÿ îòêðûòèÿ îðäåðà. Free Margin = "+
           DoubleToStr(AccountFreeMargin(), 2));
     FreeMarginAlert = True;
    } 
   return(False);  
  }
 FreeMarginAlert = False;  
 // ---------------------------------------------

 switch (Type)
   {
    case OP_BUY: string S = "BUY"; break;
    case OP_SELL: S = "SELL"; break;
    case OP_BUYSTOP: S = "BUYSTOP"; break;
    case OP_SELLSTOP: S = "SELLSTOP"; break;
    case OP_BUYLIMIT: S = "BUYLIMIT"; break;
    case OP_SELLLIMIT: S = "SELLLIMIT"; break;
   }

 if(WaitForTradeContext())  // îæèäàíèå îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà
   {  
    AG_Message(Message, "Îòïðàâëåí çàïðîñ íà îòêðûòèå îðäåðà "+S+" ...");
    int ticket=OrderSend(Symbol(), Type, Lots, Price, 0, 
               SL, TP, Comm, MagicNumber*10+Num, 0, CLR_NONE);// îòêðûòèå ïîçèöèè
    // Ïîïûòêà îòêðûòèÿ ïîçèöèè çàâåðøèëàñü íåóäà÷åé
    if(ticket<0)
      {
       int Error = GetLastError();
       if(Error == 2 || Error == 5 || Error == 6 || Error == 64 
          || Error == 132 || Error == 133 || Error == 149)// ñïèñîê ôàòàëüíûõ îøèáîê
         {
          AG_Message(Message, "Ôàòàëüíàÿ îøèáêà ïðè îòêðûòèè îðäåðà ò. ê. "+
                   ErrorToString(Error)+" Ñîâåòíèê îòêëþ÷åí!");
          FatalError = True;
         }
        else 
         AG_Message(Message, "Îøèáêà îòêðûòèÿ îðäåðà "+S+": "+Error);// íåôàòàëüíàÿ îøèáêà
       return(False);
      }
    // ---------------------------------------------
    
    // Óäà÷íîå îòêðûòèå ïîçèöèè   
    AG_Message(Message, "Îðäåð "+S+" îòêðûò óñïåøíî!"); 
    return(True); 
    // ------------------------
   }
  else
   {
    AG_Message(Message, "Âðåìÿ îæèäàíèÿ îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà èñòåêëî!");
    return(False);  
   } 
} 

//+-------------------------------------------------------------------------------------+
//| Óäàëÿåò âñå îòëîæåííèêè òèïà Type. Åñëè óäàëèòü íå óäàëîñü, òî âåðíåò 1.            |
//+-------------------------------------------------------------------------------------+
bool CheckPendingsReal(int Type)
{
 for (int i = OrdersTotal()-1; i >= 0; i--)
   if(OrderSelect(i, SELECT_BY_POS))
     if(OrderSymbol() == Symbol() && MathFloor(OrderMagicNumber()/10) == MagicNumber 
        && OrderType() > 2)                                   // ïîèñê îòëîæåííîãî îðäåðà
       if(OrderType() == Type)                                    // Åñëè îðäåð òèïà Type
         {
          if (WaitForTradeContext())  
            {
             if (!OrderDelete(OrderTicket()))                  // òî ïûòàåìñÿ óäàëèòü åãî
              return(False);                         // íå óäàëîñü óäàëèòü - âåðíåì False
            }  
           else
            return(False);//âåðíåì False, åñëè íå äîæäàëèñü îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà
         }
        else
         return(False);        // âåðíåì False, åñëè íàéäåí îðäåð íå ñîîòâåòñòâóþùèé Type
 return(True);                                             // åñëè âñå ÎÊ, òî âåðíåì True
}  


//+-------------------------------------------------------------------------------------+
//| Çàêðûâàåò âñå ïîçèöèè òèïà Type. Åñëè çàêðûòü íå óäàëîñü çàêðûòü, òî 1.             |
//| Åñëè ïðèñóòñòâóåò ïðîòèâîïîëîæíàÿ, òî âîçâðàùàåò 2.  ñëó÷àå óñïåõà 0.              |
//+-------------------------------------------------------------------------------------+
int CheckOrdersReal(int Type)
{
 for (int i = OrdersTotal()-1; i >= 0; i--)
   if(OrderSelect(i, SELECT_BY_POS))
     if(OrderSymbol() == Symbol() && MathFloor(OrderMagicNumber()/10) == MagicNumber 
        && OrderType() < 2)                                       // ïîèñê "ñâîåé" ñäåëêè
       if(OrderType() == Type)                                  // Åñëè ïîçèöèÿ òèïà Type
         {
          if (WaitForTradeContext())  
            {
             if(Type == OP_BUY)
               double Pr = ND(MarketInfo(Symbol(), MODE_BID));
              else
               Pr = ND(MarketInfo(Symbol(), MODE_ASK));
             if (!OrderClose(OrderTicket(), OrderLots(), Pr, 3))// òî ïûòàåìñÿ çàêðûòü åå
              return(1);                                 // íå óäàëîñü çàêðûòü - âåðíåì 1
            }  
           else
            return(1);//âåðíåì 1, åñëè íå óäàëîñü äîæäàòüñÿ îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà
         }
        else
         return(2);          // âåðíåì 2, åñëè îòêðûòà ïîçèöèÿ, ïðîòèâîïîëîæíàÿ óêàçàííîé
 return(0);                                                   // åñëè âñå ÎÊ, òî âåðíåì 0
}  

//+-------------------------------------------------------------------------------------+
//| Ïîèñê ïåðâè÷íîé ïîçèöèè è óñòàíîâêà åé îòëîæåííèêà                                  |
//+-------------------------------------------------------------------------------------+
bool AddPending(string& Message[])
{
// - 1 - == Ïîèñê ïåðâè÷íîé ïîçèöèè =====================================================
 for (int i = OrdersTotal()-1; i >= 0; i--)
   if (OrderSelect(i, SELECT_BY_POS))
     if (OrderSymbol() == Symbol() && MathMod(OrderMagicNumber(), 10) == 0 
        && OrderType() < 2)     // ïîèñê ïåðâè÷íîé ïîçèöèè , êîòîðàÿ îòêðûëàñü ïî ñèãíàëó
        {
         bool Res = False;     
         int Type = OrderType();                              // çàïîìèíàåì åå ïàðàìåòðû
         double OpenP = OrderStopLoss();
         double TP = MathAbs(OrderOpenPrice()-OrderStopLoss());
         double SL = OrderTakeProfit();
// - 1 - == Îêîí÷àíèå áëîêà =============================================================

// - 2 - == Ïîèñê îòëîæåííèêà, êîòîðûé äîëæåí áûòü óñòàíîâëåí íà ñòîïå ïîçèöèè ==========
         for (int j = OrdersTotal()-1; j >= 0; j--)
            if (OrderSelect(j, SELECT_BY_POS))
              if (OrderSymbol() == Symbol() && MathMod(OrderMagicNumber(), 10) == 1 
                && OrderType() > 2)       
             {   
              Res = True;               // îòëîæåííèê íàéäåí, íåò íóæäû åãî óñòàíàâëèâàòü
              break;
             } 
// - 2 - == Îêîí÷àíèå áëîêà =============================================================

// - 3 - == Óñòàíîâêà îòëîæåííîãî îðäåðà ================================================
         if (!Res)                          // åñëè îòëîæåííèê íå íàéäåí, òî óñàíîâèì åãî
           {
            if (Type == OP_BUY)                     // åñëè ïåðâè÷íàÿ ïîçèöèÿ äëèííàÿ, òî
              {
               Type = OP_SELLSTOP;                             // óñòàíàâëèâàåì SELL STOP
               TP = OpenP - TP;      // è öåëü îòñòîèò îò öåíû îòêðûòèÿ íà âåëè÷èíó ñòîïà
              } 
             else
              {                                    // åñëè ïåðâè÷íàÿ ïîçèöèÿ êîðîòêàÿ, òî
               Type = OP_BUYSTOP;                               // óñòàíàâëèâàåì BUY STOP
               TP = OpenP + TP;      // è öåëü îòñòîèò îò öåíû îòêðûòèÿ íà âåëè÷èíó ñòîïà
              } 
            if (!OpenOrder(Type, OpenP, SL, TP, 1, Message))// åñëè óñòàíîâèòü íå óäàëîñü
              return(False);                                          // âîçâðàùàåì False
           }
// - 3 - == Îêîí÷àíèå áëîêà =============================================================
         break;
        }
 return(True);
}

//+-------------------------------------------------------------------------------------+
//| Ïîèñê ïåðâè÷íîé ïîçèöèè è óäàëåíèå ñîîòâåòñòâóþùåãî åé îòëîæåííèêà, åñëè ïîçèöèè íåò|
//+-------------------------------------------------------------------------------------+
void DeletePending()
{
 for (int i = OrdersTotal()-1; i >= 0; i--)
   if (OrderSelect(i, SELECT_BY_POS))
     if (OrderSymbol() == Symbol() && MathMod(OrderMagicNumber(), 10) == 1 
        && OrderType() > 2)                                   // ïîèñê îòëîæåííîãî îðäåðà
        {
         bool Res = False;
         int Ticket = OrderTicket();
         // Ïîèñê ïîçèöèè, ñîîòâåòñòâóþùåé îòëîæåííèêó
         for (int j = OrdersTotal()-1; j >= 0; j--)
            if (OrderSelect(j, SELECT_BY_POS))
              if (OrderSymbol() == Symbol() && MathMod(OrderMagicNumber(), 10) == 0 
                && OrderType() < 2)                        
             {   
              Res = True;
              break;
             } 
         // Åñëè îòëîæåííèêà íåò, òî óäàëÿåì
         if (!Res)
           OrderDelete(Ticket);
         // ------------------------------------   
         break;
        }
}

   
//ææææææææææææææææææææææææææææææææææææ Êîíåö ìîäóëÿ æææææææææææææææææææææææææææææææ 10 ææ



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

MACD Histogram
Fractals


Custom Indicators Used:
AG_Lib

Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself

Other Features: