Discussione sull’articolo "L'Handler dell'Evento "Nuova Barra"" - pagina 2

[Eliminato]  

Prival:

Raramente, ma ci sono situazioni in cui le quotazioni di uno strumento si bloccano per molto tempo (ho visto una situazione del genere nello yen). Se l'Expert Advisor si blocca su questa coppia, siete nei guai se non avete tradotto tutto il codice in OnTime().

Se lavorate su OOP o utilizzate determinati algoritmi, non avrete bisogno di tradurre il codice. Ma sono d'accordo sul fatto che è più comodo ottenere i tick in tempo reale per tutte le coppie nella panoramica (e non inventare qualcosa di proprio)....

Lizar:

Un evento di questo tipo può essere ricevuto usando TimeCuurent(), ma cosa farne poi, come sincronizzarlo, è un problema.

Cosa c'entra TimeCuurent()?
 
Interesting:
Cosa c'entra TimeCuurent() con questo?

La guida dice:

Nel gestore OnTick(), questa funzione restituisce l'ora del tick elaborato in entrata. In altri casi (ad esempio, nei gestori OnInit(), OnDeinit(), OnTimer() e così via) si tratta dell'ora di arrivo dell'ultima quotazione per qualsiasi simbolo disponibile nella finestra "Market Watch", la stessa che viene mostrata nel titolo di questa finestra.

[Eliminato]  
Lizar:

La sinossi recita:

Nel gestore OnTick(), questa funzione restituisce l'ora di arrivo del tick in corso di elaborazione. In altri casi (ad esempio, chiamata nei gestori OnInit(), OnDeinit(), OnTimer() e così via) si tratta dell'ora di arrivo dell'ultima quotazione per qualsiasi simbolo disponibile nella finestra "Market Watch", la stessa ora che viene mostrata nell'intestazione di questa finestra.

Sì, è chiaro. Solo che se lo mettiamo in OnTime possiamo aggiornare l'ora non più di una volta al minuto, e se lo mettiamo nell'attuale OnTick() rischiamo di perdere i tick su alcune coppie (in mute).

E cosa fare nel blocco di elaborazione è chiaro (per le mute): otteniamo un nuovo valore, lo confrontiamo con quello esistente e traiamo le conclusioni se c'è stato un nuovo tick o meno.

Ma ditemi, perché farlo nell'Expert Advisor?

 
Lizar:

La sinossi recita:

errore. ecco cosa dice la guida https://www.mql5.com/it/docs/basis/function/events

L'evento NewTick viene generato solo per gli Expert Advisor quando viene ricevuto un nuovo tick per un simbolo al cui grafico è collegato l'Expert Advisor.

Ancora una volta. Stiamo parlando di un Expert Advisor che si aggancia a un simbolo. Viene attivato dall'evento

void OnTick() {}

Se vi trovate all'interno di questa funzione e non ci sono tick su questa coppia per più di un'ora, non potete fare nulla entro un'ora. Finora, l'unica via d'uscita è quella di farlo in un timer, che si avvia indipendentemente dall'arrivo di tick sullo strumento.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Interesting:

Ma se lo mettiamo in OnTime possiamo aggiornare l'ora non più di una volta al minuto, e se lo mettiamo nell'attuale OnTick() rischiamo di perdere i tick su alcune coppie (in multa).

Questo è il punto: possiamo ottenere l'evento, ma non possiamo usarlo.
 
Prival:

Errore. Ecco cosa dice la guida https://www.mql5.com/it/docs/basis/function/events.

Ancora una volta. Si tratta di un Expert Advisor che si blocca su un simbolo. Viene lanciato dall'evento

void OnTick() {}

Se ci si trova all'interno di questa funzione e non ci sono tick su questa coppia per più di un'ora, non è possibile fare nulla entro un'ora. Finora, l'unica via d'uscita è farlo nel timer, che viene avviato indipendentemente dall'arrivo di tick sullo strumento.

Sì, se agiamo nell'ambito di questo https://www.mql5.com/it/docs/basis/function/events, sono d'accordo che l'opzione migliore, come vediamo ora, è OnTime. Ma ci salverà solo dalla dipendenza dall'arrivo dei tick. E non ci salverà dalla monotematicità: mentre elaboriamo un segnale per uno strumento, rischiamo di perdere o ritardare l'elaborazione di altri strumenti. Questo è particolarmente vero quando "il tempo di elaborazione degli ordini di compravendita va da 2 a 7 secondi" + requote.

Mi sono ricordato di TimeCuurent() perché l'Interesse ha iniziato a parlare di tick in tempo reale per tutte le coppie nella revisione del mercato.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
[Eliminato]  
Ottimo articolo, grazie.
 
Grazie
 

Articolo molto interessante. Grazie per aver condiviso tutto questo.

Tuttavia, alcune osservazioni:

Parlando di questa funzione, lei dice :

If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.

  • Hai ragione. Ma chiamare più volte una funzione come isnewbar() durante 1 tick è una cattiva pratica. Chiamatela solo una volta e conservate il risultato in una variabile.
  • Il problema è che la soluzione che fornite, utilizzando una classe senza variabile statica, non risolve quanto avete sottolineato. E anche la situazione è ora peggiore. Dovete dichiarare l'istanza della vostra classe come variabile globale (oggetto), e dovete anche inizializzarla in OnInit(). Chi utilizzerà la vostra classe deve conoscere l 'operazione:
  1. Utilizzare sempre una variabile globale
  2. Inizializzare sempreanche se il simbolo e il periodo sono quelli predefiniti (per il grafico temporale).
  • Infine, "se vogliamo utilizzare questa funzione, ad esempio, in un altro punto dello stesso ciclo di calcolo". Comunque restituisce SEMPRE FALSO.

Avete sostituito una variabile locale statica con una variabile globale, che è la stessa cosa, e non avete risolto il problema.


Tuttavia, il tuo articolo ha il merito di spingere a riflettere e di offrire spunti interessanti.

[Eliminato]  

Ottimo articolo, grazie per averlo condiviso! Tutto ciò è stato molto utile!

Comunque, ho preso la tua funzione isNewBar e in fase di compilazione mi lancia il seguente messaggio:"possibile perdita di dati a causa della conversione di tipo".

Ho quindi cambiato i tipi di var da datetime a long in questo modo:

//+------------------------------------------------------------------+
//| Restituisce true se è comparsa una nuova barra per una coppia simbolo/periodo |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- memorizzare l'ora di apertura dell'ultima battuta nella variabile statica
   static long last_time=0;
//--- ora corrente
   long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);

//--- se è la prima chiamata della funzione
   if(last_time==0)
     {
      //--- impostare l'ora e uscire
      last_time=lastbar_time;
      return(false);
     }

//--- se l'ora differisce
   if(last_time!=lastbar_time)
     {
      //--- memorizza l'ora e restituisce true
      last_time=lastbar_time;
      return(true);
     }
//--- se siamo passati a questa riga, la barra non è nuova; return false
   return(false);
  }

Ora compila senza alcun avviso e sembra funzionare bene. Grazie!


Documentation on MQL5: Language Basics / Data Types / Typecasting
  • www.mql5.com
Language Basics / Data Types / Typecasting - Documentation on MQL5