MT5 и скорость в боевом исполнении - страница 65

 
fxsaber:
Находился за компом, никаких расчетов не делал. Ничем не нагружал CPU.

19 и 48 мс длилось выполнение SymbolInfoTick. Несколько десятков случаев, когда длительность была сотни микросекунд. Но их не стал приводить.


Видимо, для воспроизведения нужно запускать на сутки боевые советники, а потом только смотреть. По-моему, нереально разобраться, что является инициатором таких лагов.

 Иногда комп может качать обновления или выполнять какие-то служебные задачи. Ещё перепад напряжения сети может влиять. Так можно добраться до программируемых сетевых карт, где вся логика бота на уровне железа зашита :) но и там будут задержки, связанные с флюктуациями квантового поля 
 
Maxim Dmitrievsky:
 Иногда комп может качать обновления или выполнять какие-то служебные задачи. Ещё перепад напряжения сети может влиять. Так можно добраться до программируемых сетевых карт, где вся логика бота на уровне железа зашита :) но и там будут задержки, связанные с флюктуациями квантового поля 

Разработчики сделали все, что могли. И без этого в ветке предоставлен код, который показывает, как стакан отстает от Обзора рынка и наоборот. Как нарушена последовательность прихода тиков и, наверное, что-то еще. В общем, неприятный валидный код выложен для воспроизведения других ситуаций.

 
Anton:

SymbolInfoTick отдает данные, полученные от сервера брокера. Что сервер прислал, то вы и получаете.

Подскажите, функция SymbolInfoTick() в блокирующим режиме выполняется или в неблокирующем?

Например она находится в теле цикла while, и пропала связь или рынок закрыт на выходные,
то она заблочится остановив цикл? или выполнится асинхронно? 

 
fxsaber:

как стакан отстает от Обзора рынка и наоборот. 

   т.е SymbolInfoTick ловит новый тик, а через опрос стакана (не дожидаясь события изменение стакана) получаем другие Ask и Bid ? Где то год назад такое было невозможно. SymbolInfoTick и CopyTick и опрос стакана всегда приводили к одному и тому же тику. Если же получать тики через всякие OnXXX функции, конечно что-то получите через одни функции, что-то через другие...

 
pivomoe:

   т.е SymbolInfoTick ловит новый тик, а через опрос стакана (не дожидаясь события изменение стакана) получаем другие Ask и Bid ?

Здесь.

 
fxsaber:

Здесь.

  Как я и думал вы занимаетесь тестом OnBookEvent и OnTick, а не MarketBookGet и SymbolInfoTick. Если бы вы тестировали по такой схеме у вас бы все совпадало:

  

While(1)
{
 Sleep(1)
 Запрос тика через SymbolInfoTick
 Запрос тика через стакан MarketBookGet
 Проверка на совпадение. 
}

p.s Прочитал ваши посты ниже. Вижу вы и сами это понимаете. Зачем вам вообще нужны  OnBookEvent и OnTick ? В моем примере Sleep(1) выполняется 1-2 миллисекунды.  Запрос и тика с помощью SymbloInfoTick меньше МИКРОсекунды. Процесор и так 99.9% времени если нет тиков отдыхает. В чем выгода использования  OnBookEvent и OnTick ?

 
pivomoe:

Как я и думал вы занимаетесь тестом OnBookEvent и OnTick, а не MarketBookGet и SymbolInfoTick. Если бы вы тестировали по такой схеме у вас бы все совпадало:  

p.s Прочитал ваши посты ниже. Вижу вы и сами это понимаете. Зачем вам вообще нужны  OnBookEvent и OnTick ? В моем примере Sleep(1) выполняется 1-2 миллисекунды.  Запрос и тика с помощью SymbloInfoTick меньше МИКРОсекунды. Процесор и так 99.9% времени если нет тиков отдыхает. В чем выгода использования  OnBookEvent и OnTick ?

Без намека на дипломатию, несете ахинею. Sleep(1) - это десяток миллисекунд. Вижу только одно теоретизирование.

Пользователи в OnTick хотят видеть свежий тик, а не тот, что пришел в Терминал когда-то. В исходный код можно запихать SymbolInfoTick сразу после MarketBookGet.


Разработчики своим молчанием полностью признали наличие двух проблем.

 
fxsaber:

Без намека на дипломатию, несете ахинею. Sleep(1) - это десяток миллисекунд. Вижу только одно теоретизирование.

Пользователи в OnTick хотят видеть свежий тик, а не тот, что пришел в Терминал когда-то. В исходный код можно запихать SymbolInfoTick сразу после MarketBookGet.


Разработчики своим молчанием полностью признали наличие двух проблем.

Не всегда и не везде десяток миллисекунд. Проверяется простым скриптом

//+------------------------------------------------------------------+
//|                                                    TestSleep.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#define ITERATIONS 10000
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1=GetMicrosecondCount();
   for(int i=0; i<ITERATIONS; i++)
     {
      Sleep(1);
     }
   ulong t2=GetMicrosecondCount()-t1;
   PrintFormat("total %I64u microseconds (%.3f ms per iteration)",t2,double(t2)/(ITERATIONS*1000.0));
  }
//+------------------------------------------------------------------+

Вот мой лог

2020.11.04 13:14:31.590 TestSleep (EURUSD,H1)   total 17058138 microseconds (1.706 ms per iteration)

Пользователи OnTick всегда видят свежайший тик.

Пользователи OnBookEvent всегда видят свежайший тик.

Но если Вы хотите сравнить тики, полученный в OnTick и полученный в OnBookEvent, тогда вас ждёт разочарование, так как обработка событий производится последовательно, а не параллельно. О чём Вам попытался сказать пользователь pivomoe

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Slava:

Не всегда и не везде десяток миллисекунд. Проверяется простым скриптом

Вот мой лог

Ну а вот мой лог.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{
  for (int i = 0; i < 5; i++)
    _BV(Sleep(1), 1);
}

Результат.

2020.11.04 15:19:32.565 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 5326 mcs.
2020.11.04 15:19:32.580 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14928 mcs.
2020.11.04 15:19:32.596 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15930 mcs.
2020.11.04 15:19:32.611 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14910 mcs.
2020.11.04 15:19:32.627 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15941 mcs.

Пользователи OnTick всегда видят свежайший тик.

Пользователи OnBookEvent всегда видят свежайший тик.

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

2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 6564 mcs.
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [0] 1.17192 1.17192     true     108150
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [1] 1.17192 1.17192    false         30
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [2] 1.17189 1.17191     true      88210
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [3] 1.17189 1.17191    false       6564
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 3888 mcs.
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [0] 1.17192 1.17192    false     117471
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [1] 1.17192 1.17192     true         11
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [2] 1.17192 1.17193     true     882710
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [3] 1.17192 1.17193    false       3888
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       Alert: OnTick-lag! - 4653 mcs.
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [0] 1.17195 1.17195     true      86660
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [1] 1.17195 1.17195    false         11
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [2] 1.17194 1.17194    false     220122
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [3] 1.17194 1.17194     true       4653

Пометил одинаковые тики, которые получены в разных On-функциях соответствующими методами. Отставание может доходить до десятков миллисекунд, если запустить не на одном чарте, а на шести, например.

Но если Вы хотите сравнить тики, полученный в OnTick и полученный в OnBookEvent, тогда вас ждёт разочарование, так как обработка событий производится последовательно, а не параллельно. О чём Вам попытался сказать пользователь pivomoe

Если практически пустой OnBookEvent/OnTick срабатывает на 20 миллисекунд позже соответствующего почти пустого OnTick/OnBookEvent, то это нормально?


ЗЫ Раз обратили внимание на ветку, то здесь еще один воспроизводящий код есть. Там в Обзор рынка приходят тики со временем более ранним, чем время Обзора рынка до этого.

 
fxsaber:

Если практически пустой OnBookEvent/OnTick срабатывает на 20 миллисекунд позже соответствующего почти пустого OnTick/OnBookEvent, то это нормально?


Очередь эксперта - это блокируемый ресурс. Когда в очередь записывается событие, эксперт ждёт (если конечно эксперт в данный момент не обрабатывает какое-либо событие)

События для эксперта поступают из очереди событий соответствующего графика, которые в свою очередь поступают из цикла обработки соответствующего символа. И этот цикл обработки не только раздаёт события своим графикам, но и занимается кучей разных дел.

Я уже Вам говорил, что ОС Windows не является операционной системой реального времени.