Алексей
Алексей личный блог
25 августа 2020, 11:02

Автоматизация подачи заявок в начале сессии - полуавтомат на языке qpile для терминала quik

Раскрываю небольшую часть своей торговли в прошлом. Система старая, где-то с 2013 года, но всё ещё рабочая…
Предоставляется для рассмотрения возможностей. Сразу дисклаймер: я не программист! Это может быть интересно новичкам и таким же не программерам как и я.

В спекулятивном портфеле у меня от 30 до 60 разных ценных бумаг. Многие из них относятся к низколиквидным акциям второго, третьего эшелона, есть облигации.
Иногда по низколиквидным бумагам случаются «спайки» — краткосрочные задёрги вверх или проливы вниз. Как это можно отрабатывать: выставляем заявку на продажу в начале сессии сильно выше рыночной котировки (+10%, +20% или +40%) и ждём всю сессию или наоборот на покупку сильно ниже рыночной.
И если срабатывает, то забираем разницу как чистую прибыль или свободный денежный поток, который дальше можно инвестировать в покупку новых ценных бумаг.
Вот так это выглядит на графике одной акции с фри-флоутом менее 5%:
Автоматизация подачи заявок в начале сессии - полуавтомат на языке qpile для терминала quik

«На эти два процента и живём»

Если у нас диверсификация и много бумаг, то нужно очень много заявок… У меня в день может быть 100-200 заявок на открытии. Срабатывает 3-4 раза в неделю.
Несколько лет назад на просторах интернета нашёл код на qpile и адаптировал его под эту свою торговую систему.
Делюсь как есть, для ознакомительных целей и для своего архива.

основной код простой:

PORTFOLIO_EX InitNormalSession;
DESCRIPTION Initialization session with normal bonds and stocks;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
INCLUDE auxiliary_funcs_v200.qlib;

PROGRAM

NEW_GLOBAL («INIT_NORMAL_SESSION_DONE», 0)
CLIENT_CODE = "Код Клиента"
CLIENT_ACCOUNT = "торговый счет"

' Checking the time
CurrentHour = GET_VALUE(GET_DATETIME(), «Hour»)
CurrentMin = GET_VALUE(GET_DATETIME(), «Min»)
CurrentTime=str2num(fTextTime(CurrentHour,CurrentMin) & "")

'------------------------------------------------
IF INIT_NORMAL_SESSION_DONE == 0
IF CurrentTime > 100000 AND CurrentTime < 230000

DELETE_ALL_ITEMS()
'-- основные продажи:
send_order(«S»,«0.55»,«L»,«TQBR»,«UNAC»,«1»,«77») 'sell ОАК
send_order(«S»,«0.0054»,«L»,«TQBR»,«TGKDP»,«1»,«84») 'sell Квадра пр
send_order(«S»,«0.34»,«L»,«TQBR»,«MRKC»,«1»,«101») 'sell МРСК Центр

send_order(«B»,«0.45»,«L»,«TQBR»,«UNAC»,«1»,«215») 'buy ОАК


MESSAGE («Заявки на Мосбирже выставлены!»,1)
INIT_NORMAL_SESSION_DONE = 1

'------------------Конец проверки времени торгов
END IF
IF CurrentTime > 110005 AND CurrentTime < 120000

END IF
END IF
' ----------

END_PROGRAM
PARAMETER LASTPRICE1;
PARAMETER_TITLE LASTPRICE1;
PARAMETER_DESCRIPTION LASTPRICE1;
PARAMETER_TYPE NUMERIC(10,2);
END
END_PORTFOLIO_EX


Данный код выставляет четыре заявки по акциям UNAC, TGKDP, MRKC — три на продажу и одна на покупку.
Так можно копировать и вставлять сколько угодно заявок.
Для выполнения нужна библиотека auxiliary_funcs_v200.qlib, отправлю каждому желающему личным сообщением по запросу.


Основные достоинства:
  • Простота кодирования
  • Быстрое выставление (сравнивая с ручными действиями)
Недостатки:
  • Цены необходимо корректировать вручную. Это важно при изменении рыночных условий
  • Проданные цб не откупает автоматически назад. Откупал руками вводом лимитированных заявок через квик или мобильное приложение.
  • Нет вычисления лимитов по ценным бумагам, по денежным средствам. Если лимиты не соответствуют, то заявка игнорировалась системой
  • нет проверок на ошибки в ценовых уровнях
  • скорость исполнения ниже, чем у кода на языке lua

Вчера переписал этот скрипт на lua с дополнением функций анализа лимитов, анализа ценовых уровней закрытия предыдущего дня и максимальной возможной цены. Поэтому скрипт прекращает работать.
Не является рекомендацией. Для общеобразовательных целей.


23 Комментария
  • VladMih
    25 августа 2020, 11:24
    «100-200 заявок на открытии» —
    это в один прекрасный момент ппц депозиту даже без плечей.
    Не просто ппц, а останетесь должны брокеру!

    Система старая, где-то с 2013 года
    Полагаю, вы ошиблись минимум лет на 100 )))
      • VladMih
        25 августа 2020, 11:28
        kiselev, это не мнение, это математика арифметика, первый класс.
        А про возраст системы — это знание букварей. 
  • Михаил Titov
    25 августа 2020, 11:30

    Эти шпили обычно одной заявкой по рынку рисуются, так что как только вы ее зафиксируете, то поздно будет уже ловить. А если все же это импульс, а не одна заявка, то движение против вас

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

  • Serj90
    25 августа 2020, 12:29
    Если эта штука приносит/принесла тебе профит, то это заслуживает уважения, пусть и не за сложность/простоту конструкции, а в принципе, за то что сел и сделал. А других не слушай, представь сколько вони ты услышишь в свой адрес, если выложить алгоритм, использующий неэффективность, которая держится только лишь на том, что ее знает узкий круг. Но для тебя этот алгоритм уже не актуален, а кто-то на нем живет до сих пор)
  • ezomm
    25 августа 2020, 13:14
    На ликвидах утром тоже гепы бывают, которые закрываются.
  • Technotrade
    25 августа 2020, 13:57
    И какой самый крупный был улов на этом старом скрипте за все время?
  • Андрей Хрущев
    25 августа 2020, 16:24

    У сбербанк брокера есть встроенный в квик аналог. Называется алго-заявки. Оформляешь алго-заявку и она в 9:55 выставляет в стакан обычные лимитные заявки. даже если квик не запущен, а инвестор вообще на работе :)
    Алго-заявку можно выставить максимум на месяц.
    Сопли ловит отлично.
    Ну осторожность нужна, конечно. В марте 2020-го я чуть крепко не прилип, сколько напокупала...

    • Vanger
      25 августа 2020, 20:16
      Андрей Хрущев, можешь скинуть ссылку как их выставлять. может инструкция какая есть для нуба?
      • Андрей Хрущев
        27 августа 2020, 05:20
        Создать окно / Прочие / Таблица алго-заявок.
        В этом окне окне:
        Новая алго-заявка.



         


    • retverd
      26 августа 2020, 11:06
      Андрей Хрущев, спасибо за информацию, воспользовался.
  • A_N
    26 августа 2020, 09:28
    если эта штука только выставляет заявки, то почему бы просто не доставать их с кармана на премаркете, там же можно и корректировать ...  
      • A_N
        26 августа 2020, 09:56
        kiselev, хоть триста.  делаете заявки сколько хотите, таблицу заявок, сохраняете в файл правая кнопка сохранить (там текстовый будет) затем создать окно выбираете создать карман. правой..  достать заявки из файла, все они в кармане. если надо одну встаете на нее, если все — достать все из кармана. и все заявки за сек зарегистрированы. можно убирать из вармана, можно править   если что в справке на квик все подробно
        • retverd
          26 августа 2020, 11:07
          A_N, у некоторых брокеров есть ограничения на кол-во выставление заявок в минуту, у меня больше 50 заявок за один раз не достается из кармана (Открытие)
          • A_N
            26 августа 2020, 11:21
            retverd, нюанс, не знал..., втб ставлю меньше 50, может второй карман сделать попробовать
  • Роман Большухин
    03 декабря 2021, 14:46
    Всем привет.
    class=get_class(code)
    SecInfo = GET_SECURITY_INFO("", code)
    message(«Вход в лонг позицию»,1)

    как в сообщение добавить Тикер инструмента? Спасибо

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

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