После того как исполнилась сделка и мы получили соответствующий коллбэк у нас меняются данные по позициям и доступным лимитам. Посмотрим, как можно работать с этими данными через скрипт.
Для анализа состава портфеля, лимитов и их динамики используются таблицы:
Клиентский портфель (получаем данные через getPortfolioInfo и getPortfolioInfoEx).
Позиции по деньгам (getMoney и getMoneyEx, money_limits).
Позиции по инструментам (getDepo, getDepoEx, depo_limits).
Ограничения по клиентским счетам (futures_client_limits).
Позиции по клиентским счетам (futures_client_holding).
Таблица «Клиентский портфель» даёт сводную информацию по лимитам и параметрам риска брокерского счета. Таблицы «Позиции по деньгам» (лимиты) и «Позиции инструментам» (ценные бумаги) показывают данные в разрезе фондового рынка. Таблицы «Ограничения по клиентским счетам» (лимиты) и «Позиции по клиентским счетам» (фьючерсы и опционы) – только про срочному рынку.
Добавляются они через вкладку меню «Создать окно», если какой-то позиции не находите, то добавляем в меню: Создать окно / Настроить меню, далее находим нужные таблицы, добавляем, ОК. Либо можно, если без добавления в меню, создать сразу: F7 и выбрать требуемую таблицу.
Таблица «Клиентский портфель» показывает сводную информацию по состоянию брокерского счета по всем доступным площадкам в рублях в разрезе различных режимов (Т0 / Т1 / Т2 / Т365).
В силу того, что таблица показывает и фондовый рынок и срочный, то если выводить все доступные столбцы, она получается очень длинной и не удобной. Это связано с тем, что часть данных относится только в фондовому рынку:
В этом плане удобнее либо просматривать отдельные таблицы по фондовой и срочной секции (об этом ниже), либо создать свою пользовательскую таблицу (здесь рассматривали как создавать подобные таблицы) и выводить в неё необходимые вам данные с клиентского портфеля.
Выведем скриптом следующие параметры:
Входящие средства — состояние портфеля на открытии торговой сессии по ценам закрытия предыдущего торгового дня.
Текущие средства– оценка состояния портфеля на текущий момент с учетом вариационной маржи по счету.
Стоимость портфеля — оценка собственных средств клиента по текущим позициям и ценам.
Прибыль/убыток — разница между «Текущие средства» и «Входящие средства».
УДС — уровень достаточности средств (показатель закредитованности).
НаПокупНеМаржин – доступные средства для открытия позиции на срочном рынке.
Справка по значениям полей таблицы Клиентский портфель: при активной таблице нажать F1.
С таблицей клиентского портфеля можно работать через функции getPortfolioInfo и getPortfolioInfoEx. Вторая пригодится, если нужны данные с учетом T+.
Описание полей находим в файле QLUA.chm:
Для получения параметров их либо необходимо добавить в таблицу, либо (т.к. эта информация нужна единожды для скрипта и постоянно наблюдать в таблице просто нет необходимости) подсмотреть её через редактирование таблицы Состояние счета:
F7 / Состояние счета / CTRL + E
Получим все значения таблицы через getPortfolioInfo (в Т0). Для этого пройдемся по всем key и value и выведем их сообщениями:
https://github.com/morefinances/qlua/blob/main/getPortfolioInfo_key_value.lua
В таком варианте получим слишком большую выдачу, значительную частью из которой будут строки с нулевыми значениями. Уменьшим количества сообщений – выведем только отличные от нуля данные:
https://github.com/morefinances/qlua/blob/main/getPortfolioInfo_key_value_no_zero.lua
Теперь выдача будет более компактной:
Иногда таким образом можно быстрее по значению найти нужный параметр и в мануале свериться по наименованию и описанию поля.
Видим также, что в терминале цифры выводятся с дополнительными нулями. Вспоминаем, что это можно изменить, например, если делать вывод числа с форматированием через string.format, используя пользовательскую функцию:
function mprint( numb ) return string.format( "%.2f", numb ) end
Теперь выведем только то, что нас интересует:
https://github.com/morefinances/qlua/blob/main/getPortfolioInfo.lua
Результат:
При использовании getPortfolioInfoEx можно получить те же значения на T+, например для Т+1:
Portfolio = getPortfolioInfoEx( firm_id, client_code, 1 )
Для получения значений параметров таблицы «Клиентский портфель» для клиентов срочного рынка без единой денежной позиции необходимо указать в качестве «client_code» – торговый счет на срочном рынке, а в качестве limit_kind = 0 (т.к. в таблице срочный рынок не разбивается по периодам, как видно в выдаче скрипта и в T0, и в T1 доступные средства по FORTS одинаковые).
Не все знают, но в таблице «Клиентский портфель» также можно посмотреть список бумаг, которых брокер вам может предоставить с плечом (в лонг/шорт): кликаем правой клавишей мышки по таблице, выбираем «Открыть таблицу Купить / Продать».
Откроется таблица с доступными инструментами для покупок/продаж с плечом:
Нажав F1 можно почитать справку по таблице.
Таблица «Позиции по деньгам» / фондовый рынок.
В данной таблице отражаются свободные деньги в портфеле с разбивкой по срокам расчетов (Т0, T1, T2, T365).
Рассмотрим, как можно получить, например, входящий и текущий остатки денежных средств.
Входящий остаток – остаток денежных средств на открытии торговой сессии до совершения операций.
Текущий остаток – собственные средства клиента на текущий момент (с учетом совершенных операций)
С таблицей можно работать с помощью следующих функций:
getMoney – выдаст лимиты и остатки на Т0.
getMoneEx, a также через getNumberOf /getItem / money_limits – работа со всеми параметрами таблицы «Позиции по деньгам» на T+ (в т.ч. и Т0).
В файле QLUA.chm находим описание getMoney:
Напишем скрипт для вывода всех значений:
https://github.com/morefinances/qlua/blob/main/getMoney.lua
Получим:
В getMoneyEx разработчики поменяли порядок в значениях функции: сперва указываем код фирмы, далее код клиента, после чего валюту и период расчетов.
Пройдемся циклом по значениям T0 и T1:
https://github.com/morefinances/qlua/blob/main/getMoneyEx.lua
Получим:
Получение данных через money_limits.
Гораздо более простой и удобный вариант работы с таблицей реализован через getNumberOf / getItem и таблицу money_limits, где мы можем пройтись по каждой строке таблицы терминала. Он не требует знания клиентского кода и «Фирмы», а значит скрипт, написанный с помощью этих функций, можно будет запускать без дополнительной правки на терминалах разных брокеров.
В файле QLUA.chm забиваем в поисковой строке money_limits. Запрос нас приведет к «Таблицам, используемых в функциях getItem, getNumberOf. Здесь уже будет выделен наш money_limits.
Проваливаясь в который, мы сможем посмотреть описание всех параметров таблицы:
Для желающих получить все значения таблицы можно воспользоваться скриптом:
https://github.com/morefinances/qlua/blob/main/money_limits_key_value.lua
Аналогично предыдущим вариантам с key, value и in pairs здесь будет очень большая выдача всех значений, т.к. идет работа построчно по всей таблице.
Выведем только входящий и текущий остатки на Т0 и Т1:
https://github.com/morefinances/qlua/blob/main/money_limits.lua
Запускаем, получаем:
Таблица «Позиции по инструментам» / Позиции и лимиты по ценным бумагам.
Аналогичным образом идет работа с лимитами по ценным бумагам на фондовом рынке через таблицу «Позиции по инструментам». Таблица показывает информацию об открытых позициях и доступных лимитах в бумагах (шт.).
К ней можно обратиться с помощью getDepo (данные на T0).
В уже привычной нам QLUA находим:
Указываем бумагу, по которой хотим получить лимит, на примере Сбера:
https://github.com/morefinances/qlua/blob/main/getDepo.lua
Получим:
Для T+ используем getDepoEx и getNumberOf /getItem / depo_limits. Их же можно использовать в т.ч. для Т0.
Работа с позициями фондового рынка через getDepoEx.
По аналогии с предыдущими «кручу верчу, запутать хочу» от разработчиков в getDepoEx, в отличие от getDepo, сперва идет указание кода фирмы и только потом клиентский код, плюс добавляется счет депо, который также можно посмотреть в таблице терминала.
https://github.com/morefinances/qlua/blob/main/getDepoEx.lua
Работа с позициями через depo_limits
При выводе через depo_limits мы можем получить данные сразу по всем бумагам, в разрезе нужного периода расчетов:
https://github.com/morefinances/qlua/blob/main/depo_limits.lua
После запуска получим данные для Т0 и Т1:
Для срочного рынка используются таблицы «Ограничения по клиентским счетам» и «Позиции по клиентским счетам». Работа с ними идёт с помощью уже рассмотренных getNumberOf /getItem через: futures_client_limits и futures_client_holding соответственно.
Таблица «Позиции по клиентским счетам» / Срочный рынок
Таблица отображает информацию по портфелю на срочном рынке.
Работаем с таблицей через getNumberOf /getItem / futures_client_holding.
Выведем данные по позициям срочного рынка одновременно в окно сообщений терминала и в файл.
https://github.com/morefinances/qlua/blob/main/total_positions_forts_to_file.lua
Скрипт сделает вывод позиций как в терминал, так и сохранит их в csv файле на C:files\ (не забудьте создать соответствующую директорию).
Ограничения по клиентским счетам / срочный рынок.
Таблица отображает информацию о текущей стоимости открытых позиций, лимиты и вариационную маржу клиента по всем инструментам срочного рынка.
Если у вас подключен Единый брокерский счет (он же Единая денежная позиция), то скорее всего таблица будет практически пустой (при этом можно отсматривать вариационку, например).
Работа с таблицей ведется через futures_client_limits:
https://github.com/morefinances/qlua/blob/main/futures_client_limits.lua
Результат запуска скрипта:
У рассмотренных таблиц есть функции обратного вызова. Как обрабатывать эти коллбэки рассмотрим уже в следующей статье.
Теги: 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
Qlua: работа со сделками, позициями и денежными лимитами (часть 1).
Функция OnTrade
Сохранение параметров сделки в файл.
Работа с таблицей сделок.
Сохранение всех сделок дня.
Скрипт автосохранения всех заявок и сделок под завершение торгового дня.
smart-lab.ru/blog/1006981.php
Не гарантируется получение коллбэка по сделке до коллбэков по лимитам.
Кроме того, после получения коллбэка по сделке, данные по позициям обновятся далеко не сразу. Попытка узнать размер позиции из коллбэка по сделке почти всегда вернет неактуальное значение.
Коллбэки по этим таблицам оставил уже на следующую часть и так получилось очень объемно.
Материал отличный, можно улучшить один момент — лучше не вызывать склейку строк в цикле. На каждую такую склейку получается еще одна временная строка, которая потом идет в мусор, и, кроме того, идет постоянное копирование, что влияет на cpu. Оптимально — накапливать результат в таблицу и потом все склеить в строку через table.concat в один проход, когда известна вся длинна строки.