CreateDataSource SetUpdateCallbackcallback более чем для одного заказа

Страницы: 1
RSS
CreateDataSource SetUpdateCallbackcallback более чем для одного заказа, SetUpdateCallbackcallback более чем для одного заказа
 
Я понимаю, что "CreateDataSource гавно", но мне уже чисто из любопытства интересно.
Я уже перешел чисто на Lua.

У кого нибудь работает CreateDataSource SetUpdateCallbackcallback - более, чем для одного инструмента ??

Вот простой тестовый код на чистом Lua:


Код
function my_callback_CreateDataSource_HISTORY_1(my_table_data_history_candle_, code_class_, code_paper_, interval_, interval_string_)

message("SIZE_TABLE:" ..tostring(my_table_data_history_candle_:Size() .. "\n" .. ":" ..  code_paper_ ..":" .. interval_string_ ..":" ..my_int_1))

end




function my_callback_CreateDataSource_HISTORY_2(my_table_data_history_candle_, code_class_, code_paper_, interval_, interval_string_)

message("SIZE_TABLE:" ..tostring(my_table_data_history_candle_:Size() .. "\n" .. ":" ..  code_paper_ ..":" .. interval_string_..":" ..my_int_2))

end








-----------------------------------------------------------------------------------------------------------int main:-----------------------------------------------------------------------------------------------------


function main()


local code_class_1= "TQBR"          
local code_paper_1= "GAZP"           
local intervakla_1= INTERVAL_MN1
local intervakla_string_1 = "INTERVAL_MN1"



my_table_1, error_desc_1 = CreateDataSource(code_class_1, code_paper_1, intervakla_1)  


------------------------Проверка на ошибки:-------------------
if error_desc_1 ~= nil then 
message("1:" .. error_desc_1)
end
--------------------------------------------------------------

my_table_1:SetUpdateCallback(function(idx)my_callback_CreateDataSource_HISTORY_1(my_table_1, code_class_1, code_paper_1, intervakla_1, intervakla_string_1) end)








local code_class_2= "TQBR"          
local code_paper_2= "SBER"           
local intervakla_2= INTERVAL_W1
local intervakla_string_2 = "INTERVAL_W1"


my_table_2, error_desc_2 = CreateDataSource(code_class_2, code_paper_2, intervakla_2) 

------------------------Проверка на ошибки:-------------------
if error_desc_2 ~= nil then 
message("2:" .. error_desc_2)
end
--------------------------------------------------------------


my_table_2:SetUpdateCallback(function(idx)my_callback_CreateDataSource_HISTORY_1(my_table_2, code_class_2, code_paper_2, intervakla_2, intervakla_string_2) end)





-------------------------
while not stopped do 
sleep(1)
end 
-------------------------



end -- end main()



То есть я просто заказываю SetUpdateCallback - для Газпрома и Сбера, но callback вызывается ТОЛЬКО для сбера.
КТО НИБУДЬ получал callback - сразу более, чем по одному инстурменту ??

Или я что то конкретно не так делаю ??
 
Если Владимир сделал вывод, то, конечно, это приговор. Правда странно, почему же оно работает у остальных.

Вот, специально проверил, версия Квика 8.7.3
Код
local is_run = true

local function is_date(val)
    local status = pcall(function() return type(val) == "table" and os.time(val); end)
    return status
end

local function call_back_processor(action, context)
    if not action then return end
    return function(index)
        action(index, context)
    end
end

local function on_ds_action(index, context)
    local time = is_date(context.ds:T(index)) and os.time(context.ds:T(index)) or nil
    _G.message(string.format('new ds index %d %s %s|%s last close %.5f', index, time and os.date('%d.%m.%Y %H:%M:%S', time), context.sec_code, context.class_code, context.ds:C(index)))
end

local function create_ds(context, action)

    if not context then return end

    local ds, err = _G.CreateDataSource(context.class_code, context.sec_code, context.interval)

    if not ds then
        _G.message(err, 3)
        return
    end

    if ds and action then
        ds:SetUpdateCallback(call_back_processor(action, context))
    end
    context.ds = ds

    return ds
end

function _G.main()

    create_ds({sec_code = 'SBER', class_code = 'TQBR', interval = _G.INTERVAL_W1}, on_ds_action)
    create_ds({sec_code = 'GAZP', class_code = 'TQBR', interval = _G.INTERVAL_MN1}, on_ds_action)

    while is_run do
        _G.sleep(100)
    end
end

function _G.OnStop()
    is_run = false
end
 
Мазохисты.. :smile:

У Владимира не CreateDataSource или там SetUpdateCallbackcallback, в первую очередь, потому, что он даже не пытался эту хрень использовать, ибо ему нужны, как минимум, сотни тикеров и, соответственно, тысячи свечей. И я даже не спрашиваю, работает ли что там у кого бы то ни было - я и так прекрасно знаю: сколько-нибудь удовлетворительно это дерьмо работать НЕ МОЖЕТ.
 
Работает.
Почему же у меня не работает.
 
Ну, видимо, потому, что пытаетесь произвести конкатенацию числа и строки
my_table_data_history_candle_:Size() .. "\n"

Обратно работает, а вот число..строка уже нет

> print(5..'a')
stdin:1: malformed number near '5..'
> print('a'..5)
a5

Лучше не злоупотреблять динамичностью языка. Либо просто ошиблись с расстановкой скобки для tostring. Также не понятно что это за переменные my_int_1 и my_int_2. Не вижу инициализации. А раз они nil, то соединяете строку с nil.
 
Цитата
Nikolay написал:
Ну, видимо, потому, что пытаетесь произвести конкатенацию числа и строки
my_table_data_history_candle_:Size() .. "\n"

Обратно работает, а вот число..строка уже нет

> print(5..'a')
stdin:1: malformed number near '5..'
> print('a'..5)
a5

Лучше не злоупотреблять динамичностью языка. Либо просто ошиблись с расстановкой скобки для tostring. Также не понятно что это за переменные my_int_1 и my_int_2. Не вижу инициализации. А раз они nil, то соединяете строку с nil.
Дааа ннннннеееет.
Я же пишу, что "callback вызывается ТОЛЬКО для сбера."
То есть колбек срабатывает, но только заказанный последним.
 
Все, путем подбора разобрался.
Спасибо!
 
Цитата
Nikolay написал:
Если Владимир сделал вывод, то, конечно, это приговор. Правда странно, почему же оно работает у остальных.
А вот и нет.

Склоняюсь, к мнению Владимира, что CreateDataSource SetUpdateCallbackcallback - действительно не стабильный.

Я лишь незначительно изменил Ваш код:

-за место акций SBER и GAZP - изменил на тот, который не открыт в Квике -у меня к примеру - это "PRMB".
-И изменил "on_ds_action" - сделал, чтобы после первого вызова on_ds_action - вызывалась отписка от колбека ds:Close().

Код
local is_run = true

local function is_date(val)
    local status = pcall(function() return type(val) == "table" and os.time(val); end)
    return status
end

local function call_back_processor(action, context)
    if not action then return end
    return function(index)
        action(index, context)
    end
end

local function on_ds_action(index, context)
    local time = is_date(context.ds:T(index)) and os.time(context.ds:T(index)) or nil

    message(tostring(index) .. "\n" .. tostring(context.interval))
    context.ds:Close()

end

local function create_ds(context, action)

    if not context then return end

    local ds, err = _G.CreateDataSource(context.class_code, context.sec_code, context.interval)

    if not ds then
        _G.message(err, 3)
        return
    end

    if ds and action then
        ds:SetUpdateCallback(call_back_processor(action, context))
    end
    context.ds = ds

    return ds
end

function _G.main()

    create_ds({sec_code = 'PRMB', class_code = 'TQBR', interval = _G.INTERVAL_W1}, on_ds_action)       --VLHZ
    create_ds({sec_code = 'PRMB', class_code = 'TQBR', interval = _G.INTERVAL_MN1}, on_ds_action)

    while is_run do
        _G.sleep(100)
    end
end

function _G.OnStop()
    is_run = false
end


А вот в чем "гамно" этого СreateDataSource::SetUpdateCallback.

Если Вы запустите - этот скрипт - Вы увидите следующее поведение:
-В первый запуск скрипта   - колбек вызовется два раз: один раз для интервала INTERVAL_MN1 и один раз для INTERVAL_MN1. Тут все логично и правильно.
-Во второй запуск скрипта  - колбек вызовется только ОДИН раз - только для одного интервала!

А теперь скажите, что СreateDataSource не "гамно" ?
Страницы: 1
Читают тему
Наверх