Появление в торговом терминале  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 ) . 

This entry was posted on Понедельник, 10 июня, 2013 at 07:25 and is filed under QLUA, QUIK DDE. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

14 comments so far

Snowlife
 1 

Здравствуйте! Требуется помощь в написании модуля на C++, который будет забирать данные из quik

11 июня, 2013 at 15:23
Kamynin
 2 

Добрый день,
на сайте указан мой адрес, пишите.

11 июня, 2013 at 16:47
roma095
 3 

Николай, а как часто вы переобучаете сеть?

13 июня, 2013 at 11:43
Kamynin
 4 

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

13 июня, 2013 at 17:26
roma095
 5 

Николай, приветствую. А можно несколько вопросов от нейросетевого чайника?
Буду немного плутать, но надуюсь Вы поймете.
есть некий инструмент. Все экстремумы мы определили. Хаям присвоили единичку, лоям нолик. Цены разворота и объем также собрали.
Вопрос №1 — есть ли смысл подавать в нейросеть промежуточные данные, не являющиеся экстремумами? С одной стороны прогноз следующей точки мы делаем уе не сформировавшемся экстремуме и данные о промежуточных значениях нам не нужны. С другой стороны экстремум формируется не сразу и требуется некоторое время и входить надо на текущей свече. Ее и надо подать на вход, чтобы определить экстремум был настоящий или ложный.

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

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

Ok, подадим на вход последний сформировавшийся экстремум. Если я подам его на вход с маркером Хая, то в прогнозе получу один прогноз, если с маркером лоу, то другой.(прогноз движения вниз и вверх). Я запутался, правильно ли подавать на вход экстремум с указанием какой он? Или если подать два варианта, то и получится два прогноза с одинакой вероятностью и как цена двинулась в нужную сторону, туда и открываться?

Понимаю, что сумбур, однако надеюсь, что ваша нейросеть разберется :))

13 июня, 2013 at 14:18
Kamynin
 6 

Добрый день,
Начну от печки.
Что мы хотим?
Мы хотим построить некую логическую схему, которая может прогнозировать рынок лучше нас.
Нам эта логика неизвестна.
Но мы верим, что существует некоторая логическая связь истории и будущего.
Поэтому , мы не программируем собственные логические рассуждения,
а даем сети лишь исходные данные и ответы.
Ответы мы подглядываем в будущем и хотим,
чтобы сеть по истории эти ответы угадала (спрогнозировала).
~~~~~~~~~~~~~~~~~~
Ответы:
Вопрос №1.
В сеть поступают все данные и задача сети состоит в том, чтобы предсказать экстремумы, т е сказать что он будет, когда его еще нет.
Вопрос номер 2:
Глубина истории,т е сколько точек до экстремума может потребоваться, разная в различных ситуациях. Нам это заранее неизвестно.
Поэтому следующая аксиома: Чем больше история, чем сеть умнее.
Относительно «правильно» или «неправильно».
При создании систем распознавания и прогнозирования — на вопросы «правильно» или «неправильно» отвечает лишь эксперимент.
~~~~~~~~~~~~~~~~~~~~~~~~
Если Вы измените маркировку истории, то тем самым вы изменили историю. Следовательно, сеть будет обучаться по другому.
~~~~~~~~~~~~~~~~~~~~~~~~

13 июня, 2013 at 17:23
roma095
 7 

Почему вы пытаетесь уйти от роботов, основанных не нейросети?

13 июня, 2013 at 19:02
Kamynin
 8 

откуда такие выводы?

13 июня, 2013 at 21:40
roma095
 9 

Николай, а использование нейронной сети,это не подгонка под кривую?(оптимизация)

15 июня, 2013 at 19:18
Kamynin
 10 

Как говорил Козьма Прудков, «Вопрос: А не женится ли мне? -уже содержит ответ»

15 июня, 2013 at 21:15
roma095
 11 

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

16 июня, 2013 at 17:12
Kamynin
 12 

1)Я обучал роботов Васю и Петю на интервалах с 0.1.01.2007 по 2013 гг
2) См. аксиому №1: «Чем история больше, тем робот умнее»

16 июня, 2013 at 18:37
roma095
 13 

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

16 июня, 2013 at 20:45
Kamynin
 14 

Обучение сети подобно обучению человека.
~~~~~~~~~~~~~~~~~~~~~~~~~
Если перед ребенком положить гору книг, то он в лучшем случае их не разорвет, а в худшем оставит лишь клочки страниц.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Практически невозможно научить примитивную нейронную сеть ( малое число узлов) на большом объеме сильно зашумленной информации.
Обучить сложную сеть на этом объеме не удастся из-за нехватки вычислительных ресурсов.
Поэтому первичные признаки (информацию) необходимо преобразовать во вторичные (отфильтровать)
Эти преобразования (фильтры) создают на основе учета природы прогнозируемых явлений ( моделей )
В результате такой фильтрации , если она адекватна желаемой цели, объем шума уменьшается, что существенно улучшает процесс обучения.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Если ребенку показывать книжки с красивыми картинками и называть их, то он научится их распознавать.
Со временем изучит буквы и начнет читать книги.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Вот так и с нейронными сетями.

17 июня, 2013 at 08:51