Блог им. morefinances
Функция OnTrade
Сохранение параметров сделки в файл.
Работа с таблицей сделок.
Сохранение всех сделок дня.
Скрипт автосохранения всех заявок и сделок под завершение торгового дня.
Для отслеживания прошедших сделок мы можем задействовать функцию обратного вызова OnTrade. Она во многом похожа по логике на OnOrder, только возвращает коллбэки уже по исполненным сделкам. В случае, если заявка разбивается на несколько сделок, мы получим информацию по каждой.
В файле QLUA.chm в директории терминала находим через поиск описание самой функции:
Отдельные статусы (направление: покупка/продажа, маржинальная сделка и пр.) спрятаны, как мы это уже встречали ранее, побитово в flags:
Возьмем скрипт, который использовали ранее для отслеживания коллбэков OnTransReply и OnOrder и дополним его аналогичной отработкой коллбэков от OnTrade:
Выставим покупку по ближайшему OFFER и получим отбивки:
Видим, что комментарий (brokerref) приходит пустым (отсутствуют данные после //), а trans_id в OnOrder = 0
В отличие от OnTransReply ответы у OnTrade (как и у OnOrder) приходят от всех сделок, в т.ч. выставленных вручную, а не только алгоритмически через скрипт. Здесь OnTrade пришел раньше OnOrder, но это бывает очень по-разному, ранее уже касались этой темы.
Теперь выставим заявку средствами qlua.
Добавив в скрипт возможность отслеживать время отклика каждого коллбэка через os.clock():
Видим, что появилась и «отбивка» от OnTransReply, и trans_id = 1, и brokerref с необходимыми данными для дальнейшего отслеживания заявки.
OnTransReply сработало потому что при выставлении из lua скрипта мы указываем в sendTransaction id транзакции (trans_id), а у ручных заявок нет trans_id, что можно наблюдать в таблице заявок:
Первая заявка была выставлена вручную, в таблице по ней нет ID.
Не путать с ID транзакций в таблице транзакций, которые имеются даже при ручном выставлении:
Напомню, что ответ от OnOrder может приходить дважды (и самый первый коллбэк может быть в т.ч. с trans_id = 0 по заявкам, поданных через скрипт, после чего обычно приходит и коллбэк с полными данными по trans_id), а от OnTrade ответов может быть даже несколько на одну и ту же операцию, поэтому, при необходимости, стоит заложить в логику скрипта отсечение повторяющихся коллбэков по номерам или комментариям (brokerref) заявок (учитывая при этом, что заявка может разбиваться на несколько сделок при частичном исполнении).
Некоторые на начальном этапе для упрощения работы обходятся только работой с функцией OnTrade без OnTransReply и OnOrder по логике «заявка либо исполнилась, либо что-то пошло не так». Но правильнее контролировать процесс на всех этапах и задействовать в т.ч. промежуточные коллбэки, чтобы включить в алгоритм логику того, что именно может пойти не так и как на это нужно реагировать.
Сохранение параметров сделки в файл.
Чтобы сохранять каждую сделку в файл после получения соответствующего коллбэка достаточно добавить сохранение полученных данных в файл. Работу с файлами мы также проходили ранее.
Напомню, что само сохранение лучше вывести из функции обратного вызова в main, а в коллбэке только вести сохранение данных в переменную (в нашем случае txt_trade_string), из которой далее в основном рабочем цикле уже и будем производить сохранение. Это не будет перегружать скрипт и в целом его работа будет более устойчивой:
Для удобства добавим заголовки таблицы, которые впишем в файл, в случае, если получили первую сделку с начала дня:
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.
Скрипт: https://github.com/morefinances/qlua/blob/main/save_one_trade.lua
Таблица сделок
По аналогии с тем, как мы обращались к таблице заявок, мы можем работать и с таблицей собственных сделок. Данные таблицы сделок, как и таблицы заявок, терминал ежедневно обнуляет, поэтому достаточно актуальным бывает вопрос сохранения этой информации.
В скрипте для заявок находим getItem и меняем orders на trades, используем параметры сделок (из скринов с QLUA выше) и можем запустить следующий скрипт:
Напомню, что нумерация в таких таблицах квика идет с 0. Получаем следующий вывод в таблицу сообщений:
Скрипт: https://github.com/morefinances/qlua/blob/main/print_all_trades.lua
Гораздо удобнее работать с этой информацией, если сохранять её в файл. Напишем соответствующий скрипт.
Сохранение всех сделок дня в файл.
Добавим блок сохранения информации c таблицы сделок в csv файл. В отличие от предыдущего скрипта его можно запускать, например, под завершение торгового дня, а не держать включенным для получения откликов по отдельным сделкам.
Скрипт: https://github.com/morefinances/qlua/blob/main/DownloadsAllTrades.lua
На выходе получается csv файл, который полностью продублирует информацию с таблицы сделок. Дополним этот скрипт так, чтобы он запускал сохранение по таймеру.
Скрипт автосохранения всех заявок и сделок под завершение торгового дня.
Удобно, чтобы скрипт самостоятельно сохранял под завершение торговой сессии все заявки и сделки. При желании можно реализовать сохранение в единый журнал заявок и сделок, но мне лично удобно разделять эту информацию. В этом примере рассмотрим именно такой вариант: когда мы хотим, чтобы по каждому торговому дню запись проводилась в отдельные файлы по заявкам и сделкам.
В OnInit добавим название файла для заявок, таймер сохранения данных и индикацию выгрузки.
Добавим по аналогии с функцией сохранения трейдов функцию сохранения данных с таблицы заявок:
В main:
Скрипт: 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
ps вы вернулись ровно через 6 месяцев )) так было и задумано?
Было пару заказов, которые заняли значительно больше времени, чем я изначально планировал на них потратить.
я лично скриптом в аутлуке сохраняю отчеты в папки и потом уже vba парсит файлы-отчеты брокера
а комиссы важны, потому что в конце года надо проверять ндфл. и второй раз собирать все сделки за год то еще удовольствие))
все равно ++!
С Днем Космонавтики! Это Ваш день !
Огромнейшее спасибо за публикации, некоторые приемы по QLUA позволили сэкономить кучу времени на разбирательство с документацией и «косяками» Арки!
Сам занимаюсь процедурным QLUA несколько лет.
Не могу писать в ЛС, поэтому здесь, сорри.
Вопросы к опытному в QUIK/QLUA человеку.
В поиске точек входа/выхода в позиции и из позиций есть ли опыт использования стаканных «паттернов», имею в виду анализ плотностей, их расположения, анализ айсбергов по ленте сделок, расположения цены последней сделки в стакане ?
Если да, насколько позитивный ?
Сам пытаюсь анализировать самописную историю данных ленты и стаканов внутри дня так, в том виде, как они «прилетают» в Quik.
Что-то получается.
Но есть сомнения, что задержки прихода данных и выставления заявок в терминале сведут на нет весь реальный профит по сравнению с получающимся виртуальным.
Или все-же «стаканно-ленточная» ТС на QLUA в Квике может отловить «рыбу»?
Рад, что материалы были полезными.
Я когда-то начинал тесты стратегий на стаканах, но быстро пришел к выводу, что это очень локальный инструмент для алгоритмов. Стакан сейчас можно использовать для анализа ликвидности инструмента, например. Или для оценки движения цены при входе большой суммой (для юриков может быть полезным). Но даже это очень прикладная информация, т.к. крупнях входит либо через айсберги, либо с помощью скриптов, разбивая свою заявку на множество мелких с постоянным перевыставлением по мере их исполнения. Во 2-3 эшелоне можно заметить, что в стакане есть движения (имитация торгов), а лента сделок почти без движения при этом. Т.е. создается видимость, что инструмент активно торгуется.
А вот по ленте сделок да, уже много хороших стратегий получилось. «Здесь рыба есть»). В сочетании самых простых и лаконичных фильтров и общедоступных принципов построения стратегий можно очень хорошо улучшить результаты.
Да и мой опыт общения с людьми, кто профессионально торгует алгоритмами (или пишет роботов для банков и крупных фондов, например), показывает, что они преимущественно используют именно этот инструмент (таблицу обезличенных сделок/тиковые данные) для анализа и выбора точек входа.
Задержки данных будут всегда, если не покупаете прямой доступ на биржу (DMA, но это дорогое удовольствие). Если закладывать работу стратегий на таймфрейме от 3-5 минут и выше, то небольшие задержки (в 2-3 секунды, которые обычно по несколько раз в день встречаются даже у крупных брокеров на реальные результаты не сильно скажутся. Да даже если стратегии на минутках. Если таймфрейм меньше минуты, то результаты от таких задержек данных, выставления / перевыставления / снятия заявок, отработки событий будет уже сильно хуже по стратегия. Высокочастотные стратегии я бы на qlua не планировал реализовывать. Мы где-то это уже обсуждали в комментариях, есть более быстрые языки, которые можно задействовать. Но весь вопрос — нужно ли. Не уверен, что в HFT торговле через квик сейчас «есть деньги». Скорее так можно быстрее получить какой-то опыт и перейти на привычные (хотя бы от 1М) интервалы.
А в целом автоматизировать свою торговлю, используя весь арсенал данных, которых можно выгружать с терминала — да, вполне норм. И лента сделок здесь в числе наиболее важных.
Актуальная версия:
github.com/morefinances/qlua/blob/main/autodownloads_all_orders_and_trades2.lua