finsight / QUIKSharp

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

Модификация функции CreateDataSource #352

Closed Olddead91 closed 5 months ago

Olddead91 commented 5 months ago

Здравствуйте. Функция CreateDataSource в qlua имеет возможность заказывать свечи и историю по определенным параметрам param из ТТТ (кол-во продавцов, биды и тп). TABLE data_source, STRING error_desc CreateDataSource (STRING class_code, STRING sec_code, NUMBER interval, [, STRING param]) Пример описывали на форуме Квика - https://forum.quik.ru/messages/forum10/message8259/topic110/#message8259 Есть-ли потенциальная возможно реализации этой функции?

Pr0phet1c commented 5 months ago

Потенциальная есть, но функция не совсем обычная, и с рядом ограничений. Ее нельзя использовать в произвольном месте. По сути, надо модифицировать работу таких функции как "GetAllCandles", "GetLastCandles", "Subscribe" и "Unsubscribe", в которых CreateDataSource уже применяется, но в своем старом виде, где нельзя было указывать дополнительные параметры. Не уверен, что результат будет скоро.

Pr0phet1c commented 5 months ago

Ну, вроде получилось. Как это работает можно посмотреть в демо-приложении. Там эта функция выполняется с параметром "bid", но разницы в результатах я на первый взгляд не заметил.

Olddead91 commented 5 months ago

Шикарно! Если все получилось, то вы фактически открыли возможность доступа к таблице истории изменения параметром и полной свободы от привязки к графику в квике!))) как протестирую, обязательно отпишусь,. Спасибо!

Olddead91 commented 5 months ago

Странно конечно, но почему-то подписка идет на обычную свечу. Попробовал добавить param в эту часть кода qsfunctions.lua:

--- Возвращаем все свечи по заданному инструменту и интервалу
function qsfunctions.get_candles_from_data_source(msg)
    local ds, is_error = create_data_source(msg)
    if not is_error then
        --- датасорс изначально приходит пустой, нужно некоторое время подождать пока он заполниться данными
        repeat sleep(1) until ds:Size() > 0

        local count = tonumber(split(msg.data, "|")[4]) --- возвращаем последние count свечей. Если равен 0, то возвращаем все доступные свечи.
        local class, sec, interval, param = get_candles_param(msg)
        local candles = {}
        local start_i = count == 0 and 1 or math.max(1, ds:Size() - count + 1)
        for i = start_i, ds:Size() do
            local candle = fetch_candle(ds, i)
            candle.sec = sec
            candle.class = class
            candle.interval = interval
            candle.param= param
            table.insert(candles, candle)
        end
        ds:Close()
        msg.data = candles
    end
    return msg
function data_source_callback(index, class, sec, interval, param)
    local key = get_key(class, sec, interval, param)
    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
        candle.param= param

        local msg = {}
        msg.t = timemsec()
        msg.cmd = "NewCandle"
        msg.data = candle
        sendCallback(msg)
    end
end

И доп.поле в Candle.cs, чтобы можно было посмотреть в эвенте новой свечи, что туда приходит. Но приходит null, что на Тиковом интервале, что на любом другом

/// <summary>
/// Параметр свечи.
/// </summary>
[JsonProperty("param")]
public string Param { get; set; }
Pr0phet1c commented 5 months ago

там есть ошибка. Задачка оказалась несколько сложнее, чем мне показалось на первый взгляд. Пытаюсь исправить.

Pr0phet1c commented 5 months ago

Пофиксил. И "да" теперь данные приходят разные

Olddead91 commented 5 months ago

Класс! Все работает, спасибо!