Validates right candle (0, 1, 2, 3) and then validates wrong 0, (1, 2, 3,4).

 
Hello everyone, I'm trying to develop a pattern robot, it should send the signal at the OPENING of the ZERO candle ( O[0] ).
It is sending correctly on the Zero candle, but on the next candle it sends the pattern again, even though it is a new zero candle and the pattern is already one candle behind:
Detected the pattern:

O[3] O[2] O[1] O[0] OK!

Detected the wrong pattern again:

( O[4] O[3] O[2] O[1] ) O[0] NOT OK!

I put some security mechanisms and to clean the variables, but it is not solving, follow the mechanisms:

if (setalert == 0 && AN_02_a == true && T[0] == tTime && O[0] == precoZero) { 

And here I am cleaning the variables:

O[0]=0; H[0]=0; L[0]=0; C[0]=0;
O[1]=0; H[1]=0; L[1]=0; C[1]=0;
O[2]=0; H[2]=0; L[2]=0; C[2]=0;
O[3]=0; H[3]=0; L[3]=0; C[3]=0;
O[4]=0; H[4]=0; L[4]=0; C[4]=0;
Oz=0;
ticket = 0;
counter = 0;
default = 0;
tTime = 0;
ZeroPrice = 0; 
//+------------------------------------------------------------------+
//|                                                      MNB_EA      |
//|                                      Copyright 2018, SCode       |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
extern int StopLoss = 20;
extern int TakeProfit = 50;
extern double Lots = 0.01;
extern int Slippage = 3;
extern int MagicNumber = 58132134;
extern bool Show_Alert = true;



extern bool AN_02_a = true;
extern bool AN_02_a_Alert = true;
extern color AN_02_a_Color = DarkOrange;


// Adicione uma variável extern para escolher os pares manualmente
extern string PairsToCheck = "EURUSD,EURAUD,EURCAD,EURCHF,EURGBP,EURJPY,EURNZD,GBPAUD,GBPCAD,GBPCHF,GBPJPY,GBPNZD,GBPUSD,NZDCAD,NZDCHF,NZDJPY,NZDUSD,"+
"USDCAD,USDCHF,USDJPY,AUDUSD,AUDCAD,AUDCHF,AUDJPY,AUDNZD,CADCHF,CADJPY,CHFJPY";  // Exemplo de 28 pares de moedas
//,EURAUD,EURCAD,EURCHF,EURGBP,EURJPY,EURNZD,GBPAUD,GBPCAD,GBPCHF,GBPJPY,GBPNZD,GBPUSD,NZDCAD,NZDCHF,NZDJPY,NZDUSD,"+
//"USDCAD,USDCHF,USDJPY,AUDUSD,AUDCAD,AUDCHF,AUDJPY,AUDNZD,CADCHF,CADJPY,CHFJPY";

int Signal;
int SL, TP;
int pipMultiplier = 1;

datetime lastCurrentMinute = 0;

int diaAnterior;

datetime lastTimeM5;
datetime lastTimeM15;
datetime lastTimeM30;
datetime lastTimeH1;
datetime lastTimeH4;
datetime lastTimeD1;
datetime lastTimeW1;
datetime lastTimeMN1;

datetime cTime   = 0;
   
datetime lastCheckTimeM1  = 0;
datetime lastCheckTimeM5  = 0;
datetime lastCheckTimeM15 = 0;
datetime lastCheckTimeM30 = 0;
datetime lastCheckTimeH1  = 0;
datetime lastCheckTimeH4  = 0;
datetime lastCheckTimeD1  = 0;
datetime lastCheckTimeW1  = 0;
datetime lastCheckTimeMN1 = 0;

string symbols[];
double O[4], H[4], L[4], C[4];
datetime T[4];
double Oz = 0; 
datetime Tz =0;
string pattern =0;
int counter=0 , setalert=0;
int ticket = 0;

datetime tTime =0;
double precoZero = 0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {

   ArrayResize(symbols, 0);
   InitializeSymbols();
    
   EventSetTimer(5); // Define o temporizador para executar a cada 60 segundos
   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| Código chamado a cada minuto                                     |
//+------------------------------------------------------------------+
void OnTimer() {

    cTime = TimeCurrent();
    // Aqui você chama a função que deseja executar
    CheckTimeFrames();

//------------------------------------------------------------------------------------------------------------------    

   datetime currentMinute = TimeMinute(cTime);
   int diaAtual = TimeDay(TimeCurrent()); // Dia da data atual
   
string Shift0 = iOpen("USDCAD",PERIOD_H1,0);
string Shift1 = iOpen("USDCAD",PERIOD_H1,1);
string Shift2 = iOpen("USDCAD",PERIOD_H1,2);
string Shift3 = iOpen("USDCAD",PERIOD_H1,3);
string Shift4 = iOpen("USDCAD",PERIOD_H1,4);


Comment("\n","\n","USDCAD",
           "\n","OZ "+Oz,
           "\n","O1 "+O[1],
           "\n","O2 "+O[2],
           "\n","O3 "+O[3],
           "\n","O4 "+O[4],
           "\n",
           "\n","CZ "+C[0],
           "\n","C1 "+C[1],
           "\n","C2 "+C[2],
           "\n","C3 "+C[3],
           "\n","C4 "+C[4],
           "\n",
           "\n","C TIME "+TimeToString(cTime, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","I TIME "+TimeToString(currentMinute, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","LAST TIME 0 "+TimeToString(lastCurrentMinute, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n",
           "\n","lastTimeM5 "+TimeToString(lastCheckTimeM5, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","lastTimeM15 "+TimeToString(lastCheckTimeM15, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","lastTimeM30 "+TimeToString(lastCheckTimeM30, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","lastTimeH1 "+TimeToString(lastCheckTimeH1, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","lastTimeH4  "+TimeToString(lastCheckTimeH4, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","lastTimeD1 "+TimeToString(lastCheckTimeD1, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","lastTimeW1 "+TimeToString(lastCheckTimeW1, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","lastTimeMN1 "+TimeToString(lastCheckTimeMN1, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n",
           "\n","atual m15 "+TimeToString(lastTimeM15, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","novo m15 "+TimeToString(lastCheckTimeM15, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","atual m30 "+TimeToString(lastTimeM30, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
           "\n","novo m30 "+TimeToString(lastCheckTimeM30, TIME_DATE | TIME_MINUTES | TIME_SECONDS));
//------------------------------------------------------------------------------------------------------------------   
return;

}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   EventKillTimer(); // Remove o timer ao desanexar o robô
   ArrayResize(symbols, 0);  // Limpa o array
   ObjectsDeleteAll(0, OBJ_TEXT);  // Exclui todos os textos na janela do gráfico
   return 0;
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   if (Lots <= 0) {
      Lots = AccountFreeMargin() * .0001;
   }
   return 0;
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick() {
  

}

//+------------------------------------------------------------------+
//| Função para verificar os timeframes                              |
//+------------------------------------------------------------------+
void CheckTimeFrames() {

   O[0]=0; H[0]=0; L[0]=0; C[0]=0;
   O[1]=0; H[1]=0; L[1]=0; C[1]=0;
   O[2]=0; H[2]=0; L[2]=0; C[2]=0;
   O[3]=0; H[3]=0; L[3]=0; C[3]=0;
   O[4]=0; H[4]=0; L[4]=0; C[4]=0;
   Oz=0;
   ticket  = 0;
   counter = 0;
   pattern = 0;  
 
     // Verificar cada símbolo para M5 ---------------------------------------------------------------------------------------------------------------------------------
   if (cTime > lastCheckTimeM5) { 
   lastCheckTimeM5 = iTime(Symbol(), PERIOD_M5, 0) + 5 * 60; // Atualizar lastCheckTime para o tempo atual da vela zero 
   Print("******************* TIME M5 *********************** ");
   
      for (int i5 = 0; i5 < ArraySize(symbols); i5++) {   
         tTime = iTime(symbols[i5], PERIOD_M5, 0);
         precoZero = iOpen(symbols[i5], PERIOD_M5, 0);
         setalert = 0;  
         ValidatePattern(symbols[i5], PERIOD_M5); 
      }        
      // Print("Futuro M5: " + " - "+ TimeToString(lastCheckTimeM5, TIME_DATE | TIME_MINUTES | TIME_SECONDS));
    }

             
  //return;   
}

// Inicializa o array de símbolos ----------------------------------------------------------------------------------------------------
void InitializeSymbols() {

  ArrayResize(symbols, 0); // Limpa o array antes de inicializar   
 int numSymbols = StringSplit(PairsToCheck, ',', symbols);
   ArrayResize(symbols, numSymbols);
     
     // Inicializa uma string para armazenar os símbolos
string symbolsProcessed = "";
// Verificar se a função está realmente processando apenas os pares do array `symbols`
for (int i = 0; i < ArraySize(symbols); i++) {
   // Adiciona o símbolo atual à variável, separado por vírgula
   symbolsProcessed += symbols[i];
   if (i < ArraySize(symbols) - 1) {
      symbolsProcessed += ", "; // Adiciona uma vírgula e espaço se não for o último símbolo
   }
}

// Imprime todos os símbolos em uma linha
Print("S Initialize: ", symbolsProcessed);
}
//----------------------------------------------------------------------------------------------------
void BuyFunction(string symboll,double bidPrice,double point,double askPrice){
   ticket = OrderSend(symboll, OP_BUY, Lots, Ask, Slippage, bidPrice - StopLoss * point, askPrice + TakeProfit * point, "Bullish Hammer", MagicNumber, 0, Green);
if(ticket<0)
     {
      Print("OrderSend failed with error #",GetLastError());
     }
   else
      Print("OrderSend placed successfully");
      return;
}
//----------------------------------------------------------------------------------------------------
void SellFunction(string symboll,double bidPrice,double point,double askPrice){
  ticket = OrderSend(symboll, OP_SELL, Lots, Bid, Slippage, bidPrice + StopLoss * point, askPrice - TakeProfit * point, "Bullish Hammer", MagicNumber, 0, Green);
if(ticket<0)
     {
      Print("OrderSend failed with error #",GetLastError());
     }
   else
      Print("OrderSend placed successfully");
      return;
}
//----------------------------------------------------------------------------------------------------
void AlertS (string Parttnner){

   if (setalert == 1 && counter == 0) {
         Alert(Parttnner);
         Print(Parttnner);         
         pattern = 0;

         
   O[0]=0; H[0]=0; L[0]=0; C[0]=0;
   O[1]=0; H[1]=0; L[1]=0; C[1]=0;
   O[2]=0; H[2]=0; L[2]=0; C[2]=0;
   O[3]=0; H[3]=0; L[3]=0; C[3]=0;
   O[4]=0; H[4]=0; L[4]=0; C[4]=0;
   Oz=0;

   ticket  = 0;
   counter = 0;
   pattern = 0; 
   tTime   = 0; 
   precoZero  = 0; 
        // counter = 1;
      }
      return;
}
//----------------------------------------------------------------------------------------------------
void ValidatePattern(string symboll, int timeFrame) {

   O[0]=0; H[0]=0; L[0]=0; C[0]=0;
   O[1]=0; H[1]=0; L[1]=0; C[1]=0;
   O[2]=0; H[2]=0; L[2]=0; C[2]=0;
   O[3]=0; H[3]=0; L[3]=0; C[3]=0;
   O[4]=0; H[4]=0; L[4]=0; C[4]=0;
   Oz=0;
   ticket  = 0;
   counter = 0;
   pattern = 0;    
    // Convertendo o número do time frame para uma string legível
    string timeFrameName;
    switch (timeFrame) {
        case 1:    timeFrameName = "M1";  break;
        case 5:    timeFrameName = "M5";  break;
        case 15:   timeFrameName = "M15"; break;
        case 30:   timeFrameName = "M30"; break;
        case 60:   timeFrameName = "H1";  break;
        case 240:  timeFrameName = "H4";  break;
        case 1440: timeFrameName = "D1";  break;
        case 10080:timeFrameName = "W1";  break;
        case 43200:timeFrameName = "MN";  break;
        default:   timeFrameName = "Unknown"; break;
    }
    
 
   // Armazenar valores da vela zero 
  // Oz = iOpen(symboll, timeFrame, 0); 
   //Print("Abertura da vela zero (Oz): ", Oz);
   
  // Tz = iTime(symboll, timeFrame, 0); // Armazenar o tempo de abertura da vela zero 
    
    double askPrice, bidPrice, point = 0;

    for (int shift = 0; shift <= 3; shift++) { 
    O[shift   ] = iOpen(symboll, timeFrame, shift); 
    H[shift   ] = iHigh(symboll, timeFrame, shift); 
    L[shift   ] = iLow(symboll, timeFrame, shift); 
    C[shift   ] = iClose(symboll, timeFrame, shift);
    T[shift   ] = iTime(symboll, timeFrame, shift); // Armazenar o tempo de abertura da vela
    
    askPrice = MarketInfo(symboll, MODE_ASK);
    bidPrice = MarketInfo(symboll, MODE_BID);
    
    if (MarketInfo(symboll, MODE_DIGITS) == 3 || MarketInfo(symboll, MODE_DIGITS) == 5) {
        pipMultiplier = 10;
    } else {
        pipMultiplier = 1;
    }

    point = MarketInfo(symboll, MODE_POINT) * pipMultiplier;
   
  //  Print("Verificando o par: ", symboll, " T: ",timeFrameName, " S: ",shift);

    // Verificar padrão AN02 A
    if ( (O[0] <= C[1]) ){
    //Print("Padrão SELL detectado na condição ZERO : "+ symboll+" Oz: "+Oz+" C1: "+C[1]);
    if ( (O[1] > C[1]) && (C[2] > O[2]) && (C[3] < O[3]) ) {
    Print("Padrão SELL detectado na condição principal: "+ symboll);
        if ((O[1] > C[2]) && (C[1] > O[2]) && (L[1] > L[2]) && (C[1] < C[2])) {
        Print("Padrão SELL detectado na condição secundária: "+ symboll);
           
                        pattern = "T : "+symboll+" - SELL - "+timeFrameName+" - "+TimeToString(iTime(symboll, timeFrame, 1)) + " - T servidor "+TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS)+" Oz: "+O[0]+" C1: "+C[1];
                        
                        
                    if ( setalert == 0 && AN_02_a == true && T[0] == tTime && O[0] == precoZero) {
                        setalert = 1;
                        // Comprar quando detectar o padrão && T[0] <  tTime      && shift == 3
                        SellFunction(symboll,bidPrice,point,askPrice);
                        AlertS (pattern);
                     }
                }
            }
        }
 

    // Verificar padrão Bullish Engulfing
    if( (O[0] >= C[1]) ){
    //Print("Padrão BUY detectado na condição ZERO : "+ symboll+" Oz: "+Oz+" C1: "+C[1]);
    if (  (O[1] < C[1]) && (C[2] < O[2]) && (C[3] > O[3]) ) {
    Print("Padrão BUY detectado na condição principal: "+ symboll);
        if ((O[1] < C[2]) && (C[1] < O[2]) && (H[1] < H[2]) && (C[1] > C[2])) {
        Print("Padrão BUY detectado na condição secundária: "+ symboll);

                        pattern = "T : "+symboll+" - BUY - "+timeFrameName+" - "+TimeToString(iTime(symboll,timeFrame, 1))+ " - T servidor "+TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS)+" Oz: "+O[0]+" C1: "+C[1];
                        
                        
                    if ( setalert == 0 && AN_02_a == true && T[0] == tTime && O[0] == precoZero ) {
                        setalert = 1;                        
                        // Comprar quando detectar o padrão && T[0] <  tTime   && shift == 3
                        BuyFunction(symboll,bidPrice,point,askPrice);
                        AlertS (pattern);
                    }
                   
                }
            }
        }
     
     }  
    Print("Verificando o par: ", symboll, " T: ",timeFrameName, " S: ",shift);
return;

}
//+------------------------------------------------------------------+
 
Oleksandr Medviediev #:
Hello, thank you for reaching out. This forum primarily operates in English, so it would be appreciated if you could kindly translate your message to English for everyone's understanding and participation. We value diversity and respect for all members here. Thank you for your cooperation. 

I'm sorry, it's in English, I hope it's understandable, I used Google translate.

 

It keeps repeating the pattern at the opening of the next candle, even though the pattern is valid on candle 1 2 3 4.


 

NOTE-1: Traders and coders are working for free:

  • if it is interesting for them personally, or
  • if it is interesting for many members on this forum.

Freelance section of the forum should be used in most of the cases.

NOTE-2:  Certain parts of your code (such as repeated initialization of arrays ( O[0]=0; H[0]=0; ) seem inefficient and unnecessary. 

Trading applications for MetaTrader 5 to order
Trading applications for MetaTrader 5 to order
  • 2024.12.05
  • www.mql5.com
The largest freelance service with MQL5 application developers