alfacentavra
alfacentavra личный блог
19 сентября 2023, 15:59

Qlua: работа с заявками (часть 1).

Зачем нужен демо терминал
Где открыть учебный счет
Выставление заявки в торговом терминале через скрипт
Делаем функцию выставления заявки по требуемым условиям
Карман заявок и tri-файлы
Параметры для заявок с примерами по разным рынкам

Почему важно начинать работу с заявками на qlua с демо терминала?

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

Достаточно, например, прописать в ыставление заявки в цикле, который еще будет прописан без существенного sleep или условия завершения цикла не наступят, то в терминал могут полететь сотни заявок в секунду, в этом случае на реальном счете можно попасть на очень крупную сумму (в отличие от демо, который просто выведет сообщение после определенного значения, что не принимает новых заявок).

После прохождения всех тем работы с заявками, сделками и позициями на учебном счете (доступ, как правило, дается на 3-4 недели, этого как раз хватит) можно будет переносить свои скрипты на боевой счет.


Где открыть демосчет.

Раньше демосчет был одной из базовых услуг со стороны брокеров. С помощью учебных счетов привлекались новые клиенты, поэтому доступ к демо терминалу давал почти каждый брокер, кто предоставлял квик для торговли.

Но времена меняются и всё больше людей переходят на мобильные приложения. В самой первой статье этого цикла я ссылался на отчет ЦБ «портрет клиента брокера» по которому более 70% пользуются приложениями и в 4 раза меньше клиентов, работающих с торговыми терминалами. Это и понятно: приложение проще, нагляднее, как правило интуитивно понятный дизайн и функционал, не нужно изучать гораздо более сложную «бортовую панель» самолетаторгового терминала. Скачать приложение быстрее, не нужны танцы с бубнами с регистрацией паролей, настройками и пр.

Поэтому очень много брокеров, в т.ч. крупных просто перестали давать демодоступ к терминалу (компании платят за каждую подобную лицензию разработчикам терминала). Кто-то стал давать некий аналог – демосчет в приложении, с помощью которого потенциальные клиенты могут попробовать поработать на финансовых рынках, активно поторговать или собрать инвестиционный портфель, не рискуя реальными деньгами. Так вот подобные демосчета в приложении нам не нужны.

Я специально решил сделать эту оговорку, т.к. нам понадобится демосчет именно к терминалу квик, а не в приложениях или личном кабинете. Даже у крупных игроков, например у Сбера, Газпромбанка есть демосчет, но в приложении. С торговым терминалом Quik они никак не связаны. У кого-то есть и демо к квику, и к приложению (например в ВТБ Инвестиции, FinamTrade у Финама), нам нужен будет именно доступ к торговому терминалу.

На текущий момент такие доступы дают:

ВТБ https://www.vtb.ru/personal/investicii/quik/demo/
БКС https://broker.ru/demo
ФИНАМ https://www.finam.ru/landings/demoaccount/
АЛОР https://www.alorbroker.ru/education/demo
КИТ Финанс https://brokerkf.ru/p/demo-version-of-quik/

Со временем список может и уменьшится, не исключаю. Так, например, еще совсем недавно через Открытие можно было оформить учебный демосчет, но какое-то время назад с сайта его «выпилили». Возможно в преддверии поглащения, возможно просто стало накладным поддерживать этот сервис. Может также кто-то из числа новых брокеров станет предоставлять демо доступ и текущий, теперь уже очень скромный список, пополнится.

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

Также есть демотерминал у разработчиков – компании ARQA Technologies:

Арка: https://arqatech.com/ru/support/demo/

Я буду использовать его. Звонков в этом случае нет, но и обратиться с просьбой продлить доступ не получится (брокера могут это сделать, иногда сразу на несколько месяцев вперед)

Демотерминал отражает не все инструменты, сами котировки могут отличаться от реальных (обычно идут с задержкой от текущих торгов), зато на фондовой секции торги симулируются даже в выходные (!). Что бывает полезным, если в будни вы не успеваете всё доделать по своему скрипту и запустить его в работу.

Как правило после регистрации учебного счета в тот же день, либо на следующий придет письмо с доступом и инструкцией установки демотерминала. Я рекомендую сделать цветовые настройки графика немного отличающимися от основного (боевого) квика, чтобы на начальных порах не путаться. Например у меня на рабочих квиках белый фон, на учебном я выставляю светлосерый. Фон у графиков меняется через настройки: редактировать (CTRL + E), Диаграмма, вкладка «Внешний вид».


Выставление заявки через скрипт

Заявка в терминал выставляется через функцию sendTrasnaction, в которую необходимо передать таблицу (массив) с необходимыми параметрами. Все значения в таблице должны быть строками, поэтому цифры будем прописывать через tostring.

Транзакция – это любое поручение, которое мы отправляем в терминал: заявка, снятие заявки, стоп заявка и пр. Транзакции для фондового рынка и для срочного немного отличаются (полями). То, что хочет получить биржа, чтобы корректно отработать транзакцию. Мы сейчас будем рассматривать выставление заявки на фондовом рынке. Какие поля необходимы для других рынков рассмотрим ниже после основных примеров.

Напишем скрипт выставления заявки на покупку акций Сбербанка. Часть переменных для заявки будем вводить в OnInit, это ускорит дальнейший перенос скрипта на боевой терминал, не нужно глубоко отматывать код, чтобы изменить торговый счет, например, или инструмент.

Qlua: работа с заявками (часть 1).

Торговый счет (account) можно взять, например, из формы выставления заявки:

Qlua: работа с заявками (часть 1).

В боевом терминале торговый счет будет другим, нужно будет изменить, но пока мы всё пишем для демо.

В main пропишем таблицу с параметрами заявки:

Qlua: работа с заявками (часть 1).

id транзакции – любое число/собственная нумерация транзакций (любое число от 1 до 2 147 483 647). Удобнее вести счет с момента запуска скрипта, тогда можно отслеживать по номерам все выставленные заявки.

Через комментарии CLIENT_CODE скрипт может определять свои заявки, которые он ставил и работать только с ними (снимать, перевыставлять, проводить какие-то расчеты или запускать иные действия), не трогая заявки других скриптов и те, что были выставлены руками.

После запуска скрипта error_transaction возвращается либо пустой, если заявка нормально обработана терминалом, либо будет содержать ошибку.

Например, запустив текущий скрипт и получим следующую ошибку:

Qlua: работа с заявками (часть 1).

Связано это с тем, что в демо терминале класс акций не TQBR, а QJSIM.

Подправим класс в OnInit и запустим повторно. Заявка выставлена:

Qlua: работа с заявками (часть 1).

Файл на github


Причем, как видим, сообщение от скрипта выводится даже с опережением уведомления терминала о выставленной заявке.

Цену сейчас в скрипте мы выставили самостоятельно. Но можно это сделать автоматически в привязке к последней цене (например, выставить на 0,25 руб. ниже последней сделки).

Цену последней сделки мы можем брать из таблицы текущих торгов, с ленты всех сделок, получая последнюю цену с графика, либо можем брать, заглядывая в биржевой стакан

Во всех случаях подразумевается, что соответствующее окно (таблица текущий торгов, ленты всех сделок, стакан или график) открыты в демо терминале.

Чтобы выставить заявку по getParamEx, например, нужно заменить price на цену последней сделки с таблицы текущих торгов минус 0,25:

price = tonumber(getParamEx(class, tiker, "LAST").param_value) – 0.25

результат получится тот же.


Делаем функцию выставления заявки с необходимыми условиями

Теперь пропишем выставление нашей заявки в отдельную функцию, чтобы далее мы могли просто вызывать её с указанием минимальных нужных нам параметров.

 Qlua: работа с заявками (часть 1).

Теперь выставление заявки внутри main становится гораздо более компактным:

Qlua: работа с заявками (часть 1).

Файл.

На демосчете таймаут можно ставить и меньше, но при работе с реальными счетами нужно учитывать, что терминалу требуется время на обработку транзакции. Позднее мы посмотрим как можно сократить время ожидания (чаще всего терминал обрабатывает всё очень быстро, но бывают ситуации, например при сильной загрузке сервера или кратковременном обрыве связи, при которых это время может и затянуться). Это достигается функцией обратного вызова OnTransReply, пока же просто закладываем небольшой периода таймаута.

Выставляем серию заявок циклом:

Qlua: работа с заявками (часть 1).

Получаем:

Qlua: работа с заявками (часть 1).

По комментариям в окне заявок видно в какой последовательности эти заявки выставлялись:
Qlua: работа с заявками (часть 1).

Файл

Здесь я вручную внес в код произвольные уровни (отступил 2 лучших цены покупки и продажи, на тот момент это были 256,9 и 257,06 р. соответственно) и от них в цикле выставил заявки с разницей в 0,01 руб. в обе стороны. В качестве самостоятельной работы можете переписать данный скрипт, чтобы он:

а) сам обращался к стакану заявок и брал цену лучшей покупки/продажи для аналогичного выставления.

b) cамостоятельно определял 3-ую по счету цену спроса/предложения и выставлял заявки от них.


Т.к. счет учебный можно пойти на различные эксперименты. Например выставим заявки циклом по фиксированной цене, но количество итераций поставим 300 и исключим в коде ожидание (sleep). Заявки будут на покупку, но уровень нужно поставить сильно ниже текущих покупок, чтобы они случайно не исполнились.

Система примет данные заявки до определенного порогового значения, после чего выдаст ошибку и отклонит остальные:

 Qlua: работа с заявками (часть 1).

Снимем все заявки (правая клавиша мышки на таблице заявок, снять активные заявки) и немного изменим код. Теперь вернем таймаут (достаточно оставить sleep(300) ) и выставим цену существенно выше самой дорогой продажи. И также запустим скрипт. В этом случае каждая выставленная заявка будет исполняться, пока нам хватает виртуальных средств.

Но после терминал выдаст маржинальные ограничения (НПР – норматив покрытия риска):

Qlua: работа с заявками (часть 1).

На реальном счете, как понимаете, такие эксперименты могут достаточно дорого стоить.

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


Карман транзакций и tri-файлы

Один из вариантов того как получить необходимые поля для выставления заявок – это работа с карманом транзакций. И т.к. со временем разработчики могут что-то поменять в параметрах при выставлении заявок через sendTransaction, именно работа с данным карманом позволяет посмотреть актуальные поля и примеры для разных рынков и инструментов.

В терминале его можно настроить через Создать окно / карман транзакций. Если не находите такой пункт в меню, то заходим в Создать окно / настроить меню, выбираем в Прочее Карман транзакций, переносим в правую часть, нажимаем ОК.

Qlua: работа с заявками (часть 1).

В этом кармане можно создать заявки как шаблоны и в ручном режиме использовать их для выставления. Но эти же шаблоны можно сохранит в tri файлы и быстро вытаскивать набор таких шаблонов в терминал, когда это необходимо. Один из вариантов «полуавтоматической» торговли через этот карман: когда через любое другое приложение (скрипт на python, VBA Excel и т.п.) создаются нужные tri файлы, а в терминале они только подтягиваются в кармане транзакций и вручную выставляются.

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

Создаем карман: создать окно / карман транзакций. Выбираем доступные классы: акции (в демо терминале Акции 1-го уровня), доступные транзакции: ввод заявки, доступные параметры выбираем все. Нажимаем Да.

Qlua: работа с заявками (часть 1).

Появилась таблица кармана транзакций. Нажим на неё, далее F2 (либо правая клавиша мышки и Положить в карман):

Qlua: работа с заявками (часть 1).

В демо терминале будет доступно меньше инструментов, но нам сейчас нужно просто потестировать сам подход:

Qlua: работа с заявками (часть 1).

И выставляем саму заявку, например покупка Сбербанка:

Qlua: работа с заявками (часть 1).

Теперь видим, что заявка сохранилась в кармане:

Qlua: работа с заявками (часть 1).

Нажимаем на окно правой клавишей мышки, выбираем «Сохранить транзакции в tri-файл».

Открываем полученный файл через, например, блокнот и видим:

Qlua: работа с заявками (часть 1).

Собственно, именно отсюда и можно было узнать и торговый счет, и класс бумаг для данного демо терминала.

Более детально что такое карман транзакций можно почитать в Руководстве пользователя QUIK, Раздел 6 «Совместная работа с другими приложениями». Либо посмотреть в хелпе терминала: F1, забить в поисковой строке «Карман транзакций»:

Qlua: работа с заявками (часть 1).

Поля, которые используются можно найти там же в хелпе, если ввести в поиск tri и выбрать слева в поисковой выдаче «Формат .tri-файла с параметрами транзакций»:

Qlua: работа с заявками (часть 1).

Здесь более 60 параметров, не всё будет нужно в работе, но стоит ознакомиться и попробовать выставить разные типы заявок в
демо терминале через скрипт. Потестировать в т.ч. какие выводятся ошибки при отправке некорректных заявок.

Если промотать в самый низ последнего скрина (формат tri-файла), то там будет ссылка на примеры строк, которые могут содержать данные файлы:

Qlua: работа с заявками (часть 1).

Qlua: работа с заявками (часть 1).

Фактически это и есть шаблоны для выставления заявок по разным рынкам и инструментам.

Здесь можно будет увидеть пример со снятием всех заявок. Однако этот пример только для кармана заявок. Через скрипт можно снимать только конкретную заявку (рассмотрим уже в следующей статье), либо циклом пройтись по всем активным заявкам и снять их.

В следующей статье продолжим работу с заявками, постарайтесь не истратить до этого момента все средства своего демосчета.

Теги: qlua для начинающих, кружок авиамоделизма.

Ранее:

Qlua: введение
Доля клиентов, использующих алгоритмическую торговлю
«Кружок авиамоделизма»
Разные торговые терминалы, почему Quik
Основной функционал qlua
smart-lab.ru/blog/917696.php

Настраиваем торговый терминал и редактор кода
Установка торгового терминала
Подготовка терминала
Вкладки в терминале
Сохранение и загрузка настроек
Таблица системных сообщений
Отключение окна сообщений
Редактор Notepad++
Настройка русского языка в редакторе
Выбор синтаксиса языка и кодировки
Цветовые настройки
Дублирующий просмотр
Запуск первого скрипта
smart-lab.ru/blog/918869.php

Основы qlua, часть 1:
message, конкатенация
фильтрация по сообщениям в терминале
PrintDbgStr, комментарии
типы данных, type
операции с числами
операции со строками
операции с таблицами
условные операторы
smart-lab.ru/blog/920031.php

Основы qlua, часть 2:
Циклы for … do … end, while do … end, repeat … until.
sleep, break, goto.
как пройти весь массив циклом, как пройти таблицу по ключам
локальные и глобальные переменные, функции
получение даты и времени
получение данных через getInfoParam
smart-lab.ru/blog/921366.php

Qlua: структура скрипта.
Структура типового скрипта qlua с примерами.
Обработка скриптом «обрыва связи» с сервером и возобновления работы.
Работа с файлами: запись, перезапись и чтение файла.
getScriptPath, getWorkingFolder
smart-lab.ru/blog/922044.php

Qlua: получение данных из таблицы текущих торгов, создание таблиц в торговом терминале.
Получение биржевых данных через функцию getParamEx
Выгрузка списка параметров функции getParamEx через DDE из торгового терминала
Создание пользовательских таблиц в торговом терминале
smart-lab.ru/blog/923365.php

Qlua: работа с таблицами (продолжение). Пишем своего советника (начало).
Интегрируем таблицы в структуру скрипта qlua.
Удаляем таблицы через DestroyTable.
Останавливаем скрипт через IsWindowClosed.
Обработка события закрытия таблицы через коллбэк.
Работа с цветом SetColor, Highlight, SetSelectedRow.
Пишем простого советника.
smart-lab.ru/blog/924710.php

Qlua: дополняем скрипт советника таймингом:
Устанавливаем время старта работы скрипта,
Ставим тайминг на получение сигналов на вход,
Устанавливаем таймер на приостановку скрипта.
smart-lab.ru/blog/925421.php

Qlua советник: дополняем сигналами на закрытие позиции, таблицей для вывода данных и расчетом финансового результата по позициям.
Дополняем сигналами на закрытие позиции.
Создаем дополнительную таблицу для вывода данных.
Делаем расчет финансового результата.
smart-lab.ru/blog/926972.php

Qlua: завершаем апгрейд советника:
Пропуск «поздних» сигналов на старте.
Обработка советником обрыва связи.
Сохранение сигналов и логов в файл.
smart-lab.ru/blog/927748.php

Qlua: пишем скринер акций Московской биржи
smart-lab.ru/blog/928152.php

Qlua: получение данных биржевых свечей с сервера брокера, обработка данных, пишем скрипт выгрузки котировок
Функция CreateDataSource
Получение количества свечек данных
Пауза для подгрузки данных
Получение по инструменту OPEN, HIGH, LOW, CLOSE, VOLUME
Обработка времени и даты
Закрытие источника данных
Примеры: получение данных последних 10 свечей, выгрузка новой минутной свечки после её закрытия, текущее значение простой средней SMA10 по минуткам
Простой скрипт выгрузки котировок
smart-lab.ru/blog/929905.php

Qlua: получение данных с графиков терминала.
Идентификатор инструмента
Получаем количество свечей через getNumCandles
Получаем свечные данных через getCandlesByIndex
Читаем данные с индикатора SMA
Данные с верхней и нижней линии Price Channel
Графики с таблицы текущих торгов.
Сравнение получение данных через CreateDataSource и через getCandlesByIndex
smart-lab.ru/blog/931408.php

Qlua: работа с метками, пишем торгового советника на индикаторах.
Вывод текста на график
Вывод графических сигналов
Удаление меток с графика
Торговый советник на индикаторах
Удаление данных вечерней/утренней сессии с графика.
smart-lab.ru/blog/933582.php

Qlua: работа с лентой всех сделок.
Что такое таблица обезличенных сделок.
Настройка таблицы в терминале.
Что делать, если таблица открылась, но она пустая.
Вывод данных с таблицы по DDE.
Работа с таблицей обезличенных сделок через скрипт qlua с примерами.
Пишем советника, показывающего на графике крупных игроков.
smart-lab.ru/blog/935919.php

Qlua: работа с лентой всех сделок (часть 2).
Различия данных ленты всех сделок и биржевого стакана.
Большие покупки и продажи в ленте сделок и динамика цены.
Альтернативные варианты поиск крупных игроков по ленте сделок.
smart-lab.ru/blog/938053.php

Qlua: дополняем скринер акций статистикой, лидерами роста и падения.
Добавляем статистику по акциям роста и падения.
Составляем TOP лидеров роста и падения.
Быстрый поиск акций по тикеру в терминале.
smart-lab.ru/blog/938450.php

Qlua: работа с биржевым стаканом.
Работа с биржевым стаканом через getQuoteLevel2
Особенность нумерации в стакане заявок терминала квик
Работа через функцию обратного вызова OnQuote
Примеры работы со стаканом из скрипта
Сравнение реализации одного алгоритма через разные функции
smart-lab.ru/blog/940742.php

 

 

 

8 Комментариев
  • Ухо спекулянта
    19 сентября 2023, 18:34
    самый нужный и полезный пост за последние 5 тысяч постов… жива ещё работорговля у нас… жива))
  • Сергей Иванов
    20 сентября 2023, 10:10
    Alfacentavra, вот и до заявок добрались, спасибо огромное
  • serg1209
    20 сентября 2023, 17:27
    Спасибо.
  • Михаил Заволока
    25 сентября 2023, 02:22
    Палишь граали!) Эта статья — буквально отправная точка для начинающих алготрейдеров. Только тема функции OnTransReply() не раскрыта. Спалю тоже миниграальчик: поиском по коду проектов на гитхабе названия функции OnTransReply github.com/search?q=ontransreply&type=code можно получить исходники опенсорсных роботов!
  • Робот Вася
    26 сентября 2023, 12:27
    Спасибо за пост!
    Вопрос — 13 сентября был сбой на Мосбирже/БКС и после восстановления работы, у меня где-то в 11.30 я заметил, что все значения поля Trans_ID были потеряны, не в курсе случайно, что происходило с комментариями в поле CLIENT_CODE?

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

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