Vkt
Vkt личный блог
03 апреля 2015, 13:23

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

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

Профитов!
13 Комментариев
  • Watcher
    03 апреля 2015, 13:55
    Ещё б ликвидность завезли.
  • ves2010
    03 апреля 2015, 13:59
    для синтетики надо два опциона на 1 фьюч… а что будешь делать если тебе нальют только 1 опцион?
  • К.О'Тяра
    03 апреля 2015, 23:45
    тут надо сказать, что необходимость фреймвойка вытекает из того, что в родной Квиковской реализации API Lua нет функции выставления ордера — есть только отправка транзакции и проверка результатов ее выполнения.

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

    Вы не сравнивали этот фреймворк с QL Library (http://sourceforge.net/projects/qllib/files/?source=navbar) — еще одним враппером для QLua?
  • Ilia Z
    03 ноября 2021, 17:54
    @vkt Спасибо, актуально даже спустя 5 лет) Одна проблема, у меня этот скрипт делает заявки только на опцион, но не на фьючерс. Запускаю на учебном терминале. С чем это может быть связано?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн