Привет все посетителям.
Решил Вас порадовать новым творением.
Условия испытаний все те же.
Без плечей и без реинвестирования прибыли.
Период 3000 свечей с таймом 5 минут, т е май-июнь 2013
А вот и результаты:
Появление в торговом терминале QUIK встроенного скриптового языка LUA создает предпосылки разработки полноценных и универсальных торговых роботов на его основе. Однако, существенным недостатком любых скриптовых языков, реализованных с использованием виртуальных машин, является их относительно низкое быстродействие.
Язык LUA считается сравнительно быстродействующим скриптовым языком.
Однако, хотелось бы знать, насколько велики потери в скорости вычислений при его применении и имеет ли практический смысл использовать комбинированные способы реализации роботов на основе торгового терминала QUIK.
Для ответа на поставленные вопросы, я реализовал следующее тестовое решение.
Я написал на C++ API для QLUA два варианта получения информации из торгового терминала.
Полученные результаты полезнее рассматривать не в абсолютных величинах, а в относительных.
Вариант 1:
Все функции обратного вызова ( OnAllTrade, OnQuote и т д) реализованы на С++.
На C++ реализованы таблицы для приема и хранения всех доступных на стороне виртуальной машины QLUA таблиц QUIK.
Скорость обращение к таблицам на С++ составляет не более 0.1 мкс на ячейку. Поэтому в дальнейших расчетах, их влиянием я пренебрегаю.
Вариант 2:
На стороне QLUA на С++ реализован сервер DDE.
Таким образом, получаем возможность сравнить скорость получения данных из торгового терминала QUIK через встроенные функции обратного вызова ( далее этот способ называется QLUA ) и DDE.
Замечу, что я оцениваю скорость преобразования этих данных лишь на стороне QLUA.
Полное быстродействие робота определяется как минимум тремя составляющими : скоростью канала связи, скоростью преобразования информации в торговом терминале и скоростью преобразований на стороне QLUA.
В результате изучения работы QUIK стало ясно, что на стороне QUIK наиболее удачно решена задача формирования данных для функций обратного вызова QLUA.
В этом случае данные формируются на основе первичных данных QUIK и раньше формирования информации для передачи по каналу DDE.
Информация для DDE формируется на основе данных подготовленных для отображения в экранных окнах торгового терминала QUIK.
Таким образом, потенциально на стороне торгового терминала QUIK мы имеем более высокую скорость подготовки данных для функций обратного вызова QLUA, по сравнению с DDE.
Казалось бы, что QLUA быстрее, чем DDE.
Увы, как показали эксперименты, скорость обработки информации на стороне QLUA полностью устраняет указанное преимущество.
Эксперимент 1:
Передача таблицы всех сделок через OnAllTrade QLUA показала время 15 мкс на строку таблицы для функций обратного вызова и 50 мкс для получения строки с использованием функции getItem.
Для механизма DDE удалось достичь времени приема и преобразования данных на стороне QLUA в 6- 11 мкс.
Эксперимент 2:
Передача очереди заявок (стаканов) через OnQuote QLUA показал время 480-500 мкс для функций обратного вызова. Основное время в этом случае затрачивается на получение стакана функцией getQouteLevel2.
Для механизма DDE удалось достичь времени приема и преобразования данных на стороне QLUA в 6- 11 мкс.
Резюме:
1) В существующей реализации функций обратного вызова, в тех случаях, когда из QUIK в LUA передается таблица, содержащая строку таблицы QUIK ( к ним не относятся такие важные для создания робота функции обратного вызова, как OnParam, OnQuote) , скорость получения информации через механизм функций обратного вызова сопоставим со скоростью DDE .
2) Но , скорость существенно меньше ( для OnQuote в 40-50 раз ), если для получения строки таблицы QUIK приходится применять встроенные функции QLUA ( getQouteLevel2 и getItem ) .