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

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 12, среднее: 5,00 из 5)
Загрузка...

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

Описание функции CreateDataSource()

Функция 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():

Список для АКЦИЙ
Список для ВАЛЮТЫ
Список для ОПЦИОНОВ
Список для ФЬЮЧЕРСОВ

Так же, в 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 – легенда (подпись) графика

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

Добавить комментарий

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

  1. Добрый день, уважаемые!
    Подскажите, можно ли каким либо образом получить данные двух линий с одного графика MACD сразу основной и сигнальной линий при помощи getCandlesByIndex и идентификатора графика?
    Или все же придется открывать 2 графика, с первого брать данные основной линии, а с другой экспоненциальной скользящей средней (EМАa) и уже в коде вычислять по формуле:
    Signal = EМАa(ЕМАs(P) − EMAl(P)), т.к. MACD = ЕМАs(P) − EMAl(P)

    1. Добрый! Возможно я не прав, не помню и лень смотреть, но getCandlesByIndex получает значения линий индикатора, которые описаны в справке QLUA.chm. Если линия в индикаторе есть, то у нее есть номер: у price № = 0.

  2. с createdatasource еще такая проблема. пытаюсь получить объем свечи

    1
    2
    3
    4
    
    V = ind[i].candles_data:V(ind[i].candles_data:Size())
    			if ind[i].sec_code == "SiZ0" then
    				message(tostring(V))
    			end

    Отдает неверные цифры в пределах нескольких сотен, хотя объем в минутной свече сишки тысячи. Время свечи правильное, цена открытия тоже. Но то что отдает скрипт и значение в строчке volume совсем разные.
    Может он количество сделок отдает все же, а не объем в свече?

  3. Простой скрипт:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    function main()
    ds, Error = CreateDataSource("SPBFUT", "SIZ0", INTERVAL_M1,"bid")
    if ds == nil then 
    message('Ошибка подключения: '..Error) 
    end
    ds:SetEmptyCallback()
    sleep(60000)
    message(tostring(ds:Size()))
    end

    Выдает 0, что бы я не делал. Что я делаю не так?

        1. createdatasource отдает все свечи, которые есть на сервере брокера. а всякие там параметры, типа bid - это вряд ли вообще хранится, только за текущий день. Можете их сохранять для своей истории, только это пустое все и не важно, как и свечи, которые построены на обезличенных сделках.

          1. Тип Дата Время Сообщение
            1 09.12.2020 22:25:50 722
            2 09.12.2020 22:25:50 722
            3 09.12.2020 22:25:50 722
            4 09.12.2020 22:25:50 712
            5 09.12.2020 22:25:50 722
            6 09.12.2020 22:27:16 723
            7 09.12.2020 22:27:17 723
            8 09.12.2020 22:27:17 723
            9 09.12.2020 22:27:17 713
            10 09.12.2020 22:27:17 723

            Выхлоп Size() по нескольким инструментам. Использовались параметры "last",и вообще без параметра. Так что, вопрос с заказом данных больше чем за день остается открытым. А что по вашему важно?

            1. Я не гадалка.
              Без параметров CreateDataSource возвращает у меня около 60 тыс баров М1, если у вас не так, значит хромает логика, иначе - напишите письмо брокеру и арке в копию.
              В рамках терминала квик нет данных, которые можно и нужно анализировать. даже если вы найдете что-то, то вы вряд ли сможете это торговать так, как вы хотите.

  4. Подскажите.
    У тикового графика есть миллисекунды. Как их вытащить ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    local fd = assert( io.open( GetFileName( graphName ), 'w+' ))
    	fd:write(',,,,,,\n')
     
    	for idx = 0, ( size - 1 ) do
    	--
    		if( candles[ idx ].doesExist == 1 ) then
    		--
    			local date, time = GetFormatedDateTime( candles[ idx ].datetime )
     
    			fd:write( date .. ',' .. time .. ',' ..
    			          candles[ idx ].open .. ',' ..
    			          candles[ idx ].high .. ',' ..
    			          candles[ idx ].low .. ',' ..
    			          candles[ idx ].close .. ',' ..
    			          candles[ idx ].volume .. '\n' )
    		--
    		end
    	--
    	end
     
    function GetFormatedDateTime( source )
    --
    	local date = string.format( '%04d', source.year ) ..
    	             string.format( '%02d', source.month ) ..
    	             string.format( '%02d', source.day )
     
    	local time = string.format( '%02d', source.hour ) ..
    	             string.format( '%02d', source.min ) ..
    	             string.format( '%02d', source.sec )
     
    	return date, time
    --
    end