Найти в Дзене
Код торгового робота

Получение информации о фьючерсе (ГО, дата экспирации и пр.) средствами QLUA.

Всем привет! Сегодня хотел рассмотреть вопрос о получении информации о фьючерсе средствами QLUA. Относительно недавно я столкнулся с такой задачей. В ее реализации есть нюанс. В основе получения информации о фьючерсе лежит использование команды getParamEx. В файле помощи есть такое описание данной команды: «Функция предназначена для получения значений всех параметров биржевой информации из таблицы «Текущие торги». С помощью этой функции можно получить любое из значений Таблицы текущих торгов для заданных кодов класса и инструмента.» Из этого следует, что вообще с помощью этой команды можно получать любой показатель из таблицы текущий торгов, и не только по фьючерсам. Но, из-за того, что информация берется из текущих торгов, то всплывает следующий нюанс…. При запуске данной команды идет обращение к таблице текущих торгов. И, если у в текущий момент данная таблица в вашем терминале не открыта, или в ней нет нужного инструмента, то QUIK-у потребуется время, чтобы открыть эту таблицу и пос

Всем привет!

Сегодня хотел рассмотреть вопрос о получении информации о фьючерсе средствами QLUA. Относительно недавно я столкнулся с такой задачей. В ее реализации есть нюанс.

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

В файле помощи есть такое описание данной команды:

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

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

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

Давайте вернемся к функции getParamEx

Формат вызова ее следующий:

getParamEx (class_code, sec_code, param_name)

, где class_code – код класса бумаги,

sec_code – код бумаги,

param_name – параметр, который мы хотим получить.

Думаю, что с class_code и sec_code все ясно. А в «param_name» может стоять, например, «selldepo» - это Гарантийное обеспечение покупателя. А полный перечень возможных параметров можно посмотреть в файле-помощнике по QUIK (не путайте с файлом-помощником по QLUA). Проще всего нужную таблицу найти через поиск, внеся в строку поиска слово «selldepo».

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

-2

И, почему-то часть параметров вынесена в отдельную таблицу:

-3

Итак, давайте приступим к написанию кода.

Давайте напишем такой код:

function main()
local res = getParamEx("SPBFUT", "AFU3", "selldepo");
message("res = "..res.param_value);
end

Предполагается, что он нам выдаст гарантийное обеспечение при покупке по фьючерсу на акции Аэрофлота (экспирация фьючерса – сентябрь 2023 года).

После запуска скрипта выдалось такое сообщение:

-4

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

Что бы данный скрипт работал с первого раза нужно его немного трансформировать:

function main()
local res = getParamEx("SPBFUT", "AFU3", "selldepo");
local i = 0;
while ((i < 100)and((res.param_value == 0)))do
i = i + 1;
sleep(100);
end
message("res = "..res.param_value);
end

В данный код внесен дополнительный блок, который максимум 100 раз с небольшой задержкой делает проверку – получена ли информация об ГО. Если ГО получен и не равен 0, то проверка с задержкой завершается и выводится полученная информация.

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

function main()
local info = ""; -- Переменная для всей информации о фьючерсе.
local res = getParamEx("SPBFUT", "AFU3", "selldepo");
local i = 0;
while ((i < 100)and((res.param_value == 0)))do
i = i + 1;
sleep(100);
end
info = "Гарантийное обеспечение покупателя = "..res.param_value;
local res = getParamEx("SPBFUT", "AFU3", "SHORTNAME");
info = "Код фьючерса: "..res.param_image.." # "..info;
local res = getParamEx("SPBFUT", "AFU3", "BUYDEPO");
info = info.." # ".."Гарантийное обеспечение продавца: "..res.param_value;
local res = getParamEx("SPBFUT", "AFU3", "LONGNAME");
info = info.." # ".."Базовый актив: "..res.param_image;
local res = getParamEx("SPBFUT", "AFU3", "EXPDATE");
info = info.." # ".."Дата экспирации: "..res.param_image;
message(info);
end

Скачать код

Посмотреть код

После запуска данного кода, скрипт выдаст такое сообщение:

-5

Обратите внимание! Если Вы запускаете данный код после 21.09.2023 года, то фьючерс, который фигурирует в приводимом коде уже не действует. И скрипт вам ничего хорошего не выдаст.

Тут нужно отметить, если в скрипте запрашивается числовое значение (как ГО), то для извлечения нужного значения из переменной res нужно использовать конструкцию «res.param_value». Если извлекаемое значение не числовое (дата или текст), то нужно использовать конструкцию «res.param_image».

На сегодня у меня все. До свидания, подписывайтесь на канал, ставьте лайки, задавайте вопросы в комментариях.

Всем удачи!

=================================

Краткое содержание данного канала.

➖➖➖➖➖➖➖➖➖➖➖➖➖

Landingcentr.ru - разработка сайтов для малого и среднего бизнеса.

=================================