Announcement

Collapse
No announcement yet.

Leggere l'orario d'uscita di un buffer

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Leggere l'orario d'uscita di un buffer

    Salve a tutti, sono nuovo di queste parti e novellino di mql4.

    Avrei un quesito, con la funzione Time[] possiamo sapere l'orario giusto? Ma come posso leggere un orario di un indicatore o buffer?
    Chiedo questo, perchè sto scrivendo un codice mio e vorrei sapere se tra due punti buffer, posso sapere l'orario in modo da poter fare la differenza dei due valori e conoscere quanti minuti sono trascorsi da un buffere e l'altro.

    Utilizzerei questa formula:
    double A= (Time[1+i] - Time[2+i]) /60; //Minutes between Candle1 and Candle2

    #2
    Di solito per importare i dati di un buffer da un indicatore personalizzato si usa la funzione iCustom().
    Puoi fare la differenza tra 2 valori di tipo datetime.

    Quella formula ovviamente andrà adattata a seconda del caso e di quello che vuoi fare.
    Skype: cadddami

    Comment


      #3
      Grazie per la risposta.

      Con iCustom però non leggo il valore orario giusto? Come dovrei dichiarare il datetime sull'iCustom?

      Comment


        #4
        Non ho capito la domanda...
        Il tipo di dato datetime non è altro che il numero di secondi passati dal 1970.
        Logico che il numero di secondi passati dal 1970 ha poco senso, ma quando lo vai a printare da qualche parte lo puoi convertire in formato orario senza problemi.
        Skype: cadddami

        Comment


          #5
          Grazie per l'aiuto cadddami!

          Sto cercando di "prelevare" gli orari da due livelli di prezzi dati da un buffer con iCustom, dopo di chè sottrarrò i due orari ì dividendoli per 60 per avere la differenza di minuti.
          Il mio problema però, è non riuscire a capire come prelevare i due orari da un livello di prezzo.

          Ho due livelli di ZigZag e volgio sapere tra questi due livelli quanti minuti son pasati.

          Allego scrennshot per farmi capire.

          2ponits.png

          Comment


            #6
            Ora ho capito.
            È semplice... Al posto di importare i prezzi ad un determinato indice (tipo indice 8 della tua immagine), ti salvi solo l'indice.
            Dopodiché con l'indice potrai usare il vettore Time[] per conoscerne l'orario.
            Skype: cadddami

            Comment


              #7
              Dai che piano piano ci arrivo.....

              Il problema che io non so se l'indice 8 è nella candela 8 o 10 di conseguenza non so come salvare l'indice... È proprio questo passaggio che non riesco a capire.

              Ti chiedo scusa per la mia ignoranza in materia, ma questo step è decisamente importante per il mio apprendimento.

              Grazie ancora ​​​.

              Comment


                #8
                Provo a darti una mano facendo un esempio...
                Scrivo una funzione per avere l'orario del primo, secondo, terzo, ecc. valore dello ZigZag.
                Code:
                //+------------------------------------------------------------------+
                //| ZigZag()                                                        |
                //+------------------------------------------------------------------+
                datetime ZigZag(int j)
                  {
                   int k=0;
                   double ZigZag0=0;
                   datetime time=0;
                   
                   for(int i=0;i<500;i++) //Passo in rassegna le ultime 500 candele...
                     {
                      ZigZag0=iCustom(Symbol(),0,"ZigZag",12,6,3,0,i); //Prendo il valore dello ZigZag...
                      
                      if(ZigZag0!=0.0&&k<j) {k++;continue;} //Se il valore dello ZigZag non è quello che mi interessa lo scarto...
                      
                      if(ZigZag0!=0.0&&time==0) {time=Time[i];break;} //Se il valore dello ZigZag è quello che mi interessa, salvo l'orario con l'indice.
                     }
                   return(time);
                  }
                Non ho ricontrollato il codice ed ho scritto ora sul momento (in 2 minuti) questa funzione.
                Quello che fa è prendere l'orario di apertura del valore X dello ZigZag.

                Quindi per la differenza tra il primo valore dello ZigZag e il terzo (come da tua immagine) scriverò (sempre tenendo presente che nella mia funzione il conteggio dei valori dello ZigZag inizia da zero):
                Code:
                int A = (ZigZag(0) - ZigZag(2)) / 60; //Differenza in minuti tra primo valore (attuale) dello ZigZag ed il terzo.
                Tutto il codice che ho postato qui sopra non è stato testato ma dovrebbe comunque esserti utile come esempio di base.
                Skype: cadddami

                Comment


                  #9
                  Grazie mille sei stato gentilissimo, studierò il codice e cercherò di implementarlo al mio attuale!

                  Ti farò sapere...

                  Comment


                    #10
                    Quindi cambiando il numero dello ZigZag posso variare i punti da andare ad analizzare giusto?

                    Esempio:

                    int A = (ZigZag(1) - ZigZag(3)) / 60; //Differenza in minuti tra primo valore (attuale) dello ZigZag ed il terzo.

                    Comment


                      #11
                      Sì, il parametro della funzione che ho scritto io rappresenta il valore dello ZigZag che vuoi prendere (che sarebbero i vertici).
                      Nella funzione che ho scritto io il primo vertice è lo 0, il secondo è 1, il terzo è 2 e così via...
                      Skype: cadddami

                      Comment


                        #12
                        Eccomi qua Damiano...

                        Ho integrato il tuo codice nel mio indicatore "Test" per verificare il funzionamento, però non credo funzioni correttamente, sbaglio sicuramente qualcosa!
                        Dichiarando cosi:

                        int A = (ZigZag(1) - ZigZag(2)) / 60; //Differenza in minuti tra primo valore (attuale) dello ZigZag ed il terzo.

                        E dicendo che A < 23 mi compaiono i pallini se dico che A < 22 i pallini non ci sono, però io ho anche scritto che il pallino dovrebbere essere solo nella candela 1 e non su tutte le candele.

                        Cosa ne pensi?

                        Ecco il codice integrale:

                        Code:
                        //+------------------------------------------------------------------+
                        //| Indicatore: Mio_Test |
                        //+------------------------------------------------------------------+
                        #property copyright ""
                        #property link ""
                        #property version "1.0"
                        #property description ""
                        
                        #include <stdlib.mqh>
                        #include <stderror.mqh>
                        
                        
                        
                        //--- indicator settings
                        #property indicator_chart_window
                        #property indicator_buffers 2
                        
                        #property indicator_type1 DRAW_ARROW
                        #property indicator_width1 1
                        #property indicator_color1 White
                        #property indicator_label1 "Buy"
                        
                        #property indicator_type2 DRAW_ARROW
                        #property indicator_width2 1
                        #property indicator_color2 White
                        #property indicator_label2 "Sell"
                        
                        //--- indicator buffers
                        double Buffer1[];
                        double Buffer2[];
                        
                        extern double DistanzaIcona = 1;
                        extern bool Audible_Alerts = true;
                        datetime time_alert;
                        double myPoint;
                        
                        void myAlert(string type, string message)
                        {
                        if(type == "print")
                        Print(message);
                        else if(type == "error")
                        {
                        Print(type+" | Test @ "+Symbol()+","+Period()+" | "+message);
                        }
                        else if(type == "order")
                        {
                        }
                        else if(type == "modify")
                        {
                        }
                        else if(type == "indicator")
                        {
                        if(Audible_Alerts) Alert(type+" | Test @ | "+Symbol()+","+Period()+" | "+message);
                        }
                        }
                        
                        //+------------------------------------------------------------------+
                        //| ZigZag() |
                        //+------------------------------------------------------------------+
                        datetime ZigZag(int j)
                        {
                        int k=0;
                        double ZigZag0=0;
                        datetime time=0;
                        
                        for(int T=0;T<500;T++) //Passo in rassegna le ultime 500 candele...
                        {
                        ZigZag0=iCustom(Symbol(),0,"ZigZag",12,6,3,0,T); //Prendo il valore dello ZigZag...
                        
                        if(ZigZag0!=0.0&&k<j) {k++;continue;} //Se il valore dello ZigZag non è quello che mi interessa lo scarto...
                        
                        if(ZigZag0!=0.0&&time==0) {time=Time[T];break;} //Se il valore dello ZigZag è quello che mi interessa, salvo l'orario con l'indice.
                        }
                        return(time);
                        }
                        
                        //+------------------------------------------------------------------+
                        //| Custom indicator initialization function |
                        //+------------------------------------------------------------------+
                        int OnInit()
                        {
                        IndicatorBuffers(2);
                        
                        SetIndexBuffer(0, Buffer1);
                        SetIndexBuffer(1, Buffer2);
                        
                        SetIndexEmptyValue(0, 0);
                        SetIndexEmptyValue(1, 0);
                        
                        SetIndexArrow(0, 159);
                        SetIndexArrow(1, 159);
                        
                        //initialize myPoint
                        myPoint = Point();
                        if(Digits() == 5 || Digits() == 4 || Digits() == 3 || Digits() == 2)
                        {
                        myPoint *= 10;
                        }
                        return(INIT_SUCCEEDED);
                        }
                        
                        //+------------------------------------------------------------------+
                        //| Custom indicator iteration function |
                        //+------------------------------------------------------------------+
                        int OnCalculate(const int rates_total,
                        const int prev_calculated,
                        const datetime& time[],
                        const double& open[],
                        const double& high[],
                        const double& low[],
                        const double& close[],
                        const long& tick_volume[],
                        const long& volume[],
                        const int& spread[])
                        {
                        int limit = rates_total - prev_calculated;
                        //--- counting from 0 to rates_total
                        ArraySetAsSeries(Buffer1, true);
                        ArraySetAsSeries(Buffer2, true);
                        //--- initial zero
                        if(prev_calculated < 1)
                        {
                        ArrayInitialize(Buffer1, 0);
                        ArrayInitialize(Buffer2, 0);
                        }
                        else
                        limit++;
                        
                        int A = (ZigZag(1) - ZigZag(2)) / 60; //Differenza in minuti tra primo valore (attuale) dello ZigZag ed il terzo.
                        
                        //--- main loop
                        for(int i = limit-1; i >= 0; i--)
                        {
                        if (i >= MathMin(5000-1, rates_total-1-50)) continue;
                        
                        //Indicator Buffer 1
                        if( A < 23 )
                        {
                        Buffer1[1+i] = High[1+i] + DistanzaIcona * myPoint;
                        if(i == 0 && Time[0] != time_alert) { myAlert("indicator", "Sell"); time_alert = Time[0]; }
                        }
                        
                        //Indicator Buffer 2
                        if(false)
                        {
                        Buffer2[i] = Low[i] - DistanzaIcona * myPoint;
                        if(i == 0 && Time[0] != time_alert) { myAlert("indicator", "Buy"); time_alert = Time[0]; }
                        }
                        }
                        return(rates_total);
                        }
                        //+------------------------------------------------------------------+
                        Last edited by cadddami; 16-10-2016, 11:08. Reason: Aggiunta tag CODE.

                        Comment


                          #13
                          ZigZagTest.jpg Ti allego anche un'immagine di cosa vedo nel grafico:

                          Comment


                            #14
                            Gli errori sono di logica e sono tutti all'interno della OnCalculate().

                            Se la condizione con A < 22 non mette i pallini è sicuramente perché la distanza tra i 2 vertici attualmente è proprio 22 minuti.

                            Se controlli meglio il codice ti accorgerai che non è vero che hai messo il pallino solo sulla candela precedente ma lo hai messo su tutte le candele.
                            Infatti dichiarando A all'esterno del ciclo questa controlla sempre e solo i soliti 2 vertici e poi la condizione A < 23 è sempre verificata su tutte le candele che il ciclo controlla.
                            La mia funzione va bene, la potevi copiare nell'indicatore ma la chiamata alla funzione va adattata, non puoi fare copia-incolla.
                            Non ho il tempo di analizzare più a fondo il tuo codice, ma ricontrolla bene la logica del codice all'interno della OnCalculate() perché i problemi di logica sono tutti lì.

                            Edit:
                            Nell'immagine che hai postato la differenza tra i vertici sono 22 minuti, non 23 (che sono appunto le candele).

                            P.S.
                            Ricorda di usare i tag code per postare il codice altrimenti non ci si capisce nulla se fai solo copia-incolla.
                            Skype: cadddami

                            Comment


                              #15
                              Grazie Damiano sei stato utilissimo, cercherò di adattare meglio il tuo codice facendolo funzionare a dovere, sono un principiante del codice e alcuni concetti non sono chiarissimi per me!
                              Sper di non disturbare, qualora avessi bisogno di qualche altra dritta...

                              Comment

                              Working...
                              X