SessionTrade_Expert

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

Profitability Reports

GBP/USD Oct 2024 - Jan 2025
87.00 %
Total Trades 56
Won Trades 35
Lost trades 21
Win Rate 0.63 %
Expected payoff -3.52
Gross Profit 1302.40
Gross Loss -1499.40
Total Net Profit -197.00
-100%
-50%
0%
50%
100%
SessionTrade_Expert
//+-------------------------------------------------------------------------------------+
//|                                                             SessionTrade_Expert.mq4 |
//|                                                                           Scriptong |
//|                                                                   scriptong@mail.ru |
//+-------------------------------------------------------------------------------------+
#property copyright "Scriptong"
#property link      "scriptong@mail.ru"

//---- input parameters
extern double    Lots              = 0.1;
extern int       Delta             = 1;
extern int       AzianFlatStart    = 0;
extern int       AzianFlatEnd      = 8;
extern int       EuropeanFlatStart = 8;
extern int       EuropeanFlatEnd   = 16;
extern int       AmericanFlatStart = 16;
extern int       AmericanFlatEnd   = 24;
extern string    OpenOrderSound    = "ok.wav";
extern int       MagicNumber       = 47589;

bool Activate, FreeMarginAlert, FatalError;
double Tick, Spread, StopLevel, MinLot, MaxLot, LotStep, LastLots, 
       LowV, HighV, SessionLow, SessionHigh;
datetime LastBar, NowDay, LastOpen[3];
int Start[3], Finish[3], CurSession;

//+-------------------------------------------------------------------------------------+
//| expert initialization function                                                      |
//+-------------------------------------------------------------------------------------+
int init()
  {
//----
   Activate = False;
   FatalError = 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 - == Îêîí÷àíèå áëîêà =============================================================
    
// - 3 - === Ïåðåêîìïîíîâêà âðåìåíè ñåññèé â ìàññèâû è ïðîâåðêà êîððåêòíîñòè äàííûõ =====
   if (!ToArray(0, AzianFlatStart, AzianFlatEnd) || 
       !ToArray(1, EuropeanFlatStart, EuropeanFlatEnd) ||
       !ToArray(2, AmericanFlatStart, AmericanFlatEnd))
     return(0);  
// - 3 - === Îêîí÷àíèå áëîêà ============================================================

   ArrayInitialize(LastOpen, 0);

// - 4 - === Âîññòàíîâëåíèå çíà÷åíèé ýëåìåíòîâ ìàññèâà LastOpen =========================
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)    
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))            // ïîèñê â èñòîðèè ñ÷åòà
       if (OrderSymbol() == Symbol() && MathFloor(OrderMagicNumber()/10) == MagicNumber)
         {
          int ID = MathMod(OrderMagicNumber(), 10);
          LastOpen[ID] = MathMax(LastOpen[ID], OrderOpenTime());
         }
         
   for (i = OrdersTotal() - 1; i >= 0; i--)    
     if (OrderSelect(i, SELECT_BY_POS))                         // ïîèñê â îêíå òåðìèíàëà
       if (OrderSymbol() == Symbol() && MathFloor(OrderMagicNumber()/10) == MagicNumber)
         {
          ID = MathMod(OrderMagicNumber(), 10);
          LastOpen[ID] = MathMax(LastOpen[ID], OrderOpenTime());
         }
// - 4 - === Îêîí÷àíèå áëîêà ============================================================

   LastBar = 0;
   Activate = True;
   
//----
   return(0);
  }
//+-------------------------------------------------------------------------------------+
//| expert deinitialization function                                                    |
//+-------------------------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");   
//----
   return(0);
  }

//+-------------------------------------------------------------------------------------+
//| Ïåðåêîìïîíîâêà âõîäíûõ ïàðàìåòðîâ â ìàññèâ                                          |
//+-------------------------------------------------------------------------------------+
bool ToArray(int Num, int St, int End)
{
 if (St < 0 || End < 0 || St > 24 || End > 24 || St >= End)
     {
      Comment("Çíà÷åíèÿ âðåìåíè Start è End äîëæíû ëåæàòü â äèàïàçîíå îò 0 äî 24 è Start < End.");
      Print("Çíà÷åíèÿ âðåìåíè Start è End äîëæíû ëåæàòü â äèàïàçîíå îò 0 äî 24 è Start < End.");
      return(False);
     } 
 int i = Num-1;    
 while (i >= 0)
   {
    if (Start[i] >= St || Finish[i] >= End || Finish[i] > St)
      {
       Comment("Îáíàðóæåíî ïåðåñå÷åíèå ñåññèé. Ñîâåòíèê îòêëþ÷åí.");
       Print("Îáíàðóæåíî ïåðåñå÷åíèå ñåññèé. Ñîâåòíèê îòêëþ÷åí.");
       return(False);
      }
    i--;
   }    
   
 Start[Num] = St;
 Finish[Num] = End;
 return(True);  
}


//+------------------------------------------------------------------------------------+
//| Ïðèâåäåíèå çíà÷åíèé ê òî÷íîñòè îäíîãî òèêà                                         |
//+------------------------------------------------------------------------------------+
double ND(double A)
{
 return(NormalizeDouble(A, Digits));
}  

//+-------------------------------------------------------------------------------------+
//| Ðàñ÷åò ãðàíèö êàíàëà                                                                |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
// - 1 - ==== Åñëè êàíàë íå áóäåò ðàññ÷èòàí, òî âñå çíà÷åíèÿ îñòàíóòñÿ íóëåâûìè =========
 LowV = 0;
 HighV = 0;
 CurSession = -1;
 int DayBar = 0; 
 int k = 0;
// - 1 - ============================= Îêîí÷àíèå áëîêà ==================================

// - 2 - ==== Îïðåäåëåíèå òåêóùåé òîðãîâîé ñåñèèè =======================================
 for (k = 0; k < 3; k++)
   if (Hour() >= Start[k] && Hour() < Finish[k])
     {
      if (k == 0)
        {
         DayBar++;
         int j = 2;
        } 
       else
        j = k - 1; 
// - 2 - ============================= Îêîí÷àíèå áëîêà ==================================

// - 3 - ==== Ðàñ÷åò óðîâíåé ============================================================
      datetime BeginDay = iTime(Symbol(), PERIOD_D1, DayBar);         // Âðåìÿ íà÷àëà äíÿ
      if (!(TimeDayOfWeek(BeginDay) == 5 && k == 0))        // Èñêëþ÷àåì àçèàòñêóþ ñåññèþ
        {                                                                 // ïîíåäåëüíèêà
         // Áàð, ñîîòâåòñòâóþùèé íà÷àëó ïðåäûäóùåé ñåñèè
         int StartBar = iBarShift(Symbol(), 0, BeginDay+Start[j]*3600);
         // Áàð, ñîîòâåòñòâóþùèé îêîí÷àíèþ ïðåäûäóùåé ñåñèè
         int FinishBar = iBarShift(Symbol(), 0, BeginDay+Finish[j]*3600)+1; 
         // Íèæíÿÿ ãðàíèöà
         LowV = Low[iLowest(Symbol(), 0, MODE_LOW, StartBar-FinishBar+1, FinishBar)];
         // Âåðõíÿÿ ãðàíèöà  
         HighV = High[iHighest(Symbol(), 0, MODE_HIGH, StartBar-FinishBar+1, FinishBar)]; 
         // Ìèíèìóì òåêóùåé ñåññèè
         SessionLow =  Low[iLowest(Symbol(), 0, MODE_LOW, FinishBar+1)]; 
         // Ìàêñèìóì òåêóùåé ñåññèè
         SessionHigh = High[iHighest(Symbol(), 0, MODE_HIGH, FinishBar+1)];
        }
      CurSession = k;// íîìåð òåêóùåé ñåññèè (0-àçèàòñêàÿ, 1-åâðîïåéñêàÿ, 2-àìåðèêàíñêàÿ)
      break;
     } 
// - 3 - ============================= Îêîí÷àíèå áëîêà ==================================
}  

//+-------------------------------------------------------------------------------------+
//| Ðàñøèôðîâêà ñîîáùåíèÿ îá îøèáêå                                                     |
//+-------------------------------------------------------------------------------------+
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("çàïðåùåíî ëîêèðîâàíèå."); 
   }
}
  
//+-------------------------------------------------------------------------------------+
//| "Ïðàâèëüíîå" îòêðûòèå ïîçèöèè                                                       |
//|  îòëè÷èå îò OpenOrder ïðîâåðÿåò ñîîòíîøåíèå òåêóùèõ óðîâíåé è óñòàíàâëèâàåìûõ      |
//| Âîçâðàùàåò:                                                                         |
//|   0 - íåò îøèáîê                                                                    |
//|   1 - Îøèáêà îòêðûòèÿ                                                               |
//|   2 - Îøèáêà çíà÷åíèÿ Price                                                         |
//|   3 - Îøèáêà çíà÷åíèÿ SL                                                            |
//|   4 - Îøèáêà çíà÷åíèÿ TP                                                            |
//|   5 - Îøèáêà çíà÷åíèÿ Lot                                                           |
//+-------------------------------------------------------------------------------------+
int OpenOrderCorrect(int Type, double Lot, double Price, double SL, double TP,
                     bool Redefinition = True)
// Redefinition - ïðè True äîîïðåäåëÿòü ïàðàìåòðû äî ìèíèìàëüíî äîïóñòèìûõ
//                ïðè False - âîçâðàùàòü îøèáêó
{
// - 1 - == Ïðîâåðêà äîñòàòî÷íîñòè ñâîáîäíûõ ñðåäñòâ ====================================
 if(AccountFreeMarginCheck(Symbol(), OP_BUY, Lot) <= 0 || GetLastError() == 134) 
  {
   if(!FreeMarginAlert)
    {
     Print("Íåäîñòàòî÷íî ñðåäñòâ äëÿ îòêðûòèÿ ïîçèöèè. Free Margin = ", 
           AccountFreeMargin());
     FreeMarginAlert = True;
    } 
   return(5);  
  }
 FreeMarginAlert = False;  
// - 1 - == Îêîí÷àíèå áëîêà =============================================================

// - 2 - == Êîððåêòèðîâêà çíà÷åíèé Price, SL è TP èëè âîçâðàò îøèáêè ====================   

 RefreshRates();
 switch (Type)
   {
    case OP_BUY: 
                string S = "BUY"; 
                if (MathAbs(Price-Ask)/Point > 3)
                  if (Redefinition) Price = ND(Ask);
                  else              return(2);
                if (ND(TP-Bid) <= StopLevel && TP != 0)
                  if (Redefinition) TP = ND(Bid+StopLevel+Tick);
                  else              return(4);
                if (ND(Bid-SL) <= StopLevel)
                  if (Redefinition) SL = ND(Bid-StopLevel-Tick);
                  else              return(3);
                break;
    case OP_SELL: 
                 S = "SELL"; 
                 if (MathAbs(Price-Bid)/Point > 3)
                   if (Redefinition) Price = ND(Bid);
                   else              return(2);
                 if (ND(Ask-TP) <= StopLevel) 
                   if (Redefinition) TP = ND(Ask-StopLevel-Tick);
                   else              return(4);
                 if (ND(SL-Ask) <= StopLevel && SL != 0)
                   if (Redefinition) SL = ND(Ask+StopLevel+Tick);
                   else              return(3);
                 break;
    case OP_BUYSTOP: 
                    S = "BUYSTOP";
                    if (ND(Price-Ask) <= StopLevel)
                      if (Redefinition) Price = ND(Ask+StopLevel+Tick);
                      else              return(2);
                    if (ND(TP-Price) <= StopLevel && TP != 0)
                      if (Redefinition) TP = ND(Price+StopLevel+Tick);
                      else              return(4);
                    if (ND(Price-SL) <= StopLevel)
                      if (Redefinition) SL = ND(Price-StopLevel-Tick);
                      else              return(3);
                    break;
    case OP_SELLSTOP: 
                     S = "SELLSTOP";
                     if (ND(Bid-Price) <= StopLevel)
                       if (Redefinition) Price = ND(Bid-StopLevel-Tick);
                       else              return(2);
                     if (ND(Price-TP) <= StopLevel)
                       if (Redefinition) TP = ND(Price-StopLevel-Tick);
                       else              return(4);
                     if (ND(SL-Price) <= StopLevel && SL != 0)
                       if (Redefinition) SL = ND(Price+StopLevel+Tick);
                       else              return(3);
                     break;
    case OP_BUYLIMIT: 
                     S = "BUYLIMIT";
                     if (ND(Ask-Price) <= StopLevel)
                      if (Redefinition) Price = ND(Ask-StopLevel-Tick);
                      else              return(2);
                     if (ND(TP-Price) <= StopLevel && TP != 0)
                       if (Redefinition) TP = ND(Price+StopLevel+Tick);
                       else              return(4);
                     if (ND(Price-SL) <= StopLevel)
                       if (Redefinition) SL = ND(Price-StopLevel-Tick);
                       else              return(3);
                     break;
    case OP_SELLLIMIT: 
                     S = "SELLLIMIT";
                     if (ND(Price - Bid) <= StopLevel) 
                       if (Redefinition) Price = ND(Bid+StopLevel+Tick);
                       else              return(2);
                     if (ND(Price-TP) <= StopLevel)
                       if (Redefinition) TP = ND(Price-StopLevel-Tick);
                       else              return(4);
                     if (ND(SL-Price) <= StopLevel && SL != 0)
                       if (Redefinition) SL = ND(Price+StopLevel+Tick);
                       else              return(3);
                     break;
   }
// - 2 - == Îêîí÷àíèå áëîêà =============================================================
 
// - 3 - == Îòêðûòèå îðäåðà ñ îæèäàíèå òîðãîâîãî ïîòîêà =================================   
 if(WaitForTradeContext())  // îæèäàíèå îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà
   {  
    Comment("Îòïðàâëåí çàïðîñ íà îòêðûòèå îðäåðà ", S, " ...");
    datetime Exp = NowDay + Finish[CurSession]*3600;
    if (Exp - TimeCurrent() <= 600)
      Exp = TimeCurrent() + 660;  
    int ticket=OrderSend(Symbol(), Type, Lot, Price, 3, 
               SL, TP, NULL, MagicNumber*10+CurSession, Exp);// îòêðûòèå ïîçèöèè
    // Ïîïûòêà îòêðûòèÿ ïîçèöèè çàâåðøèëàñü íåóäà÷åé
    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(1);
      }
    // ---------------------------------------------
    
    // Óäà÷íîå îòêðûòèå ïîçèöèè   
    Comment("Ïîçèöèÿ ", S, " îòêðûòà óñïåøíî!"); 
    PlaySound(OpenOrderSound); 
    return(0); 
    // ------------------------
   }
  else
   {
    Comment("Âðåìÿ îæèäàíèÿ îñâîáîæäåíèÿ òîðãîâîãî ïîòîêà èñòåêëî!");
    return(1);  
   } 
// - 3 - == Îêîí÷àíèå áëîêà =============================================================  
}

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

//+-------------------------------------------------------------------------------------+
//| Óñòàíîâêà îòëîæåííûõ îðäåðîâ                                                        |
//+-------------------------------------------------------------------------------------+
void DoTransactions()
{
// - 1 - == Óñòàíîâêà îðäåðà Buy Stop ===================================================
 if (LastOpen[CurSession] < NowDay)   // Óñòàíàâëèâàëñÿ ëè îðäåð çà âðåìÿ òåêóùåé ñåññèè?
   if (Close[1] < LowV && Open[1] < LowV)   // Öåíà çàêðåïèëàñü çà íèæíåé ãðàíèöåé êàíàëà
     {
      RefreshRates();
      double Price = ND(LowV + Spread + Delta*Tick);   // Öåíà îòêðûòèÿ Buy Stop - íèæíÿÿ
                                                                        // ãðàíèöà êàíàëà
      double SL = ND(SessionLow - (HighV - LowV) - Tick);            // Ñòîï äëÿ Buy Stop
      double TP = ND(HighV);      // ïðîôèò äëÿ Buy Stop - ïðîòèâîïîëîæíàÿ ãðàíèöà êàíàëà
      if (OpenOrderCorrect(OP_BUYSTOP, Lots, Price, SL, TP, False) == 0)
        LastOpen[CurSession] = TimeCurrent();   // Îðäåð óñïåøíî îòêðûò, çàïèñûâàåì âðåìÿ
       else 
        return;
     }    
// - 1 - === Îêîí÷àíèå áëîêà ============================================================

// - 2 - === Óñòàíîâêà îðäåðà Sell Stop =================================================
 if (LastOpen[CurSession] < NowDay)   // Óñòàíàâëèâàëñÿ ëè îðäåð çà âðåìÿ òåêóùåé ñåññèè?
   if (Close[1] > HighV && Open[1] > HighV)// Öåíà çàêðåïèëàñü çà âåðõíåé ãðàíèöåé êàíàëà
     {
      RefreshRates();
      Price = ND(HighV);              // Öåíà îòêðûòèÿ Sell Stop - âåðõíÿÿ ãðàíèöà êàíàëà
      SL = ND(SessionHigh + (HighV - LowV) + Spread + Tick);        // Ñòîï äëÿ Sell Stop
      TP = ND(LowV + Spread);    // ïðîôèò äëÿ Sell Stop - ïðîòèâîïîëîæíàÿ ãðàíèöà êàíàëà
      if (OpenOrderCorrect(OP_SELLSTOP, Lots, Price, SL, TP, False) == 0)
        LastOpen[CurSession] = TimeCurrent();   // Îðäåð óñïåøíî îòêðûò, çàïèñûâàåì âðåìÿ
       else 
        return;
     }    
// - 2 - === Îêîí÷àíèå áëîêà ============================================================
   
 LastBar = Time[0];                                 // Áîëüøå íà òåêóùåì áàðå íå ðàáîòàåì
}
  
//+-------------------------------------------------------------------------------------+
//| Ôóíêöèÿ 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 - == Îïðåäåëåíèå âðåìåíè íà÷àëà òåêóùåãî äíÿ è ðàñ÷åò óðîâíåé ====================
   NowDay = iTime(Symbol(), PERIOD_D1, 0);
   GetSignal();
// - 4 - === Îêîí÷àíèå áëîêà ============================================================

// - 5 - == Óñòàíîâêà îòëîæåííîãî îðäåðà, åñëè îïðåäåëåíû óðîâíè ========================
   if (LowV != 0 && HighV != 0 && CurSession != -1)
      DoTransactions();
// - 5 - === Îêîí÷àíèå áëîêà ============================================================

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