Если правильно понял. Можно попробовать передачу через Замыкание Lua функции.
Если объявить функцию обратного вызова fn прямо внутри кода, она автоматически видит и захватывает все локальные переменные, объявленные выше неё.
Допустим стратегия календарного арбитража должна найти в системной таблице сделок QUIK ("trades") все записи, которые принадлежат конкретным кодам инструментов из вложенного массива legs.lua
| Код |
|---|
-- Исходная вложенная структура в ОЗУ робота
local my_portfolio = {
securities = {
legs = {
[1] = { sec_code = "SVU6" }, -- Ближний фьючерс
[2] = { sec_code = "SVZ6" } -- Дальний фьючерс
}
}
}
function FindArbitrageTrades()
-- 1. Вытаскиваем элементы в локальные переменные (создаем замыкание)
local code_leg1 = my_portfolio.securities.legs[1].sec_code
local code_leg2 = my_portfolio.securities.legs[2].sec_code
-- 2. Определяем функцию обратного вызова fn
-- QUIK будет передавать в неё каждую сделку из хранилища терминала
local function filter_callback(trade_item)
-- Функция видит переменные code_leg1 и code_leg2 из внешнего контекста!
if trade_item.sec_code == code_leg1 or trade_item.sec_code == code_leg2 then
return true -- Элемент удовлетворяет условию, сохраняем его индекс
end
return false
end
local total_items = getNumberOf("trades") or 0
if total_items == 0 then return nil end
-- 3. Вызываем SearchItems. Строку params не задаем, элемент передается полностью
local found_indices = SearchItems("trades", 0, total_items - 1, filter_callback)
return found_indices -- Возвращает таблицу с индексами найденных сделок арбитража
end |