CreateDataSource

Функция предназначена для создания таблицы Lua и позволяет работать со свечками, полученными с сервера QUIK, а также реагировать на их изменение. Функция возвращает таблицу data_source в случае успешного завершения. Параметры возвращаемой таблицы. Если указан неверный код класса или параметр, то возвращается «nil». При этом error_desc содержит описание ошибки.
TABLE data_source, STRING error_desc CreateDataSource (STRING class_code, STRING sec_code, NUMBER interval, [, STRING param])
  • class_code – код класса,
  • sec_code – код бумаги,
  • interval – интервал запрашиваемого графика из Таблица интервалов
  • param – необязательный параметр. Если параметр не задан, то заказываются данные на основании Таблицы обезличенных сделок, если задан – данные по этому параметру.
ds1 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1, "last")
ds2 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)
ds3 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1, "bid")

Таблица интервалов

Параметр Тип Описание
INTERVAL_TICK - Тиковые данные
INTERVAL_M1 - 1 минута
INTERVAL_M2 - 2 минуты
INTERVAL_M3 - 3 минуты
INTERVAL_M4 - 4 минуты
INTERVAL_M5 - 5 минут
INTERVAL_M6 - 6 минут
INTERVAL_M10 - 10 минут
INTERVAL_M15 - 15 минут
INTERVAL_M20 - 20 минут
INTERVAL_M30 - 30 минут
INTERVAL_H1 - 1 час
INTERVAL_H2 - 2 часа
INTERVAL_H4 - 4 часа
INTERVAL_D1 - 1 день
INTERVAL_W1 - 1 неделя
INTERVAL_MN1 - 1 месяц

Параметры возвращаемой таблицы

Параметр Тип Описание
SetUpdateCallback function Позволяет задать пользователю функцию обратного вызова для обработки изменившихся свечек
O function Получить значение Open для указанной свечи
H function Получить значение High для указанной свечи
L function Получить значение Low для указанной свечи
C function Получить значение Close для указанной свечи
V function Получить значение Volume для указанной свечи
T function Получить значение Time для указанной свечи
Size function Возвращает текущий размер (количество свечек в источнике данных)
Close function Удаляет источник данных, отписывается от получения данных
SetEmptyCallback function Позволяет получать данные с сервера без указания функции обратного вызова

Примеры:

  • 1
-- Пример получения первой свечи текущего дня
function main()
	-- Создаем таблицу со всеми свечами нужного интервала, класса и кода
	ds, error_desc = CreateDataSource("QJSIM", "SBER", INTERVAL_H1)
	-- Ограничиваем количество попыток (времени) ожидания получения данных от сервера
	local try_count = 0
	-- Ждем пока не получим данные от сервера,
	--	либо пока не закончится время ожидания (количество попыток)
	while ds:Size() == 0 and try_count < 1000 do
		sleep(100)
		try_count = try_count + 1
	end
	-- Если от сервера пришла ошибка, то выведем ее и прервем выполнение
	if error_desc ~= nil and error_desc ~= "" then
		message("Ошибка получения таблицы свечей:" .. error_desc)
		return 0
	end
	
	-- Текущий день месяца (1 - 31)
	local today_day = tonumber(os.date("%d"))
	-- Текущая свеча (с которой начинаем поиск)
	local current_candle = ds:Size()
	-- Максимальное количество свечей для поиска
	--	не может быть больше чем общее количество свечей в таблице
	local max_candles = math.min(1000, ds:Size())
	-- Индекс первой свечи текущего дня
	local first_candle_index = nil
	
	-- Цикл пока не нашли первую свечу дня либо не проверили
	--	максимальное количество свечей
	while first_candle_index == nil and current_candle > ds:Size() - max_candles do
		-- Если день текущей свечи не совпадает с текущим днем
		if tonumber(ds:T(current_candle).day) ~= today_day then
			-- Тогда индекс искомой свечи
			first_candle_index = current_candle - 1
			message("Найден индекс: " .. tostring(first_candle_index))
		end
		
		current_candle = current_candle - 1
	end
	
	-- Если индекс был найден
	if first_candle_index ~= nil then
		message("Первая свеча дня:")
		message("		индекс: " .. tostring(current_candle))
		message("		время: " .. tostring(ds:T(current_candle).hour) .. ":" .. tostring(ds:T(current_candle).min) .. ":" .. tostring(ds:T(current_candle).sec))
		message("Последняя свеча предыдущего дня:")
		message("		индекс: " .. tostring(current_candle - 1))
		message("		время: " .. tostring(ds:T(current_candle - 1).hour) .. ":" .. tostring(ds:T(current_candle - 1).min) .. ":" .. tostring(ds:T(current_candle - 1).sec))
	-- Если индекс найти не удалось
	else
		message("Первая свеча дня не найдена. Не достаточно свечей для поиска (" .. tostring(ds:Size()) .. ").")
		message("Самая дальняя свеча:")
		message("		индекс: " .. tostring(1))
		message("		время: " .. tostring(ds:T(1).hour) .. ":" .. tostring(ds:T(1).min) .. ":" .. tostring(ds:T(1).sec))
	end
end
  • 0
-- Пример получения минимума, максимума за определенный период времени, текущей сессии
function main()    
	-- Создаем таблицу со всеми свечами нужного класса и кода
	ds, error_desc = CreateDataSource("QJSIM", "SBER", INTERVAL_M1)
	-- Ограничиваем количество попыток (времени) ожидания получения данных от сервера
	local try_count = 100
	-- Ждем пока не получим данные от сервера,
	--	либо пока не закончится время ожидания (количество попыток)
	while ds:Size() == 0 and try_count < 1000 do
		sleep(100)
	end
	-- Если от сервера пришла ошибка, то выведем ее и прервем выполнение
	if error_desc ~= nil and error_desc ~= "" then
		message("Ошибка получения таблицы свечей:" .. error_desc)
		return 0
	end
	
	-- Текущий день месяца (1 - 31)
	local today_day = tonumber(os.date("%d"))
	-- Текущая свеча (с которой начинаем поиск)
	local current_candle = ds:Size()
	-- Максимальное количество свечей для поиска
	--	не может быть больше чем общее количество свечей в таблице
	local max_candles = math.min(1000, ds:Size())    
    -- Индекс свечи с максимумом
    local max_candle_index = nil
    -- Индекс свечи с минимумом
    local min_candle_index = nil
    -- Время начала поиска
    local start_time = 100000
    -- Время окончания поиска
    local end_time = 143600
    
    message(to_human_time(ds:T(ds:Size())))

	-- Цикл по всем свечам и поиск в нужном интервале
	while current_candle > ds:Size() - max_candles do
		-- Если это уже другая сессия
        if tonumber(ds:T(current_candle).day) ~= today_day then
            break
		end
        
        -- Если текущая свеча в нашем интервале
        if time_to_number(ds:T(current_candle)) >= start_time and time_to_number(ds:T(current_candle)) <= end_time then
            if max_candle_index == nil or ds:H(current_candle) > ds:H(max_candle_index) then
                max_candle_index = current_candle
            end
            if min_candle_index == nil or ds:L(min_candle_index) > ds:L(current_candle)  then
                min_candle_index = current_candle
            end            
        end
                
		current_candle = current_candle - 1
	end
    
    message("Максимум:\n" ..
        "   Индекс: " .. tostring(max_candle_index) ..
        "   Цена: " .. tostring(ds:H(max_candle_index)) ..
        "   Время: " .. to_human_time(ds:T(max_candle_index))
    )

    message("Минимум:\n" ..
        "   Индекс: " .. tostring(min_candle_index) ..
        "   Цена: " .. tostring(ds:L(min_candle_index)) ..
        "   Время: " .. to_human_time(ds:T(min_candle_index))
    )
end

function to_human_time(time)
    return tostring(string.format("%02d", time.hour) .. ":" .. string.format("%02d", time.min) .. ":" .. string.format("%02d", time.sec))
end

function time_to_number(time)
    return tonumber(string.format("%02d", time.hour) .. string.format("%02d", time.min) .. string.format("%02d", time.sec))
end