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


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

25 августа 2020 smart-lab.ru
Раскрываю небольшую часть своей торговли в прошлом. Система старая, где-то с 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 с дополнением функций анализа лимитов, анализа ценовых уровней закрытия предыдущего дня и максимальной возможной цены. Поэтому скрипт прекращает работать.

/ (C) Источник
Не является индивидуальной инвестиционной рекомендацией
При копировании ссылка обязательна Нашли ошибку: выделить и нажать Ctrl+Enter