Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?

MetaQuotes | 13 сентября, 2016

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

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

12 сентября 2016 года были проведены три замера скорости на реальном счете БД "Открытие" на MetaTrader 5 build 1415 и Quik 7.2.23 в одно и то же время. Каждый тест был призван измерить конкретную скоростную характеристику, важную с точки зрения алгоритмического трейдинга:
  1. Тестирование синхронных операций  — серия из 10 синхронных последовательных торговых операций Buy с подтверждением успешности выполнения каждой транзакции на бирже. Последующая операция не производится, пока не будет  получено подтверждение от торгового сервера, что операция прошла/не прошла на бирже. Скорость выполнения зависит от всей цепочки терминал — торговый сервер — биржа — торговый сервер — терминал. Чем меньше будет среднее время торговой синхронной операции, тем лучше.
  2. Тестирование асинхронных операций — серия из 10 асинхронных торговых операций Buy без подтверждения успешности выполнения транзакции. Это чистый тест на скорострельность, измеряющий скорость отправки заявок на биржу. Тут также лучшим будет тот терминал, у которого время выполнения 10-ти асинхронных покупок будет меньше.
  3. Тестирование обновления стакана заявок — замер скорости изменений заявок в Стакане. Это простой подсчет количества тиков (обновлений) Стакана в единицу времени. Чем чаще приходят котировки с биржи в торговый терминал, тем быстрее будет обновляться Стакан. Следовательно, чем больше тиков за секунду поступает в программу автоматической торговли, тем быстрее она может среагировать на изменения в структуре спроса/предложения на рынке. Лучшим будет тот терминал, в котором скорость обновления Стакана выше.


Условия испытаний

Оба терминала установлены на арендованном сервере VPS в Москве, как и сами торговые серверы БД "Открытие". Торговля велась на одном и том же реальном счете в срочной секции Московской биржи инструментом Si-9.6.

Мы записали на видео все три теста одним роликом, чтобы было видно:

  1. торговые операции проводились на одном и том же реальном счете;
  2. и на одном и том же инструменте Si-9.16;
  3. на одном и том же компьютере;
  4. торговые операции проводились в одно и то же время;
  5. в одних и тех же рыночных условиях;
  6. скорости обновления стаканов замерялись на одном и том же инструменте и в одно и то же время;
  7. сетевая задержка до серверов Открытия была 2 мс.

Результаты сравнения скорости торговых операций: MetaTrader 5 vs QUIK

Результаты всех трех тестов собраны в сводной таблице, детальные результаты по каждому тесту представлены ниже отдельными разделами этой статьи.

Тест
MetaTrader 5
QUIK
Выигрыш MT5
Среднее время синхронной операции
9.59 ms277.80 ms28.96 раз
Среднее время асинхронной операции0.09 ms0.30 ms 3.33 раза
Скорость обновления стакана заявок
42.7 раза за сек8.4 раз за сек5.08 раза

Как видно из таблицы, MetaTrader 5 опережает по всем трем тестам со значительным отрывом. Желающие могут самостоятельно провести подобные испытания с помощью приложенных исходных кодов. Само тестирование представлено на видео ниже.


Видео сравнения скорости торговых операций




Выводы:  MetaTrader 5 быстрее QUIK в торговых операциях до 28 раз

Проведенные замеры показали, что язык MQL5 значительно опережает QLUA как в проведении торговых операций на Московской бирже, так и просто в сканировании стакана заявок. Торговые роботы, написанные на языке MQL5, не только считают в 50-600 раз быстрее, но и торгуют до 28 раз быстрее. И при этом вам не нужно изобретать свои велосипеды — приводы, коннекторы и т.д. К вашим услугам готовые торговые классы стандартной библиотеки и масса статей по автоматизации трейдинга.

Надежный торговый робот просто обязан проверять результаты отправки торговых операций — то есть, дожидаться ответа от торгового сервера. Тесты доказали, что MetaTrader 5 значительно быстрее в синхронных операциях. Если же вам нужны асинхронные операции — то и здесь скорость в 3 раза выше. Требуется анализировать поток заявок — и тут MetaTrader 5 даст вам преимущество за счет в 5 раз более быстрого потока котировок без снапшотов.

Проведенные испытания показали, что для создания быстрых автоматических торговых систем язык MQL5 подходит как нельзя лучше. Никакие коннекторы и библиотеки, подключаемые к терминалу QUIK для ускорения расчетов, не спасут: узким местом будет являться само время проведения торговых операций.

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


Детальные отчеты по сравнению терминалов

Программа на QLUA при замере времени обращается к системному таймеру операционной системы, который по умолчанию имеет погрешность измерения в пределах в 10…15.6 миллисекунда (чаще всего — 15.6 мс). Поэтому мы повысили точность замеров времени в QLUA простым повышением точности системного таймера до 1 ms. Сделано это с помощью скрипта на SpeedupSystemTimer.mq5, который вызывает функцию timeBeginPeriod системной библиотеки Winmm.dll

#import "winmm.dll"
int timeBeginPeriod(uint per);
#import

void OnInit()
  {
   timeBeginPeriod(1);
  }

void OnTick()
  {
  }

Этот скрипт мы запустили перед началом тестов в терминале MetaTrader 5 и разрешив вызов DLL, в результате чего обеспечили погрешность измерений операций в терминале QUIK не более 1 миллисекунды.

В языке MQL5 есть готовая функция GetMicrosecondCount(), поэтому замеры в терминале MetaTrader 5 делались с точностью 1 микросекунда (1 миллисекунда=1000 микросекунд).

#1 Тестирование скорости синхронных торговых операций

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

Сначала была проведена серия торговых операций через терминал MetaTrader 5, затем такая же серия была произведена через терминал QUIK.

Суть испытания заключается в измерении среднего времени 10 синхронных операций покупки по рынку 1 лотом:

Измерение времени, затраченного на синхронную транзакцию, проводилось следующим образом:

Результаты замеров показывают, что в синхронных операциях MetaTrader 5 до 28 раз быстрее.


#2 Тестирование скорости асинхронных торговых операций

В этом тесте все значительно проще. Десять раз подряд на биржу отправляется приказ на покупку одного контракта фьючерса Si-9.16. Это позволило нам измерить среднее время асинхронной передачи в QLUA с точностью 1 ms / 10 = 0.10 ms. В MetaTrader 5 погрешности нет, так как в нем используется микросекундный таймер.

Мы не ждем никакого результата наших операций, за каждой отправкой заявки торговому серверу сразу же делается отправка новой заявки:

Как видно из результатов, в асинхронных операциях MetaTrader 5 в 3.33 раза быстрее.


#3 Тестирование обновления стакана заявок

Ряд торговых стратегий строится на анализе потока заявок в стакане. В языке MQL5 событие изменения стакана можно отлавливать в обработчике OnBookEvent(), а в QLUA через OnQuote().

Тесты скорости обновления стаканов проводились с помощью следующих программ, которые доступны в приложенном ZIP-архиве:

В результате последовательного запуска этих программ на двух разных терминалах было зафиксировано, что стакан в MetaTrader 5 обновляется примерно в 5 раза чаще. Скорее всего QUIK просто лимитирует частоту обновлений стакана и не показывает все изменения.

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


Почему такая разница?

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

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