Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
TGB написал: Дело в том, что цикл вида: = .. при большом количестве повторений (а я предполагаю что это может быть) в Lua заметно нагружает управление памятью.
Ваши слова заставили задуматься. Что такое "нагружает управление памятью" я не понял. Но убедился, что при большом количестве склеиваемых строк (от нескольких десятков и выше) выгоднее (в плане скорости) все строки загнать в таблицу, а затем склеить в одну с помощью table.concat. При огромном количестве строк (более 100) скорость склейки в цикле существенно падает (нелинейно). Правда, не знаю, для каких практических задач может потребоваться склейка огромного количества строк. Например, для сделок используется ~73 параметров, и запись в одну строку из массива строк с помощью table.concat всего лишь процентов на 10% быстрее, чем в цикле.
На выходе вместо Lua-таблицы получается какая-то нечитаемая "каша". Странный выбор... или у нас разное понимание понятия "сереализация". Чем обусловлен выбор такого формата? Он ведь труден для восприятия.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Артем написал: Колбек указывает только на порядковый номер обновлённой свечки в источнике данных, но не указывает к какому источнику данных она принадлежит.
Цитата
Артем написал: Гораздо лучше когда можно объявить колбек и отправлять его в датасорс, и при вызове он сам объявит к какому датасорсу он принадлежит.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир написал: дайте юзеру возможность САМОМУ определять тип данных
Это в Lua есть.
Цитата
Владимир написал: Добрая половина проблем тут же снимется.
Только не в вашем случае. Ещё Крылов написал басню, про таких:
Код
К несчастью, то ж бывает у людей:
Как ни полезна вещь, — цены не зная ей,
Невежда про нее свой толк все к худу клонит;
А ежели невежда познатней,
Так он ее еще и гонит.
Артем написал: есть определённый список таблиц, без данных из которых невозможно начать автоматическую торговлю. Вот их и ждём.
или
Цитата
swerg написал: экспериментально установить, что через 5 минут после подключения и/или через 5 минут после начала торговой сессии - данные в терминале на нашем компьютере и нашем интернете - точно актуальные
ненадёжные. Есть множество факторов, от которых зависит продолжительность загрузки данных, о многих мы и не подозреваем даже. Ну получили вы 100500 строк в таблице спустя 5 мин. И что? Это все или еще не все?
Артем написал: не ждать заполнения таблиц которые однозначно будут пустыми
Как это в коде заранее запрограммировать? Тут подразумевается, что пользователь пишет скрипт для автоматизированной торговли, не с тем, чтобы потом подсказывать ему: "тут ждать, тут не ждать".
Сделок нет, потому что ждем, когда таблицы заполнятся. А таблица сделок не заполняется, потому что мы не торгуем, спим. Нормально чё, курим бамбук, Артем сказал спать: "пока спишь, данные с сервера сами приходят".
Артем, подсказка: чтобы в таблице появилась сделка, надо ее совершить. По другому она ну никак не появится, хоть ты год жди.
Готов за скромную плату модерировать ваш форум. А то он превратился в какую-то помойку. Вроде, уважаемая организация... в сфере IT даже, а форум, как в школьной локалке. В каждой второй теме визги, какой язык лучший, и старпёры "уважаемые" программисты меряются пись, кто здесь "эксперт в Lua".
Артем написал: Можно проверять объём строк в таблицах и спать пока он равен нулевому.
Так во многих таблицах количество строк и будет нулевым, пока вы спите. Откуда, например, взяться заявкам, сделкам, позициям по фьючерсам etc., если вы спите?
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Сидят в песочнице зверята и хвастаютя: "Я дальше всех умею прыгать", - говорит Зайчонок. "А я быстрее всех бегаю в колесе", - говорит Бельчонок. Медвежонок слушал-слушал и говорит: "А я…, а у меня… А я вам щас всем пи[цензура] дам!"
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
TGB написал: Дело в том, что цикл вида: <строка1> = <строка1> .. <добавляемая строка> при большом количестве повторений (а я предполагаю что это может быть) в Lua заметно нагружает управление памятью.
В чём это выражается?
Цитата
TGB написал: Вы же можете получать свою строку следующим образом: local str = "" for k,v in next, dump_tbl (<Параметры>) do str = str .. v end или модифицировать код функции dump_tbl.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
TGB написал: Комментариев обсуждения функции cоздания последовательности ключей я насчитал более двадцати. Это одна из самых простых функций из списка API OS_Quesha
Ставить дополнительную библиотеку только лишь для создания уникальных ключей - не лучшее решение.
Цитата
TGB написал: 1. Запрос последовательности ключей (number): Cl_LuaGL () Результат функции: number - глобальный ключ системы формата: <Номер запус- ка/перезапуска системы >(старшие, оставшиеся разряды, начиная с 6-го )<Счетчик запросов ключей после запуска/перезапуска системы>(6 десятичных разрядов)
<Номер запуска/перезапуска системы > сохраняется в каком-то файле на диске? Тогда такой вариант можно и без библиотеки сделать. Прочитать из файла последнее значение, увеличить на 1:
Код
local LaunchNumber = (file:read("*n") or 0) + 1
Сохранить новое значение в файл. И далее использовать, например:
TGB написал: Примером простой (классическая задача на рекурсию), но, наверное, полезной функции из раздела 10 является универсальная функция печати переменных dump_str.
Преобразование одной таблицы в другую... Сомнительная польза.
Цитата
TGB написал: функцию dump_str можно вызвать в любой момент для любой глобальной переменной скрипта с тем, чтобы распечатать ее с выдачей в журнал отладки.
Может, лучше сразу распечатать таблицу в виде строки, без конвертации в другую таблицу?
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
local trans_id_start = os.time () - 1546290000
local trans_id = trans_id_start + getUniqTransID()
Вот так ID должны быть уникальны, независимо от количества запущенных роботов.
Наврал. Надо доработать алгоритм.
Цитата
Игорь Б написал: Я уникальность обеспечиваю фиксированием момента времени включения скрипта, а не совершения транзакции. А уже дальше, если в скрипте есть сделка, то как обычно, к полученному случайному числу +1.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
BlaZed написал: Расчет на 10 одновременно работающих роботов, у каждого робота свой robot_id от 0 до 9
Есть идеи, как сделать уникальный trans_id в разных роботах без необходимости задавать свой диапазон (robot_id) внутри каждого робота (или их копий)? Вместо trans_id_count можно использовать миллисекунды из os.sysdate(). Но
Цитата
Nikolay написал: вероятность отправки транзакции двумя скриптами одновременно есть.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Anton написал: По задумке подтягиваться за ценой , когда та растет, и стоять на месте, когда не растет. Исполнится, когда цена откатится от очередного пика.
Это трейл-стоп-лимит так должен работать.
Я не верно написал. Стоп-лимит также не может быть трейл. Еесли мы говорим о лимитной заявке, которая сразу выставляется на биржу, иначе, при чём здесь штраф за бесполезное выставление заявок?
Или я чего-то не понимаю.
Цитата
Anton написал: Исполнится, когда цена откатится от очередного пика.
Объясните мне, как заявка исполнится, если цена пойдёт в обратную от заявки сторону?
Anton написал: По задумке подтягиваться за ценой, когда та растет, и стоять на месте, когда не растет. Исполнится, когда цена откатится от очередного пика.
Это трейл-стоп-лимит так должен работать. Тейк-профит же исполняется против рынка.
shr540i написал: да хоть просто сделай новый тип заявки и назови его трэйл-профит и сделай его как выставляемую по условию достижения профит цены обычную лимитку у которой потом при движении рынка в нужную сторону динамически меняется лимит. и все проблемы будут решены
Есть штраф за бесполезное выставление заявок . Юзер выставит такой трейл с большим отступом, через пару часов после активации брокер влетает на штраф, кто его оплачивать будет?
А в чём смысл заявки? Постоянно убегать от текущей цены? А исполниться она когда должна?
Транзакции KILL_ORDER имеют флаг "на ввод заявки", а KILL_ALL_FUTURES_ORDERS - флаг "служебная". QUIK clients support, какой смысл вкладывается в эти понятия?
Незнайка написал: на общем балансе брокера в моменте количество акций меньше, чем вы хотите продать...
Roman Azarov, возможна такая ситуация, когда у одного клиента на счёте +некоторое количество акций, у другого "-" (продано или стоят в заявках на продажу), в итоге суммарное количество доступных акций у брокера меньше, чем у первого клиента в портфеле? Какая в этом случае будет диагностика?
Обычно, если послать транзакцию за несколько секунд до начала или через несколько секунд после окончания торговой сессии, то будет ошибка от шлюза торговой системы: "Сейчас эта сессия не идет."
Цитата
Олег написал: вот с такими данными улетала транзакция фьючерс Si-3.21 12.02.2021;11:30:00;ACTION=NEW_ORDER; TRANS_ID=1612899312; OPERATION=B; QUANTITY=1; PRICE=74366;
Что значит "улетела"?
Цитата
Олег написал: Указанная транзакция по указанному классу не найдена: "SPBFUT"
Это, вроде, как ошибка самого терминала, транзакция на сервер не отправляется.
Незнайка написал: Пока выполняется байткод (в любом потоке) сам QUIK залочен?
Ну да, ваш же тест выше это и подтверждает. Просто это было не так очевидно в скриптах, где байткод перемежается с си-функциями. Не далеко от QPILE ушли
Anton написал: байткод всегда выполняется под локом
Пока выполняется байткод (в любом потоке) сам QUIK залочен?
Цитата
Anton написал: Арке надо было только реализовать lua_lock/lua_unlock
А зачем понадобилось их реализовывать? Ну выполнялись бы потоки параллельно. А то так стопорится скрипт на каждом шаге, переключаясь то на один поток, то на другой.
Anton написал: Сишные функции - любые, из самого луа, из qlua выполняются без лока
Как можно в этом убедиться?
При вызове, скажем сишной функции из самого lua, сначала ставится lua_lock потом выполняется функция, затем lua_unlock или в обратном порядке: lua_unlock - выполнение функции - lua_lock?
Anton написал: байткод всегда выполняется под локом, а когда надо вызвать сишную функцию, лок снимается и после возврата захватывается снова. Арке надо было только реализовать lua_lock/lua_unlock, все остальное уже готово.
Т.е., весь луа-код, в т.ч. и сишные функции из qlua, не может выполняться одновременно в двух потоках? Ну и зачем тогда нужно было городить весь этот огород с двумя потоками, если они всё равно не работают параллельно?
Вопрос к разработчикам: какие преимущества дала такая двухпоточная модель работы Lua-скриптов?
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Ни к чему не призываю, сам эту штуку не ставил. Но кому-то может, и пригодятся реализованные автором средства, которых нет изначально в qlua. Вы ведь не думаете, что автор предложил исключительно вам двоим опробовать свой продукт? С таким же успехом можно, пойти, например на форум TSLaba и возмущаться там, зачем мне ваша хрень, я и сам могу тестер написать.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Евгений написал: Что не так с моим оборудованием что 35 меток в формате jpg на одном графике вызывают остановку остальных? Открыто 8 вкладок на каждой в среднем по 3 графика с индикаторами.
Если закрыть все графики, кроме того, на котором метки, как работать будет?