А.К.
А.К. личный блог
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 )))
  • Михаил Titov
    25 августа 2020, 11:30

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

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

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

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

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