Блог им. Vkt

Как самому сделать робота на опционах. Лайфхак

    • 03 апреля 2015, 13:23
    • |
    • Vkt
  • Еще
Есть мнение, что сделать робота очень сложно. Это под силу только крутым программистам. Попробую опровергнуть — чтобы сделать робота достаточно уметь хорошо пользоваться поиском и знать азы программирования в рамках школьной/институтской программы.
Большинство задач решается операторами 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
Начинать с минимальных объемов.
Если все работает как надо, но хочется открыть большую позу — открывать частями, запуская несколько раз скрипт.
Обязательно смотреть на стаканы с торгуемыми контрактами и быть готовым на случай форс-мажора или ошибки в скрипте закрыть/захеджировать руками.
Делать паузу в скрипте побольше, чтобы в случае ошибки в скипте робот не начал строчить заявки как из пулемета.
Когда все отлажено паузу можно уменьшать.

Профитов!
★50
13 комментариев
Ещё б ликвидность завезли.
avatar
Enfernuz, я сделал заготовку, шаблон для котирования опционов.
Допиливайте, котируйте и будет ликвидность
avatar
для синтетики надо два опциона на 1 фьюч… а что будешь делать если тебе нальют только 1 опцион?
avatar
ves2010, вариантов ровно 2 — ничего не делать(ждать когда нальют второй опцион) или открыть 1 фьюч. Я выбрал второй вариант. Не нравится — каждый может переделать под себя.

avatar
тут надо сказать, что необходимость фреймвойка вытекает из того, что в родной Квиковской реализации API Lua нет функции выставления ордера — есть только отправка транзакции и проверка результатов ее выполнения.

Идея фреймворка привлекательна, но интересно — как 'умные заявки' себя поведут при переходе через вечерний клиринг или сбоях/зависаниях/вылетах Квика?

Вы не сравнивали этот фреймворк с QL Library (http://sourceforge.net/projects/qllib/files/?source=navbar) — еще одним враппером для QLua?
avatar
cosmichorror, я бы до клиринга торговлю роботом не доводил.
Можно брать время торгового сервера и по условию заранее приостанавливать торговлю, после клиринга возобновлять.
При падении Квика этот, как и любой другой скрипт, не будет работать, проблему придется решать вручную.
QL тоже пользуюсь, но их нельзя сравнивать. Тут готовое решение, а там набор функций.
avatar
@vkt Спасибо, актуально даже спустя 5 лет) Одна проблема, у меня этот скрипт делает заявки только на опцион, но не на фьючерс. Запускаю на учебном терминале. С чем это может быть связано?
avatar
Ilia Z, Это может быть связано с особенностями учебного терминала. Может быть не верно заданы параметры инструментов в  MarketData и SmartOrder
Ну и HackTrade лучше обновить, если стоит старая версия
github.com/ffeast/hacktrade
Я тоже до сих пор пользуюсь. Научился одним скриптом на нескольких инструментах держать двусторонние котировки. Мощная штука. Вот только изредка сделки пропускает. Не понял пока почему.
avatar

теги блога Vkt

....все тэги



UPDONW
Новый дизайн