Тема: Подписаться на стакан при активном ордере

Добрый вечер,
нет ли у кого-нибудь готового скрипта, реализуюшего такую логику

1) если есть активный ордер, то подписываемся на получение стакана котировок
2) если активного ордера нет, скажем, секунд 10 - то отписываемся, чтобы не грузить Квик. Таймаут нужен для операции типа MOVE_ORDER - когда ордер снят, а новый ещё не пришёл, чтобы не было сайд эффекта.

Я хочу настроить запись стакана куда-нибудь, а уровень lua примерно "могу копипастить примеры". С записью я примеры нашёл, а вот с такой логикой нет.

Спасибо

2

Re: Подписаться на стакан при активном ордере

unregistered пишет:

Добрый вечер,

Привет! А если заявки 2 по одному инструменту? тогда беда wink

local exitflag
function main()
    while not exitflag do
        --some code
        sleep(1)
    end
end
function OnTransReply(t)
    if not IsSubscribed_Level_II_Quotes(t.class_code, t.sec_code) then
        Subscribe_Level_II_Quotes(t.class_code, t.sec_code)
        message("OnTransReply\n Subscribe ql2: "..t.class_code.." "..t.sec_code, 2)
    end
end
function OnOrder(t)
    if bit.band(t.flags, 0x1) == 0 then
        Unsubscribe_Level_II_Quotes(t.class_code, t.sec_code)
        message("OnOrder\n Unsubscribe ql2: "..t.class_code.." "..t.sec_code, 2)
    end
end
function OnStop()
    exitflag = true
end

3

Re: Подписаться на стакан при активном ордере

Спасибо!
Правда я не понял, почему будут проблемы при 2 заявках по одному инструменту.

Не уверен нужно ли делать задержку при отписывании. Вообще, я хочу котировать по лучшей цене, т.е. обнаружив что мою заявку перебили или наоборот, позади есть свободное место, я ордер планирую переставить, получится что я отпишусь-подпишусь. Вопрос насколько это будет критично.

4

Re: Подписаться на стакан при активном ордере

unregistered пишет:

Правда я не понял, почему будут проблемы при 2 заявках по одному инструменту.

Надо будет докручивать логику, чтобы отписка была только после исполнения / снятия второй заявки.

Если вы планируете постоянно заявку "перемещать" в стакане - то не совсем понятно зачем подписываться / отписываться.
Наверняка же после исполнения заявки вы будете выставлять новую, другого направления.

5

Re: Подписаться на стакан при активном ордере

swerg пишет:

Надо будет докручивать логику, чтобы отписка была только после исполнения / снятия второй заявки.

Да, точно, сразу не сообразил. А её можно вообще докрутить?
OnTransReply не подойдёт, так как по документации не вызывается для импортированных заявок.
OnOrder вызывается несколько раз для одной заявки при её создании, поэтому просто завести таблицу и считать там число срабатываний не получится.

Можно, конечно, подписаться на 10 минут с момента последнего срабатывания onOrder(), внося инструменты в таблицу и проверяя в main(), правда это только для ликвидных инструментов. Ну или самостоятельно снимать ордер чаще чем раз в 10 минут.

В программе экспорта стаканов по ODBC указано ограничение не больше 10 стаканов, подозреваю что в Квике тоже будет такое же ограничение, поэтому совсем долго держать ненужную подписку я бы не стал.

swerg пишет:

Если вы планируете постоянно заявку "перемещать" в стакане - то не совсем понятно зачем подписываться / отписываться.

В примере выше так будет происходить, если я правильно понял код.

Т.е.
1. подписались
2. решили передвинуться
3. заявка снята -> отписались
4. заявка поставлена -> подписались

swerg пишет:

Наверняка же после исполнения заявки вы будете выставлять новую, другого направления.

Не всегда, иногда надо просто купить или продать по лучшей цене, нежели кидать в мидпрайс smile
Я бы подписался вообще на все стаканы всех инструментов, но в Квике нет такой возможности (и, подозреваю, его производительности не хватит) да и не нужны все стаканы по умолчанию.

6 (2022-01-02 05:51:59 отредактировано kalikazandr)

Re: Подписаться на стакан при активном ордере

unregistered пишет:

да и не нужны все стаканы по умолчанию.

не знаю на счет импортированных заявок, OnTransreply можно заменить на OnOrder с проверкой "новой" заявки.
Суть не в этом. Вы планируете руками торговать 500+ инструментов единовременно?
Если нет, то просто заказываете стакан.
Как по мне - то, что вы хотите увидеть в стакане - вы не увидите, скорее всего, никогда!
Просто забудьте саму идею -  история стакана и квик - не совместимые понятия.
з.ы.
при выставлении новой заявки всегда приходит 2 события OnOrder.
достаточно понимать, что заявки с таким номером не существует, значит номер нужно добавить в соответствующую таблицу и первое событие OnOrder - не обрабатывать - никак.
з.ы2.
полуавтоматическая торговля, с использованием внешних источников сигналов, приведет вас к потере депо, безоговорочно.

7 (2022-02-08 00:16:23 отредактировано unregistered)

Re: Подписаться на стакан при активном ордере

Получился вот такой скрипт. Я отказался от отписки при снятии ордера и просто сделал таймаут. Это имеет смысл, так как заявку я буду перемещать и реагировать как-то по особому на снятие ордера мне не надо. Ну а после того, как весь объём будет набран, подписка тихо отомрёт за ненадобностью.

Я понимаю, почему Вы меня отговариваете - задача очень напоминает сеточник, но это не он. Я просто хочу входить по лучшей цене в позицию и стакан нужен, чтобы я мог отработать назад, так как по таблице текущих торгов я будут видеть свою цену. Иногда стукнуться в противоположную сторону спреда меня устраивает, конкурировать с HFT я не собираюсь на Квике.

function OnInit(script)
    isRun = true
    state = {}
end

function OnOrder(order)

    if not IsSubscribed_Level_II_Quotes(order["class_code"], order["sec_code"]) then
        message("Subscribing to " .. order["class_code"] .. "." .. order["sec_code"])
        Subscribe_Level_II_Quotes(order["class_code"], order["sec_code"])
    end

    state[order["class_code"] .. "." .. order["sec_code"]] = os.time()
end

function OnQuote(class_code, sec_code)
    if state[class_code .. "." .. sec_code] ~= nil then
        if state[class_code .. "." .. sec_code] + 60 < os.time() then
            unsubscribe(class_code, sec_code)
        else
            message("Received " .. class_code .. "." .. sec_code)
        end
    end
end

function unsubscribe(class_code, sec_code)

    if IsSubscribed_Level_II_Quotes(class_code, sec_code) then
        message("Unsubscribing to " .. class_code .. "." .. sec_code)
        Unsubscribe_Level_II_Quotes(class, ticker)
    end

    state[class_code .. "." .. sec_code] = nil
end

function main()
    while isRun do

        sleep(10)
    end
end

Большое Вам спасибо за код.

8

Re: Подписаться на стакан при активном ордере

квик не захлебывается сообщениями message("Received " .. class_code .. "." .. sec_code)? или по инструменту 1 сделка в пол часа?

9

Re: Подписаться на стакан при активном ордере

Я просто чтобы запустить и проверить логику. Так-то я json перегоняю и в сокет пишу.