С терминологией в луа у меня уже сносит крышу Ну впрочем это мои проблемы
Т.е. как я понял CreateDataSource возвращает все таки метатаблицу? Ну в любом случае, при работе с ds чтобы получить данные, все таки действительно вызывается функция? Если это так, то теперь мне понятно в чем проблема, мой подход в корне не верен с учетом вашего пояснения про возможности луа.
В чем смысл. На данный момент в одном майн работают 43 робота(т.е. робот один, но он обрабатывает сразу 43 инструмента в одном майн). Как это реализовано, для упрощения пусть будут 3 инструмента. Есть настроечная таблица в которую я вписываю нужные мне инструменты и их параметры
settings = {
common = {
_KIND = 0,
TRADE_ACC = "NL0011100043",
CLIENT_CODE = "10444",
FILE_NAME = "DEMO_"
},
SPBE = {
SEC = "SPBE",
CLASS = "TQBR",
portfolio = 1,
uniq_trans_id = 0x01000,
strategy = "Graph_Gibrid",
Block_sell_Case = 0,
},
FLOT = {
SEC = "FLOT",
CLASS = "TQBR",
portfolio = 3,
uniq_trans_id = 0x02000,
strategy = "Graph_Gibrid",
Block_sell_Case = 0, },
MAGN = {
SEC = "MAGN",
CLASS = "TQBR",
portfolio = 4,
uniq_trans_id = 0x03000,
strategy = "Graph_Gibrid",
Block_sell_Case = 0,
},
}
При запуске робот их читает и по образу и подобию создает для каждого инструмента отдельное поле в таблице tool с набором переменных
local i = 0
tool = {}
for k, v in pairs(settings) do
if k ~= "common" then
i = i + 1
local temp = settings[k].SEC
tool[temp] = {}
security_info = getSecurityInfo(settings[k].CLASS, settings[k].SEC)
tool[temp].NAME = security_info.short_name
tool[temp].PRICE_STEP = security_info.min_price_step -- Инструмент
tool[temp].PRICE_SCALE = security_info.scale -- точность задания цены инструмента
tool[temp].LOT_SIZE = security_info.lot_size -- Размер лота
.............................
Add_row(-1)
Table_row(i, temp)
end
end
Теперь к каждой переменной любого инструмента я могу обратиться по коду инструмента, который выдает мне коллбэк, т.к. индекс полностью совпадает с кодом инструмента. Да, все это работает не только на демо счете, но и на реальном счете. Левые коды я фильтрую. Под левыми я подразумеваю те инструменты, которые не внесены в настроечный файл. Тут только одна проблема осталась, это множественные вызовы коллбэков(это оставил на закуску, особо не вредит и ладно).
А вот более серьезная проблема пока не решена. Для каждого инструмента мне нужен источник данных, который я создаю примерно так
ds, Error = CreateDataSource (settings[temp].CLASS, settings[temp].SEC, INTERVAL_M5)
Если бы не множество инструментов, проблемы бы не было, создал и забыл, насколько я понял его достаточно один раз создать и он сам обновляется, достаточно в нужный момент получить интересующие данные
И когда то давно вроде даже проверял, и вроде даже обновлялся без проблем, и даже коллбэк срабатывал если его включал...
Но теперь возникла проблема. Колбэки я назначить не могу, ибо их отличить друг от друга будет нельзя, а прописывать новый коллбэк с уникальным именем каждый раз при добавлении инструмента тоже не айс. К тому же имена источников также должны быть уникальными. Сейчас пока проблема с источниками данных не решена, у меня каждый раз создается новый источник данных во всех инструментах с одним и тем же именем, из которого дергаю нужные мне данные и помещаю в нужные переменные. НО! Подозреваю что именно из за такого подхода через пару дней работы, оператива компа забивается напрочь, что приходится перезапускать квик...
Вот и кубатурю как при запуске робота один раз создать все источники данных для прописанных инструментов...
Была мысль создать коллбэк, но пришлось отказаться.
Сейчас кубатурил как скопировать в свою таблицу, но видимо действительно не судьба...
Т.е. по сути все сводится к тому, чтобы создавать 3(в реальности, сколько инструментов прописано) источника данных, каждый для своего инструмента, из которых можно будет вытаскивать нужные данные по типу таблицы со строковыми индексами
open[SEC_CODE] = ds[SEC_CODE]:open()