Получение в QLua(Lua) данных из графиков и индикаторов

Автор записи: Дмитрий (Admin)

QUIK-Qlua-poluchenie-dannyhЧтобы получить доступ к графику(не индикатору) какого-либо инструмента нужно создать источник данных при помощи функции CreateDataSource().
ВАЖНО!!! Для получения новых данных, кроме тех, что уже есть в открытом графике на текущий момент (тем более, если он не открыт), требуется использовать одну из следующих функций: SetUpdateCallback(), или SetEmptyCallback(), о которых будет написано ниже.

Описание функции CreateDataSource()
-- Функция предназначена для создания таблицы Lua и позволяет работать со свечами, полученными с сервера QUIK, а также реагировать на их изменение.
ds, Error = CreateDataSource (class_code, sec_code, interval [, param]);
   -- Параметры:
      -- class_code - (STRING) код класса, например "SPBFUT"
      -- sec_code   - (STRING) код бумаги, например "RIZ5"
      -- interval   - (NUMBER) константа, обозначающая тайм-фрейм графика, например INTERVAL_M5 (полный список: https://quikluacsharp.ru/qlua-osnovy/spisok-konstant-tajm-frejmov-grafikov/)
      -- param      - (STRING) необязательный параметр. Если параметр не задан, то заказываются данные на основании таблицы всех сделок, если задан – данные по этому параметру, например "BID" (возможные параметры смотрите ниже)
   -- Возвращаемые значения:
      -- ds         - (TABLE) таблица с данными по свечам графика
      -- Error      - (STRING) строка ошибки в случае неудачной попытки получить доступ к данным (тогда ds будет nil)
 
-- Если график, к которому нужно подключиться не открыт в терминале, то данные заказываются с сервера, на их получение нужно время,
-- по этому, рекомендуется добавлять вот такое ожидание, прежде, чем обращаться к ds:
-- Ждет, пока данные будут получены с сервера (на случай, если такой график не открыт)
while (Error == "" or Error == nil) and ds:Size() == 0 do sleep(1) end
if Error ~= "" and Error ~= nil then message("Ошибка подключения к графику: "..Error) end
 
-- Примеры (одновременно можно подключаться к нескольким источникам данных):
ds1 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1, "last");
ds2 = CreateDataSource("QJSIM", "SBER", INTERVAL_M1);
ds3, Error = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1, "bid");
if ds3 == nil then message('Ошибка подключения: '..Error); end;

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

local O = ds:O(i); -- Получить значение Open для указанной свечи (цена открытия свечи)
local H = ds:H(i); -- Получить значение High для указанной свечи (наибольшая цена свечи)
local L = ds:L(i); -- Получить значение Low для указанной свечи (наименьшая цена свечи)
local C = ds:C(i); -- Получить значение Close для указанной свечи (цена закрытия свечи)
local V = ds:V(i); -- Получить значение Volume для указанной свечи (объем сделок в свече)
local T = ds:T(i); -- Получить значение Time для указанной свечи (время открытия свечи (таблица datetime))
   -- Где i - индекс свечи (от 1 до ds:Size())
 
local Size = ds:Size(); -- Возвращает текущий размер (количество свечей в источнике данных)
ds:Close(); -- Удаляет источник данных, отписывается от получения данных
 
ds:SetUpdateCallback(MyFuncName); -- Позволяет задать пользователю функцию обратного вызова для обработки изменившихся свечей, т.е. когда по выбранному в CreateDataSource параметру в терминал поступит новое значение (возможно такое же), автоматически будет вызвана данная функция, в которую будут передан индекс последней свечи графика, а так же добавятся новые данные в таблицу ds
-- Пример функции:
function MyFuncName(index)
   message('На '..index..'-й свече объем вырос до '..ds:V(index));
end;
 
-- Чтобы получать новые данные без использования функции обратного вызова, а просто получать новые данные в ds и брать их оттуда по необходимости существует функция:
ds:SetEmptyCallback(); -- Которая подписывается на получение новых данных

Списки возможных параметров, используемых в функции CreateDataSource():

Список для АКЦИЙ
"LOTSIZE"            -- Размер лота
"BID"                -- Лучшая цена спроса
"BIDDEPTH"           -- Спрос по лучшей цене
"BIDDEPTHT"          -- Суммарный спрос
"NUMBIDS"            -- Количество заявок на покупку
"OFFER"              -- Лучшая цена предложения
"OFFERDEPTH"         -- Предложение по лучшей цене
"OFFERDEPTHT"        -- Суммарное предложение
"NUMOFFERS"          -- Количество заявок на продажу
"OPEN"               -- Цена открытия
"HIGH"               -- Максимальная цена сделки
"LOW"                -- Минимальная цена сделки
"LAST"               -- Цена последней сделки
"CHANGE"             -- Разница цены последней к предыдущей сессии
"QTY"                -- Количество бумаг в последней сделке
"VOLTODAY"           -- Количество бумаг в обезличенных сделках
"VALTODAY"           -- Оборот в деньгах
"VALUE"              -- Оборот в деньгах последней сделки
"WAPRICE"            -- Средневзвешенная цена
"HIGHBID"            -- Лучшая цена спроса сегодня
"LOWOFFER"           -- Лучшая цена предложения сегодня
"NUMTRADES"          -- Количество сделок за сегодня
"PREVPRICE"          -- Цена закрытия
"PREVWAPRICE"        -- Предыдущая оценка
"LASTCHANGE"         -- % изменения от закрытия
"LASTTOPREVSTLPRC"   -- Разница цены последней к предыдущей сессии
"MARKETPRICETODAY"   -- Рыночная цена
"SEC_FACE_VALUE"     -- Номинал бумаги
"SEC_SCALE"          -- Точность цены
Список для ВАЛЮТЫ
"LOTSIZE"               -- Размер лота
"BID"                   -- Лучшая цена спроса
"BIDDEPTH"              -- Спрос по лучшей цене
"BIDDEPTHT"             -- Суммарный спрос
"NUMBIDS"               -- Количество заявок на покупку
"OFFER"                 -- Лучшая цена предложения
"OFFERDEPTH"            -- Предложение по лучшей цене
"OFFERDEPTHT"           -- Суммарное предложение
"NUMOFFERS"             -- Количество заявок на продажу
"OPEN"                  -- Цена открытия
"HIGH"                  -- Максимальная цена сделки
"LOW"                   -- Минимальная цена сделки
"LAST"                  -- Цена последней сделки
"CHANGE"                -- Разница цены последней к предыдущей сессии
"QTY"                   -- Количество бумаг в последней сделке
"VOLTODAY"              -- Количество бумаг в обезличенных сделках
"VALTODAY"              -- Оборот в деньгах
"VALUE"                 -- Оборот в деньгах последней сделки
"WAPRICE"               -- Средневзвешенная цена
"HIGHBID"               -- Лучшая цена спроса сегодня
"LOWOFFER"              -- Лучшая цена предложения сегодня
"NUMTRADES"             -- Количество сделок за сегодня
"PREVPRICE"             -- Цена закрытия
"PREVWAPRICE"           -- Предыдущая оценка
"CLOSEPRICE"            -- Цена периода закрытия
"LASTCHANGE"            -- % изменения от закрытия
"PRICEMINUSPREVWAPRICE" -- Разница цены последней к предыдущей оценке
"LASTTOPREVSTLPRC"      -- Разница цены последней к предыдущей сессии
"PRICEMAX"              -- Максимально возможная цена
"PRICEMIN"              -- Минимально возможная цена
"BASEPRICE"             -- Базовый курс
"SEC_FACE_VALUE"        -- Номинал бумаги
"SEC_SCALE"             -- Точность цены
Список для ОПЦИОНОВ
"LOTSIZE"               -- Размер лота
"BID"                   -- Лучшая цена спроса
"BIDDEPTH"              -- Спрос по лучшей цене
"BIDDEPTHT"             -- Суммарный спрос
"NUMBIDS"               -- Количество заявок на покупку
"OFFER"                 -- Лучшая цена предложения
"OFFERDEPTH"            -- Предложение по лучшей цене
"OFFERDEPTHT"           -- Суммарное предложение
"NUMOFFERS"             -- Количество заявок на продажу
"HIGH"                  -- Максимальная цена сделки
"LOW"                   -- Минимальная цена сделки
"LAST"                  -- Цена последней сделки
"CHANGE"                -- Разница цены последней к предыдущей сессии
"QTY"                   -- Количество бумаг в последней сделке
"VOLTODAY"              -- Количество бумаг в обезличенных сделках
"VALTODAY"              -- Оборот в деньгах
"VALUE"                 -- Оборот в деньгах последней сделки
"WAPRICE"               -- Средневзвешенная цена
"NUMTRADES"             -- Количество сделок за сегодня
"PREVPRICE"             -- Цена закрытия
"PREVWAPRICE"           -- Предыдущая оценка
"LASTCHANGE"            -- % изменения от закрытия
"PRICEMINUSPREVWAPRICE" -- Разница цены последней к предыдущей оценке
"PREVSETTLEPRICE"       -- Предыдущая расчетная цена
"NUMCONTRACTS"          -- Количество открытых позиций
"BUYDEPO"               -- Гарантийное обеспечение продавца
"SELLDEPO"              -- Гарантийное обеспечение покупателя
"BGOP"                  -- БГО по покрытым позициям
"BGONP"                 -- БГО по непокрытым позициям
"STRIKE"                -- Цена страйк
"STEPPRICET"            -- Стоимость шага цены
"STEPPRICE"             -- Стоимость шага цены (для новых контрактов FORTS и RTS Standard)
"VOLATILITY"            -- Волатильность опциона
"THEORPRICE"            -- Теоретическая цена
"CLPRICE"               -- Котировка последнего клиринга
"SEC_FACE_VALUE"        -- Номинал бумаги
"SEC_SCALE"             -- Точность цены
Список для ФЬЮЧЕРСОВ
"LOTSIZE"               -- Размер лота
"BID"                   -- Лучшая цена спроса
"BIDDEPTH"              -- Спрос по лучшей цене
"BIDDEPTHT"             -- Суммарный спрос
"NUMBIDS"               -- Количество заявок на покупку
"OFFER"                 -- Лучшая цена предложения
"OFFERDEPTH"            -- Предложение по лучшей цене
"OFFERDEPTHT"           -- Суммарное предложение
"NUMOFFERS"             -- Количество заявок на продажу
"HIGH"                  -- Максимальная цена сделки
"LOW"                   -- Минимальная цена сделки
"LAST"                  -- Цена последней сделки
"CHANGE"                -- Разница цены последней к предыдущей сессии
"QTY"                   -- Количество бумаг в последней сделке
"VOLTODAY"              -- Количество бумаг в обезличенных сделках
"VALTODAY"              -- Оборот в деньгах
"VALUE"                 -- Оборот в деньгах последней сделки
"WAPRICE"               -- Средневзвешенная цена
"NUMTRADES"             -- Количество сделок за сегодня
"PREVPRICE"             -- Цена закрытия
"PREVWAPRICE"           -- Предыдущая оценка
"LASTCHANGE"            -- % изменения от закрытия
"PRICEMINUSPREVWAPRICE" -- Разница цены последней к предыдущей оценке
"PREVSETTLEPRICE"       -- Предыдущая расчетная цена
"PRICEMAX"              -- Максимально возможная цена
"PRICEMIN"              -- Минимально возможная цена
"NUMCONTRACTS"          -- Количество открытых позиций
"BUYDEPO"               -- Гарантийное обеспечение продавца
"SELLDEPO"              -- Гарантийное обеспечение покупателя
"STEPPRICET"            -- Стоимость шага цены
"STEPPRICE"             -- Стоимость шага цены (для новых контрактов FORTS и RTS Standard)
"SETTLEPRICE"           -- Расчетная цена
"PERCENTRATE"           -- Агрегированная ставка
"CLPRICE"               -- Котировка последнего клиринга
"REALVMPRICE"           -- Текущая рыночная котировка
"STEPPRICECL"           -- Стоимость шага цены для клиринга
"STEPPRICEPRCL"         -- Стоимость шага цены для промклиринга
"SEC_FACE_VALUE"        -- Номинал бумаги
"SEC_SCALE"             -- Точность цены

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

После этого, можно использовать следующие функции для доступа к данным:

-- Функция предназначена для получения КОЛИЧЕСТВА ЛИНИЙ в графике (индикаторе) по выбранному идентификатору
getLinesCount(tag); -- Возвращает число
   -- tag - (STRING) идентификатор графика (индикатора), о котором писалось выше
 
-- Функция предназначена для получения информации о КОЛИЧЕСТВЕ СВЕЧЕЙ по выбранному идентификатору
getNumCandles(tag); -- Возвращает число
   -- tag - (STRING) идентификатор графика (индикатора), о котором писалось выше
 
-- Функция предназначена для получения информации о свечах по идентификатору (заказ данных для построения графика функция не осуществляет, поэтому для успешного доступа нужный график должен быть открыт)
t, n, l = getCandlesByIndex (tag, line, first_candle, count);
   -- Параметры:
      -- tag          – (STRING) строковый идентификатор графика или индикатора
      -- line         – (NUMBER) номер линии графика или индикатора. Первая линия имеет номер 0
      -- first_candle – (NUMBER) индекс первой свечи. !!! ПЕРВАЯ (САМАЯ ЛЕВАЯ) СВЕЧКА ИМЕЕТ ИНДЕКС 0 !!!
      -- count        – (NUMBER) количество запрашиваемых свечей
   -- Возвращаемые значения:
      -- t – таблица, содержащая запрашиваемые свечи, пример работы:
         local O = t[i].open; -- Получить значение Open для указанной свечи (цена открытия свечи)
         local H = t[i].high; -- Получить значение High для указанной свечи (наибольшая цена свечи)
         local L = t[i].low; -- Получить значение Low для указанной свечи (наименьшая цена свечи)
         local C = t[i].close; -- Получить значение Close для указанной свечи (цена закрытия свечи)
         local V = t[i].volume; -- Получить значение Volume для указанной свечи (объем сделок в свече)
         local T = t[i].datetime; -- Получить значение datetime для указанной свечи
            -- Где i - индекс свечи от 0 до n-1
      -- n – количество свечей в таблице t
      -- l – легенда (подпись) графика

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!