finsight / QUIKSharp

QUIK# (QUIK Sharp) is the QUIK Lua interface ported to .NET.
Other
232 stars 135 forks source link

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

Open aBaTaPbl4 opened 5 years ago

aBaTaPbl4 commented 5 years ago

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

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

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

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

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

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

Pr0phet1c commented 5 years ago

Скорее всего из-за перезагрузки данных о свечах в терминале. Если внимательно посмотреть код в файле 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 тут скорее всего не причем, он лишь транслирует это событие Вам.

SkyQuant commented 4 years ago

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

SkyQuant commented 4 years ago

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

aBaTaPbl4 commented 4 years ago

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

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