akaRem
akaRem личный блог
15 ноября 2012, 09:12

Вопрос о стандартных задержках в обновлении данных QUIK/QPILE

Хочу написать торгового робота на языке QPILE, но торговый алгоритм несколько критичен к системным задержкам и рассогласованиям.
(Не ХФТ, но нужно четко контролировать позиции по инструментам, активные и исполненные заявки, а так же совершенные сделки с наименьшими «тормозами»)

Подскажите, пожалуйста, какие задержки являются нормальными (понятно, что они всегда есть, интересуют их «обычные» величины — от… до… )
— между двумя последовательными итерациями скрипта (и что будет, если его зациклить на постоянный пересчет?) (1)
— между моментом передачи скриптом заявки на сервер и моментом получения ответа от сервера о результате (2)
— (приостанавливается ли выполнение скрипта до момента получения ответа от сервера)? (2, да)
— между моментом передачи скриптом заявки на сервер и моментом появления заявки в таблице заявок (т.е. моментом начала возможности проверять наличие и статус заявки в системе) 
(3)
— между моментом исполнения(удовлетворения) заявки на бирже и моментом изменения ее статуса на «исполнена» в таблице заявок (3)
— между моментом исполнения(удовлетворения) заявки на бирже и моментом ее появления в таблице сделок (3)
— между моментом исполнения(удовлетворения) заявки на бирже и моментом изменения позиции по счету, списания/начисления ГО и изм. прочих параметров. (речь идет о фьючерсных контрактах) в таблице позиций по клиентским счетам и таблице ограничений по клиентским счетам (3)

Возможны ли рассогласования в данных из разных источников? Например:
— заявка исполнена, в таблице заявок ее статус сменен, но в таблице сделок ее еще нет
— заявка исполнена, в таблице заявок ее статус сменен, но в таблице позиций позиция не изменилась
— и т.п.

Возможна ли ситуация, когда нарушается порядок заявок и сделок в таблицах? Например,
— отправил заявку1, потом заявку2 и заявку3, в таблице отображаются в порядке типа заявка1, заявка3, заявка2
— заявки исполнились в порядке заявка1, заявка2, заявка3, в таблице сделок отражается в порядке типа сделка1, сделка3, сделка2 (4)

По каким таблицам лучше контролировать свои заявки и позицию? (5)

Если на СмартЛабе (или где-то еще) есть что почитать на эту тему, буду признателен за ссылки.

ПС. Я в курсе, что СтокШарп — это хорошо, Купайл — плохо и т.п. Но вопрос именно про Купайл.
ППС. Программист, но на Купайле пока не писал.

________________________

Ответы от Арки 

1) Минимальный промежуток между итерациями = 1 сек.
Время расчета одного цикла = время работы самого портфеля + интервал между итерациями.
То есть, отсчет интервала, начинается как только портфель закончил работать а не как только начал.
Если портфель зациклить то это будет одна итерация, которая никогда не кончится, соответственно интервал можно указать любым.

2) Есть минимальный промежуток, в течении которого портфель будет ждать ответ на транзакцию wait_timeout_for_replay (не менее 5 сек.) Это означает, что когда портфель отправит транзакцию, он будет ждать минимум 5 секунд пока не продолжит свою работу. Если он получит ответ раньше, то работа продолжится. Если по истечении этого времени, ответа об успешной отправке не будет, то в RESULT_EX вернется ошибка.

3) Это время целиком и полностью зависит от качества и скорости канала связи между Вами и брокером. Если связь хорошая и проблем со связью не наблюдается, то заявка появится за доли секунды. Точнее сказать не можем. Однако, есть нюанс, обновление данных по деньгам и бумагам (для фьючерсов позиции и ограничения) приоритетнее чем обновление таблиц с заявками и сделками. То есть деньги заблокируются под заявку на сотые доли быстрее чем появится запись о заявке.

4) Да такая ситуация возможна, но шансов ее возникновения практически нет. Зачастую такие ситуации проявляются при задержках на канале связи. Все зависит опять же от качества канала связи.

5) лимиты по деньгам и бумагам (для фьючерсов позиции и ограничения).
63 Комментария
  • Maaxee
    15 ноября 2012, 09:18
    на купайле задержка от одной секунды и выше
      • Роботорговец
        15 ноября 2012, 11:18
        akaRem, нормально там всё, за секунду уложится любой алгоритм (расчет данных, выставить/снять/подвинуть) всё умещается в 1 сек. не заморачивайся с задержками. Писать лучше в этой программе(синтаксис VB выбрать), там всё красиво выделяется цветов и групируется по циклам, блокам и т.д., можно удобно скрывать/раскрывать блоки. освоить квик в отличии от С# можно за 1 день, для простых систем(без трёх мерных интегралов) самое то.

          • Роботорговец
            15 ноября 2012, 11:27
            akaRem, ну смотрю есть ли активные заявки в таблице заявок.
            N=GET_NUMBER_OF(«ORDERS») ' ПОЛУЧАЕМ ЧИСЛО СТРОК В ТАБЛИЦЕ ЗАЯВОК
            IF N>0 ' ЕСЛИ ТАМ ЧТО-ТО ЕСТЬ, ТО
            FOR I FROM 0 TO NKILL
            IF (GET_VALUE (GET_ITEM («ORDERS», I), «STATUS»)=«ACTIVE»… то смотрим сколько лотов осталось и решаем что с этим делать. в интернете полно примеров готовых роботов и блоков
              • Роботорговец
                15 ноября 2012, 11:51
                akaRem, наверное, не знаком с их работами.
                • Werner Heisenberg
                  15 ноября 2012, 11:54
                  Роботорговец, да ты не стесняйся — давай дружить! Я вообще открытый для создания команды адекватных людей! И пофиг чем мы будем заниматься, если мы адекватные люди :) А если мы еще и одним делом займемся! То вообще крутотенечка :)
                  • Роботорговец
                    15 ноября 2012, 13:46
                    Dimanite, мы в разных городах. ты в москве на мкаде, а я в россии, у нас такси 100р. и квартира 500тр стоит, даже курс рубля разный.)))
                  • Werner Heisenberg
                    15 ноября 2012, 12:05
                    akaRem, я круто! Блин… поверь мне!!! :)))))))))))))
              • Роботорговец
                15 ноября 2012, 13:03
                akaRem, заявки испольняются мгновенно если у вас хороший компьюетр(хотябы 3-х летней давности) и интеренет будет 1мс.
                Этот параметр служебный на скорость исполнения не влияет. На квике можно делать ХФТ, там нет ограничений, проблема тока в интернете и кривых руках(кто любит в циклы задержки добавлять)
  • Максим
    15 ноября 2012, 09:29
    нет там инструментария для столь детальной информации о лэтэнси, все работает с мин тактом 1 сек
    • Роботорговец
      15 ноября 2012, 11:22
      hush, такт 0 сек, зависит от вашего компьютера и интернета. Вы в конце цикла не ставьте задержку 1сек, будут милисекунды как в С#.
      • Максим
        15 ноября 2012, 12:41
        Роботорговец, такт 0 сек забавно звучит))) в остальном согласен
        • Роботорговец
          15 ноября 2012, 12:42
          hush, я имел ввиду тот такт про который имелии ввиду: что к времени исполнения программы 100мс + 1 сек искуственно., можно и час задать в квике есть и такие возможности
          • Максим
            15 ноября 2012, 12:48
            Роботорговец, т.е. если 1 сек искуственно не ставить, бедет каждые, например, 100 мс считать?
            • Роботорговец
              15 ноября 2012, 12:53
              hush, если у вас быстрый комп и интернет то будет и 1 мс почти ХФТ. такт будет зависеть только от железа, но только чтобы не считалось эта +123456… сек, надо в конце самого последнего цикла указать что испольнять программу заново, а не переходить в искусвенную задержку цикла в настройках квика(0 поставить нельзя, можно не включать просто это)
  • Константин Дубровин
    15 ноября 2012, 09:39
    арбитраж?
  • ivan_petrov
    15 ноября 2012, 09:48
    Робот на C#, средний раундтрип 250 миллисекунд.
      • ivan_petrov
        15 ноября 2012, 10:23
        akaRem,
        > C# не знаю и знать не хочу
        Стратегическая ошибка. Все придется переписывать заново, если надо будет менять платформу.
        • Werner Heisenberg
          15 ноября 2012, 10:56
          ivan_petrov, если менять то конечно это супер проблема, но кому это надо? Кто менял квик в последние 10 лет? Ну да я менял — был квик, потом альфа директ и снова квик! Ну надо же!
  • cruss1u5
    15 ноября 2012, 09:52
    в среднем по России от Вас до биржи — 0.1 сек
  • cruss1u5
    15 ноября 2012, 09:52
    там 5 сек нужно минимум для выставлении заявки (на купиле рекомендуют)
      • cruss1u5
        15 ноября 2012, 10:02
        akaRem, на арке на сайте справка по купайлу…
        я меньше делал — оно не ругалось… а в эктрим как-то не посчастливилось попадать
      • cruss1u5
        15 ноября 2012, 10:06
        akaRem, Функции для работы с заявками — в этом подразделе
        раздела «алгоритмический язык»

        www.quik.ru/depot/chm_quik.zip
          • cruss1u5
            15 ноября 2012, 10:21
            akaRem, вроде нет… но надо контролировать потом запросам встала заява или не встала
  • cruss1u5
    15 ноября 2012, 10:01
    посл абзац (вопрос): не понял вопроса, но если по одному инструменту, то вроде бы как нет… если разные инструменты, тем более площадки, то возможно да

    пред посл. (вопрос): возможны — лично видал задупливания… но там не через скрипты выставлял а через импорт но на купайле — а на купайле можно контролировать это
      • cruss1u5
        15 ноября 2012, 20:04
        akaRem, пример:

        отправляем заявку
        если она не встала отправлем еще раз

        // тут первая строчка уже вставила ордер, и вторая вставила
        опс! две заявки стоят…

        но это решабельно, хотя на времени сказывается
      • cruss1u5
        15 ноября 2012, 20:05
        akaRem, таблицы? нах они нужны?…
  • usertrader
    15 ноября 2012, 10:56
    Задержки там есть это однозначно. Во-первых время исполнения программы — если у вас стоит выполнять раз в 1 сек это означает, что идетзапуск проги на купайле она выполняется и после окончания выполнения проги отсчитывается 1 сек. То есть если ваш код большой он может сильно есть время машины. Купайл это интепретатор и его писали не для того что бы сильно шибко и быстро считать. Тем более он очень чуствителен к типизации. Исполненые заявки то же не сразу могут появляться в таблице заявок как исполненые — здесь может быть задержка так как может быть экономия трафика — у меня лично в 2008 году в Атоне задержка была около 2-3 секунд. Вообще если есть вопросы пишите в личку — со мной можно свзяаться и я попробую помочь разобраться. Возможно есть другой путь для Вашего алгоритма
      • Werner Heisenberg
        15 ноября 2012, 11:10
        akaRem, о и мне пишите в личку! :)
  • Werner Heisenberg
    15 ноября 2012, 11:09
    что-то вы тут все усложняете… какие нах циклы? Вы квик этим вообще повесите!

    Кароч система простая:
    обычно робот обновляется 1/2 секунды (редко но бывает 3 секунды)
    смотри таблицу выставленых заЯВок, запоминай номер, и смотри — если номер заявки исполнен полностью, тогда обновляй баланс (я его вообще отдельно от брокера считаю и храню — так то оно безопаснее, просто я его сравниваю иногда с официальными данными но не принимаю решения основываясь только на них)

    Я так понимаю ты хочешь отправлять сразу же 3 заявки… я не буду отвечать тебе на вопрос, но спрошу — а зачем? И есть ли в этом алгоритм?

    Если тут есть алгоритм, например заявка 1 исполнилась — баланс равен 1 контракт, цена снизилась на 1% купили еще 2 контракта (отправили заявку, исполнилась, обновили баланс), теперь у нас есть новая средняя величина по балансу, цена уже от обновленной средней цены снизилась на 1% и мы купили еще 3 контракта (заявка, исполнилась, обновили баланс).

    Суть я думаю ты уловил. Возможно стоит делать все поступательно а не сразу пул заявок контролировать — ибо это сложнее
      • Werner Heisenberg
        15 ноября 2012, 11:44
        akaRem, «цена спайканула, ордера исполнены, но позиция еще не изменилась» ну как так не изменилась позиция. У вас есть исполненная заявка, и есть ее объем, и есть понимание какая позиция была перед этим. Тут проблемы нет вообще.
        Ну как следствие не вижу причин далее смотреть проблему, так как на этом этапе она вроже как решилась.

        Вопрос: как система принимает решение на открытие новой позиции? Думаю если тут логика чОткая то все нормально будет
          • Werner Heisenberg
            15 ноября 2012, 11:50
            akaRem, в файле??? WOW эффект просто… не страшно? Я имею в виду что теперь необходимо после проверки исполнения заявки не баланс обновить в первую очередь, а файл удалить а потом уже баланс обновить — а то случится косяк :)
              • Werner Heisenberg
                15 ноября 2012, 12:04
                akaRem, хм… ну а робот то как принимает решения?
  • s_mike@rambler.ru
    15 ноября 2012, 20:48
    akaRem. Вы пишете робота. Технология такова, что получение данных идет различными потоками. Правильный стиль заключается в предположении, что запаздывание данных может быть произвольным. Робот есть конечный автомат. Только в этом случае получается стабильная программа. Любые предположения о максимально возможной задержке являются ошибочными и в конечном счете ведут к неправильной работе и, следовательно, к убыткам.

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

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