Tiki en tiempo real - página 7

 
prostotrader:

Tienes que publicar tu código para demostrar o refutar algo.

Usted se encargó de demostrar que hay registros entre eventos OnTick adyacentes, que luego entran en el historial de CopyTicks y pueden ser capturados en tiempo real a través de OnBookEvent.

Lamentablemente, los registros anteriores no muestran esto.

 
fxsaber:

Está demostrando que hay registros entre eventos OnTick adyacentes, que luego entran en el historial de CopyTicks y pueden ser capturados en tiempo real a través de OnBookEvent.

Lamentablemente, los registros anteriores no muestran esto.

Lo probé publicando el código de trabajo y expliqué por qué funciona más rápido y en tiempo real,

Me he basado en la ayuda de la función MQL5 y en la experiencia personal.

¿Quiere comprobarlo usted mismo? O demostrar lo contrario con un código que funcione.

 
prostotrader:

Lo he demostrado publicando un código que funciona y explicando por qué funciona más rápido y en tiempo real.

Desgraciadamente, cuando falta el enlace principal de la prueba en forma de entradas OnTick CopyTicks-historia, no se puede aceptar.

 
fxsaber:

Desgraciadamente, cuando falta el eslabón principal de la prueba en forma de registros OnTick CopyTicks-historia, no se puede aceptar.

¿Cuál es el problema?

Compruébelo usted mismo.

 
prostotrader:

¿Y qué es?

Compruébelo usted mismo.

Sólo señalaba que su prueba no puede ser aceptada sólo por razones lógicas, y no por contradecir ningún otro punto de vista.

 
fxsaber:

Sólo señalaba que su prueba no puede ser aceptada sólo por razones lógicas, y no por contradecir ningún otro punto de vista.

Vale, ya veo, pero sigo sugiriendo que se lea la ayuda de OnBookEvent()

No voy a demostrar nada, simplemente escribí un código de trabajo en el tema del tema, y expliqué (a petición de los usuarios del foro)

Por qué este método es mejor que OnTick(), si alguien no me cree, ¡que lo compruebe él mismo!

O publica un código que funcione y que refute mi explicación.

Añadido por

Hay miles de personas de FOREX aquí en el foro que nunca han trabajado con OnBookEvent()

Y con un tumblr.

¿Qué se supone que tengo que hacer algo para todos los que van a publicar en este hilo?

 
prostotrader:

Hora del primer OnTick()2020.01.30 19:31:11.112

hora del segundo OnTick()2020.01.30 19:31:11.802

Es decir, han pasado 690 ms, mientras tanto, entre el OnTick() de estos 690 ms

OnBookEvent() se activó 15 veces

¿Crees que estos clics no tienen nada que ver con las garrapatas?

A menos que llame a un cambio en la pila que no afecte a la banda de borde (bid/ask) o al flipper, entonces sí, estos disparos no tienen nada que ver con los ticks.


prostotrader:

Hay otro punto esencial que mucha gente olvida.

Es la velocidad con la que el EA toma una decisión al analizar los datos de entrada.

Usando OnBookEvent() en lugar de OnTick(), mi EA será más rápido que el tuyo.

Te equivocas, y te lo digo por milésima vez.

Puede ejecutar este EA en un terminal en dos gráficos: uno en modo "Use OnBookEvent", el segundo - en modo "Use OnTick" (este es el parámetro de entrada). El código dentro de los manejadores de eventos es idéntico (puedes ponerlo en una función separada y llamarlo desde allí, pero ese no es el 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 ) );
};

Y luego mira en el registro del EA, y analiza la hora de recepción de los ticks:


Si encuentra algo interesante (por ejemplo, el tiempo de obtención de un tick(GetTickCount64) desde OnTick es más largo que el mismo tiempo (para el mismo tick) desde OnBook), publíquelo aquí.

 
Andrey Khatimlianskii:

Si no se llama a un cambio en la copa que no afecta a la banda de borde (bid/ask) o flipper, entonces sí, esos disparos no tienen nada que ver con los ticks.


Te equivocas y te lo digo por milésima vez.

Ejecute este EA en un terminal en dos gráficos: uno en modo "Use OnBookEvent", el otro en modo "Use OnTick" (este es el parámetro de entrada). El código dentro de los manejadores de eventos es idéntico (puedes ponerlo en una función separada y llamarlo desde allí, pero ese no es el punto):

Y luego mira en el registro del EA, y analiza la hora de recepción de los ticks:


Si encuentra algo interesante (por ejemplo, el tiempo de obtención de un tick (GetTickCount64) de OnTick es más largo que el tiempo análogo (para el mismo tick) de OnBook), publíquelo aquí.

¡Es como dije!

En la primera línea del registro (trabajo conjunto) hay una confirmación directa de mis explicaciones

OnTick() se activa tarde y, por lo tanto, recibe datos obsoletos


Archivos adjuntos:
20200131.log  220 kb
 
prostotrader:

¡Es como dije!

La primera línea del registro (colaboración) confirma directamente mi explicación

OnTick() se activa tarde, por lo que obtiene datos obsoletos

Muestra algo de información antes de esta pieza de registro.

¿Fue justo después del lanzamiento (las primeras entradas)? ¿En qué orden has ejecutado los EAs?

ps: ver registro adjunto, lo miraré ahora

 
Andrey Khatimlianskii:

Muestra algo de información antes de esta pieza de registro.

¿Fue justo después del lanzamiento (las primeras entradas)? ¿En qué orden has ejecutado los EAs?

Onbook primero, luego ontic, registro adjunto arriba


Razón de la queja: