Тики в реальном времени - страница 7

 
prostotrader:

Вы должны выложить Ваш код, чтобы что-то доказать или опровергнуть!

Вы взялись доказать, что между соседними OnTick-событиями имеются записи, которые попадают потом в CopyTicks-историю и могут быть отловлены в реальном времени через OnBookEvent.

К сожалению, из приведенных логов этого не видно.

 
fxsaber:

Вы взялись доказать, что между соседними OnTick-событиями имеются записи, которые попадают потом в CopyTicks-историю и могут быть отловлены в реальном времени через OnBookEvent.

К сожалению, из приведенных логов этого не видно.

Я доказал это выложив рабочий код и объяснил почему он работает быстрее и в реальном времени,

основываясь на справке к функциям MQL5 и личном опыте.

Хотите сами проверяйте. Или докажите рабочим кодом обратное.

 
prostotrader:

Я доказал это выложив рабочий код и объяснил почему он работает быстрее и в реальном времени.

К сожалению, когда отсутствует основное звено доказательства в виде пропущенных OnTick записей CopyTicks-истории, оно не может быть принято.

 
fxsaber:

К сожалению, когда отсутствует основное звено доказательства в виде пропущенных OnTick записей CopyTicks-истории, оно не может быть принято.

Так в чем дело?

Проверьте сами.

 
prostotrader:

Так в чем дело?

Проверьте сами.

Лишь указал, что ваше доказательство не может быть принято исключительно из логических соображений, а не как противоречащее какой-то другой точке зрения.

 
fxsaber:

Лишь указал, что ваше доказательство не может быть принято исключительно из логических соображений, а не как противоречащее какой-то другой точке зрения.

Ок, понятно, по все же посоветую прочитать справку по OnBookEvent()

Я и не собирался что-то доказывать, просто написал рабочий код в тему топика, и объяснил (по просьбе форумчан)

почему этот метод лучше чем OnTick(), если кто-то не верит, то пусть проверяет сам!

Или выложит рабочий код, который опровергает мои объяснения.

Добавлено

Здесь, на форуме, тысячи ФОРЕКСников, которые никогда не работали с OnBookEvent()

и со стаканом.

Что я должен что-то делать для каждого кто будет писать в этой теме? 

 
prostotrader:

Время первого OnTick() 2020.01.30 19:31:11.112

время второго OnTick() 2020.01.30 19:31:11.802

Т.е прошло 690 мс, тем временем, между OnTick() за эти 690 мс

15 раз сработал OnBookEvent() 

Вы считаете что это срабатывания не имеют отношения к тикам?

Если не называть тиком изменение стакана, которое не влияет на крайний банд (бид/аск) или ласт, то да, эти срабатывания не имеют отношения к тикам.


prostotrader:

Есть еще один существенный момент о котором многие забывают.

Это скорость принятия решения советником, анализируя входные данные.

Используя OnBookEvent() вместо OnTick() мой советник окажется быстрее Вашего.

Вы заблуждаетесь, и я вам об этом говорю в тысячный раз.

Запустите на одном терминале вот этого советника на двух графиках: одного в режиме "Use OnBookEvent", второго — в режиме "Use OnTick" (это входной параметр). Код внутри обработчиков событий идентичный (можно вынести его в отдельную функцию и вызывать от-туда, но не суть):

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

А потом загляните в журнал советников, и проанализируйте время получения тиков:


Если найдете что-то интересное (например, время получения тика (GetTickCount64) из ОнТик больше, чем аналогичное (для того же тика) из ОнБук), выкладывайте сюда.

 
Andrey Khatimlianskii:

Если не называть тиком изменение стакана, которое не влияет на крайний банд (бид/аск) или ласт, то да, эти срабатывания не имеют отношения к тикам.


Вы заблуждаетесь, и я вам об этом говорю в тысячный раз.

Запустите на одном терминале вот этого советника на двух графиках: одного в режиме "Use OnBookEvent", второго — в режиме "Use OnTick" (это входной параметр). Код внутри обработчиков событий идентичный (можно вынести его в отдельную функцию и вызывать от-туда, но не суть):

А потом загляните в журнал советников, и проанализируйте время получения тиков:


Если найдете что-то интересное (например, время получения тика (GetTickCount64) из ОнТик больше, чем аналогичное (для того же тика) из ОнБук), выкладывайте сюда.

Все как я и говорил!

В первой же строчке лога (совместная работа) прямое подтверждение моих объяснений

OnTick() позднее срабатывает, в следствии чего получает устаревшие данные


Файлы:
20200131.log  220 kb
 
prostotrader:

Все как я и говорил!

В первой же строчке лога (совместная работа) прямое подтверждение моих объяснений

OnTick() позднее срабатывает, в следствии чего получает устаревшие данные

Покажите немного информации перед этим куском лога.

Это прямо после запуска было (самые первые записи)? В каком порядке запускали советников?

ps: вижу прикрепленный лог, сейчас посмотрю

 
Andrey Khatimlianskii:

Покажите немного информации перед этим куском лога.

Это прямо после запуска было (самые первые записи)? В каком порядке запускали советников?

Сначала онбук, потом онтик, лог прикреплен выше