Back to the index page  
  FAQ   Cerca   Lista utenti   Gruppi   Registrati   Profilo   Messaggi privati   Log in 
MQL: Capire il codice: IndicatorCounted(), Bars metatrader 4

 
Nuovo argomento   Rispondi    Indice del forum » Metatrader - Expert Advisor - MQL Precedente :: Successivo  
Ads
 Inviato: Mar Dic 12, 2017 4:47 pm  
Messaggio
  Ads




MQL: Capire il codice: IndicatorCounted(), Bars metatrader 4
 MessaggioInviato: Gio Nov 08, 2007 10:28 pm Rispondi citando  
Messaggio
  speranzoso
Aspirante Trader
Aspirante Trader

Registrato: 18/10/07 14:03
Messaggi: 61

Sperando di essere nella sezione giusta.

Gentilmente qualcuno mi spiega passo passo il pezzo di codice qui sotto?

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.


Ho tolto i code perchè sparivano parti di stringa meglio una immagine

Mi pare di aver capito sia un controllo per eventuali errori del calcolo di IndicatorCounted() ma non ho capito cosa faccia esattamente questa istruzione e che differenza ci sia da Bars .
Complimenti per la sezione a mio avviso ci sarebbe un mucchio da scrivere sopratutto se c'è qualcuno come Carlo10 che ti spiega per benino le cose.
Un saluto

_________________
Mauro
Profilo Invia messaggio privato
MQL: calcolo delle barre negli indicatori di metatrader
 MessaggioInviato: Ven Nov 09, 2007 10:44 am Rispondi citando  
Messaggio
  carlo10
Site Admin
Site Admin

Registrato: 29/04/06 16:19
Messaggi: 5577
Residenza: Padova

speranzoso ha scritto:
Sperando di essere nella sezione giusta.

Gentilmente qualcuno mi spiega passo passo il pezzo di codice qui sotto?

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.


Ho tolto i code perchè sparivano parti di stringa metterò una immagine

Mi pare di aver capito sia un controllo per eventuali errori del calcolo di IndicatorCounted() ma non ho capito cosa faccia esattamente questa istruzione e che differenza ci sia da Bars .
Complimenti per la sezione a mio avviso ci sarebbe un mucchio da scrivere sopratutto se c'è qualcuno come Carlo10 che ti spiega per benino le cose.
Un saluto


grazie dei complimenti, io non sono un guru di mql ma ho delle conoscenze di programmazione che mi consentono di sapermi muovere anche in questo linguaggio che devo ancora approfondire per bene. Piacerebbe anche a me che la sezione si sviluppasse, speriamo col tempo!!

Andiamo ad analizzare passo passo il codice postato:

Codice:
int counted_bars=IndicatorCounted();


dal metaeditor trovo questa spiegazione:

metaeditor ha scritto:
int IndicatorCounted( )
The function returns the amount of bars not changed after the indicator had been launched last. The most calculated bars do not need any recalculation. In most cases, same count of index values do not need for recalculation. The function is used to optimize calculating.

Note: The latest bar is not considered to be calculated and, in the most cases, it is necessary to recalculate only this bar. However, there occur some boundary cases where custom indicator is called from the expert at the first tick of the new bar. It is possible that the last tick of the previous bar had not been processed (because the last-but-one tick was being processed when this last tick came), the custom indicator was not called and it was not calculated because of this. To avoid indicator calculation errors in such situations, the IndicatorCounted() function returns the count of bars minus one.


effettivamente la spiegazione non è chiarissima.

La mia interpretazione è che la funzione restituisce il numero barre che erano già presenti l'ultima volta che l'indicatore (e quindi la funzione IndicatorCounted()) ha smesso di andare in esecuzione. La funzione si serve di un indice interno per ottimizzare al massimo il tempo di esecuzione e tenere in memoria il numero di barre già contate.

La nota riguarda la più recente barra tra quelle già contate, in parole povere è necessario diminuire il valore restituito di una barra per poterla ricalcolare dato che per qualche possibile errore durante la chiamata alla funzione questa barra può essere saltata.

A cosa può servire una funzione del genere? A migliorare le performance degli indicatori, utilizzando questa funzione una volta chiuso e riaperto metatrader (ma anche quando resta aperto) l'indicatore non viene ricalcolato dall'inizio del grafico ma solo per le barre nuove.

Continuiamo quindi con il codice:

Codice:
if(counted_bars<0) return(-1);


Quando la funzione viene chiamata in modo sbagliato (ad esempio all'interno di uno script) o a causa di altri errori (conessione?) restituisce un valore negativo. Questo è sicuramente un valido motivo per uscire dal programma prima di combinare guai restituendo errore (return -1Wink.

Codice:
if(counted_bars>0) counted_bars--;


Questa è la nota che si trova sul metaeditor, si diminuisce il valore restituito di 1 in modo da riprendere in considerazione anche l'ultima barra già calcolata.

Codice:
limit=Bars-counted_bars;


se ti stavi chiedendo il perchè di tutto questo [CENSORED] in questa semplice riga c'è la spiegazione di tutto.

salviamo nella variabile intera limit il numero di barre che non sono state ancora prese in considerazione nell'ultima volta che è stato lanciato l'indicatore.

Bars= numero di barre totali del grafico, da quella attuale [0], alla prima in assoluto disegnata sul grafico.

counted_bars= numero di barre già prese in considerazione nell'ultima esecuzione dell'indicatore (IndicatorCounted()).

L'indicatore verrà quindi ricalcolato solo per il numero di barre contato da limits e non dall'inizio, ecco una possibile esecuzione:

Codice:
for(int i=0; i<limit; i++)
       {
        //---- ma_shift set to 0 because SetIndexShift called abowe
        ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
       }


Mi rendo conto che il meccanismo può risultare complesso ma non bisogna spaventarsi, dopo averlo capito e utilizzato più volte diventa automatico inoltre c'è sempre a disposizione la documentazione e l'esempio sul metaeditor.
Profilo Invia messaggio privato Invia e-mail HomePage
MQL: quale barra sta calcolando?
 MessaggioInviato: Ven Nov 09, 2007 7:15 pm Rispondi citando  
Messaggio
  speranzoso
Aspirante Trader
Aspirante Trader

Registrato: 18/10/07 14:03
Messaggi: 61

Grande Carlo, è cosi che mi piace e si deve sentire la spiegazione di un codice.
Allora se ho capito bene il ricalcolo è dovuto semplicemente dal fatto che MT è un programma i cui dati restano nel web e non vengono memorizzati nell'harddisk per cui ogni volta che ti colleghi riparte dal punto in cui l'hai lasciato e per sveltezza di calcolo opera in questo modo,mentre resti collegato aggiorna solo l'ultima barra.
ora se riesco ad inserire il codice senza errori dovresti dirmi ancora una cosa
Codice:
 
for(i = limit; i >= 0; i--) {
      cciTrendNow = iCCI(NULL, 0, 50, PRICE_TYPICAL, i);
      cciTrendPrevious = iCCI(NULL, 0, 50, PRICE_TYPICAL, i+1);
     
      //st = st * 100;
     
     
      counter = i;
      Range = 0;
      AvgRange = 0;
      for (counter = i; counter >= i-9; counter--) {
         AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);
      }
      Range = AvgRange/10;
      if (cciTrendNow >= st && cciTrendPrevious < st) {
         TrendUp[i+1] = TrendDown[i+1];
      }
     
      if (cciTrendNow <st> st) {
         TrendDown[i+1] = TrendUp[i+1];
      }
     
      if (cciTrendNow >= st) {
         TrendUp[i] = Low[i] - iATR(NULL, 0, 5, i);         
         if (TrendUp[i] < TrendUp[i+1]) {
            TrendUp[i] = TrendUp[i+1];
         }
      }
      else if (cciTrendNow <st> TrendDown[i+1]) {
            TrendDown[i] = TrendDown[i+1];
         }
      }
   }
         
//----
   
//----
   return(0);

Essendo collegati in continuo qual'è il valore attuale di " i " ?
Non riesco a capire se è uguale alla barra corrente, a tot barre precedenti o cosa?
Perchè quando dice
Codice:
for (counter = i; counter >= i-9; counter--)


cosa vuole ottenere? counter sempre uguale a 10? in modo di fare riferimento alle ultime 10 barre?

Spero di essermi fatto capire in quanto quando chiedo ho la tendenza a complicarmi la vita,un grazie per la tua pazienza.
Un saluto Mauro
P.S.
Se alcune cose vengono spiegate nell'help di MT e io ti chiedo lo stesso è perchè io e l'inglese abbiamo un pessimo rapporto. Sad

_________________
Mauro
Profilo Invia messaggio privato
 MessaggioInviato: Ven Nov 09, 2007 7:23 pm Rispondi citando  
Messaggio
  speranzoso
Aspirante Trader
Aspirante Trader

Registrato: 18/10/07 14:03
Messaggi: 61

Ma porca miseria,ma come mai se copio incollo del codice fra i tag si mangia parte del codice?
Aggiungo che in anteprima non me lo fà,qualche impostazione da fare che non sò?
Non so come si allega questo è il link dell'indicatore cosi lo leggi in modo corretto(ma poi sicuramente ce l'hai è supertrend)
Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.


_________________
Mauro
Profilo Invia messaggio privato
MQL: ricalcolo dell'ultima barra
 MessaggioInviato: Sab Nov 10, 2007 12:21 pm Rispondi citando  
Messaggio
  carlo10
Site Admin
Site Admin

Registrato: 29/04/06 16:19
Messaggi: 5577
Residenza: Padova

speranzoso ha scritto:
Allora se ho capito bene il ricalcolo è dovuto semplicemente dal fatto che MT è un programma i cui dati restano nel web e non vengono memorizzati nell'harddisk per cui ogni volta che ti colleghi riparte dal punto in cui l'hai lasciato e per sveltezza di calcolo opera in questo modo,mentre resti collegato aggiorna solo l'ultima barra.
ì


non è proprio così, faccio una precisazione.

I dati restano sicuramente memorizzati in locale sul proprio pc che riparte a calcolare dopo il punto in cui l'avevi lasciato.

Il ricalcolo è invece un problema un attimo differente. Da quanto scritto nel metaeditor viene fatto per ovviare un errore che si può verificare quado un expert advisor va a chiamare un indicatore.

Dato che la chiamata impiega comunque del tempo (anche se si tratta di frazioni di secondo), si può verifcare il caso in cui l'ea chiama l'indicatore, nel momento in cui viene chiamato l'indicatore viene tracciata sul grafico la nuova barra.

In questo caso l'indicatore restituirebbe all'ea dei dati errati visto che l'ultima barra a cui si riferisce l'expert advisor è in realtà la penultima barra dell'indicatore, è per questo che si torna indietro per ricalcolarla.

non è proprio semplice da capire ma non è nemmeno così importante, basta sapere che bisogna effettuare indicator_counted-- per far prendere in considerazione all'indicatore la penultima barra invece dell'ultima.

poi rispondo anche all'altra parte del topic.

P.S. ora si dovrebbe poter postare il codice senza che venga modificato a solo!!
Profilo Invia messaggio privato Invia e-mail HomePage
MQL: codice indicatore supertrend
 MessaggioInviato: Sab Nov 10, 2007 12:34 pm Rispondi citando  
Messaggio
  speranzoso
Aspirante Trader
Aspirante Trader

Registrato: 18/10/07 14:03
Messaggi: 61

Ok!invece capire a mio avviso è importante anche se non ci si deve perdere il sonno ma capire come lavora il programma credo non sia cosa da poco,comunque un passo alla volta.Ora provo a reinserire il codice cosi puoi leggerlo direttamente.

Codice:

#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link      "http://www.jnrtrading.co.uk"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Red


double TrendUp[];
double TrendDown[];
int st = 0;
//extern int SlowerEMA = 6;



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

   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(0, TrendUp);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(1, TrendDown);
   
   /*SetIndexStyle(0, DRAW_ARROW, EMPTY);
   SetIndexArrow(0, 159);
   SetIndexBuffer(0, TrendUp);
   SetIndexStyle(1, DRAW_ARROW, EMPTY);
   SetIndexArrow(1, 159);
   SetIndexBuffer(1, TrendDown);*/
   
   /*for(int i = 0; i < Bars; i++) {
      TrendUp[i] = NULL;
      TrendDown[i] = NULL;
   }*/
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   /*for(int i = 0; i < Bars; i++) {
      TrendUp[i] = NULL;
      TrendDown[i] = NULL;
   }*/
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   
   int limit, i, counter;
   double Range, AvgRange, cciTrendNow, cciTrendPrevious, var;

   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) counted_bars--;

   limit=Bars-counted_bars;
   
   for(i = limit; i >= 0; i--) {
      cciTrendNow = iCCI(NULL, 0, 50, PRICE_TYPICAL, i);
      cciTrendPrevious = iCCI(NULL, 0, 50, PRICE_TYPICAL, i+1);
     
      //st = st * 100;
     
     
      counter = i;
      Range = 0;
      AvgRange = 0;
      for (counter = i; counter >= i-9; counter--) {
         AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);
      }
      Range = AvgRange/10;
      if (cciTrendNow >= st && cciTrendPrevious < st) {
         TrendUp[i+1] = TrendDown[i+1];
      }
     
      if (cciTrendNow <= st && cciTrendPrevious > st) {
         TrendDown[i+1] = TrendUp[i+1];
      }
     
      if (cciTrendNow >= st) {
         TrendUp[i] = Low[i] - iATR(NULL, 0, 5, i);         
         if (TrendUp[i] < TrendUp[i+1]) {
            TrendUp[i] = TrendUp[i+1];
         }
      }
      else if (cciTrendNow <= st) {
         TrendDown[i] = High[i] + iATR(NULL, 0, 5, i);
         if (TrendDown[i] > TrendDown[i+1]) {
            TrendDown[i] = TrendDown[i+1];
         }
      }
   }
         
//----
   
//----
   return(0);
  }

_________________
Mauro
Profilo Invia messaggio privato
 MessaggioInviato: Sab Nov 10, 2007 12:36 pm Rispondi citando  
Messaggio
  speranzoso
Aspirante Trader
Aspirante Trader

Registrato: 18/10/07 14:03
Messaggi: 61

Ho controllato e mi sembra ok!
Ciao grazie di tutto e aspetto tue notizie Smile

_________________
Mauro
Profilo Invia messaggio privato
MQL: ciclo for annidato
 MessaggioInviato: Sab Nov 10, 2007 1:13 pm Rispondi citando  
Messaggio
  carlo10
Site Admin
Site Admin

Registrato: 29/04/06 16:19
Messaggi: 5577
Residenza: Padova

Codice:

   for(i = limit; i >= 0; i--) {
      cciTrendNow = iCCI(NULL, 0, 50, PRICE_TYPICAL, i);
      cciTrendPrevious = iCCI(NULL, 0, 50, PRICE_TYPICAL, i+1);
     
      //st = st * 100;
     
     
      counter = i;
      Range = 0;
      AvgRange = 0;
      for (counter = i; counter >= i-9; counter--) {
           AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);
         }
       ...
      }


Il blocco di codice da considerare è per forza di cose questo: siamo all'interno di un ciclo for che viene chiuso con la chiusura della parentesi graffa.

L'istruzione seguente serve per andare a calcolare le barre non ancora prese in considerazione e dovrebbe essere a questo punto chiara:

Codice:

for(i = limit; i >= 0; i--){
   cciTrendNow = iCCI(NULL, 0, 50, PRICE_TYPICAL, i);
   cciTrendPrevious = iCCI(NULL, 0, 50, PRICE_TYPICAL, i+1);
   ...
   ...
}


per i uguale allla prima barra utile non ancora calcolata finchè i non diventa uguale alla barra attuale (cioè la barra 0) esegue le istruzioni all'interno del ciclo for...

Da notare come i cicli for con autodecremento siano molo utilizzati in mql proprio per la scelta di considerare la barra più recente come la barra 0 e quelle più vecchie la 1, 2, 3 ecc.

per le istruzioni iCCI ti consiglio invece di andare a leggere questo topic:

Solamente gli utenti registrati possono vedere link su questo forum!
Registrati oppure Autenticati su questo forum.



Qui si inizializzano 3 variabili:

Codice:

      counter = i;
      Range = 0;
      AvgRange = 0;


su Range e AvgRange niente da dire, counter invece viene inizializzato al valore di i.

Essendo dentro al ciclo for i decrementa di 1 ogni volta che il ciclo è terminato e quindi ricomincia. L'ultima esecuzione del ciclo si ha con valore di i uguale a 0 (i >= 0), dopodichè si esce.

Dopo aver inizializzato le variabili si entra nel nuovo ciclo for che se non sbaglio è proprio la parte che ti interessa:

Codice:

for (counter = i; counter >= i-9; counter--) {
           AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);
}


poniamo il caso che i valga 2 nel momento in cui si entra nel secondo ciclo for, l'istruzione diventa:

Codice:

for (counter = 2; counter >= -7; counter--) {
           AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);
}


Il ciclo va quindi in esecuzione 10 volte (per i= 2,1,0,-1,-2,-3,-4,-5,-6,-7), quando i è uguale a -7 esce.

Ad ogni esecuzione viene eseguita l'istruzione:

Codice:

      AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);


MathAbs() è una funzione che calcola il valore assoluto di un numero intero, per semplificare diciamo che se all'interno delle parentesi si mette un numero negativo questo viene restituito senza segno.

High restitusce il valore massimo raggiunto dalla barra presa in considerazione, Low il minimo. La barra considerata è quella indicata tra parentesi quadre, ne nostro caso counter che è la variabile che viene decrementata.

Alla fine delle 10 esecuzioni quindi AvgRange conterrà il valore della somma della differenza tra il massimo e il minimo delle ultime 10 barre.

Da notare che l'ultima barra utile è a barra 0, quindi nel caso in cui counter assuma valori negativi High e Low restituiscono sempre 0:

Codice:

   AvgRange= AvgRange + (0-0) = AvgRange


Quindi per valori negativi i counter AvgRange non viene modificato.

Non sono stato ad analizzare il motivo matematico/tecnico per cui questo AvgRange viene valorizzato, spero però di averti fatto chiarezza sul codice.

Se hai dubbi sono qua.
Profilo Invia messaggio privato Invia e-mail HomePage
MQL: Stampa dei valori su metatrader
 MessaggioInviato: Sab Nov 10, 2007 3:57 pm Rispondi citando  
Messaggio
  speranzoso
Aspirante Trader
Aspirante Trader

Registrato: 18/10/07 14:03
Messaggi: 61

Ringrazio a piene mani,si effettivamente ciò che mi premeva era il ciclo for però cosi è ancora meglio.Il difetto solito di chi crea e posta un codice è la sovente mancanza di commenti atti a far capire tutto il meccanismo perchè a mio avviso capire il meccanismo evita un mare di perdite di tempo.
Un'ultima domanda che nel dizionario non ho trovato(anche per mia scarsità)In Ts 2000 o ts8 o Ninja trader per evidenziare il vlore di una variabile o di altro si fà uso di Expert commentary o in ninja di istruzioni Print plottate in una output window(in quest'ultimo caso)in meta T.quale possibilità si ha?(così non ti spacco i maroni ogni 10 minuti) Very Happy
Ancora grazie per la tua pazienza(non è per lecchinare è che sono rare le persone che offrono tanta disponibilità)ciao

_________________
Mauro
Profilo Invia messaggio privato
MQL: Stampa dei valori a run-time: Alert(), Print(), Comment
 MessaggioInviato: Sab Nov 10, 2007 4:16 pm Rispondi citando  
Messaggio
  carlo10
Site Admin
Site Admin

Registrato: 29/04/06 16:19
Messaggi: 5577
Residenza: Padova

speranzoso ha scritto:
Ringrazio a piene mani,si effettivamente ciò che mi premeva era il ciclo for però cosi è ancora meglio.Il difetto solito di chi crea e posta un codice è la sovente mancanza di commenti atti a far capire tutto il meccanismo perchè a mio avviso capire il meccanismo evita un mare di perdite di tempo.
Un'ultima domanda che nel dizionario non ho trovato(anche per mia scarsità)In Ts 2000 o ts8 o Ninja trader per evidenziare il vlore di una variabile o di altro si fà uso di Expert commentary o in ninja di istruzioni Print plottate in una output window(in quest'ultimo caso)in meta T.quale possibilità si ha?(così non ti spacco i maroni ogni 10 minuti) Very Happy
Ancora grazie per la tua pazienza(non è per lecchinare è che sono rare le persone che offrono tanta disponibilità)ciao


in metatrader hai principalmente 3 possibilità (quello che ho visto fin'ora):

Alert(): fa partire un pop-up.

Print(): scrive i valori su metatrader nella sezione in basso chiamata diario oppure sulla experts (non ricordo bene ora)

Comment(): visualizza l'output direttamente sul grafico in alto a sinistra.

A mio avviso la funzione migliore è Print()
Profilo Invia messaggio privato Invia e-mail HomePage
 MessaggioInviato: Sab Nov 10, 2007 4:47 pm Rispondi citando  
Messaggio
  speranzoso
Aspirante Trader
Aspirante Trader

Registrato: 18/10/07 14:03
Messaggi: 61

Grazie mille e buon fine settimana
Very Happy

_________________
Mauro
Profilo Invia messaggio privato
 MessaggioInviato: Mar Apr 11, 2017 4:55 pm Rispondi citando  
Messaggio
  Bjt083
New Entry
New Entry

Registrato: 11/04/17 16:25
Messaggi: 1

A distanza di anni dalla creazione di questo topic, l'ho trovato davvero utilissimo per comprendere al meglio la funzione IndicatorCounted().

Grazie di cuore Wink
Profilo Invia messaggio privato
Nuovo argomento   Rispondi    Indice del forum » Metatrader - Expert Advisor - MQL

Pagina 1 di 1
Tutti i fusi orari sono GMT + 2 ore

Mostra prima i messaggi di:

  

Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi
c d
e

CI SIAMO TRASFERITI QUI: http://forum.forexup.biz





Powered by phpBB © 2001, 2002 phpBB Group phpbb.it
Macinscott 2 by Scott Stubblefield


Abuse - Segnalazione abuso - Utilizzando questo sito si accettano le norme di TOS & Privacy.
Powered by forumup.it forum gratis free, crea il tuo forum gratis free ora! Created by Hyarbor & Qooqoa
Confirmed

Page generation time: 3.528