201

Re: Общие вопросы по написанию скриптов LUA.

Хотя я бы всё равно не закладывался на какой-либо порядок данных.

Я имел ввиду и забыл написать про номера заявок и сделок, остальной порядок меня в принципе не волнует. Ибо я иду по списку с номерами заявок или сделок соответственно, затем номер считанной из таблицы заявки или сделки сравниваю с последней сохраненной у себя(получаю во время работы робота) с соответствующим кодом инструмента, если меньше или равно, ничего не делаю со считанными данными, ибо они учтены, если равно, то это означает отсутствие дырки в данных, ну и соответственно если больше то учитываю в итогах. Если же равенства небыло, то это означает скорее всего дыру в данных и вывожу соответствующее предупреждение...

Текущая торговая сессия.

Эх, тогда для моей задачи она абсолютна бесполезна sad

202

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

Я имел ввиду и забыл написать про номера заявок и сделок, остальной порядок меня в принципе не волнует.

Какая разница? я бы не закладывался на какой-либо порядок данных, взятых из QUIK.
Либо сортировать как требуется после чтения всех данных, либо формировать очереди из операций, которые "некуда пристроить", авось потом к ним найдётся то, что требуется.

203 (2023-05-04 09:54:15 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

я бы не закладывался на какой-либо порядок данных

Именно поэтому и спрашиваю... С другой стороны уже недели две наблюдаю. Само собой порядок в таблицах заявок и сделок не совпадает и это понятно, ибо таблицы разные и сделки далеко не всегда срабатывают сразу после выставления заявок. А вот по номерам в той и другой таблицах все сделки при чтении идут в хронологическом порядке.
Вот подумываю для защиты от "непонятных глюков" раз в неделю или месяц ручками запрашивать отчет брокера(ну как минимум на период тестирования), переводить в csv файл и кормить роботу, который уже самостоятельно будет сравнивать правильность своих подсчетов с отчетом брокера. В случае чего будет корректировать и выводить предупреждения о несовпадении данных. Пожалуй это наверное единственный вариант проверить надежность таблицы сделок.
В общем в любом случае буду тестировать. Все-таки робот не коммерческий, а для себя smile

"некуда пристроить"

Не совсем понял про операции? Если в таблице есть сделка, я точно найду куда ее пристроить smile

204 (2023-05-05 10:20:00 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Есть такой вопрос. Необходимо прочитать отчет брокера из csv файл. Само чтение не проблема, но так как в файле много лишнего и чтобы его не редактировать я хочу сделать автоматическое распознавание начала и конца необходимых мне для чтения строк. У меня есть две мысли на этот счет. Вторую реализовать в принципе вроде не проблема, но хотелось бы попробовать распознать начало данных с даты и времени сделки. Как наиболее универсальный способ, да и в принципе для самообразования.
Есть например, дата и время в таком виде
04.04.2023  9:59:43
или в таком
04.04.2023  11:05:54
Само собой читаю как строку из csv файла с разделителями ";". Мысль такая, из файла читаю строку целиком, затем по шаблону ";" выделяю первую запись... И вот тут нужно что то придумать, чтобы вернуть "false" в случае если это не дата и время и "true" если строка распознается как дата время. Да, можно распознать например две точки и два двоеточия. Но тогда проще вторым способом smile Каких то стандартных функций я не нашел. string.format здесь вообще не годится, ибо предназначена для обратного, ей я могу отформатировать строку в такой вид очень удобно, но обратно она никак не годится. Использовать шаблоны? Но как то даже не представляю как это сделать, хоть и нашел описание шаблонов луа... Правда только на английском, но это не проблема.
Есть мысль сделать как то так
string.find(str, ["%s*(%d+)%p(%d+)%p(%d+)"])

205 (2023-05-05 11:00:12 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

dark184,
не понимаю вашего вопроса.
Формат csv  обычно подразумевает фиксированное количество "столбцов", разделённых ;
Т.е. мы точно знаем в каком "столбце" дата, а в каком время.
Зачем еще что-то распознавать? зачем заниматься тем, чем не нужно?

206

Re: Общие вопросы по написанию скриптов LUA.

1. Не уверен что отчет брокера завтра будет точно таким же, как и сегодня
2. Столбцы тоже самое.
3. Не знаем количество строк, а значит не знаем где начало нужных данных, и уж тем более конец. Конец файла это далеко не конец полезных данных, там еще много всякой ненужной информации. Тут либо редактировать файл и удалять бесполезные данные. Или каким то образом распозновать.

Т.е. мы точно знаем в каком "столбце" дата, а в каком время.

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

207

Re: Общие вопросы по написанию скриптов LUA.

Изменится формат - оправите скрипт. Это точно происходит очень редко.
Это надёжнее, чем заниматься эвристикой, выискивая "то ли дату, то ли цену".

"Бесполезные" строки проще откинуть по любым формальным признакам (не то количество ;, начинаются не с тех слов и т.д.)

Т.е. я бы строил алгоритм так:
- читать построчно, если строка по общим каким-то простым признакам является строкой с нужными данными - обработать, вычитав нужные "столбцы"
- если строка по общим "приметам" не является строкой с нужными данными - пропустить ее.

Выглядит надёжнее и управляемее такой алгоритм, по-моему. Эвристику и догадки и без того хватает где применить.

208

Re: Общие вопросы по написанию скриптов LUA.

Есть у меня в роботе один косяк, который отлавливал наверное с начала года. Нет, не потому что тупой smile Просто подобная ситуация крайне редка, особенно на демо счете, где торги ну крайне вялые. Просьба помочь. Косяк связан с частичным исполнением сделки при определенных условиях. Когда частичные покупки по одной и тойже заявке происходят относительно медленно, алгоритм работает идеально. Но стоит покупкам совершаться настолько быстро, что не успел отработать один OnDepoLimit(dlimit) как отрабатывает уже следующий, алгоритм дает сбой. Попытаюсь продемонстрировать на примере. Есть функция KillOrder(), по моему алгоритму если свершилась частичная покупка и уже есть неполная заявка на продажу(т.е. частичная покупка по одной и той же заявке совершилась во 2 и более раз), то KillOrder() просто напросто не находит эту заявку на продажу в таблице заявок.

function KillOrder(sec)

    local n = getNumberOf("orders")

    local y    = 0
    message("KillOrder() от " .. tool[sec].NAME .. ": Записей в таблице заявок " .. n)
    for y = 0, n-1 do
    
        local order = getItem("orders", y)                                        -- Перебираем все строки таблицы
        if    (order.client_code        == settings["common"].CLIENT_CODE)    and    
            (order.sec_code            == settings[sec].SEC)                and
            ((order.flags & 0x7)    == 5)                                then    -- Если есть совпадение
            
                message("KillOrder(): Найдена активная заявка на продажу")
--                tool[sec].uniq_trans_id = tool[sec].uniq_trans_id + 0x1
                local Trade = settings["common"].TRADE_ACC
                if settings[sec].CLASS == "CETS" then Trade = settings["common"].TRADE_ACC_1 end

                local trans = {
                    ["ACTION"] = "KILL_ORDER",
                    ["CLASSCODE"] = settings[sec].CLASS,
                    ["SECCODE"] = settings[sec].SEC,
                    ["ACCOUNT"] = Trade,
                    ["ORDER_KEY"] = tostring(order.order_num),
                    ["TRANS_ID"] = tostring(tool[sec].uniq_trans_id),
               }
                local res = sendTransaction(trans)                                -- и убиваем заявку
                message("KillOrder(): Приговор заявке от " .. tool[sec].NAME .. " вынесен! " .. res, 2)
                
        elseif (order.sec_code            == settings[sec].SEC)            then    -- Если есть совпадение
            message("KillOrder(): от " .. tool[sec].NAME .. " Значения: Код клиента - " .. order.client_code .. ", Код инструмента - " .. order.sec_code .. ", Флаги - " .. tostring(string.format("0x%X", order.flags)) .. " ID - " .. tostring(tool[sec].uniq_trans_id))

        end
    end

end

А вот вывод диагностических сообщений. Где:
1. OnDepoLimit() in: начало(вход) коллбэка OnDepoLimit(). Здесь не производится никаких действий, просто вывод необходимых мне значений таблицы dlimit, возвращаемой OnDepoLimit().
2. После пункта 1 идет следующее сообщение OnDepoLimit() out х:, где х означает условие по которому завершился коллбэк из первого пункта.
Т.е. пара этих сообщений это один и тот же коллбэк, все что между ними это действия внутри коллбэка от вызова до выхода

12:11:39    ВТБ ао Берем повторно по стратегии
12:11:39    SendOrder(): Заявка B от ВТБ ао отправлена!  Цена = 0.02161
12:11:39    OnDepoLimit() in: ВТБ ао В покупке - 10 В портфеле - 0 В продаже - 0 Статус - e_buy
12:11:39    OnDepoLimit() out 1: ВТБ ао Статус - confirm_buy
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 8 В портфеле - 2 В продаже - 0 Статус - confirm_buy
12:11:40    SendOrder(): Заявка S от ВТБ ао отправлена!  Цена = 0.021675
12:11:40    OnDepoLimit() out 2: ВТБ ао Статус - part_e_buy
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 7 В портфеле - 3 В продаже - 0 Статус - part_e_buy
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 6 В портфеле - 4 В продаже - 0 Статус - part_e_buy
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 5 В портфеле - 5 В продаже - 0 Статус - part_e_buy
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 1 В портфеле - 9 В продаже - 0 Статус - part_e_buy
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 0 В портфеле - 10 В продаже - 0 Статус - part_e_buy
12:11:40    OnDepoLimit() out 4.1: ВТБ ао Статус - part_buy
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 0 В портфеле - 10 В продаже - 2 Статус - part_buy
12:11:40    KillOrder() от ВТБ ао: Записей в таблице заявок 97
12:11:40    KillOrder(): от ВТБ ао Значения: Код клиента - 10609, Код инструмента - VTBR, Флаги - 0x1E ID - 24655
12:11:40    KillOrder(): от ВТБ ао Значения: Код клиента - 10609, Код инструмента - VTBR, Флаги - 0x18 ID - 24655
12:11:40    KillOrder(): от ВТБ ао Значения: Код клиента - 10609, Код инструмента - VTBR, Флаги - 0x1C ID - 24655
12:11:40    KillOrder(): от ВТБ ао Значения: Код клиента - 10609, Код инструмента - VTBR, Флаги - 0x18 ID - 24655
12:11:40    KillOrder(): от ВТБ ао Значения: Код клиента - 10609, Код инструмента - VTBR, Флаги - 0x1C ID - 24655
12:11:40    KillOrder(): от ВТБ ао Значения: Код клиента - 10609, Код инструмента - VTBR, Флаги - 0x18 ID - 24655
12:11:40    KillOrder(): от ВТБ ао Значения: Код клиента - 10609, Код инструмента - VTBR, Флаги - 0x1C ID - 24655
12:11:40    KillOrder(): от ВТБ ао Значения: Код клиента - 10609, Код инструмента - VTBR, Флаги - 0x18 ID - 24655
12:11:40    OnDepoLimit() out 5: ВТБ ао Статус - kill_order

Вначале видим, что стратегия решила о необходимости после предыдущей закрытой сделки(купля-продажа) открыть сделку повторно(т.е. прикупить еще бумаг), отправляем заявку и подтверждаем что она выставлена. После чего происходит покупка 2 лотов из 10, что мы видим по выводу и отправляем заявку на продажу уже купленных 2 лотов SendOrder() и спокойно уходим из коллбэка по условию out 2. И вот здесь начинается чехарда с частичными покупками, причем судя по всему первые 4 коллбэка даже не завершились, ибо вход в функцию после всех фильтров есть, но выхода нет. Для данного случая я не стал предусматривать отдельного выхода, ибо геморойно, просто функция 100% должна была завершиться сообщениями

12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 7 В портфеле - 3 В продаже - 0 Статус - part_e_buy
[u]12:11:40    OnDepoLimit() out: ВТБ ао В покупке - 7 В портфеле - 3 В продаже - 0 Статус - wait[/u]
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 6 В портфеле - 4 В продаже - 0 Статус - part_e_buy
[u]12:11:40    OnDepoLimit() out: ВТБ ао В покупке - 6 В портфеле - 4 В продаже - 0 Статус - wait[/u]
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 5 В портфеле - 5 В продаже - 0 Статус - part_e_buy
[u]12:11:40    OnDepoLimit() out: ВТБ ао В покупке - 5 В портфеле - 5 В продаже - 0 Статус - wait[/u]
12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 1 В портфеле - 9 В продаже - 0 Статус - part_e_buy
[u]12:11:40    OnDepoLimit() out: ВТБ ао В покупке - 1 В портфеле - 9 В продаже - 0 Статус - wait[/u]

Тем не менее незавершенная функция не помешала отработать при полной покупке и нормально выйти по out 4.1(Не знаю как отразится в будущем такая неполная отработка коллбэка, возможно переполнение или опустошение стэка, не знаю). После чего приходит коллбэк OnDepoLimit() in с тем, что заявка, отправлена ранее, выставлена, что мы и видим

12:11:40    OnDepoLimit() in: ВТБ ао В покупке - 0 В портфеле - 10 В продаже - 2 Статус - part_buy

Эти цифры я беру из таблицы, возвращаемой коллбэком.
Тут по моей логике необходимо прибить заявку и выставить заново с тем количеством, что у меня в портфеле. Для чего вызываю прямо из действующего текущего OnDepoLimit() функцию KillOrder()(Да, знаю, хреновое решение, но других вариантов я не придумал, ибо надо максимально быстро это сделать). Теперь функция быстренько перебирает всю таблицу заявок, отбирает только действующие заявки на продажу по флагам и если находит то убивает. НО! В таблице заявок выставленной заявки еще нет! Мы видим что нашлось 97 записей, а по факту нужная заявка в таблице 98! Причем все предыдущие заявки отображаются верно. С ID я поспешил и вывел текущее значение вместо того чтобы взять его из таблицы заявок.
Причем, если частичные покупки совершаются не так интенсивно и OnDepoLimit() успевает завершаться, все работает идеально...
Принципиально у меня есть решение, тупо вынести убийство заявки в майн, можно подумать вынести в OnTrade(), а в OnDepoLimit() только выставлять флаг что необходимо прибить заявку... Но в первом случае это очень и очень долго, во втором случае не гарантирует что я не нарвусь на тот же самый глюк, да и прилететь новые могут... Как всегда, вопрос что делать?

209

Re: Общие вопросы по написанию скриптов LUA.

1. Колбеки происходят в самых произвольных порядках. В абсолютно произвольных.
2. В момент прихода любого колбека данные в разных таблицах - не консистентны.

Это данность, которую надо принять и учитывать при разработке роботов. Не надо её пытаться "замазать" (тем более sleep'ами, прости господи!) или "обходить". Надо обдуманно учитывать, и алгоритмы строить железно с учетом этих обстоятельств. Не надеяться, а именно сразу строить алгоритмы с учетом того, что хоть что произойдет хоть в какое время.

Соответственно чем больше разнообразных колбеков использовать - тем больше нестабильности будет в программе и тем сложнее всё это будет в алгоритме обыграть.

Вывод: не надо использовать OnDepoLimit() для торговых операций, это точно лишнее.

210

Re: Общие вопросы по написанию скриптов LUA.

Именно поэтому я и использую OnDepoLimit(). Исключительно только его по двум причинам:
1. OnTrade и Onorder выносили мозг из за своих приходов в разное время, и особенно когда заявка только выставилась и сразу исполнилась. Это жесть похуже чем OnDepoLimit()
2. только OnDepoLimit() возвращает мне нужные данные, кроме номера заявки и сделки. Их как раз возвращают только OnTrade и OnOrder, но в них нет нужных мне данных...
С другой стороны OnDepoLimit() уже отлажен идеально, проглатывает все и вся, похоже что все ошибки выловлены, кроме киллордера и тот ошибается только при очень быстрых частичных покупках... Слипы я не использую, исключительно в майн чтобы проц не загружался на 100%.
Да, хреново что данные не согласованы в таблицах, буду иметь ввиду, надо еще подумать.

211 (2023-05-18 11:10:35 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Всем привет. Ни с того ни с сего на демо счете появилась ошибка.

Last_Price = 24.955, buy_price = 24.955, Avg_Price = 24.988065, Max_Lot = 900, Статус Сургнфгз = confirm_sell
SendOrder(): Заявка B от Сургнфгз отправлена!  Цена = 24.955
Заявка buy от Сургнфгз выставлена! Цена = 24.955 Кол-во = 3
OnTransReply(): Статус заявки Сургнфгз = 6, cur_state = part_e_buy Заявка не выставлена из-за ошибки!
Скорректированное значение НПР1 -6285.07 (RUB) меньше 0

Первой строкой робот информирует о вычисленных значениях, далее отправляет транзакцию с указанной ценой. Цена не меняется. Далее отрабатывает OnTransReply() и возвращает 6. После чего приходит сообщение от квика "Скорректированное значение НПР1 -6285.07 (RUB) меньше 0".
Что это вообще такое? Цена и количество однозначно корректные, что следует из второго и третьего сообщения, т.к. первое выводится сразу после отправки sendTransaction(trans).

local res = sendTransaction(trans)
        message("SendOrder(): Заявка " .. buy_sell .. " от " .. tool[sec].NAME .. " отправлена!  Цена = " .. tostring(price) .. res, 2)

, а третье сразу после возврата из функции SendOrder().
На данном инструменте лот 100, точность 3 знака после запятой, шаг цены 0,005, из чего произведя элементарные вычисления, цена за 3 лота должна быть 7486,5. Из чего можно сделать однозначный вывод, что НПР1 это не цена лотов.
Вообще что это значит? Глюк демо счета? На реальном счете этого не наблюдается. Хотелось бы разобраться. Демо счет открыт здесь [url]https://arqatech.com[/url]
Счет действующий, открыт был 21 апреля, сегодня 18 мая. Началось все это примерно в начале этой недели.

212 (2023-05-18 13:59:12 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

НПР1 - это новый параметр проверки клиентского лимитирования.
Фактически диагностика означает "недостаточно средств на счете для заявки" (возможно, маржинальная торговля с плечом). К корректности параметров заявки отношения не имеет.

Т.к. это демо-счет от Арка - то, если вы считаете что средств на демо-счете должно хватать под выставляемый объем заявки - напишите им письмо в саппорт, разберутся, ответят, починят при необходимости.

Почитать про контроль рисков и параметры можно где-то тут, например
[url]https://broker.ru/brokerage/services/risk-control[/url]

213 (2023-05-18 14:07:41 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Посмотрел на демо счет, действительно, счет ушел в -56703(я его обычно не контролирую на демо, ибо все равно понарошку), это тестовый робот сегодня накосячил и понабрал дохрена сбера, не по стратегии. В общем как я понял я уже занял 56 с лишним тысяч и больше мне не дают.
Ох, как хорошо что этот косяк проявился именно на демо счете smile Интересно, а сработает ли маржин колл на демо счете???

214

Re: Общие вопросы по написанию скриптов LUA.

Можете подсказать как так происходит? Реализую одну идею и столкнулся с чем то непонятным в таком коде

Client_Codes_Table = {}
for i=0,getNumberOf("client_codes")-1,1 do
    Client_Codes_Table[i] = getItem("client_codes", i)
    message(Client_Codes_Table[i] .. " Записей в таблице - " .. #Client_Codes_Table)
end

Т.е. в цикле получаю весь список клиентских кодов, в моем случае их 5, затем запихиваю их в массив с индексами от 0 до 4, вроде все хорошо. Все выводится и даже вроде все верно. НО! при i=0 длина таблицы должна быть 1, ибо я уже создал первую запись с индексом 0, у меня же в сообщениях выводится в первом цикле 0, во втором 1 и так до 4. Я знаю что в луа индексы в массивах начинаются с 1 по умолчанию, а не с нуля как в подавляющем большинстве языков программирования. Но в тоже время луа не запрещает мне использовать и другие индексы, в том числе и 0. Или же это особенность работы "#"?
К тому же в любом случае если длина массива равно 0, это пустой массив. С другой стороны, если длина массива начинается с 0, а пустой массив это nil, то где тут хоть какая то логика с тем, что индексы массива по умолчанию начинаются с 1??? Нафига людям так взрывать мозг?

215 (2023-05-24 12:16:56 отредактировано barlone)

Re: Общие вопросы по написанию скриптов LUA.

В доке написано как работает "#" для таблицы [url]https://www.lua.org/manual/5.4/manual.html#3.4.7[/url]

The length operator applied on a table returns a border in that table. A border in a table t is any non-negative integer that satisfies the following condition:

     (border == 0 or t[border] ~= nil) and
     (t[border + 1] == nil or border == math.maxinteger)

In words, a border is any positive integer index present in the table that is followed by an absent index, plus two limit cases: zero, when index 1 is absent; and the maximum value for an integer, when that index is present. Note that keys that are not positive integers do not interfere with borders.

216 (2023-05-24 12:17:42 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

Или же это особенность работы "#"

Именно так.
Почитайте справку про этот оператор, он имеет много ограничений и в общем случае вовсе не отвечает на вопрос "сколько элементов в таблице".

Вообще в Lua, на удивление,  нет штатного способа верного определения количества элементов в таблице. Все штатные способы имеют разные экзотические особенности, из-за чего не показывают реальное количество элементов в общем случае. "Проблеме" подсчета количества элементов в таблице посвящены множество топиков на в интернете, и фактически единственный верный и работающий способ - перебрать таблицу по for ... pairs, где сосчитать количество.
Идея разработчиков видимо состояла в том, что количество элементов знать не требуется.

a) Для задачи обхода всех элементов таблицы есть цикл for ... pairs / for ... ipairs

b) Для проверки таблицы на пустоту следует использовать if next(myTable) == nil then

217 (2023-05-24 12:35:09 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Ох уж эти справки... Ну в принципе то это все понятно, что индексы должны следовать друг за другом, иначе отсутствующий индекс будет восприниматься как конец массива, в моем случае это не важно. Само собой индексы в моем случае и положительные и целые.
В любом случае получается, в первом цикле индекс 1 отсутствует и это воспринимается как нулевой или пустой массив... Блин, ну зачем же так взрывать мозг? И так на каждом шагу sad
Переделал так, все стало правильно

for i=1,getNumberOf("client_codes"),1 do
    Client_Codes_Table[i] = getItem("client_codes", i-1)
    message(Client_Codes_Table[i] .. " Записей в таблице - " .. #Client_Codes_Table)
end

Само собой ограничения учел. Надеюсь что теперь уже все.

218

Re: Общие вопросы по написанию скриптов LUA.

Не понятно зачем вам #Client_Codes_Table в данном случае.
Просто выводите i (или i+1 для первого варианта кода) да и все.

219 (2023-05-24 13:23:27 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Дело в том, что в этом цикле я только заполняю массив. Подсчет количества мне будет нужен позже в другой функции. А сообщение я вывел только для вылавливания очередных граблей...
И да, это только тест, массив будет другим в реальной программе.

220 (2023-05-25 10:11:19 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

В справке крайне запутанно все описано, попытался найти более внятное описание, но кроме копипаста ничего не нашел. Вопрос по getClassSecurities(), "Функция предназначена для получения списка кодов инструментов для списка классов, заданного списком кодов."
Как перевести на нормальный русский это описание??? Понятно что возвращает список кодов инструмента, именно его и возвращает. А вот с фразой "для списка классов". Т.е. функция должна бы принимать список классов и судя по всему в купе с фразой "заданного списком кодов." следует читать как "заданного списком кодов классов". Т.е. по сути я функции скармливаю список кодов классов, а она возвращает список всех кодов инструментов, соответствующий кодам заданных классов.
Логично предположить что список кодов классов разделяется запятыми, причем пробовал и так "QJSIM","TQBR" задать, и так "QJSIM,TQBR". Функция не работает. Причем если задать только один код инструмента все отлично возвращается...
Собственно говоря данная функция может принимать список аргументов, просто я неверно оформляю этот самый список(неверно понимаю фразу "для списка классов, заданного списком кодов."), или же все таки функция работает исключительно с одним аргументом?
Не сказал бы что это проблема, можно чуть видоизменить программу, закинув список кодов классов в массив и в цикле скармливать функции аргументы по очереди... Но гораздо интереснее задать список аргументов одним махом чем организовывать циклы.

221

Re: Общие вопросы по написанию скриптов LUA.

Про список классов в getClassSecurities() надо на официальном форуме спросить.
Официальная документация не разъясняет как передавать туда список классов. А если не удаётся его туда передать - то остаётся единственный вариант узнать правду спросить явно разработчика.

222

Re: Общие вопросы по написанию скриптов LUA.

Вообще, принципиально функция съедает и не давится если задать список так
example = getClassSecurities("QJSIM,TQBR,TQPI,")
или так
example = getClassSecurities("QJSIM,TQBR,TQPI")
Одно но! Если в списке первым стоит существующий код, то возвращается строка со списком кодов инструментов только по первому коду, остальные игнорятся или не видятся функцией. Если же первым поставить несуществующий код, то возвращается пустая строка. Даже если первые два существуют, то возвращается строка только с кодами по первому из списка. Т.е. список задать можно однозначно, функция проглатывает, но все что после первой запятой будет игнорироваться.

223

Re: Общие вопросы по написанию скриптов LUA.

Посмотрел в более новую справку от версии терминала QUIK 10.1 - там уже дописано как задавать список классов:

getClassSecurities
Функция предназначена для получения списка кодов инструментов для списка классов, заданного списком кодов. Коды инструментов в списке разделяются запятой «,». В конце полученной строки всегда дописывается символ «,».

224 (2023-05-26 08:52:32 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

У меня справка 8.7, написано слово в слово. Вот только это описание к сожалению к "полученной" строке sad
Создается впечатление что разработчики предусмотрели список аргументов, но все что после первой же запятой игнорируется, как будто оставили на потом, когда нибудь реализуем, а пока и так сойдет.
к тому же я пробовал и без запятой, и с запятой

example = getClassSecurities("QJSIM,TQBR,TQPI,")
example = getClassSecurities("QJSIM,TQBR,TQPI")

разницы вообще никакой, ни ошибок, ни значений nil, возвращается значения исключительно по первому коду до запятой. Если первый код не существует возвращается пустая строка, если же существует, то список инструментов как и положено с запятой в конце. Причем как на демо счете, так и на реальном.

225 (2023-05-26 09:34:47 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

это описание к сожалению к "полученной" строке

Блин, точно, писал второпях, невнимательно прочитал текст.