AMKA_Expert





//+-------------------------------------------------------------------------------------+
//|                                                            AMKAandWilder_Expert.mq4 |
//|                                                                           Scriptong |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "Scriptong"
#property link      "scriptong@mail.ru"

//---- input parameters
extern double    Lots        = 0.1;                          // Îáúåì îòêðûâàåìîé ïîçèöèè
extern int       TakeProfit = 2000;
extern int       StopLoss = 2000;
extern string    A3 = "Ïàðàìåòðû èíäèêàòîðà AMKA";
extern int       AMKAPeriod=9;                                             // Ïåðèîä AMKA
extern int       FastEMAPeriod=2;                   // Ïåðèîä áûñòðîé ñêîëüçÿùåé äëÿ AMKA
extern int       SlowEMAPeriod=30;                  // Ïåðèîä áûñòðîé ñêîëüçÿùåé äëÿ AMKA
extern double    PowLevel=2.0;         // Ñòåïåíü, â êîòîðóþ âîçâîäÿòñÿ ñîñòàâëÿþùèå AMKA
                                       // 2 - ñðåäíåêâàäðàòè÷íîå çíà÷åíèå, 
                                       // 3 - ñðåäíåêóáè÷åñêîå è ò. ä.
extern double    dK = 1.0;                                     // êîýôôèöèåíò äëÿ ôèëüòðà
extern bool      UseStdDev = True;      // èñïîëüçîâàòü ëè ñðåäíåêâàäðàòè÷íîå îòêëîíåíèå?
extern int       AMKAPrice = 5;                              // Öåíà ðàñ÷åòà AMKA (0 - 6)
extern string    A4 = "=====================================";
extern string    OpenOrderSound = "ok.wav";                  // Çâóê äëÿ îòêðûòèÿ ïîçèöèè
extern int       MagicNumber = 17589 ;                         // Ìàãèê ïîçèöèé ñîâåòíèêà
bool Activate, FreeMarginAlert, FatalError;
double Tick, Spread, StopLevel, MinLot, MaxLot, LotStep, CurRed, CurBlue;
datetime LastBar;
int TypeOrder, LastType, TicketOrder, Signal;


//+-------------------------------------------------------------------------------------+
//| Ôóíêöèÿ èíèöèàëèçàöèè ýêñïåðòà                                                      |
//+-------------------------------------------------------------------------------------+
int init()
  {
//----
   Activate = False;
// - 1 - == Ñáîð èíôîðìàöèè îá óñëîâèÿõ òîðãîâëè ========================================
   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);                         // ìèíèìàëüíûé òèê
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                  // òåêùèé ñïðýä
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // òåêóùèé óðîâåíü ñòîïîâ
   MinLot = MarketInfo(Symbol(), MODE_MINLOT);    // ìèíèìàëüíûé ðàçðåøåííûé îáúåì ñäåëêè
   MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);   // ìàêñèìàëüíûé ðàçðåøåííûé îáúåì ñäåëêè
   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);          // øàã ïðèðàùåíèÿ îáúåìà ñäåëêè
// - 1 - == Îêîí÷àíèå áëîêà =============================================================

// - 2 - == Ïðèâåäåíèå îáúåìà ñäåëêè ê äîïóñòèìîìó è ïðîâåðêà êîððåêòíîñòè îáúåìà =======
   Lots = MathRound(Lots/LotStep)*LotStep; // îêðóãëåíèå îáúåìà äî áëèæàéøåãî äîïóñòèìîãî
   if(Lots < MinLot || Lots > MaxLot) // îáúåì ñäåëêè íå ìåíüøå MinLot è íå áîëüøå MaxLot
     {
      Comment("Ïàðàìåòðîì Lots áûë çàäàí íåïðàâèëüíûé îáúåì ñäåëêè! Ñîâåòíèê îòêëþ÷åí!");
      return(0);
     }
// - 2 - == Îêîí÷àíèå áëîêà =============================================================

   LastBar = 0;
   CurRed = 0;
   CurBlue = 0;

   Activate = True; // Âñå ïðîâåðêè óñïåøíî çàâåðøåíû, âîçâîäèì ôëàã àêòèâèçàöèè ýêñïåðòà
   
//----
   return(0);
  }

//+-------------------------------------------------------------------------------------+
//| Ôóíêöèÿ äåèíèöèàëèçàöèè ýêñïåðòà                                                    |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   Comment("");
//----
   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)
{
 // Áëîê ïðîâåðêè äîñòàòî÷íîñòè ñâîáîäíûõ ñðåäñòâ
 if(AccountFreeMarginCheck(Symbol(), OP_BUY, Lots) <= 0 || GetLastError() == 134) 
  {
   if(!FreeMarginAlert)
    {
     Print("Íåäîñòàòî÷íî ñðåäñòâ äëÿ îòêðûòèÿ ïîçèöèè. Free Margin = ", 
           AccountFreeMargin());
     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())  // îæèäàíèå îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà
   {  
    Comment("Îòïðàâëåí çàïðîñ íà îòêðûòèå îðäåðà ", S, " ...");
    int ticket=OrderSend(Symbol(), Type, Lots, Price, 0, 
               SL, TP, NULL, MagicNumber, 0, CLR_NONE);        // îòêðûòèå ïîçèöèè
    // Ïîïûòêà îòêðûòèÿ ïîçèöèè çàâåðøèëàñü íåóäà÷åé
    if(ticket<0)
      {
       int Error = GetLastError();
       if(Error == 2 || Error == 5 || Error == 6 || Error == 64 
          || Error == 132 || Error == 133 || Error == 149)     // ñïèñîê ôàòàëüíûõ îøèáîê
         {
          Comment("Ôàòàëüíàÿ îøèáêà ïðè îòêðûòèè ïîçèöèè ò. ê. "+
                   ErrorToString(Error)+" Ñîâåòíèê îòêëþ÷åí!");
          FatalError = True;
         }
        else 
         Comment("Îøèáêà îòêðûòèÿ ïîçèöèè ", S, ": ", Error);       // íåôàòàëüíàÿ îøèáêà
       return(False);
      }
    // ---------------------------------------------
    
    // Óäà÷íîå îòêðûòèå ïîçèöèè   
    Comment("Ïîçèöèÿ ", S, " îòêðûòà óñïåøíî!"); 
    PlaySound(OpenOrderSound); 
    return(True); 
    // ------------------------
   }
  else
   {
    Comment("Âðåìÿ îæèäàíèÿ îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà èñòåêëî!");
    return(False);  
   } 
}

//+-------------------------------------------------------------------------------------+
//| Îæèäàíèå òîðãîâîãî ïîòîêà. Åñëè ïîòîê ñâîáîäåí, òî ðåçóëüòàò True, èíà÷å - False    |
//+-------------------------------------------------------------------------------------+
bool WaitForTradeContext()
{
 int P = 0;
 // öèêë "ïîêà"
 while(IsTradeContextBusy() && P < 5)
   {
    P++;
    Sleep(1000);
   }
 // -------------  
 if(P == 5)
   return(False);
 return(True);    
}

//+-------------------------------------------------------------------------------------+
//| Ðàñ÷åò óðîâíåé ïîääåðæêè/ñîïðîòèâëåíèÿ                                              |
//+-------------------------------------------------------------------------------------+
void GetSignal(int Bar)
{
 Signal = 0;
// - 1 - == Ðàñ÷åò ïî èíäèêàòîðó AMKA ===================================================
 double RedDot = iCustom(Symbol(), 0, "AMKA", AMKAPeriod, FastEMAPeriod, 
                         SlowEMAPeriod, PowLevel, dK, UseStdDev, AMKAPrice, 1, Bar);
 double BlueDot = iCustom(Symbol(), 0, "AMKA", AMKAPeriod, FastEMAPeriod, 
                          SlowEMAPeriod, PowLevel, dK, UseStdDev, AMKAPrice, 2, Bar);
 if (RedDot != 0 && BlueDot == 0) 
   {
    CurRed = RedDot;
    CurBlue = 0.0;
   } 
 if (BlueDot != 0 && RedDot == 0) 
   {
    CurBlue = BlueDot;
    CurRed = 0.0;
   } 
// - 1 - == Îêîí÷àíèå áëîêà =============================================================

// - 3 - == Ñèíòåç ñèãíàëà ==============================================================
  if (CurRed != 0)
    if (ND(Open[Bar]) > ND(Close[Bar]))   // ïîñëåäíèé áàð ìåäâåæèé
      if (ND(Close[Bar]) < ND(Low[Bar+1])) // è îí âûñòóïàåò çà ãðàíèöû ïðåäûäóùåãî áàðà
        if (ND(Open[Bar+1]) < ND(Close[Bar+1])) // à âòîðîé áàð áû÷èé
          Signal = 1;
    
  if (CurBlue != 0)
    if (ND(Open[Bar]) < ND(Close[Bar]))   // ïîñëåäíèé áàð áû÷èé
      if (ND(Close[Bar]) > ND(High[Bar+1])) // è îí âûñòóïàåò çà ãðàíèöû ïðåäûäóùåãî áàðà
        if (ND(Open[Bar+1]) > ND(Close[Bar+1])) // à âòîðîé áàð ìåäâåæèé
          Signal = 2;
// - 3 - == Îêîí÷àíèå áëîêà =============================================================
}  

//+-------------------------------------------------------------------------------------+
//| Çàêðûâàåò âñå ïîçèöèè òèïà 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() && OrderMagicNumber() == 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
}  

//+-------------------------------------------------------------------------------------+
//| Çàìåíà ñòàíäàðòíîãî áëîêà "if-else"                                                 |
//+-------------------------------------------------------------------------------------+
double IF(bool Condition, double IfTrue, double IfFalse)
{
 if (Condition) return(IfTrue);    // Åñëè óñëîâèå èñòèííî, òî âîçâðàùàåì çíà÷åíèå IfTrue
 else           return(IfFalse);    // Åñëè óñëîâèå ëîæíî, òî âîçâðàùàåì çíà÷åíèå IfFalse
}  

//+-------------------------------------------------------------------------------------+
//| Ôóíêöèÿ START ýêñïåðòà                                                              |
//+-------------------------------------------------------------------------------------+
int start()
  {
// - 1 -  == Ðàçðåøåíî ëè ñîâåòíèêó ðàáîòàòü? ===========================================
   if (!Activate || FatalError)             // Îòêëþ÷àåòñÿ ðàáîòà ñîâåòíèêà, åñëè ôóíêöèÿ
    return(0);           //  init çàâåðøèëàñü ñ îøèáêîé  èëè èìåëà ìåñòî ôàòàëüíàÿ îøèáêà
// - 1 -  == Îêîí÷àíèå áëîêà ============================================================

// - 2 -  == Êîíòðîëü îòêðûòèÿ íîâîãî áàðà ==============================================
   if (LastBar == Time[0])                        //Åñëè îòêðûòèå íà äàííîì áàðå óæå áûëî
     return(0);                                                         // òî çàêàí÷èâàåì
// - 2 -  == Îêîí÷àíèå áëîêà ============================================================

// - 3 - == Ñáîð èíôîðìàöèè îá óñëîâèÿõ òîðãîâëè ========================================
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                  // òåêùèé ñïðýä
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // òåêóùèé óðîâåíü ñòîïîâ
// - 3 -  == Îêîí÷àíèå áëîêà ============================================================
     
// - 4 - == Ðàñ÷åò òåêóùåãî ñèãíàëà =====================================================
   GetSignal(1);                                                       // ðàñ÷åò  ñèãíàëà
// - 4 -  == Îêîí÷àíèå áëîêà ============================================================
   
   double Price = 0;
   int Type = -1;
   
// - 6 - == Îòêðûòèå äëèííîé ïîçèöèè ====================================================
   if (Signal == 1)
     {
      int Res = CheckOrdersReal(OP_SELL);
      RefreshRates();
      if (Res == 0)                                          // åñëè íåò îòêðûòûõ ïîçèöèé
        {                                               
         Price = ND(Ask);
         double TP = ND(IF(TakeProfit > StopLevel/Point, Price+TakeProfit*Tick,
                           Price + StopLevel));
         double SL = ND(IF(StopLoss > (StopLevel+Spread)/Point, Price-StopLoss*Tick,
                           Price - StopLevel-Spread));
         Type = OP_BUY;
        }                    
      if (Res == 1) return(0);                      // íå óäàëîñü çàêðûòü ïðîòèâîïîëîæíóþ
     }
// - 6 -  == Îêîí÷àíèå áëîêà ============================================================
     
// - 7 - == Óñòàíîâêà îðäåðà SellStop ===================================================
   if (Signal == 2)
     {
      Res = CheckOrdersReal(OP_BUY);
      if (Res == 0)                                          // åñëè íåò îòêðûòûõ ïîçèöèé
        {               
         RefreshRates();
         Price = ND(Bid);
         TP = ND(IF(TakeProfit > StopLevel/Point, Price-TakeProfit*Tick, 
                    Price - StopLevel));
         SL = ND(IF(StopLoss > (StopLevel+Spread)/Point, Price+StopLoss*Tick,
                    Price + StopLevel + Spread));
         Type = OP_SELL;
        }                    
      if (Res == 1) return(0);                      // íå óäàëîñü çàêðûòü ïðîòèâîïîëîæíóþ
     }
// - 7 -  == Îêîí÷àíèå áëîêà ============================================================

   if (Type >= 0)
     if (!OpenOrder(Type, Price, SL, TP))             // åñëè íå óäàëîñü óñòàíîâèòü îðäåð
        return(0);                                     // òî ïîïðîáóåì ñî ñëåäóþùèì òèêîì
        
   LastBar = Time[0];     

   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

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


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

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

Other Features:


It plays sound alerts