QUIKSharp icon indicating copy to clipboard operation
QUIKSharp copied to clipboard

NewCandle генерируется для старых свечей

Open aBaTaPbl4 opened this issue 5 years ago • 4 comments

Есть ишуя #124, в которой эта проблема вскользь упоминается. Но ответа на вопрос "Почему" там не нашел.

Суть проблемы

Подписываюсь на получение новых свечей:

            _quik.Candles.Subscribe(secId.BoardCode, secId.SecCode, quikInterval);
            _quik.Candles.NewCandle += handler;

В процессе работы бота, в рандомное время (ночью-днем-утром перед тем как зубы чистить), - начинают приходить старые свечи. Даже прошлогодние могут приходить.

Поведение мягко говоря неожиданное. Можете подсказать, почему так происходит?

aBaTaPbl4 avatar Jul 11 '19 09:07 aBaTaPbl4

Скорее всего из-за перезагрузки данных о свечах в терминале. Если внимательно посмотреть код в файле qsfunctions.lua, то там есть такие функции:

function qsfunctions.subscribe_to_candles(msg)
	local ds, is_error = create_data_source(msg)
	if not is_error then
		local class, sec, interval = get_candles_param(msg)
		local key = get_key(class, sec, interval)
		data_sources[key] = ds
		last_indexes[key] = ds:Size()
		ds:SetUpdateCallback(
			function(index)
				data_source_callback(index, class, sec, interval)
			end)
	end
	return msg
end

function data_source_callback(index, class, sec, interval)
	local key = get_key(class, sec, interval)
	if index ~= last_indexes[key] then
		last_indexes[key] = index

		local candle = fetch_candle(data_sources[key], index - 1)
		candle.sec = sec
		candle.class = class
		candle.interval = interval
		local msg = {}
        msg.t = timemsec()
        msg.cmd = "NewCandle"
        msg.data = candle
        sendCallback(msg)
	end
end

Соответственно, событие NewCandle вызывается вот тут:

ds:SetUpdateCallback(
			function(index)
				data_source_callback(index, class, sec, interval)
			end)

а "ds:SetUpdateCallback" - не что иное как событие терминала. Так что вероятно лучше спросить разработчиков квика о механике работы их колбэка. QUIKSharp тут скорее всего не причем, он лишь транслирует это событие Вам.

Pr0phet1c avatar Jul 11 '19 12:07 Pr0phet1c

Подскажите, кэшируются ли свечи в самом терминале или каждый раз при запросе истории QUIK идёт на сервер за всем объёмом, а не только пропущенным? Т.е. вопрос в том, по событию новой свечи или по таймеру, было бы рационально тупо запрашивать всю или частичную историю, а не заморачиваться на ведение, склеивание и упорядочивание свечей в базе данных?

SkyQuant avatar Dec 25 '19 09:12 SkyQuant

И ещё вдогонку, зачем при инициализации квика new Quik(Quik.DefaultPort, new InMemoryStorage()) ему передаётся стрим? Можно ли таким образом кэшировать запрошенные графики?

SkyQuant avatar Dec 25 '19 10:12 SkyQuant

И ещё вдогонку, зачем при инициализации квика new Quik(Quik.DefaultPort, new InMemoryStorage()) ему передаётся стрим? Можно ли таким образом кэшировать запрошенные графики?

Исходники скачайте да и гляньте. Проект не самый большой, - и в целом всё понятно написано, в отличие от того же проекта StockSharp, который по ходу доктор Франкешнтейн сварганил в перерыве на обед...

aBaTaPbl4 avatar Dec 25 '19 18:12 aBaTaPbl4