Indicare una nuova barra

 

Mi chiedo come indicare quando una nuova barra vede la luce.
Principalmente mi preoccupo delle prestazioni. Su alcuni simboli ho visto tick ogni 20 ms. Non c'è molto tempo per reagire.

Un'idea è tassi.tick_volume

Mqlrates rates[1];

OnInit()
    {
    if(CopyRates(_Symbol,_Period,0,1,rates) < 1)
       if(rates[0].tick_volume == 1)
          {
          ... deal with new bar ...
          }

Un'altra idea potrebbe essere il controllo se il numero di barre è stato incrementato

OnInit()
  {
  if(BarsOld < Bars(_Symbol,_Period))
     {
     BarsOld = Bars(_Symbol,_Period);
     ... deal with new bar ...
     }

Ho controllato anche OnChartEvent, ma non ho trovato alcun modo per differenziare le nuove barre da altre cose.

Grazie per la tua valutazione

WIllbur

 

Le barre e il volume non sono affidabili per rilevare una nuova barra.

Un computer lavora in nano secondi, quindi un EA ben codificato può fare molto in 20 ms.

The "New Bar" Event Handler
The "New Bar" Event Handler
  • 2010.10.11
  • Konstantin Gruzdev
  • www.mql5.com
MQL5 programming language is capable of solving problems on a brand new level. Even those tasks, that already have such solutions, thanks to object oriented programming can rise to a higher level. In this article we take a specially simple example of checking new bar on a chart, that was transformed into rather powerful and versatile tool. What tool? Find out in this article.
 
Vedere questo argomento :
Improve your time execution by removing Bars function calls
Improve your time execution by removing Bars function calls
  • www.mql5.com
After a basic profiling I get the following results :. - - Category: trading systems
 

Grazie Alain,

molto interessante ... esattamente quello che immagino . . . 10 volte più veloce ... hmmm.

Significa: TimeCurrent() è veloce e sincrono ai bordi delle barre?

Perché .... hmmm ...

Ho bisogno di un po' di tempo per pensarci.

Willbur

 

Ok - per le persone a cui piacciono queste cose: il mio studio su questo problema.

Ho scritto una frase in un file in ogni evento "OnTick".

TimeLocal (PC CLock), TimeCurrent(), usando SymbolInfoTick() alcune informazioni sull'ultimo tick arrivato e - usando CopyRates() - alcune informazioni sulla barra corrente.


Un esempio da "USD/JPY" - Il periodo è "M1":

Sono le 19:43:01 dell'orologio del PC quando arriva il primo tick del 43° minuto, allo stesso tempo è nata una nuova barra.
A parte il fakt, che il tick-volume non è 1. questo è il normale flusso delle cose.



A volte non è così facile - come in questo caso:

Il PC mostra già 19:42:00 quando sono arrivati altri tre tick della barra 41min. Hanno ancora un timestamp di 19:41:59.

Ora il mondo fa un respiro profondo - 8.150 msec di totale immobilità.

Poi - il PC mostra già 19:42:09 - il primo tick della nuova barra - la barra dei 42 minuti - arriva.
Il Tick è segnato con 19:42:07 e - poiché è la barra delle 19:42 che entra con essa - il timestamp della barra è 19:42:00


Ora .... hmmm ....

1. TimeCurrent() è sempre uguale al timestamp del tick?

Ho controllato 40.000 record e ho trovato solo cinque casi in cui TimeCurrent è già commutato mentre il timestamp dell'ultimo tick non lo è.

2. Il last_tick è sempre più avanti dell'apertura della nuova barra?

(da continuare)

 

TimeCurrent() è il tempo dell'ultimo tick dal server, dipende dal tuo codice se è dal tuo simbolo grafico o no.

Non capisco il tuo problema "ultimo tick", dovresti mostrare il codice che ha prodotto questo output.

 

Ciao Alain

Controllo il TimeCurrent() in OnTick() che dovrebbe garantire l'appartenenza al simbolo che tratto.

Bene, questo dovrebbe essere il mio "New Bar Identifier" - piccolo e veloce - che ne pensi?

//---  New Bar           
bool   NewBar = false;
long   currPeriodSeconds;
double currPeriodProgress = 0;

int OnInit(void)  //-----------------------------------------------
{
      currPeriodSeconds = PeriodSeconds();
      return(INIT_SUCCEEDED);
}

void OnTick()  //--------------------------------------------------
{
      if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
           NewBar = true;
      else NewBar = false;
     

      currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);

Lo controllerò con questa sequenza:

//---  Just for testing
int    ExtHdlFile1=0;
       MqlRates rates[1];
        
//---  New Bar           
bool   NewBar = false;
long   currPeriodSeconds;
double currPeriodProgress = 0;

int OnInit(void) // -------------------------------------------------------
{
      currPeriodSeconds = PeriodSeconds();

      ExtHdlFile1=FileOpen("NewBarTest.csv",FILE_READ|FILE_WRITE|FILE_CSV);
      FileSeek (ExtHdlFile1,0,SEEK_END); 
      FileWrite(ExtHdlFile1,  "TimeLocal",
                              "TimeCurrent",
                              "rates[0].time",
                              "rates[0].tick");
      return(INIT_SUCCEEDED);
}

void OnTick() // -----------------------------------------------------------
{
      if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
           NewBar = true;
      else NewBar = false;
     
      currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);

//--- lets check this

      if(NewBar)
         {
         // last Time Stamp of old Bar
         FileWrite(ExtHdlFile1, " ",
                                " ",
                                TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
                                IntegerToString(rates[0].tick_volume));
         // get the new bar                     
         if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return;
         // first Time Stamp of new Bar       
         FileWrite(ExtHdlFile1,TimeToString(TimeLocal(),TIME_MINUTES|TIME_SECONDS),
                               TimeToString(TimeCurrent(), TIME_MINUTES|TIME_SECONDS),
                               TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
                               IntegerToString(rates[0].tick_volume));
         }

      if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return; // != clean code - just a test
}

void OnDeinit(const int reason)
{
      FileClose(ExtHdlFile1);
      return;
}

 
Willbur:

Ciao Alain

Controllo il TimeCurrent() in OnTick() che dovrebbe garantire l'appartenenza al simbolo che tratto.

Bene, questo dovrebbe essere il mio "New Bar Identifier" - piccolo e veloce - cosa ne pensi?

Interessante, ma non credo che sia universale (funziona in tutti i casi)... controllerò, non ho tempo attualmente.
 
 

Ecco la mia versione finale.

In effetti sono un po' preoccupato perché è così facile.

Alain: Sarebbe bello se tu rilasciassi la benedizione.

// -----------------------------------------------------------------------
bool NewBar(void)
{
bool iNewBar = false;
static double currPeriodProgress = 0;

   if(MathMod(TimeCurrent(),PeriodSeconds()) < currPeriodProgress) iNewBar = true;

   currPeriodProgress = MathMod(TimeCurrent(),PeriodSeconds());

   return(iNewBar);
}
// ------------------------------------------------------------------------
void OnTick()
{
    if(NewBar())     PlaySound("tick.wav");


Saluti da Colonia
Willbur

 

Il modo più semplice:

static datetime tlastbar=0;

datetime tnewbar=iTime(NULL,PERIOD_CURRENT,0);

bool isnewbar=tnewbar!=tlastbar;

tlastbar=tnewbar;