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.
I need help, a light, a blessed soul to brighten the dark path of trading.
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.
I need help, a light, a blessed soul to brighten the dark path of trading.
Inserted Code
//+------------------------------------------------------------------+ //| MNB_EA | //| Copyright 2018, SCode | //| [url="https://www.mql5.com/go?link=https://www.registryrocket.com/default.aspx?ec=RO9VOIRYMMGBNA6LDK6GVNL9T"]http://www.companyname.net[/url] | //+------------------------------------------------------------------+ 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; } //+------------------------------------------------------------------+