MQL5 Trovare valori di una candela in un array

 

Ciao Al gruppo

 Ho iniziato da poco a studiare MQL5 e mi sono trovato a dover risolvere un quesito credo semplice per chi è più avanti.

Ho un periodo durante la giornata definibile dagli input.

Controllo se sono nel periodo o se il periodo è passato ma sono ancora nel giorno.

Aggiungo in un array con CopyRates i dati delle candele e cerco il valore più alto.

La cosa strana è che quando apro il grafico da Debug mi mostra nei Print prima i valori del H1 e passando a M1 variano anche se

le Candele che vado a memorizzare sono tutte a M1. 

Aggiungo iI  codice 


input int   OraInizio    =  4;
input int   MinutiInizio =  0;
input int   OraFine      =  7;
input int   MinutiFine   =  0;
int         OraCheck;      
datetime    OraAttuale;
long        DaInizioGiorno;

int OnInit()
  {
    ChartSetSymbolPeriod(0,NULL,PERIOD_M1);
    
   Elabora();
 
   return(INIT_SUCCEEDED);
  }


void Elabora() {


    OraAttuale = TimeLocal();
    DaInizioGiorno = (OraAttuale%86400)/60;
     
    int OraStart=60*OraInizio+MinutiInizio;
    int OraStop =60*OraFine  +MinutiFine  ;
  
      if ( DaInizioGiorno >= OraStop ) { 
         OraCheck = OraStop ;
         Comment(" Periodo attivo giá passato " ); 
      }
      if ( DaInizioGiorno > OraStart && DaInizioGiorno < OraStop ) {
         OraCheck = OraAttuale;
         Comment(" Periodo attivo " );
      }
      if ( DaInizioGiorno < OraStart) {
         Comment(" Periodo non ancora attivo " );
      }
     
   MqlRates rates[]; 
   int copied = CopyRates(NULL,PERIOD_M1,OraStart,( OraCheck - OraStart ) ,rates);   // Calcola le candele nel periodo se ancora non completato
                                                                                     // calcola sino all-ultima disponibile  
   if(copied<=0) {
      Print("Errore nella copia dei dati dei prezzi ",GetLastError()); 
   } else { 
      Print("Copiate ",ArraySize(rates)," barre");          
   }    
   
   int      hBar = iHighest(NULL,0,MODE_HIGH,ArraySize(rates));   // Candela con valore Highest del periodo
   double   HhBar = rates[hBar].high;                             // Valore Candela hBar
   int      HBarDaInizio = OraStart + hBar;                       // Candela hBar conteggiata da inizio giorno
   
  Print("InizioGiorno: "    + DaInizioGiorno ); 
  Print("OraCheck    : "    + OraCheck );
  Print("HBarDaInizio: "    + HBarDaInizio );
  Print("HhBar       : "    + HhBar );          
  Print("hBar        : "    + hBar );  
 
}  

 Quello che vorrei ottenere è sapere il valore massimo del periodo e quale candela l'ha generato.


Grazie a chi mi potrà dare un suggerimento

Custom Graphical Controls. Part 1: Creating a Simple Control
Custom Graphical Controls. Part 1: Creating a Simple Control
  • www.mql5.com
This article covers general principles of development of graphical controls. We are going to prepare tools for a quick and convenient work with graphical objects, analyze an example of creation of a simple control for entering text or numeric data as well as the ways of using it.
 
RedTaurus:

Ciao Al gruppo

 Ho iniziato da poco a studiare MQL5 e mi sono trovato a dover risolvere un quesito credo semplice per chi è più avanti.

Ho un periodo durante la giornata definibile dagli input.

Controllo se sono nel periodo o se il periodo è passato ma sono ancora nel giorno.

Aggiungo in un array con CopyRates i dati delle candele e cerco il valore più alto.

La cosa strana è che quando apro il grafico da Debug mi mostra nei Print prima i valori del H1 e passando a M1 variano anche se

le Candele che vado a memorizzare sono tutte a M1. 

Aggiungo iI  codice 


 Quello che vorrei ottenere è sapere il valore massimo del periodo e quale candela l'ha generato.


Grazie a chi mi potrà dare un suggerimento

Modifica così questa riga

int      hBar = iHighest(NULL,PERIOD_M1,MODE_HIGH,ArraySize(rates),0);   // Candela con valore Highest del periodo
 
Michele Catanzaro #:

Modifica così questa riga

Grazie Michele, non mi ero reso conto che mettendo 0 cambiava i valori in base al Time Frame del grafico.

Ora devo capire come "visualizzare" qual è la candela interessata sul grafico magari evidenziandola con una freccia o similari.


Ho provato aggiungendo 

// Evidenziare Candela con valore hHighest su grafico 
ObjectCreate( 0 , "XX",OBJ_ARROW_CHECK,0,0,HhBar );
ObjectSetInteger(0,"XX",OBJPROP_COLOR,clrYellow);
 ObjectSetInteger(0,"XX",OBJPROP_ARROWCODE,135);

// Disegnare linea orizzontale sul livello hHigest su grafico
ObjectCreate( 0 , "Highest", OBJ_HLINE,0,0,HhBar);
ObjectSetInteger(0 , "Highest",OBJPROP_WIDTH,3);


ma il risultato non è stato quello sperato, non viene visualizzata nessuna candela e la linea orizzontale è su un valore che non capisco da dove provenga.

 
RedTaurus #:

Grazie Michele, non mi ero reso conto che mettendo 0 cambiava i valori in base al Time Frame del grafico.

Ora devo capire come "visualizzare" qual è la candela interessata sul grafico magari evidenziandola con una freccia o similari.


Ho provato aggiungendo 


ma il risultato non è stato quello sperato, non viene visualizzata nessuna candela e la linea orizzontale è su un valore che non capisco da dove provenga.

Fai così per il segno di spunta:

datetime date = rates[hBar].time;
  // Evidenziare Candela con valore hHighest su grafico 
ObjectCreate( 0 , "XX",OBJ_ARROW_CHECK,0,date,HhBar);
ObjectSetInteger(0,"XX",OBJPROP_ANCHOR,ANCHOR_BOTTOM);
ObjectSetInteger(0,"XX",OBJPROP_COLOR,clrYellow);
ObjectSetInteger(0,"XX",OBJPROP_ARROWCODE,135);

Per la linea è simile.

 
Michele Catanzaro #:

Fai così per il segno di spunta:

Per la linea è simile.

Ciao Michele, Grazie per il supporto.

Ho provato , ho aggiunto le righe da te proposte, ma ottengo che mi viene segnalata con il baffetto una candela delle 12.45   mentre il rande era dalle 2.00 alle 4.00 

Dove sbaglio?? 

 
RedTaurus #:

Ciao Michele, Grazie per il supporto.

Ho provato , ho aggiunto le righe da te proposte, ma ottengo che mi viene segnalata con il baffetto una candela delle 12.45   mentre il rande era dalle 2.00 alle 4.00 

Dove sbaglio?? 

Probabile che sia la gestione dell'ora o del numero delle candele impostato,onde perdere tempo nel cercare dove sia l'errore nel tuo caso, ti posto un codice direttamente che dovrebbe funzionare:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

string   OraInizio="04:00";
string   OraFine="17:55";
datetime starthour,endhour,OraAttuale;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   starthour=StringToTime(OraInizio);
   endhour=StringToTime(OraFine);

   ChartSetSymbolPeriod(0,NULL,PERIOD_M1);

   if(Elabora() == true)
     {
      int n = Bars(Symbol(),PERIOD_M1,OraAttuale,starthour); //Calcolo il numero di candele da conteggiare
      Print("Il numero di barre da conteggiare sono:",n+1);
      MqlRates rates[];
      ArraySetAsSeries(rates,true);
      int copied = CopyRates(Symbol(),PERIOD_M1,0,n,rates);   // Calcola le candele nel periodo se ancora non completato
      // calcola sino all-ultima disponibile
      if(copied<=0)
        {
         Print("Errore nella copia dei dati dei prezzi ",GetLastError());
        }
      else
        {
         Print("Copiate ",ArraySize(rates)+1," barre");
        }

      int      hBar = iHighest(NULL,PERIOD_M1,MODE_HIGH,ArraySize(rates),0);   // Candela con valore Highest del periodo
      double   HhBar = rates[hBar].high;                             // Valore Candela hBar

      Print("hBar        : "    + hBar);
      Print("HhBar       : "    + HhBar);
      datetime date = rates[hBar].time;
      // Evidenziare Candela con valore hHighest su grafico
      ObjectCreate(0, "XX",OBJ_ARROW_CHECK,0,date,HhBar);
      ObjectSetInteger(0,"XX",OBJPROP_ANCHOR,ANCHOR_BOTTOM);
      ObjectSetInteger(0,"XX",OBJPROP_COLOR,clrYellow);
      ObjectSetInteger(0,"XX",OBJPROP_ARROWCODE,135);

     }


  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Elabora()
  {


   OraAttuale = TimeLocal();
   if(OraAttuale > starthour && OraAttuale < endhour)
     {
      Print("Orario Operativo");
      return true;
     }
   else
     {
      Print("Orario non Operativo");
      return false;
     }

  }

 
Michele Catanzaro #:

Probabile che sia la gestione dell'ora o del numero delle candele impostato,onde perdere tempo nel cercare dove sia l'errore nel tuo caso, ti posto un codice direttamente che dovrebbe funzionare:

Grazie Michele, mi studio il listato... poichè provato non funziona, ma prenderò spunto.

 
RedTaurus #:

Grazie Michele, mi studio il listato... poichè provato non funziona, ma prenderò spunto.

Cosa non funziona RedTaurus? 
 
Michele Catanzaro #:
Cosa non funziona RedTaurus? 

Ciao Michele .. Leggo solo ora ... 


Non ho sotto mano quel listato, poichè ho poi cambiato un pò tutto .. e riscritto buona parte.

Ho utilizzato i tuoi spunti.

Grz