Come rilevare una nuova barra - pagina 2

 
Ian Harris:

Ciao oneillj,

Pensavo di aver già risposto, ma sembra che sia svanito nell'etere di internet.

Il frammento di codice che hai fornito è praticamente quello di cui mi stavo lamentando all'inizio. Perché così complesso? Ho solo pensato che ci doveva essere un modo più semplice. Ho trovato questo, che sembra funzionare. Per favore correggetemi se mi sbaglio. (Ho anche provato a usare BarsCalculated, ma era sempre uguale a Bars, quindi il test ha sempre valutato falso).

statico int LastBarCount = 0;
se (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
altrimenti
ritorna;

;-) Ian

Sono completamente d'accordo che abbiamo bisogno di qualcosa di più semplice possibile.

Purtroppo questo codice non sembra funzionare per me in MQL5.

 
RoboSpider:
Purtroppo questo non sembra funzionare in MQL5.

Le barre sarebbero comunque un pessimo modo per rilevare una nuova barra.

L'unico modo affidabile per verificare la presenza di una nuova barra è usare il tempo. Non il volume, non i prezzi, non le barre.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
 
honest_knave:

Le barre sarebbero comunque un pessimo modo per rilevare una nuova barra.

L'unico modo affidabile per verificare la presenza di una nuova barra è usare il tempo. Non il volume, non i prezzi, non le barre.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
Sei il mio eroe!
 
honest_knave Bars sarebbe comunque un pessimo modo per rilevare una nuova barra. L'unico modo affidabile per verificare la presenza di una nuova barra è usare il tempo. Non il volume, non i prezzi, non le barre.
  1. Bars è inaffidabile (un refresh/reconnect può cambiare il numero di barre sul grafico,) volume è inaffidabile (mancano i tick,) Price è inaffidabile (prezzi duplicati e L'operando ==. - MQL4 forum.) Usa sempre il tempo. Nuova candela - MQL4 forum
 
honest_knave:

Le barre sarebbero comunque un pessimo modo per rilevare una nuova barra.

L'unico modo affidabile per verificare la presenza di una nuova barra è usare il tempo. Non il volume, non i prezzi, non le barre.

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }

Solo per informazione, ho la seguente nota nei miei riferimenti:

//-- A volte SeriesInfoInteger con SERIES_LASTBAR_DATE restituisce un errore,

Questo è molto tempo fa e non sto usando/testando questa funzione da anni, quindi forse non è più il caso. Ma se vuoi usarla per rilevare una nuova barra, probabilmente è meglio controllarla ;-)

 
Alain Verleyen:

Solo per informazione, ho la seguente nota nei miei riferimenti:

//-- A volte SeriesInfoInteger con SERIES_LASTBAR_DATE restituisce un errore,

Questo è molto tempo fa e non sto usando/testando questa funzione da anni, quindi forse non è più il caso. Ma se vuoi usarla per rilevare una nuova barra, probabilmente è meglio controllarla ;-)

Questo è molto criptico Alain! Che tipo di errori?

In tal caso, per le parentesi graffe o controllare SeriesInfoInteger >0 e/o ResetLastError prima della chiamata e poi controllare _LastError dopo la chiamata.

O ottenere la fonte del tempo da qualche altra parte, ad esempio time[] se in OnCalculate, o CopyTime, ecc.

 

Perché non usare semplicemente qualcosa come questo:

   static datetime prevTime=0;
          datetime lastTime[1];
          if (CopyTime(_Symbol,_Period,0,1,lastTime)==1 && prevTime!=lastTime[0])
          {
               prevTime=lastTime[0];
              
               // ...
          }
Dovrebbe funzionare in tutti i casi (anche quando c'è un errore con CopyTime() evita una trappola)
 
honest_knave:

Questo è molto criptico Alain! Che tipo di errori?

In tal caso, per le parentesi graffe o controllare SeriesInfoInteger >0 e/o ResetLastError prima della chiamata e poi controllare _LastError dopo la chiamata.

O ottenere la fonte del tempo da qualche altra parte, ad esempio time[] se in OnCalculate, o CopyTime, ecc.

Sto solo dicendo che quando l'ho usato anni fa SeriesInfoInteger() non era davvero affidabile. Sta a voi vedere cosa fare con queste informazioni :-D
 
Alain Verleyen:
Sto solo dicendo che quando l'ho usato anni fa SeriesInfoInteger() non era molto affidabile. Sta a voi vedere cosa fare con queste informazioni :-D

Non molto TBH - non ho bisogno di rilevare una nuova barra in MT5 Ma grazie per aver condiviso - lo terrò a mente per il futuro.

Stavo solo cercando di semplificare qualcosa che le persone sembravano rendere eccessivamente complicato.

Tuttavia, il principio rimane: usare il tempo. Attenzione: scegliete il vostro metodo per ottenere il tempo a vostro rischio e pericolo, tenendo conto delle note storiche incomplete di Alain (a proposito, come va XP Service Pack 1?)

 
honest_knave:

Non molto TBH - non ho bisogno di rilevare una nuova barra in MT5 Ma grazie per aver condiviso - lo terrò a mente per il futuro.

Stavo solo cercando di semplificare qualcosa che le persone sembravano rendere eccessivamente complicato.

Tuttavia, il principio rimane: usare il tempo. Attenzione: scegliete il vostro metodo per ottenere il tempo a vostro rischio e pericolo, tenendo conto delle note storiche incomplete di Alain (a proposito, com'è XP Service Pack 1?)

Motivazione: