AMKA_Expert

Author: Scriptong
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open orders
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites

Profitability Reports

NZD/USD Oct 2024 - Jan 2025
81.00 %
Total Trades 47
Won Trades 18
Lost trades 29
Win Rate 0.38 %
Expected payoff -2.71
Gross Profit 547.50
Gross Loss -674.70
Total Net Profit -127.20
-100%
-50%
0%
50%
100%
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);
  }
//+------------------------------------------------------------------+

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 ---