Найти тему

Получение данных котировочного стакана с помощью QLUA

Всем привет!

Сегодня я расскажу, как программно в скрипте можно получить данные котировочного стакана.

Например, такого:

-2

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

Тут есть некоторые сложности и изучением одной команды мы не отделаемся.

Первая, достаточно простая, функция, которая нам потребуется - Subscribe_Level_II_Quotes().

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

Но, если Вы работаете с большим количеством бумаг (Например, у меня одни скрипт работает одновременно со 180 бумагами), то лучше получать доступ к стаканам через команду Subscribe_Level_II_Quotes(). Тем более, что она предельно простая.

Subscribe_Level_II_Quotes(STRING class_code, STRING sec_code)

Для выполнения этой команды нам нужно указать код бумаги и код класса этой бумаги. Что касается кода бумаги (например, для СБЕРа это «SBER», для префов СБЕРа это «SBERP» и пр.) все должно быть ясно. Мы рассматривали этот вопрос в выпуске просмотра остатков бумаг.

А вот код инструмента (или идентификатор режима торгов) sec_code нужно смотреть отдельно или на сайте Мосбиржи, или у брокера или в QUIK.

В QUIK это можно сделать так:

На интересующем инструменте нажать правую кнопку мыши. И во всплывающем меню выбрать «Информация об инструменте».

-3

В открывшемся окне будет отражен в том числе и код класса.

-4

В данном случае показывается код класса «QJSIM». Обратите внимание, что это показана информация из демо-счета. На реальном счете у акций СБЕРа будет другой код класса – TQBR.

Таким образом, для получения доступа к стакану СБЕРА нужно выполнить команду:

Subscribe_Level_II_Quotes(“QJSIM”, “SBER”) -- для демо-счета.

Эта команда не выдаст нам никакой полезной информации.

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

function OnQuote(“QJSIM”, “SBER”)
if class ==" QJSIM " and sec == " SBER" then
information = getQuoteLevel2(class, sec)
end
end

Эта функция срабатывает при изменении стакана.

И при ее вызове мы внутри через команду getQuoteLevel2() получаем уже данные из котировочного стакана.

Операция if внутри функции onQuote нужна для того, чтобы мы получили данные из нужного стакана, а не из стакана по другой бумаге.

После выполнения этих команд, все необходимые данные стакана попадут в переменную information.

Формат этих данных будет такой:

-5

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

-6

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

function main()
-- Обращение к акции
CLASS_CODE = "QJSIM" -- Код класса
SEC_CODE = "SBER" -- Код бумаги
Subscribe_Level_II_Quotes(CLASS_CODE, SEC_CODE) --делаем заказ получения данных по стакану.
sleep(500); -- подождем, на всякий случай.
information = OnQuote(CLASS_CODE, SEC_CODE); -- получили данные стакана
if (information) then --выводим данные если получили данные по стакану.
message("Количество котировок покупки: "..information["bid_count"]+0);
message("================================");
message("Количество котировок продажи: "..information["offer_count"]+0);
message("================================");
if ((information["bid_count"]+0) > 0) then -- если есть котировки покупки, то выводим их
message("Лучшая цена покупки:"..information["bid"][information["bid_count"]+0]["price"]);
message("Объем с лучшей ценой покупки:"..information["bid"][information["bid_count"]+0]["quantity"]);
message("================================");
end
if ((information["offer_count"]+0) > 0) then -- если есть котировки продажи, то выводим их
message("Лучшая цена продажи:"..information["offer"][1]["price"]);
message("Объем с лучшей ценой продажи:"..information["offer"][1]["quantity"]);
message("================================");
end
if ((information["bid_count"]+0) > 0) then -- если есть котировки покупки, то выводим их
message("Все котировки покупки");
showTable(information["bid"],information["bid_count"]+0);
message("================================");
end
if ((information["offer_count"]+0) > 0) then -- если есть котировки продажи, то выводим их
message("Все котировки продажи");
showTable(information["offer"],information["offer_count"]+0);
message("================================");
end
else
message("Данные по стакану не получены!");
end
end
function OnQuote(CLASS,SEC)
--Результат возвращается в таблице info_po_bum
local info_po_bum=0;
if (CLASS_CODE) then
if (SEC==SEC_CODE)then
info_po_bum=getQuoteLevel2(CLASS,SEC);
end
end
return info_po_bum;
end
function showTable(local_table, size_table) -- функция получает таблицу с объемами и ценами стакана и выводит эти данные.
-- local_table - таблица с объемами и ценами
-- size_table - количество котировок (позиций в таблице)
for key=1,size_table do
message("Цена"..local_table[key].price.." - Объем:"..local_table[key].quantity);
end
end

Скачать данный код

Если запустить этот скрипт, то в окне сообщений, мы сможем увидеть следующее:

-7

Как можете убедиться – все данные из стакана получены и выведены в сообщениях.

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

Сам скрипт получился достаточно объемный. Но, по большому счету большая часть скрипта связана с выводом данных в сообщения.

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

В некоторых местах скрипта можно увидеть такую конструкцию: (information["bid_count"]+0). В данном случае к значению прибавляется 0 для перевода значения из строки в численное значение для дальнейшей обработки.

Попробуйте позапускать данный скрипт для различных бумаг.

Очень надеюсь, что Вам получилось разобраться с этой не простой темой.

На этом пока все – до следующих встреч.

Всем удачи – всем пока!

⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

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

⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆