Tiki in tempo reale - pagina 7

 
prostotrader:

Devi postare il tuo codice per dimostrare o confutare qualcosa!

Ti sei preso la briga di dimostrare che ci sono dei record tra eventi OnTick adiacenti, che poi entrano nella cronologia di CopyTicks e possono essere catturati in tempo reale tramite OnBookEvent.

Sfortunatamente, i log di cui sopra non lo mostrano.

 
fxsaber:

Stai dimostrando che ci sono dei record tra eventi OnTick adiacenti, che poi entrano nella cronologia di CopyTicks e possono essere catturati in tempo reale tramite OnBookEvent.

Sfortunatamente, i log di cui sopra non lo mostrano.

L'ho dimostrato postando del codice funzionante e ho spiegato perché funziona più velocemente e in tempo reale,

L'ho scritto basandomi sul riferimento alle funzioni MQL5 e sull'esperienza personale.

Vuoi controllare tu stesso? O dimostrare il contrario con un codice funzionante.

 
prostotrader:

L'ho dimostrato pubblicando un codice funzionante e spiegando perché funziona più velocemente e in tempo reale.

Sfortunatamente, quando manca il principale collegamento di prova sotto forma di voci mancanti di OnTick CopyTicks-history, non può essere accettato.

 
fxsaber:

Sfortunatamente, quando manca il collegamento principale della prova sotto forma di record OnTick CopyTicks-history mancanti, non può essere accettata.

Allora qual è il problema?

Controllate voi stessi.

 
prostotrader:

Allora, che cos'è?

Controllate voi stessi.

Ho solo fatto notare che la tua prova non può essere accettata solo su basi logiche, e non come contraddizione di qualsiasi altro punto di vista.

 
fxsaber:

Ho solo fatto notare che la tua prova non può essere accettata solo per ragioni logiche, e non in quanto contraddice qualsiasi altro punto di vista.

OK, capisco, ma suggerisco ancora di leggere l'aiuto su OnBookEvent()

Non ho intenzione di dimostrare nulla, ho solo scritto del codice funzionante nell'argomento del topic, e spiegato (su richiesta degli utenti del forum)

Perché questo metodo è meglio di OnTick(), se qualcuno non mi crede, lo controlli lui stesso!

O pubblicate un codice funzionante che smentisca la mia spiegazione.

Aggiunto da

Ci sono migliaia di persone FOREX qui sul forum che non hanno mai lavorato con OnBookEvent()

E con un tumblr.

Cosa dovrei fare per tutti quelli che posteranno in questo thread?

 
prostotrader:

Ora del primo OnTick()2020.01.30 19:31:11.112

tempo del secondo OnTick()2020.01.30 19:31:11.802

Cioè, sono passati 690 ms, nel frattempo, tra gli OnTick() di questi 690 ms

OnBookEvent() è stato attivato 15 volte

Pensate che questi clic non abbiano nulla a che fare con le zecche?

A meno che tu non chiami un cambiamento nello stack che non influisce sulla banda di bordo (bid/ask) o sul flipper, allora sì, questi trigger non hanno nulla a che fare con i tick.


prostotrader:

C'è un altro punto essenziale che molte persone dimenticano.

È la velocità con cui l'EA prende una decisione analizzando i dati di input.

Usando OnBookEvent() invece di OnTick(), il mio EA sarà più veloce del tuo.

Ti sbagli, e te lo dico per la millesima volta.

È possibile eseguire questo EA su un terminale su due grafici: uno in modalità "Use OnBookEvent", il secondo - in modalità "Use OnTick" (questo è il parametro di ingresso). Il codice all'interno dei gestori di eventi è identico (potete metterlo in una funzione separata e chiamarlo da lì, ma non è questo il punto):

//---
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;

//---
bool is_book;
long last_tick_time = 0;
MqlTick cur_ticks[], last_tick;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
        if ( Mode == USE_BOOK )
        {
                is_book = MarketBookAdd(Symbol());
                if ( !is_book ) Alert( "MarketBookAdd failed with error #", GetLastError(), "!" );
        }

        last_tick_time = 0;

        return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
        if(is_book == true) MarketBookRelease(Symbol());
}

//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
        if ( Mode != USE_BOOK || symbol != _Symbol ) return;

        if ( last_tick_time <= 0 )
        {
                if ( CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, 0, 1 ) > 0 )
                {
                        last_tick_time = cur_ticks[0].time_msc;
                        last_tick = cur_ticks[0];
                }
        }
        if ( last_tick_time > 0 )
        {
                int new_ticks = CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, last_tick_time, 0 );
                for ( int i = 0; i < new_ticks; i ++ )
                {
                        PrintTick( "OnBook", cur_ticks[i] );
                }
                if ( new_ticks > 0 )
                {
                        last_tick_time = cur_ticks[new_ticks-1].time_msc;
                        last_tick = cur_ticks[new_ticks-1];
                }
        }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
        if ( Mode != USE_TICK ) return;

        if ( last_tick_time <= 0 )
        {
                if ( CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, 0, 1 ) > 0 )
                {
                        last_tick_time = cur_ticks[0].time_msc;
                        last_tick = cur_ticks[0];
                }
        }
        if ( last_tick_time > 0 )
        {
                int new_ticks = CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, last_tick_time, 0 );
                for ( int i = 0; i < new_ticks; i ++ )
                {
                        PrintTick( "OnTick", cur_ticks[i] );
                }
                if ( new_ticks > 0 )
                {
                        last_tick_time = cur_ticks[new_ticks-1].time_msc;
                        last_tick = cur_ticks[new_ticks-1];
                }
        }
}

void PrintTick( string func_name, MqlTick &tick )
{
        if ( tick.time_msc == last_tick.time_msc &&
                        tick.bid == last_tick.bid &&
                        tick.ask == last_tick.ask &&
                        tick.last == last_tick.last ) return;
        Print( GetTickCount64(), ": tick received from ", func_name, ": ",
                        tick.time, "   ", tick.time_msc, "  ",
                        DoubleToString( tick.bid, _Digits ), " / ",
                        DoubleToString( tick.ask, _Digits ), " / ",
                        DoubleToString( tick.last, _Digits ) );
};

E poi guarda nel log dell'EA, e analizza il tempo di ricezione dei tick:


Se trovate qualcosa di interessante (per esempio, il tempo di ottenere un tick(GetTickCount64) da OnTick è più lungo dello stesso tempo (per lo stesso tick) da OnBook), postatelo qui.

 
Andrey Khatimlianskii:

Se non chiami un cambio di stack che non influenza la banda di bordo (bid/ask) o il flipper, allora sì, quei trigger non hanno niente a che fare con i tick.


Vi sbagliate e ve lo dico per la millesima volta.

Esegui questo EA su un terminale su due grafici: uno in modalità "Use OnBookEvent", l'altro in modalità "Use OnTick" (questo è il parametro di ingresso). Il codice all'interno dei gestori di eventi è identico (potete metterlo in una funzione separata e chiamarlo da lì, ma non è questo il punto):

E poi guarda nel log dell'EA, e analizza il tempo di ricezione dei tick:


Se trovate qualcosa di interessante (per esempio, il tempo di ottenere un tick (GetTickCount64) da OnTick è più lungo del tempo analogo (per lo stesso tick) da OnBook), postatelo qui.

È proprio come ho detto!

Nella prima riga del registro (lavoro comune) c'è una conferma diretta delle mie spiegazioni

OnTick() è attivato in ritardo, e quindi riceve dati non aggiornati


File:
20200131.log  220 kb
 
prostotrader:

È proprio come ho detto!

Nella prima riga del registro (lavoro collaborativo) una conferma diretta della mia spiegazione

OnTick() viene attivato in ritardo, quindi riceve dati non aggiornati

Mostra alcune informazioni prima di questo pezzo di registro.

Era subito dopo il lancio (le primissime voci)? In che ordine hai eseguito gli EA?

ps: vedi log allegato, lo guarderà ora

 
Andrey Khatimlianskii:

Mostra alcune informazioni prima di questo pezzo di registro.

Era subito dopo il lancio (le primissime voci)? In che ordine hai eseguito gli EA?

Prima onbook, poi ontic, registro allegato sopra