Чтобы получить доступ к графику(не индикатору) какого-либо инструмента нужно создать источник данных при помощи функции CreateDataSource().
ВАЖНО!!! Для получения новых данных, кроме тех, что уже есть в открытом графике на текущий момент (тем более, если он не открыт), требуется использовать одну из следующих функций: SetUpdateCallback(), или SetEmptyCallback(), о которых будет написано ниже.
[su_spoiler title="Описание функции CreateDataSource()" style="fancy"]
-- Функция предназначена для создания таблицы 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; |
[/su_spoiler]
Функция 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():
[su_spoiler title="Список для АКЦИЙ" style="fancy"]
"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" -- Точность цены |
[/su_spoiler]
[su_spoiler title="Список для ВАЛЮТЫ" style="fancy"]
"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" -- Точность цены |
[/su_spoiler]
[su_spoiler title="Список для ОПЦИОНОВ" style="fancy"]
"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" -- Точность цены |
[/su_spoiler]
[su_spoiler title="Список для ФЬЮЧЕРСОВ" style="fancy"]
"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" -- Точность цены |
[/su_spoiler]
Так же, в 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 – легенда (подпись) графика |
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!