Announcement

Collapse
No announcement yet.

Leggere l'orario d'uscita di un buffer

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

    #16
    Cio Damiano,

    abbi pazienza non mi mandare a quel paese.....non riesco proprio a capire dove sbaglio, perchè il codice non mi da nessun errore da poter analizzare e correggere e con la mia epserienza non ne vengo fuori.

    Un aiutino a tempo perso....

    Grazie!!!

    Comment


      #17
      Ho riletto ora i post che ho scritto e sembrano serissimi.:42.rofl_80_anim_gif

      Ricorda che il compilatore ti segnala solo gli errori di sintassi, mai gli errori di logica.
      Questo significa che se il compilatore non ti segnala nessun errore, non è scontato che il codice sia giusto.

      Correggo la parte di codice che non andava bene nell'indicatore che hai postato.
      Spero così di farti capire bene cosa c'era che non andava.
      Per prima cosa, come avevo detto, c'è da adattare il mio esempio di funzione al tuo codice (tu avevi fatto solo copia-incolla):
      Code:
      /+------------------------------------------------------------------+
      //| ZigZag()                                                         |
      //+------------------------------------------------------------------+
      datetime ZigZag(int y,int j)
        {
         int k=0;
         double ZigZag0=0;
         datetime time=0;
        
         for(int i=y;i<y+50;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);
        }
      In blu le modifiche che ho apportato.
      Come puoi vedere ho aggiunto un parametro perché ho visto che nel tuo indicatore tu passi in rassegna anche tutte le candele nel passato.
      Di conseguenza noi dobbiamo adattare la funzione e fare in modo che lavori anche con gli indici del passato (che appunto specificheremo nel parametro).
      Nel mio esempio la funzione lavorava solo con i vertici del presente.

      Passiamo poi alla OnCalculate().
      Qui ho effettuato un paio di modifiche (che vedi in verde e arancione):
      Code:
      //+------------------------------------------------------------------+
      //| 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) limit=MathMin(5000-1, rates_total-1-50);
      {
      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;
      
      int A = (ZigZag(i,1) - ZigZag(i,2)) / 60;
      
      //Indicator Buffer 1
      if( A < 23 && Buffer1[iBarShift(Symbol(),0,ZigZag(i,0),true)+1] == EMPTY_VALUE )
      {
      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);
      }
      //+------------------------------------------------------------------+
      In rosso tutto il codice che devi eliminare.
      Infatti buona parte del codice che ho evidenziato è inutile.
      ArraySetAsSeries(true) serve per impostare i vettori come serie ma è inutile perché i buffer sono di default già tutti impostati come serie.
      In un vettore normale gli indici vanno da sinistra a destra mentre impostandolo come serie questi vanno da destra verso sinistra.
      ArrayInitialize(0) serve per riempire tutti gli indici di un vettore con il vuoto ed è inutile perché di default i buffer sono già vuoti.
      Il controllo con MathMin() l'ho solo spostato fuori dal ciclo così crea meno confusione.

      In verde tutto il codice che ho aggiunto.
      Come puoi vedere ho adattato la chiamata alla funzione dello ZigZag.

      In arancione il filtro per mettere un solo pallino sulla candela precedente al vertice 0 dello ZigZag e non uno ogni candela come prima.
      Tu non avevi messo nessun filtro quindi come potevi affermare che il pallino veniva messo solo sulla candela precedente?
      Il filtro che ho inserito io non tiene conto del repaint dello ZigZag.
      Quindi se il vertice 0 dello ZigZag fa repaint, il pallino viene rimesso.
      Se non vuoi che ciò accada devi modificare il filtro come meglio ritieni opportuno.

      Attualmente il filtro (come puoi vedere) utilizza la iBarShift() per prendere l'indice dell'ultimo vertice.
      Dopodiché controlla e se non è stato messo ancora nessun pallino (Buffer1 vuoto) allora lo mette.

      Spero di esserti stato d'aiuto.:01.smile_80_anim_gi
      Skype: cadddami

      Comment


        #18
        Cavolo che lezione, grazie infinite!

        Studierò attentamente questa correzione che hai fatto, in modo da capirla a fondo per non commettere più questi errori, purtroppo sono un neofita della programmazione e a volte mi perdo nel nulla!
        Grazie ancora sei stato gentilissimo!!!!!

        Comment


          #19
          Ciao Damiamo, stro cercando di studiare e integrare il tuo codice nei miei, però con le nuove modifiche, ricevo l'errore "redefinition of formal parameter 'k".

          Come potrei fare?

          Comment


            #20
            L'errore è molto banale e mi è sfuggito perché ho scritto il codice qui senza farlo passare per il compilatore.
            Il compilatore ti sta dicendo che la variabile K oltre che come parametro è stata dichiarata all'interno della funzione.
            Basta rinominare la variabile.
            Ho corretto la funzione nel mio precedente post rinominando la variabili in Y.
            Skype: cadddami

            Comment

            Working...
            X