Tiki en temps réel - page 7

 
prostotrader:

Vous devez poster votre code pour prouver ou réfuter quelque chose !

Vous avez pris sur vous de prouver qu'il y a des enregistrements entre des événements OnTick adjacents, qui entrent ensuite dans l'histoire de CopyTicks et peuvent être capturés en temps réel via OnBookEvent.

Malheureusement, les journaux ci-dessus ne le montrent pas.

 
fxsaber:

Vous prouvez qu'il y a des enregistrements entre des événements OnTick adjacents, qui entrent ensuite dans l'historique CopyTicks et peuvent être capturés en temps réel via OnBookEvent.

Malheureusement, les journaux ci-dessus ne le montrent pas.

Je l'ai prouvé en postant un code fonctionnel et en expliquant pourquoi il fonctionne plus rapidement et en temps réel,

Je l'ai écrit en me basant sur la référence des fonctions de MQL5 et sur mon expérience personnelle.

Vous voulez le vérifier vous-même ? Ou prouvez le contraire avec un code qui fonctionne.

 
prostotrader:

Je l'ai prouvé en postant un code fonctionnel et en expliquant pourquoi il fonctionne plus rapidement et en temps réel.

Malheureusement, lorsque le principal lien de preuve sous la forme d'entrées OnTick CopyTicks-history manquantes fait défaut, il ne peut être accepté.

 
fxsaber:

Malheureusement, lorsque le lien principal de la preuve, sous la forme d'enregistrements OnTick CopyTicks-history manquants, fait défaut, elle ne peut être acceptée.

Alors quel est le problème ?

Vérifiez par vous-même.

 
prostotrader:

Alors, qu'est-ce que c'est ?

Vérifiez par vous-même.

J'ai seulement fait remarquer que votre preuve ne peut pas être acceptée uniquement sur des bases logiques, et non comme contredisant tout autre point de vue.

 
fxsaber:

J'ai juste fait remarquer que votre preuve ne peut être acceptée uniquement pour des raisons logiques, et non pas parce qu'elle contredit un autre point de vue.

OK, je vois, mais je suggère quand même de lire l'aide sur OnBookEvent()

Je ne vais pas prouver quoi que ce soit, j'ai juste écrit un code fonctionnel dans le sujet du sujet, et j'ai expliqué (à la demande des utilisateurs du forum)

Pourquoi cette méthode est meilleure que OnTick(), si quelqu'un ne me croit pas, qu'il le vérifie lui-même !

Ou postez un code fonctionnel qui réfute mon explication.

Ajouté par

Il y a des milliers de personnes travaillant sur le FOREX ici sur le forum qui n'ont jamais travaillé avec OnBookEvent().

Et avec un tumblr.

Je suis censé faire quelque chose pour tous ceux qui vont poster dans ce fil ?

 
prostotrader:

Heure du premier OnTick()2020.01.30 19:31:11.112

Heure de la seconde OnTick()2020.01.30 19:31:11.802

C'est-à-dire que 690 ms se sont écoulées, pendant ce temps, entre le OnTick() de ces 690 ms

OnBookEvent() a été déclenché 15 fois

Pensez-vous que ces clics n'ont rien à voir avec les tiques?

À moins que vous n'appeliez un changement dans la pile qui n'affecte pas la bande de bord (bid/ask) ou le flipper, alors oui, ces déclencheurs n'ont rien à voir avec les ticks.


prostotrader:

Il y a un autre point essentiel que beaucoup de gens oublient.

Il s'agit de la vitesse à laquelle l'EA prend une décision en analysant les données d'entrée.

En utilisant OnBookEvent() au lieu de OnTick(), mon EA sera plus rapide que le vôtre.

Vous vous trompez, et je vous le dis pour la millième fois.

Vous pouvez exécuter cet EA sur un terminal sur deux graphiques : l'un en mode "UseBookEvent", le second - en mode "Use OnTick" (c'est le paramètre d'entrée). Le code contenu dans les gestionnaires d'événements est identique (vous pouvez le placer dans une fonction distincte et l'appeler à partir de là, mais ce n'est pas la question) :

//---
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 ) );
};

Ensuite, regardez dans le journal de l'EA, et analysez l'heure de réception du tick :


Si vous trouvez quelque chose d'intéressant (par exemple, le temps d'obtention d'un tick(GetTickCount64) depuis OnTick est plus long que le même temps (pour le même tick) depuis OnBook), postez-le ici.

 
Andrey Khatimlianskii:

Si vous n'appelez pas un changement de pile qui n'affecte pas la bande de bord (bid/ask) ou le flipper, alors oui, ces déclencheurs n'ont rien à voir avec les ticks.


Vous vous trompez et je vous le dis pour la millième fois.

Exécutez cet EA sur un terminal sur deux graphiques : l'un en mode "UseBookEvent", l'autre en mode "Use OnTick" (c'est le paramètre d'entrée). Le code contenu dans les gestionnaires d'événements est identique (vous pouvez le placer dans une fonction distincte et l'appeler à partir de là, mais ce n'est pas la question) :

Ensuite, regardez dans le journal de l'EA, et analysez l'heure de réception du tick :


Si vous trouvez quelque chose d'intéressant (par exemple, le temps d'obtention d'un tick (GetTickCount64) depuis OnTick est plus long que le temps analogue (pour le même tick) depuis OnBook), postez-le ici.

C'est comme je l'ai dit !

Dans la première ligne du journal (travail commun) se trouve une confirmation directe de mes explications

OnTick() est déclenché tardivement, et reçoit donc des données périmées.


Dossiers :
20200131.log  220 kb
 
prostotrader:

C'est comme je l'ai dit !

Dans la première ligne du journal (travail collaboratif) une confirmation directe de mon explication

OnTick() est déclenché tardivement, il reçoit donc des données périmées.

Montrez quelques informations avant ce morceau de bois.

Était-ce juste après le lancement (les toutes premières entrées) ? Dans quel ordre avez-vous exécuté les EAs ?

ps : voir le journal ci-joint, je vais le regarder maintenant

 
Andrey Khatimlianskii:

Montrez quelques informations avant ce morceau de bois.

Était-ce juste après le lancement (les toutes premières entrées) ? Dans quel ordre avez-vous exécuté les EAs ?

Onbook d'abord, puis ontic, log joint ci-dessus


Raison: