Блог им. hacktrade

Спредовый робот на HackTrade

Доработал фреймворк HackTrade до версии 1.4.

Теперь можно удобно работать со стаканом
Обратите внимание, что по умной заявке сначала открывается позиция лучшим бидом, потом позиция приводится к 0 лучшим оффером.
Подход не стандартный, но оцените удобство: если снять заявку, робот поставит новую, чтобы добить недостающий объём.


Пример робота (исходник):

dofile("../hacktrade.lua")

function Robot()

    feed = MarketData{
        market="QJSIM",
        ticker="SBER",
    }

    order = SmartOrder{
        account="NL0011100043",
        client="74924",
        market="QJSIM",
        ticker="SBER",
    }
    
    
    while working do
      repeat
        order:update(feed.bids[1].price, 3)
        Trade()
      until order.filled      
      repeat
        order:update(feed.offers[1].price, 0)
        Trade()
      until order.filled
    end
end

Посморите на реализацию конечного автомата: 2 цикла, пока не заполнится умная заявка.
Жду отзывов )
★6
20 комментариев
А Как называется язык на котором написан робот?
avatar
Lika, Lua (терминал QUIK)
avatar
hacktrade, а разве у него не должны подсвечиваться функциональные слова как в MQL4?
Я бы, наверное, поняла код если бы каждая строчка была прокомментирована. Жаль что нет комментов что на каждой строчке происходит.
И под опционы на этом языке можно писать?
avatar
Lika, воспользуйтесь любой средой разработки или специализированным редактором: studio.zerobrane.com/

А комментарии добавлю, в планах )
avatar
если бы в комплекте с роботом шла еще и машина времени, что бы в 2006 год вернутся…
avatar
Lafert, в терминале QUIK пока нет такой функции, написал в техподдержку )

Пример, скорее, функциональный, но можно рискнуть на неликвиде/опционах )
avatar
hacktrade, Поскольку пока не очень подробная документация, сходу не понял как, к примеру, выставить лимитную заявку на покупку по биду, но не ждать пока заполнится весь выставленный объем, а сразу после первой сделки выставить купленный объем на продажу по офферу, сняв перед этим неисполненный остаток лимитной заявки с бида. При этом надо учесть, что с момента получения программой информации о первой сделке по биду и фактическим снятием остатка из торговой системы, туда могли налить еще вплоть до полного исполнения. Т.е. если выставлять на оффер купленный объем по информации о первой сделки по биду, то мы можем продать не все, что купили. Получается, что надо дождаться снятия первой заявки с бида, еще подождать сколько-то времени на случай возможного прихода запоздавшей информации о сделках и уже потом выставлять оффер. Это все в умных заявках как-то учитывается?
avatar
Vkt, всё просто

repeat
…
until order.position != 0

repeat
…
until order.filled
В данном случае цикл работает до первой сделки, после которой сразу скидывает всё, что дали.
Робот сам снимет остаток и выставит купленное на продажу.

Традиционных лимитников нет. В этом вся фишка, что заявки не теряются.

Можно добавить ещё умных заявок и работать по разным бидам.
avatar
hacktrade, если я все правильно понял, то это вообще крутая фишка! Т.е. можно наштамповать умных ордеров order1, order2… orderN и каждый умный ордер будет внутри себя отслеживать свою собственную позицию даже если после первой сделки по биду налили еще, он просто станет продавать больше по офферу пока не закроет свою собственную позицию до 0? При этом остальные умные ордера будут делать тоже самое?
avatar
Vkt, всё точно! именно так и работает )

Каждая заявка помнит, сколько она набрала, и сколько надо скидывать. А если ей дать отрицательное значение, она войдёт в шорт (даже из логна с любым остатком). А если в шорте передадите 0, шорт закроется, причём тем объёмом, которым заявка успеет войти, когда будет переворачивать лонг.
avatar
hacktrade, супер, респект! Но еще больше вопросов появилось :)
«Обратите внимание, что вам вернётся столько значений, сколько задано в параметрах графика. Не добавляйте на график слишком много значений, это может замедлить работу программы.» — имеется ввиду, что если на графике одна ЕМА, то Indicator при каждом обращении будет всасывать из Квика все доступные значения этого мувинга или что-то другое? Какова система нумерации бидов и офферов в стакане (feed.bids[1])?
avatar
Vkt, да, при каждом обращении к графику достаются все значения, это ограничение терминала. Лучше укажите точно, сколько свечек в графике; не загружайте все доступные.

Теперь по бидам/офферам. Для удобства они нумеруются от лучших цен (центр стакана). Индекс 1 — лучший бид и оффер, 2 — вторые бид и оффер от центра. И так далее.
avatar
hacktrade, понятно, спасибо! А вот интерсено, свои заявки вычитаются из данных стакана, будет ли корректно фронтранится лучший бид:
repeat
order:update(feed.bids[1].price+feed.sec_price_step, 3)
Trade()
until order.filled
avatar
Vkt, собственные заявки пока не вычитаются. В ближайших планах. Пока только вручную.
avatar
hacktrade, ясно, ждем реализации планов!
avatar
hacktrade, можно сделать замыкание для индикаторы/графики, которое на старте считывает все данные, а после добавлять только текущий активный или закрытый бар. Прирост по времени обеспечен.

Можно ли получиь значение маржи из таблицы Quik. Или другие значения из таблиц?
avatar
legion73, данное значение получить можно только стандартным вызовом getItem.
avatar
hacktrade, Спасибо за ответ.Буду разбираться. Есть у меня на вашей 1-ой версии робот. Хорошо работает с индикаторами.
avatar
legion73, ого! раз есть практический кейс, буду особенно рад услышать ваши отзывы по надёжности и функционалу.

Ошибки и пожелания можно публиковать сразу в GitHub:
github.com/hacktrade/hacktrade/issues?state=open

Тогда не потеряются )
avatar

теги блога hacktrade

....все тэги



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