Блог им. morefinances

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

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

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

Клиентский портфель (получаем данные через getPortfolioInfo и getPortfolioInfoEx).
Позиции по деньгам (getMoney и getMoneyEx, money_limits).
Позиции по инструментам (getDepo, getDepoEx, depo_limits).
Ограничения по клиентским счетам (futures_client_limits).
Позиции по клиентским счетам (futures_client_holding).

Таблица «Клиентский портфель» даёт сводную информацию по лимитам и параметрам риска брокерского счета. Таблицы «Позиции по деньгам» (лимиты) и «Позиции инструментам» (ценные бумаги) показывают данные в разрезе фондового рынка. Таблицы «Ограничения по клиентским счетам» (лимиты) и «Позиции по клиентским счетам» (фьючерсы и опционы) – только про срочному рынку.

Добавляются они через вкладку меню «Создать окно», если какой-то позиции не находите, то добавляем в меню: Создать окно / Настроить меню, далее находим нужные таблицы, добавляем, ОК. Либо можно, если без добавления в меню, создать сразу: F7 и выбрать требуемую таблицу.

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


Работа с клиентским портфелем

Таблица «Клиентский портфель» показывает сводную информацию по состоянию брокерского счета по всем доступным площадкам в рублях в разрезе различных режимов (Т0 / Т1 / Т2 / Т365).

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

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

А другая только к срочному:

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

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

Выведем скриптом следующие параметры:

Входящие средства — состояние портфеля на открытии торговой сессии по ценам закрытия предыдущего торгового дня.
Текущие средства– оценка состояния портфеля на текущий момент с учетом вариационной маржи по счету.
Стоимость портфеля — оценка собственных средств клиента по текущим позициям и ценам.
Прибыль/убыток — разница между «Текущие средства» и «Входящие средства».
УДС — уровень достаточности средств (показатель закредитованности).
НаПокупНеМаржин – доступные средства для открытия позиции на срочном рынке.

Справка по значениям полей таблицы Клиентский портфель: при активной таблице нажать F1.

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

С таблицей клиентского портфеля можно работать через функции getPortfolioInfo и getPortfolioInfoEx. Вторая пригодится, если нужны данные с учетом T+.

Описание полей находим в файле QLUA.chm:

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

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

F7 / Состояние счета / CTRL  + E

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

Получим все значения таблицы через getPortfolioInfo (в Т0). 
Для этого пройдемся по всем key и value и выведем их сообщениями:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.
https://github.com/morefinances/qlua/blob/main/getPortfolioInfo_key_value.lua


В таком варианте получим слишком большую выдачу, значительную частью из которой будут строки с нулевыми значениями. Уменьшим количества сообщений – выведем только отличные от нуля данные:

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

https://github.com/morefinances/qlua/blob/main/getPortfolioInfo_key_value_no_zero.lua

Теперь выдача будет более компактной:

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

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

Видим также, что в терминале цифры выводятся с дополнительными нулями. Вспоминаем, что это можно изменить, например, если делать вывод числа с форматированием через string.format, используя пользовательскую функцию:

function mprint( numb )

    return string.format( "%.2f", numb )

end

Теперь выведем только то, что нас интересует:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.
https://github.com/morefinances/qlua/blob/main/getPortfolioInfo.lua

Результат:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.
При использовании getPortfolioInfoEx можно получить те же значения на T+, например для Т+1:

Portfolio = getPortfolioInfoEx( firm_id, client_code, 1 )

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

Для получения значений параметров таблицы «Клиентский портфель» для клиентов срочного рынка без единой денежной позиции необходимо указать в качестве «client_code» – торговый счет на срочном рынке, а в качестве limit_kind = 0 (т.к. в таблице срочный рынок не разбивается по периодам, как видно в выдаче скрипта и в T0, и в T1 доступные средства по FORTS одинаковые).

Не все знают, но в таблице «Клиентский портфель» также можно посмотреть список бумаг, которых брокер вам может предоставить с плечом (в лонг/шорт): кликаем правой клавишей мышки по таблице, выбираем «Открыть таблицу Купить / Продать».

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

Откроется таблица с доступными инструментами для покупок/продаж с плечом:

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

Нажав F1 можно почитать справку по таблице.

 

Таблица «Позиции по деньгам» / фондовый рынок.

В данной таблице отражаются свободные деньги в портфеле с разбивкой по срокам расчетов (Т0, T1, T2, T365).

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

Рассмотрим, как можно получить, например, входящий и текущий остатки денежных средств.

Входящий остаток – остаток денежных средств на открытии торговой сессии до совершения операций.
Текущий остаток – собственные средства клиента на текущий момент (с учетом совершенных операций)


С таблицей можно работать с помощью следующих функций:

getMoney – выдаст лимиты и остатки на Т0.

getMoneEx, a также через getNumberOf /getItem / money_limits – работа со всеми параметрами таблицы «Позиции по деньгам» на T+ (в т.ч. и Т0).

 

В файле QLUA.chm находим описание getMoney:

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

Напишем скрипт для вывода всех значений:

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

https://github.com/morefinances/qlua/blob/main/getMoney.lua

Получим:

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

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

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

Пройдемся циклом по значениям T0 и T1:

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

https://github.com/morefinances/qlua/blob/main/getMoneyEx.lua

Получим:

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

Получение данных через money_limits.

Гораздо более простой и удобный вариант работы с таблицей реализован через getNumberOf / getItem и таблицу money_limits, где мы можем пройтись по каждой строке таблицы терминала. Он не требует знания клиентского кода и «Фирмы», а значит скрипт, написанный с помощью этих функций, можно будет запускать без дополнительной правки на терминалах разных брокеров.

В файле QLUA.chm забиваем в поисковой строке money_limits. Запрос нас приведет к «Таблицам, используемых в функциях getItem, getNumberOf. Здесь уже будет выделен наш money_limits.

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

Проваливаясь в который, мы сможем посмотреть описание всех параметров таблицы:

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

Для желающих получить все значения таблицы можно воспользоваться скриптом:

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

https://github.com/morefinances/qlua/blob/main/money_limits_key_value.lua

Аналогично предыдущим вариантам с key, value и in pairs здесь будет очень большая выдача всех значений, т.к. идет работа построчно по всей таблице.


Выведем только входящий и текущий остатки на Т0 и Т1:

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

https://github.com/morefinances/qlua/blob/main/money_limits.lua

Запускаем, получаем:

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

Таблица «Позиции по инструментам» / Позиции и лимиты по ценным бумагам.

Аналогичным образом идет работа с лимитами по ценным бумагам на фондовом рынке через таблицу «Позиции по инструментам». Таблица показывает информацию об открытых позициях и доступных лимитах в бумагах (шт.).

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

К ней можно обратиться с помощью
getDepo  (данные на T0).

В уже привычной нам QLUA находим:

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

Указываем бумагу, по которой хотим получить лимит, на примере Сбера:

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

https://github.com/morefinances/qlua/blob/main/getDepo.lua

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

Для T+ используем getDepoEx и getNumberOf /getItem / depo_limits. Их же можно использовать в т.ч. для Т0.

 

Работа с позициями фондового рынка через getDepoEx.

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

Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.
https://github.com/morefinances/qlua/blob/main/getDepoEx.lua

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

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


Работа с позициями через depo_limits

Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.
При выводе через depo_limits мы можем получить данные сразу по всем бумагам, в разрезе нужного периода расчетов:

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

https://github.com/morefinances/qlua/blob/main/depo_limits.lua

После запуска получим данные для Т0 и Т1:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.
Для срочного рынка используются таблицы «Ограничения по клиентским счетам» и «Позиции по клиентским счетам». Работа с ними идёт с помощью уже рассмотренных getNumberOf /getItem через: futures_client_limits и  futures_client_holding соответственно.

 

Таблица «Позиции по клиентским счетам» / Срочный рынок

Таблица отображает информацию по портфелю на срочном рынке.

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

Работаем с таблицей через getNumberOf /getItem / futures_client_holding.

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

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

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

https://github.com/morefinances/qlua/blob/main/total_positions_forts_to_file.lua

Скрипт сделает вывод позиций как в терминал, так и сохранит их в csv файле на C:files\  (не забудьте создать соответствующую директорию).

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

Ограничения по клиентским счетам / срочный рынок.

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

Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.
Если у вас подключен Единый брокерский счет (он же Единая денежная позиция), то скорее всего таблица будет практически пустой (при этом можно отсматривать вариационку, например).

Работа с таблицей ведется через futures_client_limits:

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

Выведем основные параметры.

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

https://github.com/morefinances/qlua/blob/main/futures_client_limits.lua

Результат запуска скрипта:

Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.
У рассмотренных таблиц есть функции обратного вызова. Как обрабатывать эти коллбэки рассмотрим уже в следующей статье.


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

  • обсудить на форуме:
  • Quik Lua
★12
4 комментария
После того как исполнилась сделка и мы получили соответствующий коллбэк  у нас меняются данные по позициям и доступным лимитам.

Не гарантируется получение коллбэка по сделке до коллбэков по лимитам.
Кроме того, после получения коллбэка по сделке, данные по позициям обновятся далеко не сразу. Попытка узнать размер позиции из коллбэка по сделке почти всегда вернет неактуальное значение.
Станислав Потемкин, спасибо. Да, важное замечание.
Коллбэки по этим таблицам оставил уже на следующую часть и так получилось очень объемно.
avatar

Материал отличный, можно улучшить один момент — лучше не вызывать склейку строк в цикле. На каждую такую склейку получается еще одна  временная строка, которая потом идет в мусор, и, кроме того, идет постоянное копирование, что влияет на cpu. Оптимально — накапливать результат в таблицу и потом все склеить в строку через table.concat в один проход, когда известна вся длинна строки.

avatar
Denis, интересный подход. Спасибо!
avatar

теги блога alfacentavra

....все тэги



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