Тема: Возращает только одно значение

Доброго времени суток. Подскажите. Не могу сообразить. Сканирую таблицу depo_limits в самой функции видит позиции, но возращает только одну и туже позицию, что через return, что через присваивание глобальных переменных. Результат одинаковый. Как сделать что бы возращались параметры по каждой позиции, а не только одной и той же? Хочу написать скрипт для выставления стопов в портфеле акции.

IsRun       = true
ACCOUNT     = 'NL0011100043' -- Код счета
CLASS_CODE  = 'QJSIM' -- Код класса
EXPIRY_DATE = 'TODAY' -- Срок действия стоп-заявки: 'TODAY' - до окончания текущей торговой сессии, 'GTC' -до отмены, или время в формате 'ГГГГММДД'
PriceStep   = 0
Procent     = 2
IsRun       = true
SEC_CODE    = '' -- Код инструмента
QTY_LOTS    = 0

function OnStop()
    IsRun = false
end

function main()

    while IsRun do
    ScanerPortfelya()
    PrintDbgStr("SEC_CODE_"..SEC_CODE.."_QTY_LOTS_"..QTY_LOTS)
        sleep(1000)
        SEC_CODE = ""
        QTY_LOTS = 0
    end
end

-- Сканирует Портфель
ScanerPortfelya = function()
    -- Акции
    
        -- Перебирает таблицу "Позиции по инструментам"
        local num = getNumberOf('depo_limits')
        local depo_limit
        for i = 0, num - 1 do
            depo_limit = getItem('depo_limits', i)
            if depo_limit.limit_kind == 0 and depo_limit.currentbal ~= 0 then
                
                SEC_CODE = depo_limit.sec_code
                QTY_LOTS = depo_limit.currentbal

            PrintDbgStr("-----------------START--------------------")
            PrintDbgStr("Код бумаги_"..depo_limit.sec_code)      -- Код бумаги  (STRING)  
            --PrintDbgStr("Счет депо_"..depo_limit.trdaccid)     -- Счет депо  (STRING)  
            --PrintDbgStr("Идентификатор фирмы_"..depo_limit.firmid)
            PrintDbgStr("Код клиента_"..depo_limit.client_code)
           -- PrintDbgStr("Входящий остаток по бумагам_"..depo_limit.openbal)
           -- PrintDbgStr("Входящий лимит по бумагам_"..depo_limit.openlimit)
            PrintDbgStr("Текущий остаток по бумагам_"..depo_limit.currentbal)
            -- PrintDbgStr("Текущий лимит по бумагам_"..depo_limit.currentlimit)
            -- PrintDbgStr("Заблокировано на продажу количества лотов_"..depo_limit.locked_sell)
            -- PrintDbgStr("Заблокированного на покупку количества лотов_"..depo_limit.locked_buy)
            -- PrintDbgStr("Стоимость ценных бумаг, заблокированных под покупку_"..depo_limit.locked_buy_value)
            -- PrintDbgStr("Стоимость ценных бумаг, заблокированных под продажу_"..depo_limit.locked_sell_value)
            PrintDbgStr("Цена приобретения_"..depo_limit.awg_position_price)
            PrintDbgStr("Тип лимита_"..depo_limit.limit_kind)
            PrintDbgStr("==================END=======================")
           -- return  depo_limit.sec_code, depo_limit.currentbal, depo_limit.awg_position_price
            
           -- return depo_limit.sec_code, depo_limit.currentbal 
            end
        end
end

Результат:
[14036] -----------------START--------------------
[14036] Код бумаги_SBER
[14036] Код клиента_1238
[14036] Текущий остаток по бумагам_10.0
[14036] Цена приобретения_118.37
[14036] Тип лимита_0
[14036] ==================END=======================
[14036] SEC_CODE_SBER_QTY_LOTS_10.0
[14036] -----------------START--------------------
[14036] Код бумаги_GMKN
[14036] Код клиента_1238
[14036] Текущий остаток по бумагам_1.0
[14036] Цена приобретения_19778.0
[14036] Тип лимита_0
[14036] ==================END=======================
[14036] -----------------START--------------------
[14036] Код бумаги_LKOH
[14036] Код клиента_1238
[14036] Текущий остаток по бумагам_1.0
[14036] Цена приобретения_3925.0
[14036] Тип лимита_0
[14036] ==================END=======================
[14036] -----------------START--------------------
[14036] Код бумаги_ROSN
[14036] Код клиента_1238
[14036] Текущий остаток по бумагам_1.0
[14036] Цена приобретения_351.5
[14036] Тип лимита_0
[14036] ==================END=======================
[14036] -----------------START--------------------
[14036] Код бумаги_SBER
[14036] Код клиента_1238
[14036] Текущий остаток по бумагам_10.0
[14036] Цена приобретения_118.37
[14036] Тип лимита_0
[14036] ==================END=======================
[14036] SEC_CODE_SBER_QTY_LOTS_10.0

2

Re: Возращает только одно значение

Если вы хотите из ScanerPortfelya() вернуть непременно список, тогда его надо возвращать через таблицу (массив):

ScanerPortfelya = function()
......
        local ret = {}
        for i = 0, num - 1 do
......
                table.insert(ret, {
                        sec_code=depo_limit.sec_code;
                        currentbal=depo_limit.currentbal;
                        wg_position_price=depo_limit.awg_position_price
                })
        end
        return ret

И после массив этот обрабатывать в цикле:

secs = ScanerPortfelya()
for _,sec in pairs(secs) do
      PrintDbgStr("SEC_CODE_"..sec.sec_code.."_QTY_LOTS_"..sec.currentbal)
end

Обратите внимание на разные переменные sec и secs. Возможно, есть смысл выбрать "более различающиеся" имена для них.

Можно и не через возвращаемую переменную передавать, а через глобальную (не забыть инициализировать её таблицей). Тут по вкусу.

[hr][/hr]
Либо код обработки встроить внутрь цикла в функции ScanerPortfelya(), тогда и возвращать ничего не придется.

3

Re: Возращает только одно значение

Приветы, не стоит однако забывать, что выставляя стоп, вы просто говорите брокеру - на забери мои деньги!
Вам нужно подумать об алгоритме, который по условию будет закрывать позицию лимитками.

4

Re: Возращает только одно значение

БЛАГОДАРЮ! Очень помогли.

IsRun       = true
ACCOUNT     = 'NL0011100043' -- Код счета
CLASS_CODE  = 'QJSIM' -- Код класса
EXPIRY_DATE = 'TODAY' -- Срок действия стоп-заявки: 'TODAY' - до окончания текущей торговой сессии, 'GTC' -до отмены, или время в формате 'ГГГГММДД'
PriceStep   = 0
Procent     = 2
IsRun       = true
SEC_CODE    = '' -- Код инструмента
QTY_LOTS    = 0
PRICE = 0

function OnStop()
    IsRun = false
end

function main()

    while IsRun do
        secs = ScanerPortfelya()
        for _, sec in pairs(secs) do
            
            PrintDbgStr("-----------------START--------------------")
            PrintDbgStr("SEC_CODE_=" .. sec.sec_code .. "_QTY_LOTS_=" .. sec.currentbal.."_PRICE_="..sec.wg_position_price)
            PrintDbgStr("==================END=======================")
        end
        sleep(1000)
        SEC_CODE = ""
        PRICE = 0
        QTY_LOTS = 0
    end
end

-- Сканирует Портфель
ScanerPortfelya = function()
       -- Перебирает таблицу "Позиции по инструментам"
    local num = getNumberOf('depo_limits')
    local depo_limit
    local ret = {}
    for i = 0, num - 1 do
        depo_limit = getItem('depo_limits', i)
        if depo_limit.limit_kind == 0 and depo_limit.currentbal ~= 0 then
            table.insert(ret, {
                sec_code = depo_limit.sec_code;
                currentbal = depo_limit.currentbal;
                wg_position_price = depo_limit.awg_position_price
            })
            PrintDbgStr("-----------------START--------------------")
            PrintDbgStr("Код бумаги_" .. depo_limit.sec_code) -- Код бумаги  (STRING)  
            PrintDbgStr("Код клиента_" .. depo_limit.client_code)
            PrintDbgStr("Текущий остаток по бумагам_" .. depo_limit.currentbal)
            PrintDbgStr("Цена приобретения_" .. depo_limit.awg_position_price)
            PrintDbgStr("Тип лимита_" .. depo_limit.limit_kind)
            PrintDbgStr("==================END=======================")
           end
    end
    return ret
end

[10128] -----------------START--------------------
[10128] SEC_CODE_=GAZP_QTY_LOTS_=30.0_PRICE_=265.25666666667
[10128] ==================END=======================
[10128] -----------------START--------------------
[10128] SEC_CODE_=GMKN_QTY_LOTS_=1.0_PRICE_=19778.0
[10128] ==================END=======================
[10128] -----------------START--------------------
[10128] SEC_CODE_=LKOH_QTY_LOTS_=3.0_PRICE_=3988.3333333333
[10128] ==================END=======================
[10128] -----------------START--------------------
[10128] SEC_CODE_=ROSN_QTY_LOTS_=1.0_PRICE_=351.5
[10128] ==================END=======================
[10128] -----------------START--------------------
[10128] SEC_CODE_=SBER_QTY_LOTS_=30.0_PRICE_=121.82666666667
[10128] ==================END=======================
Возращает то что нужно!!! Спасибо!

5

Re: Возращает только одно значение

kalikazandr пишет:

Приветы, не стоит однако забывать, что выставляя стоп, вы просто говорите брокеру - на забери мои деньги!
Вам нужно подумать об алгоритме, который по условию будет закрывать позицию лимитками.

Привет. Возможно стоит сделать, но пока я только учусь qlua. И роботам пока доверять большие деньги не буду. Основной счет только в ручном управлении(и помощь от робота советника на писанным для amibroker). То что собирают стопы это конечно проблема. В втб в  утренню и дневную сесию на SPB до открытия Америки обували людей постоянно.

6

Re: Возращает только одно значение

snegovik3009 пишет:

... В втб в  утренню и дневную сесию на SPB до открытия Америки обували людей постоянно.

Привет. Не только втб, Любое ПО аля quik, очень сильно помогает расстаться с деньгами.
Условные заявки много сложнее лимитных и биржа ничего не знает об условных заявках, только лимитки.