Блог им. morefinances

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

Функция OnTrade
Сохранение параметров сделки в файл.
Работа с таблицей сделок.
Сохранение всех сделок дня.
Скрипт автосохранения всех заявок и сделок под завершение торгового дня.

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

В файле QLUA.chm в директории терминала находим через поиск описание самой функции:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.
И таблицу с параметрами:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

Отдельные статусы (направление: покупка/продажа, маржинальная сделка и пр.) спрятаны, как мы это уже встречали ранее, побитово в flags:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

Возьмем скрипт, который использовали ранее для отслеживания коллбэков OnTransReply и OnOrder и дополним его аналогичной отработкой коллбэков от OnTrade:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.
 

Выставим покупку по ближайшему OFFER и получим отбивки:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.
Видим, что комментарий (brokerref) приходит пустым (отсутствуют данные после //), а trans_id в OnOrder = 0

В отличие от OnTransReply ответы у OnTrade (как и у OnOrder) приходят от всех сделок, в т.ч. выставленных вручную, а не только алгоритмически через скрипт. Здесь OnTrade пришел раньше OnOrder, но это бывает очень по-разному, ранее уже касались этой темы.

Теперь выставим заявку средствами qlua.

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

Добавив в скрипт возможность отслеживать время отклика каждого коллбэка через os.clock():

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

Видим, что появилась и «отбивка» от OnTransReply, и trans_id = 1, и brokerref с необходимыми данными для дальнейшего отслеживания заявки.

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

OnTransReply сработало потому что при выставлении из lua скрипта мы указываем в sendTransaction id транзакции (trans_id), а у ручных заявок нет trans_id, что можно наблюдать в таблице заявок:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

Первая заявка была выставлена вручную, в таблице по ней нет ID.

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

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.
 

Скрипт: https://github.com/morefinances/qlua/blob/main/OnTransReply_and_OnOrder_and_OnTrade_with_sendtransaction_final.lua

Напомню, что ответ от OnOrder может приходить дважды (и самый первый коллбэк может быть в т.ч. с trans_id = 0 по заявкам, поданных через скрипт, после чего обычно приходит и коллбэк с полными данными по trans_id), а от OnTrade ответов может быть даже несколько на одну и ту же операцию, поэтому, при необходимости, стоит заложить в логику скрипта отсечение повторяющихся коллбэков по номерам или комментариям (brokerref) заявок (учитывая при этом, что заявка может разбиваться на несколько сделок при частичном исполнении).

Некоторые на начальном этапе для упрощения работы обходятся только работой с функцией OnTrade без OnTransReply и OnOrder по логике «заявка либо исполнилась, либо что-то пошло не так». Но правильнее контролировать процесс на всех этапах и задействовать в т.ч. промежуточные коллбэки, чтобы включить в алгоритм логику того, что именно может пойти не так и как на это нужно реагировать.

 

Сохранение параметров сделки в файл.

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

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

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.
 

Для удобства добавим заголовки таблицы, которые впишем в файл, в случае, если получили первую сделку с начала дня:

number_of_trades = getNumberOf("trades")

if number_of_trades == 1 then

  txt_trade_string = "trade_num;order_num;price;qty;direct;value;brokerref;\n"

end


После сохранения сделок получаем файл, с которым можно работать в любой удобной вам среде, хоть в привычном Excel, хоть в python.

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

 

Скрипт: https://github.com/morefinances/qlua/blob/main/save_one_trade.lua


Таблица сделок

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

В скрипте для заявок находим getItem и меняем orders на trades, используем параметры сделок (из скринов с QLUA выше) и можем запустить следующий скрипт:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.
 

Напомню, что нумерация в таких таблицах квика идет с 0. Получаем следующий вывод в таблицу сообщений:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

 

Скрипт: https://github.com/morefinances/qlua/blob/main/print_all_trades.lua

Гораздо удобнее работать с этой информацией, если сохранять её в файл. Напишем соответствующий скрипт.

 

Сохранение всех сделок дня в файл.

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

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

Скрипт: https://github.com/morefinances/qlua/blob/main/DownloadsAllTrades.lua 

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

 

Скрипт автосохранения всех заявок и сделок под завершение торгового дня.

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

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

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

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

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

В main:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.
 

Скрипт: https://github.com/morefinances/qlua/blob/main/autodownloads_all_orders_and_trades.lua

В текущем скрипте сохранение данных происходит в 18:51. Если вам нужно сохранение заявок и сделок в т.ч. и вечерней сессии поставьте таймер на 23:51 (time_for_downloads=235100 в OnInit), например, чтобы по тем заявкам, которых система будет снимать, успели поменяться статусы.

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

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

 

Теги: 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

Qlua: работа с заявками (часть 1).
Зачем нужен демо терминал
Где открыть учебный счет
Выставление заявки в торговом терминале через скрипт
Делаем функцию выставления заявки по требуемым условиям
Карман заявок и tri-файлы
Параметры для заявок с примерами по разным рынкам
smart-lab.ru/blog/942481.php

Qlua: работа с заявками (часть 2).
Узнаем общее количество заявок
Функции getNumberOf и getItem
Как пройтись циклом по всем заявкам
Вывод активных заявок
Снять скриптом заявку
Снимаем все активные заявки скриптом
Снимаем только заявки, выставленные конкретным скриптом
smart-lab.ru/blog/944520.php

Qlua: работа с заявками (часть 3).
Функция OnTransReply
Функция OnOrder
Получение остатка по заявке, контроль исполнения полного объема
Таблица транзакций
Общая логика выставления лимитной заявки в стакане
smart-lab.ru/blog/949198.php



  • обсудить на форуме:
  • Quik Lua
★14
16 комментариев
День добрый, спасибо
ps вы вернулись ровно через 6 месяцев )) так было и задумано?
Сергей Иванов, добрый день)
Было пару заказов, которые заняли значительно больше времени, чем я изначально планировал на них потратить.
avatar
сделки дня сохранять из QUIK мало смысла — там нет правильных комиссов биржи и брокера
я лично скриптом в аутлуке сохраняю отчеты в папки и потом уже vba парсит файлы-отчеты брокера
а комиссы важны, потому что в конце года надо проверять ндфл. и второй раз собирать все сделки за год то еще удовольствие))
все равно ++!
avatar
evg_gen, ну здесь не ради комиссий, а для контроля исполнения заявок и фиксации цен/объемов по сделкам.
avatar
alfacentavra, здравствуйте !
С Днем Космонавтики! Это Ваш день !
Огромнейшее спасибо за публикации, некоторые приемы по QLUA позволили сэкономить кучу времени на разбирательство с документацией и «косяками» Арки!
Сам занимаюсь процедурным QLUA несколько лет.
Не могу писать в ЛС, поэтому здесь, сорри.
Вопросы к опытному в QUIK/QLUA человеку.
В поиске точек входа/выхода в позиции и из позиций есть ли опыт использования стаканных «паттернов», имею в виду анализ плотностей, их расположения, анализ айсбергов по ленте сделок, расположения цены последней сделки в стакане ?
Если да, насколько позитивный ?
Сам пытаюсь анализировать самописную историю данных ленты и стаканов внутри дня так, в том виде, как они «прилетают» в Quik.
Что-то получается.
Но есть сомнения, что задержки прихода данных и выставления заявок в терминале сведут на нет весь реальный профит по сравнению с получающимся виртуальным.
Или все-же «стаканно-ленточная» ТС на QLUA в Квике может отловить «рыбу»?
avatar
BITE4SAVE, добрый день! Спасибо!) Взаимно!
Рад, что материалы были полезными.

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

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

Задержки данных будут всегда, если не покупаете прямой доступ на биржу (DMA, но это дорогое удовольствие). Если закладывать работу стратегий на таймфрейме от 3-5 минут и выше, то небольшие задержки (в 2-3 секунды, которые обычно по несколько раз в день встречаются даже у крупных брокеров на реальные результаты не сильно скажутся. Да даже если стратегии на минутках. Если таймфрейм меньше минуты, то результаты от таких задержек данных, выставления / перевыставления / снятия заявок, отработки событий будет уже сильно хуже по стратегия. Высокочастотные стратегии я бы на qlua не планировал реализовывать. Мы где-то это уже обсуждали в комментариях, есть более быстрые языки, которые можно задействовать. Но весь вопрос — нужно ли. Не уверен, что в HFT торговле через квик сейчас «есть деньги». Скорее так можно быстрее получить какой-то опыт и перейти на привычные (хотя бы от 1М) интервалы.

А в целом автоматизировать свою торговлю, используя весь арсенал данных, которых можно выгружать с терминала — да, вполне норм. И лента сделок здесь в числе наиболее важных.
avatar
alfacentavra, Спасибо за такой конкретный и развернутый ответ! Ваше мнение очень мне интересно! Успехов и удач!
avatar
BITE4SAVE, спасибо, взаимно!!!
avatar
Спасибо большое за труды. Какие в дальнейшем планы по работе: индикаторы, колбэки, живые таблицы или..?
avatar
Олег Леликов, честно говоря еще около 4-5 тем из числа вводных осталось. Дальше если и буду продолжать тему, то просто какие-то небольшие полезные скрипты в качестве примеров выкладывать.
avatar
alfacentavra, Спасибо. Хотелось бы конечно много большего, вплоть до ООП.
avatar
Олег Леликов, ну пока темы для начинающих. Как знать, может и до ООП дойдем когда-нибудь. Причем это не прикладная тема: видел примеры роботов, где ООП очень органично использовалось. Правда это был не qlua.
avatar
alfacentavra, Благодарю. Ждём.
avatar
отличные и полезные полезные посты!
avatar
OrinokoA, спасибо!
avatar
UPD: подправил небольшие неточности в последнем скрипте.

Актуальная версия:
github.com/morefinances/qlua/blob/main/autodownloads_all_orders_and_trades2.lua
avatar

теги блога alfacentavra

....все тэги



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