Есть мнение, что сделать робота очень сложно. Это под силу только крутым программистам. Попробую опровергнуть — чтобы сделать робота достаточно уметь хорошо пользоваться поиском и знать азы программирования в рамках школьной/институтской программы.
Большинство задач решается операторами
if,
while,
repeat и иногда
for. Плюс специфические функции для взаимодействия с торговой платформой.
Будет этот робот зарабатывать или нет зависит уже не от навыков програмирования, а от заложенной в него логики.
Напишем простейшего робота на qlua для Квика, который будет покупать/продавать волатильность на опционах
путем покупки синтетического стрэдла
www.option.ru/glossary/strategy/long-straddle
или продажи синтетического стрэдла
www.option.ru/glossary/strategy/short-straddle
Изначально этот робот ничего на зарабатывает, а лишь помогает открыть нужную позицию.
Самое сложное в роботе на qlua для Квика это написать логику отслеживания заявок и сделок по инструменту.
Можно не изобретать велосипед, а поискать готовые решения, напрмер здесь:
forum.qlua.org/forum7.html
Мне ближе другой вариант:
smart-lab.ru/blog/195508.php
Не знаю мотивации автора этого фреймворка, но по мне это просто подарок.
Еще нам пригодится руководство по lua
www.lua.ru/doc/ и qlua
quik.ru/user/download/
Если не знаете как пользоваться какой-то функцией для взаимодействия с Квиком, то ищем
на форуме
forum.quik.ru/search/ и старом форуме
forum-archive.quik.ru/forum/search/
При должном умении и везении, там можно найти почти готовые куски кода.
Наш робот должен делать 2 простые вещи — выставить заявку на опционе и при открытии позиции сделать соответсвующую сделку с базовым активом. Этот робот простейший и он не будет рассчитывать дельту позиции, а будет делать сделки на опционе и базовом активе в соответствии с изначально заданными количествами этих инструментов, поддерживая нужное соотношение (типа дельту).
Собственно скрипт робота:
dofile(getScriptPath().."\\hacktrade.lua")
function Robot()
— начальные условия: номер счета, тикеры, объемы (покупаем 10 опционов колл и продаем 5 фьючерсов)
acc=«ХХХХХХХХ»
opt=«RI92500BD5»
fuch=«RIM5»
sizeO = 10
sizeF = -5
slippage = 20
feed = MarketData{
market=«SPBOPT»,
ticker=opt,
}
orderO = SmartOrder{
account=acc,
client=«O»,
market=«SPBOPT»,
ticker=opt,
}
orderF = SmartOrder{
account=acc,
client=«F»,
market=«SPBFUT»,
ticker=fuch,
}
— округление
function round(numb)
i,f = math.modf (numb)
if f < 0.5 then
return math.floor(numb)
else
return math.ceil (numb)
end
end
— узнаем шаг цены на фьючерсе
local stepF=tonumber(getParamEx (orderF.market, orderF.ticker, «SEC_PRICE_STEP»).param_value)
while working do
repeat
Trade()
— ставим заявку по опциону на первый бид или оффер
if sizeO>0 then
orderO:update( feed.bids[1].price, sizeO)
else
orderO:update( feed.offers[1].price, sizeO)
end
— если открыта позиция по опциону, то перекрываемя фьючерсом
if orderO.position~=0 and sizeO~=0 then
— определям цены по которым будем покупать или продавать фьючерс
buypr=tonumber(getParamEx (orderF.market, orderF.ticker, «bid»).param_value)+stepF*slippage
sellpr=tonumber(getParamEx (orderF.market, orderF.ticker, «offer»).param_value)-stepF*slippage
if sizeF>0 then
orderF:update( buypr, round( math.abs ( orderO.position*sizeF/sizeO) ) )
else
orderF:update( sellpr, -round( math.abs ( orderO.position*sizeF/sizeO) ) )
end
end
— маленькая пауза значительно разгружает процессор
sleep(20)
— крутимся в цикле, пока не наберем заданные изначально позиции по инструментам
until orderO.position==sizeO and orderF.position==sizeF
working = false
end
end
Этот робот ставит заявку по опциону на имеющийся лучший бид/оффер и ждет. Либо нам наливают, тогда проиходит сделка на фьючерсе,
либо если кто-то ставит заявку перед нами, то мы соседимся уже к нему. И так до полного набора заданной позиции.
ВАЖНО! Должны быть открыты стаканы по фьючерсу и опциону. Обязательно!!!
(в qlua можно и подписаться на получение данных из любых стаканов, но не советую)
orderO.position и orderF.position это позиции этого конкретного робота по заданным интрументам.
Она может оличаться от позиции в Квике, ели ранее что-то было открыто.
Фреймворк отслеживает только свои заявки и сделки. Если сделать 2 и более копий этого скрипта на разных страйках, то можно открывать более сложные позиции.
Таким образом делаем 2 полезных дела — учимся самостоятельно писать скрипты роботов и повышаем ликвидность на опционах.
В любом случае это не готовый програмный продукт. Это лишь повод задуматься о своих возможностях и потребностях.
Кто не хочет покупать готовые программы, кому нужно что-то свое — этот скрипт можно усовершенствовать бесконечно.
Хочется считать нормальную дельту или котировать низколиквидные опционы по волатильности — ищите готовые куски кода и допиливайте под себя
sourceforge.net/projects/qllib/files/Robots/OptionCalculator/
Хочется сделать простейший интерфейс, легко можно взять за основу —
smart-lab.ru/blog/216652.php
Если этот скрипт остановить до того как поза набрана — останется висеть заявка. Тогда нужно либо вручную снимать, либо допилить скрипт.
Поможет библиотека
sourceforge.net/projects/qllib/files/?source=navbar
Также может пригодиться
forum.qlua.org/topic34.html
Все есть, все в открытом доступе. Нужно только желание!
---Техника безопасности---
Очень внимательно задавать коды опционов (не путать пут и колл), количество контрактов и направление сделок: (-) это шорт.
Проверять профиль открываемой позиции хотя бы здесь
www.option.ru/analysis/option#position
Начинать с минимальных объемов.
Если все работает как надо, но хочется открыть большую позу — открывать частями, запуская несколько раз скрипт.
Обязательно смотреть на стаканы с торгуемыми контрактами и быть готовым на случай форс-мажора или ошибки в скрипте закрыть/захеджировать руками.
Делать паузу в скрипте побольше, чтобы в случае ошибки в скипте робот не начал строчить заявки как из пулемета.
Когда все отлажено паузу можно уменьшать.
Профитов!
Допиливайте, котируйте и будет ликвидность
Идея фреймворка привлекательна, но интересно — как 'умные заявки' себя поведут при переходе через вечерний клиринг или сбоях/зависаниях/вылетах Квика?
Вы не сравнивали этот фреймворк с QL Library (http://sourceforge.net/projects/qllib/files/?source=navbar) — еще одним враппером для QLua?
Можно брать время торгового сервера и по условию заранее приостанавливать торговлю, после клиринга возобновлять.
При падении Квика этот, как и любой другой скрипт, не будет работать, проблему придется решать вручную.
QL тоже пользуюсь, но их нельзя сравнивать. Тут готовое решение, а там набор функций.
Ну и HackTrade лучше обновить, если стоит старая версия
github.com/ffeast/hacktrade
Я тоже до сих пор пользуюсь. Научился одним скриптом на нескольких инструментах держать двусторонние котировки. Мощная штука. Вот только изредка сделки пропускает. Не понял пока почему.