Блог им. kiselev

Автоматизация подачи заявок в начале сессии - полуавтомат на языке 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 с дополнением функций анализа лимитов, анализа ценовых уровней закрытия предыдущего дня и максимальной возможной цены. Поэтому скрипт прекращает работать.
Не является рекомендацией. Для общеобразовательных целей.


  • обсудить на форуме:
  • QUIK
★46
23 комментария
«100-200 заявок на открытии» —
это в один прекрасный момент ппц депозиту даже без плечей.
Не просто ппц, а останетесь должны брокеру!

Система старая, где-то с 2013 года
Полагаю, вы ошиблись минимум лет на 100 )))
avatar
VladMih,  спасибо за ваше мнение. Биржевая торговля — это опасно 
avatar
kiselev, это не мнение, это математика арифметика, первый класс.
А про возраст системы — это знание букварей. 
avatar

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

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

avatar
Михаил Titov, таки есть обеспечение.
1) Система без шортов. Акции свои портфельные. При выносе вверх на импульсе можно остаться без акций. Это минус и такое случалось. Печалился и ждал снижение. Иногда снижение приходит спустя пару месяцев. Но есть и примеры такие как ТГК-2 преф, которые так и не снизились к уровням моей продажи. Там я заработал всего около 100% ROE, а мог больше 500%.
2) При проливах вниз я получал небольшой выход в плечо под залог ликвидных голубых фишек, которые не лежат с инвестиционным горизонтом. Небольшой займ закрывается в течении сессии или двух. 
3) Ну и как мы знаем на медвежьем рынке лучше не ловить ножи. Например, в марте 2020 года просто снял все покупки из скрипта. Точнее разделил на два — один скрипт на продажу и один покупки. Скрипт «ловлю ножи» в марте не запускал. В марте работал скрипт продажи своих бумаг.
avatar
Если эта штука приносит/принесла тебе профит, то это заслуживает уважения, пусть и не за сложность/простоту конструкции, а в принципе, за то что сел и сделал. А других не слушай, представь сколько вони ты услышишь в свой адрес, если выложить алгоритм, использующий неэффективность, которая держится только лишь на том, что ее знает узкий круг. Но для тебя этот алгоритм уже не актуален, а кто-то на нем живет до сих пор)
avatar
Serj90, благодарю за поддержку 
avatar
На ликвидах утром тоже гепы бывают, которые закрываются.
avatar
И какой самый крупный был улов на этом старом скрипте за все время?
avatar
Technotrade, за 7 лет суммарно 1 — 2 млн руб доп кэша скрипт принёс. Неэффективностей было много. Раньше больше, сейчас меньше. Это прибавка 6-10 процентных пунктов к годовой доходности портфеля на 3 млн. руб
avatar
Сергей Сергаев, я подозревал, что уже давно не один 
avatar

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

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



 


avatar
Андрей Хрущев, спасибо за информацию, воспользовался.
avatar
если эта штука только выставляет заявки, то почему бы просто не доставать их с кармана на премаркете, там же можно и корректировать ...  
avatar
A_N, эта штука не претендует на единственный способ исполнения. Наверное можно из кармана. Напишите как это сделать. Можно ли из кармана достать 200 заявок за 2 сек?
avatar
kiselev, хоть триста.  делаете заявки сколько хотите, таблицу заявок, сохраняете в файл правая кнопка сохранить (там текстовый будет) затем создать окно выбираете создать карман. правой..  достать заявки из файла, все они в кармане. если надо одну встаете на нее, если все — достать все из кармана. и все заявки за сек зарегистрированы. можно убирать из вармана, можно править   если что в справке на квик все подробно
avatar
A_N, у некоторых брокеров есть ограничения на кол-во выставление заявок в минуту, у меня больше 50 заявок за один раз не достается из кармана (Открытие)
avatar
retverd, нюанс, не знал..., втб ставлю меньше 50, может второй карман сделать попробовать
avatar
Более совершенный скрипт с реализацией на QLUA : 
smart-lab.ru/blog/737046.php

avatar
Всем привет.
class=get_class(code)
SecInfo = GET_SECURITY_INFO("", code)
message(«Вход в лонг позицию»,1)

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

теги блога Алексей

....все тэги



UPDONW
Новый дизайн