1

Тема: Требования к роботу

Требуется робот-арбитражер для парного трейдинга с акциями и фьючерсами.
Главные требования:
1. Скорость работы – максимально быстрая скорость постановки, снятия и перестановки заявки при изменении цены в стакане – желательно не более 0.1сек.
2. Отсутствие торможения – отсутствие замедления и сбоев в работе при выставлении заявок по 15-20 парам инструментов, при отслеживании до 40-60 пар (отслеживание возможно не в режиме реального времени, а периодически – 1раз в 1-5 минут).
Не нужно: никаких графиков, индикаторов, проверки на истории, возможностей постановки заявок вручную.
Собственно такой робот у меня есть (написан мной на Delphi), но он работает через передачу по ODBC в базу данных и затем чтения из нее, что замедляет постановку заявки более чем на 1.5 сек.
Вопрос: возможно ли написание такого робота на Lua с передачей данных по DDE и постановкой заявок через API или требования слишком завышены?
Нового робота сам писать не хочу (только если никто не согласится написать за разумные деньги), но перед тем как искать исполнителя хочу выяснить: на чем лучше писать, какие механизмы использовать для передачи данных из Квика в робота и обратно?

2

Re: Требования к роботу

Balug пишет:

1. Скорость работы – максимально быстрая скорость постановки, снятия и перестановки заявки при изменении цены в стакане – желательно не более 0.1сек.

Здесь вы упретесь не в Lua, а в общую скорость реакции терминала QUIK - сервер - биржа.
Видимые на разных форумах времена в сообщениях разнились от 0,05 до 0,25 сек.
Причем типичное значение - это примерно 0,2 сек (речь про время отправка транзакции -> получение на неё ответа).
Скорость самой реакции на изменение стакана (т.е. время изменился стакан -> отправили транзакцию) будет меньше, конечно.

Balug пишет:

2. Отсутствие торможения – отсутствие замедления и сбоев в работе при выставлении заявок по 15-20 парам инструментов

Про сбои - это уж как код напишете )
Про замедление - тут опять же смотря как вы его планируете оценивать.
В самом деле, пусть собственно время на отправку транзакции (имеется ввиду за пределами нашей пограммы, т.е. отправили транзакцию и она едет на биржу из терминала) у нас условно будет 0,05 сек. Вполне типичное время, даже скорее нижняя граница.
Тогда отправка заявок по 20-ти парам инструментов у нас условно займет 0,05 * 20 * 2 = 2 сек.

2 секунды - это весьма много вообще говоря. Даже для Lua.
Выходит собственно задержки в Lua-коде у нас много меньше задержек не зависящих от нас.

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

достигните ли вы в итоге желаемые параметры - вопрос, но вряд ли тут Lua будет виновата, расчеты см. выше.

А написать простого робота на один инструмент, чтобы попробовать и поизменять время - по-моему вполне разумные затраты времени и не такие уж большие. Чтобы уже можно было точно сказать: да, подходит, или нет, точно не подходит. Да и ничего страшного там совершенно нет.

3

Re: Требования к роботу

swerg пишет:

Здесь вы упретесь не в Lua, а в общую скорость реакции терминала QUIK - сервер - биржа.
Видимые на разных форумах времена в сообщениях разнились от 0,05 до 0,25 сек.
Причем типичное значение - это примерно 0,2 сек (речь про время отправка транзакции -> получение на неё ответа).
Скорость самой реакции на изменение стакана (т.е. время изменился стакан -> отправили транзакцию) будет меньше, конечно.

Спасибо за ответ, но во-первых у меня ping до брокера 25-27 млсек, от брокера до биржи (по утверждению брокера) меньше 10млсек, итого меньше 0.04 сек

swerg пишет:

В самом деле, пусть собственно время на отправку транзакции (имеется ввиду за пределами нашей пограммы, т.е. отправили транзакцию и она едет на биржу из терминала) у нас условно будет 0,05 сек. Вполне типичное время, даже скорее нижняя граница.
Тогда отправка заявок по 20-ти парам инструментов у нас условно займет 0,05 * 20 * 2 = 2 сек.

Во-вторых заявки по 20 парам естественно не будут отправляться одновременно (одновременно будет отслеживаться только изменение цены в стакане), я думаю разница в отправке заявок всегда будет более 1 сек, разве что случайно совпадет отправление одновременно 2-х заявок.
Поэтому вопрос будет упираться 1) во время математической обработки полученной информации роботом написанным на Lua + 2) время передачи по DDE + 3) отправка сигнала через API. По 1 пункту я мало что знаю, но боюсь, что это будет существенно медленнее, чем при написании на Delphi или C#, поэтому и думаю, что проще будет передать  информацию полученную из Квика в стороннюю программу (тем более, что у меня она уже написана). По 2 пункту - насколько я знаю, передача по DDE достаточно медленная и устаревшая, и должны существовать какие-то более быстрые механизмы - если кто-то знает, подскажите, пожалуйста.

swerg пишет:

А написать простого робота на один инструмент, чтобы попробовать и поизменять время - по-моему вполне разумные затраты времени и не такие уж большие. Чтобы уже можно было точно сказать: да, подходит, или нет, точно не подходит.

Ну по мне так, что написать робота на 1 инструмент, что на 20 разница невелика, вопрос в другом. Я ни разу не программист, поэтому изучение нового языка это проблема и очень не хочется оказаться в положении человека затратившего время на изучение языка, затем написание программы, чтобы в конце концов убедиться, что она не подходит для решения данной задачи:). Потому и прошу тех, кто писал на Lua, подсказать насколько данный язык подходит для решения указанной проблемы.

4 (2017-02-06 22:31:43 отредактировано swerg)

Re: Требования к роботу

Balug пишет:

Спасибо за ответ, но во-первых у меня ping до брокера 25-27 млсек, от брокера до биржи (по утверждению брокера) меньше 10млсек, итого меньше 0.04 сек

Всё, конечно, надо проверять, но пинг не показателен.
Он показателен при сравнении - тут больше, там - меньше.
Но сама цифра пинга обычно заметно меньше (в 2..3 раза запросто) времени выставления заявки при этом.

Чтобы можно было что-то ответить на ваш вопрос - надо знать объём вычислений. Но вы про это сколь-нибудь подробно не говорите.
Если ваши вычисления это сравнить/перемножить 50 чисел - можно смело писать на Lua.
Если ваши вычисления это перемножить 10 тыс. чисел - Lua тут не помощник.

DDE сама по себе очень быстрая технология на самом деле.
Другое дело, что писать на Lua + своя DLL на С++ или Delphi (только для тяжелых объёмных вычислений) - по-моему сейчас самый выгодный вариант в плане скорости и гибкости.

5

Re: Требования к роботу

swerg пишет:

Чтобы можно было что-то ответить на ваш вопрос - надо знать объём вычислений. Но вы про это сколь-нибудь подробно не говорите.
Если ваши вычисления это сравнить/перемножить 50 чисел - можно смело писать на Lua.

Это действительно сравнить/перемножить 50 чисел, но для каждой пары инструментов, а пар таких 15-20

swerg пишет:

DDE сама по себе очень быстрая технология на самом деле.
Другое дело, что писать на Lua + своя DLL на С++ или Delphi (только для тяжелых объёмных вычислений) - по-моему сейчас самый выгодный вариант в плане скорости и гибкости.

Я тоже прихожу к такому мнению. Тем более, что программа на Delphi уже есть. Значит, как я понял, надо написать свою DLL на Delphi. Не подскажите примеры таких DLL, никогда не поверю, что их никто не писал:).

6

Re: Требования к роботу

Соседний раздел, прикреплённые темы
https://quik2dde.ru/viewforum.php?id=14

7

Re: Требования к роботу

Спасибо, это я видел. Но к моему изумлению это ЕДИНСТВЕННЫЙ пример в интернете, который мне удалось найти. Может быть есть еще что-нибудь? Сами знаете, примеров много не бывает:)

8

Re: Требования к роботу

Примеров в интернете масса. "С++ Lua" в гугле - и примеров вагон )
Да и рядом в том же разделе можно найти еще примеры готовых библиотечек под разные задачи:
https://quik2dde.ru/viewtopic.php?id=61
https://quik2dde.ru/viewtopic.php?id=78

Но я бы другое спросил: чего не хватает в приведённых примерах? может просто задать там предметный вопрос - возможно, на него сыщется ответ.

9

Re: Требования к роботу

Balug пишет:

По 1 пункту я мало что знаю, но боюсь, что это будет существенно медленнее, чем при написании на Delphi или C#, поэтому и думаю, что проще будет передать  информацию полученную из Квика в стороннюю программу (тем более, что у меня она уже написана).

Это все мнимые понарошки, придуманные не известно кем, возможно даже мелкософтом. Lua код уже выполнится, а сторонняя программа только будет парсить то, что вы передадите в нее из квик, не важно, через DDE или "хитропопый" коннектор.
У меня на С# коннектор к Астс и робот в ко-локации (15-30 мс расчет 0 мс регистрация заявки на бирже), логическая копия робота на Lua в квике из дома (оптика до квартиры и 20 км от ЦОД: 1 мс расчет, 0-160 мс регистрация заявки).

Так вот, из дома робот периодически раньше заявки регистрирует на бирже. А сам алгоритм написанный на Луа считает быстрее аналогичного на С# минимум в 15 раз.

Мое мнение: C# - днище, не даром ни одной игрухи не написано на С#. А на Луа ко многим играм пишут сценарии.

Но это сугубо мое мнение.