Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
MetaQuotes | 13 сентября, 2016
Многие трейдеры зачастую не задумываются над тем, как быстро доходит их заявка до биржи, как долго она там исполняется и когда торговый терминал трейдера узнает о результате.
В результате они не знают, что легко могут улучшить качество исполнения своих сделок за счет более быстрой реакции и скорости проведения транзакций.
- Тестирование синхронных операций — серия из 10 синхронных последовательных торговых операций Buy с подтверждением успешности выполнения каждой транзакции на бирже. Последующая операция не производится, пока не будет получено подтверждение от торгового сервера, что операция прошла/не прошла на бирже. Скорость выполнения зависит от всей цепочки терминал — торговый сервер — биржа — торговый сервер — терминал. Чем меньше будет среднее время торговой синхронной операции, тем лучше.
- Тестирование асинхронных операций — серия из 10 асинхронных торговых операций Buy без подтверждения успешности выполнения транзакции. Это чистый тест на скорострельность, измеряющий скорость отправки заявок на биржу. Тут также лучшим будет тот терминал, у которого время выполнения 10-ти асинхронных покупок будет меньше.
- Тестирование обновления стакана заявок — замер скорости изменений заявок в Стакане. Это простой подсчет количества тиков (обновлений) Стакана в единицу времени. Чем чаще приходят котировки с биржи в торговый терминал, тем быстрее будет обновляться Стакан. Следовательно, чем больше тиков за секунду поступает в программу автоматической торговли, тем быстрее она может среагировать на изменения в структуре спроса/предложения на рынке. Лучшим будет тот терминал, в котором скорость обновления Стакана выше.
Условия испытаний
Оба терминала установлены на арендованном сервере VPS в Москве, как и сами торговые серверы БД "Открытие". Торговля велась на одном и том же реальном счете в срочной секции Московской биржи инструментом Si-9.6.
Мы записали на видео все три теста одним роликом, чтобы было видно:
- торговые операции проводились на одном и том же реальном счете;
- и на одном и том же инструменте Si-9.16;
- на одном и том же компьютере;
- торговые операции проводились в одно и то же время;
- в одних и тех же рыночных условиях;
- скорости обновления стаканов замерялись на одном и том же инструменте и в одно и то же время;
- сетевая задержка до серверов Открытия была 2 мс.
Результаты сравнения скорости торговых операций: MetaTrader 5 vs QUIK
Результаты всех трех тестов собраны в сводной таблице, детальные результаты по каждому тесту представлены ниже отдельными разделами этой статьи.
Тест | MetaTrader 5 | QUIK | Выигрыш MT5 |
---|---|---|---|
Среднее время синхронной операции | 9.59 ms | 277.80 ms | 28.96 раз |
Среднее время асинхронной операции | 0.09 ms | 0.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 лотом:
- SyncTradeTest.mq5
- SyncTradeTest.lua
Измерение времени, затраченного на синхронную транзакцию, проводилось следующим образом:
- В языке MQL5 есть синхронная функция OrderSend, а время легко замерить в начале и конце серии сделок.
- В языке QLUA нет синхронной торговой функции и поэтому статус сделки приходится отлавливать отдельно. Время старта торговой операции замерялось непосредственно перед вызовом sendTransaction () с помощью функции os.closck(). Успешное выполнение транзакции отслеживалось во встроенном обработчике OnOrder() на первом вызове в момент, когда приходило событие о совершении сделки на бирже. Разница между этими событиями и есть время, потраченное на выполнение торговой операции.
#2 Тестирование скорости асинхронных торговых операций
В этом тесте все значительно проще. Десять раз подряд на биржу отправляется приказ на покупку одного контракта фьючерса Si-9.16. Это позволило нам измерить среднее время асинхронной передачи в QLUA с точностью 1 ms / 10 = 0.10 ms. В MetaTrader 5 погрешности нет, так как в нем используется микросекундный таймер.
Мы не ждем никакого результата наших операций, за каждой отправкой заявки торговому серверу сразу же делается отправка новой заявки:
- AsyncTradeTest.mq5
- AsyncTradeTest.lua
#3 Тестирование обновления стакана заявок
Ряд торговых стратегий строится на анализе потока заявок в стакане. В языке MQL5 событие изменения стакана можно отлавливать в обработчике OnBookEvent(), а в QLUA через OnQuote().
Тесты скорости обновления стаканов проводились с помощью следующих программ, которые доступны в приложенном ZIP-архиве:
- MarketUpdateTest.mq5
- MarketUpdateTest.lua
В результате последовательного запуска этих программ на двух разных терминалах было зафиксировано, что стакан в MetaTrader 5 обновляется примерно в 5 раза чаще. Скорее всего QUIK просто лимитирует частоту обновлений стакана и не показывает все изменения.
Почему такая разница?
Мы фанатично относимся к производительности и боремся за каждый десяток микросекунд, годами оптимизируя торговую платформу.
Именно поэтому мы показываем потрясающую производительность встроенного алгоритмического языка MQL5 и скорость торговых транзакций.