Tiki em tempo real - página 7

 
prostotrader:

Você tem que postar seu código para provar ou refutar algo!

Você se encarregou de provar que existem registros entre eventos OnTick adjacentes, que depois entram na história do CopyTicks e podem ser pegos em tempo real através do OnBookEvent.

Infelizmente, os registros acima não mostram isso.

 
fxsaber:

Você está provando que existem registros entre eventos OnTick adjacentes, que depois entram no histórico do CopyTicks e podem ser pegos em tempo real através do OnBookEvent.

Infelizmente, os registros acima não mostram isso.

Eu o provei postando o código de trabalho e expliquei por que ele funciona mais rápido e em tempo real,

Baseei-me na ajuda da função MQL5 e na experiência pessoal.

Deseja verificar você mesmo? Ou provar o oposto com um código de trabalho.

 
prostotrader:

Eu provei isto postando código de trabalho e explicando porque ele funciona mais rápido e em tempo real.

Infelizmente, quando falta o principal elo de prova na forma de entradas de história do OnTick CopyTicks, ele não pode ser aceito.

 
fxsaber:

Infelizmente, quando o elo principal da prova está faltando sob a forma de registros de história do OnTick CopyTicks, ela não pode ser aceita.

Então, qual é o problema?

Confira por si mesmo.

 
prostotrader:

Então, o que é isso?

Confira por si mesmo.

Apenas assinalou que sua prova não pode ser aceita somente por motivos lógicos, e não como contraditória a qualquer outro ponto de vista.

 
fxsaber:

Apenas assinalou que sua prova não pode ser aceita somente por razões lógicas, e não tão contraditórias quanto qualquer outro ponto de vista.

OK, estou vendo, mas ainda sugiro a leitura da ajuda no OnBookEvent()

Não vou provar nada, apenas escrevi um código de trabalho no assunto do tópico e expliquei (a pedido dos usuários do fórum)

Porque este método é melhor que o OnTick(), se alguém não acredita em mim, deixe-o verificar ele mesmo!

Ou afixar um código de trabalho que refuta a minha explicação.

Adicionado por

Há milhares de pessoas da FOREX aqui no fórum que nunca trabalharam com o OnBookEvent()

E com um tumblr.

O que devo fazer por todos que vão postar neste tópico?

 
prostotrader:

Hora do primeiro OnTick()2020.01.30 19:31:11.112

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

Ou seja, 690 ms passaram, entretanto, entre os 690 ms

OnBookEvent() foi acionado 15 vezes

Você acha que esses cliques não têm nada a ver com carrapatos?

A menos que você chame uma mudança na pilha que não afete a faixa de borda (bid/ask) ou flipper, então sim, estes gatilhos não têm nada a ver com carrapatos.


prostotrader:

Há outro ponto essencial que muitas pessoas esquecem.

É a velocidade com que a EA toma uma decisão, analisando os dados de entrada.

Usando OnBookEvent() em vez de OnTick(), minha EA será mais rápida do que a sua.

Você está enganado, e eu lhe digo isto pela milésima vez.

Você pode executar esta EA em um terminal em dois gráficos: um no modo "Use OnBookEvent", o segundo - no modo "Use OnTick" (este é o parâmetro de entrada). O código dentro dos manipuladores de eventos é idêntico (você pode colocá-lo em uma função separada e chamá-lo de lá, mas não é essa a questão):

//---
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, em seguida, olhar no registro do EA, e analisar o tempo de recebimento do tick:


Se você encontrar algo interessante (por exemplo, o tempo de receber um tick(GetTickCount64) do OnTick é maior do que o mesmo tempo (para o mesmo tick) do OnBook), poste-o aqui.

 
Andrey Khatimlianskii:

Se você não chamar uma mudança no copo que não afete a faixa de borda (bid/ask) ou flipper, então sim, esses gatilhos não têm nada a ver com carrapatos.


Você está enganado e eu lhe digo isto pela milésima vez.

Execute este EA em um terminal em dois gráficos: um no modo "Use OnBookEvent", o outro no modo "Use OnTick" (este é o parâmetro de entrada). O código dentro dos manipuladores de eventos é idêntico (você pode colocá-lo em uma função separada e chamá-lo de lá, mas não é essa a questão):

E, em seguida, olhar no registro da EA, e analisar o tempo de recebimento do tick:


Se você encontrar algo interessante (por exemplo, o tempo de receber um tick (GetTickCount64) do OnTick é maior que o tempo análogo (para o mesmo tick) do OnBook), poste-o aqui.

É exatamente como eu disse!

Na primeira linha do registro (trabalho conjunto) é uma confirmação direta de minhas explicações

OnTick() é acionado tardiamente, e portanto recebe dados desatualizados


Arquivos anexados:
20200131.log  220 kb
 
prostotrader:

É exatamente como eu disse!

Na primeira linha do registro (trabalho colaborativo) uma confirmação direta de minha explicação

OnTick() é acionado tardiamente, portanto fica com dados desatualizados

Mostrar algumas informações antes deste pedaço de tronco.

Foi logo após o lançamento (as primeiras entradas)? Em que ordem você dirigiu os EAs?

ps: veja o diário de bordo em anexo, vai olhar para ele agora

 
Andrey Khatimlianskii:

Mostrar algumas informações antes deste pedaço de tronco.

Foi logo após o lançamento (as primeiras entradas)? Em que ordem você dirigiu os EAs?

Onbook primeiro, depois ontic, log anexado acima