Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
14.03.2021 17:14:22
Велосипеды уже давно написаны, языку уже 27 лет. Не стесняетесь пользоваться , раздел Serialization.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Снимаю замечание. Не увидел изначально переменную seen. Обычно этот вариант не содержит ее.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
14.03.2021 13:23:08
Цитата
Функция dump_tbl рекурсивная и в ней раскручиваются все ссылки.
В этом проблема. Кеширования ссылок нет.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
14.03.2021 11:57:35
Цитата
В диалоге OS_Quesha, в процессе ее работы, функцию dump_str можно вызвать в любой момент для любой глобальной переменной скрипта с тем, чтобы распечатать ее с выдачей в журнал отладки.
Это довольно распространенный вариант на просторах. Вы попробуйте им вывести Класс или таблицы с перекрестными ссылками.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
написал: Расчет на 10 одновременно работающих роботов, у каждого робота свой robot_id от 0 до 9
Есть идеи, как сделать уникальный trans_id в разных роботах без необходимости задавать свой диапазон (robot_id) внутри каждого робота (или их копий)? Вместо trans_id_count можно использовать миллисекунды из os.sysdate(). Но
Цитата
написал: вероятность отправки транзакции двумя скриптами одновременно есть.
Вопрос уникальности транзакции обычно возникает в свете поиска ответа на транзакцию и установленного ордера по ней, сделок. Обычно делают номер как unix_time + mcs*1000. Также скрипт пишет в поле brokerref свой уникальный комментарий. Или, как выше написали, есть некая добавка от номера скрипта. Я предпочитаю brokerref, т.к. он идет сквозным образом от транзакции в ордер и сделки.
Вместе это дает уникальность при дальнейшем использовании номера и brokerref.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
12.03.2021 17:10:11
Если id транзакции предполагается в дальнейшем использовать как ключ, то необходимо обеспечить его уникальность. Хоть рандомизация и повышает вероятность уникальности, но не обеспечивает ее в полной мере. Чаще всего используют производные от unix-time как ключ транзакции. Но при этом надо еще подумать об уникальности между скриптами, т.к. вероятность отправки транзакции двумя скриптами одновременно есть.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
12.03.2021 16:37:14
qlua.dll - это библиотека, неотъемлемая от терминала. Так что ее можно считать частью среды исполнения. Я же говорю о библиотеках реализующие часть функциональности, которую можно реализовать самому. Предпочтение будет всегда тем, которые имеют открытый код.
Владимир, как угодно. Можете доверять чужим рукам.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
12.03.2021 15:02:18
С точки зрения ГК коммерческая деятельность - это деятельность предприятия (организации, юридического образования) направленную на рыночную деятельность, имеющую своей целью получение прибыли или рыночного дохода.
Так что это не о том.
А по существу уже все обсудили. Я слабо себе могу представить разработчика, использующего библиотеки без исходных кодов.
Индикатор торговой сессии
Пользователь
Сообщений: Регистрация: 27.01.2017
05.03.2021 17:53:44
Цитата
Владимир написал: , Непохоже. Там у меня вообще стоит 10 секунд, а данные обновляются НАМНОГО чаще!
Эти секунды берутся, если установлен флаг "Запрашивать данные раз в". Если не установлен, то происходит постоянное получение данных, с учетом минимальной допустимой дискретности.
агрегировать значения из таблицы сделок по временному условию
Пользователь
Сообщений: Регистрация: 27.01.2017
03.03.2021 13:14:28
Время лучше всегда и сравнивать в секундах, переведя его в unix-time, используя os.time. Надо определить переменную, определяющую время 12:00 текущего дня и сравнивать ее с временем таблицы. Условно: os.time(trade.datetime) > time_12
агрегировать значения из таблицы сделок по временному условию
Пользователь
Сообщений: Регистрация: 27.01.2017
03.03.2021 12:17:28
Владимир, неужели Вы думаете, что если бы такое было, то за все время существования языка (с 1993 года) это никто не заметил бы? Такого рода проблема (самопроизвольное магическим образом изменение значения переменной) - это просто крест на языке.
агрегировать значения из таблицы сделок по временному условию
Пользователь
Сообщений: Регистрация: 27.01.2017
03.03.2021 12:08:32
Цитата
Владимир написал: , Да приводил уже, Господи! Почти сразу после моего появления здесь! Когда элемент брался по двойной индексации a=b[i[j]] тип был один, а если заменить на k=i[j];a=b[k] - другой.
Не бывает такого поведения. Если Вы между индексациями таблицы изменение значение переменной к, то язык здесь не виноват. В случае же первого варианта у Вас нет переменной и нет проблемы. Часто такое наблюдается при использовании глобальных переменных, когда к, объявленная в одном месте, перезаписывется в другом.
Индикатор торговой сессии
Пользователь
Сообщений: Регистрация: 27.01.2017
03.03.2021 12:00:00
Свечи могут не поступать. Есть такая ошибка (особенность) у серверной части брокера - последняя цена обновляется, а свечи нет. При этом торговая сессия идет. Смотришь на график, не двигается, а цена последней сделки меняется.
Данные стакана, тоже могут не поступать. При этом еще есть планка, когда нет заявок. Есть предторговый аукцион, когда стакан заполнен, а сессия не идет. Для срочного рынка есть клиринг, когда сессия не идет, а заявки какое-то время еще есть в стакане.
агрегировать значения из таблицы сделок по временному условию
Пользователь
Сообщений: Регистрация: 27.01.2017
03.03.2021 11:49:05
Владимир, я не очень понимаю в чем у Вас проблема с типами. Ее нет. Если Вы записываете в переменную значение другого типа, то это чья проблема? В других языках получите ошибку компиляции, здесь просто следите за руками.
агрегировать значения из таблицы сделок по временному условию
Пользователь
Сообщений: Регистрация: 27.01.2017
03.03.2021 09:54:28
Цитата
Игорь М написал: Да, 2-ой. И у меня 2-ой. Можно с префиксом "0x" поставить для наглядности: bit.band(trade.flags, 0x4). И bit.band в отличие от bit.test число возвращает. Почему bit.test лучше, чем bit.band - готов узнать.
Кроме быстродействия и наглядности никаких.
агрегировать значения из таблицы сделок по временному условию
Пользователь
Сообщений: Регистрация: 27.01.2017
02.03.2021 19:09:22
То что получение данных таблицы сделано разово - это хорошо, т.к. это затратная по памяти функция. А вот то, что функция аггрегирования вызывается несколько раз - это не очень.
Почему не произвести расчет разово, перебрав сделки в одном цикле.
Что касается направления сделки, то если это обычная таблица trades (а не обезличенные сделки), то направление это 2-ой бит флага. И проверять его лучше логически через функцию bit.test, а не сравнивать с десятичным числом.
if bit.test(trade.flag, 2) then ...
Отправка транзакции в сегменте фондового рынка (акции) - брокеры Финам / Сбербанк, какой формат и где брать код клиента?
Пользователь
Сообщений: Регистрация: 27.01.2017
02.03.2021 11:59:47
Никаких проблем с брокером Сбербанк не наблюдается. Формат отправки client_code..'/'..comment
Данный инструмент запрещен для операции шорт
Пользователь
Сообщений: Регистрация: 27.01.2017
23.02.2021 16:15:47
Владимир, разработчики терминала Вам в этом вопросе не помогут.
Перед подачей транзакции Вы можете проверить какое количество доступно для заявки данного направления. Данная ошибка возникает по причине проверки параметров заявки на сервере Брокера. В периоды высокой нагрузки на сервере брокера Вы еще и не такие ошибки будете получать. Допустим, транзакция прошла, Вы видите сделки в таблице сделок, а баланс до сих пор показывает, что бумаги у Вас есть или их нет. Потом и баланс обновится, но задержка может быть существенной.
Индекс формирующегося бара.
Пользователь
Сообщений: Регистрация: 27.01.2017
18.02.2021 10:18:08
Для проигрывания звуковых файлов Вы можете воспользоваться библиотекой w32:
Индекс формирующегося бара.
Пользователь
Сообщений: Регистрация: 27.01.2017
17.02.2021 09:55:35
В данном контексте у нас последний бар = Size. Можно порассуждать о теоретических ситуациях, но зачем.
Я такие задачи предпочитаю решать через замыкание. Но можно, конечно, и переменные создать.
Код
--Общая сумма
local sum = 0
--Сумма текущего бара
local ind_sum = 0
--Последний рассчитанный индекс
local last_index = 0
function OnCalculate(index)
--Рассчет необходимо произвести один раз при появлении нового бара, рассчитав только что завершившийся.
--Если этот код вызывать на каждой сделке, то sum не будет равен сумме объемов баров
if index ~= last_index then
sum = sum + ind_sum
end
if not C(index) then return sum end
ind_sum = 0
if T(index).hour == 9 then
ind_sum = 0
end
if O(index) ~= C(index) then --исключаем пред и пост торговые бары, а также бары без движения.
if O(index) < C(index) then
ind_sum = V(index)
else
ind_sum = -V(index)
end
end
last_index = index
return sum + ind_sum
end
Индекс формирующегося бара.
Пользователь
Сообщений: Регистрация: 27.01.2017
16.02.2021 18:42:49
Так я Вам уже написал:
Так расчет будет только для исторических баров при старте. Текущий бар всегда равен Size, а значит и расчета нет. Когда появится новый бар, он опять равен Size.
Если Вы хотите при поступлении нового бара произвести расчет прошлого бара, то необходимо обеспечить хранение последнего рассчитанного бара он будет равен Size()-1, а при поступлении нового увеличить индекс рассчитанного бара и произвести расчет. Т.о. Вы будете производить расчет последнего закрытого бара.
Индекс формирующегося бара.
Пользователь
Сообщений: Регистрация: 27.01.2017
16.02.2021 18:17:08
Так расчет будет только для исторических баров при старте. Текущий бар всегда равен Size, а значит и расчета нет. Когда появится новый бар, он опять равен Size. Также Вы переменную sum инициализировали где-то? Иначе будет арифметика с nil.
Индекс формирующегося бара.
Пользователь
Сообщений: Регистрация: 27.01.2017
16.02.2021 17:42:56
В Квик нумерация баров идет от 1, в отличии от MT.
Поэтому последний бар равен результату выполнения функции Size(). Она возвращает текущее число баров. Если индекс равен ему, то он последний существующий бар.
Нулевые значения PRICEMIN и PRICEMAX
Пользователь
Сообщений: Регистрация: 27.01.2017
15.02.2021 12:29:45
За это время брокер уже восстановил данные в потоке данных. При этом в какие-то дни наблюдались частично корректные данные. В частности для класcа FQBR (иностранные акции) данные были всегда корректны. Для TQBR данные были заполнены по нескольким инструментам, остальные были пустые. С чем связана такая избирательности не очень понятно.
Странная дата сервера
Пользователь
Сообщений: Регистрация: 27.01.2017
07.02.2021 09:48:30
Цитата
Старатель написал: На рабочем месте, не на сервере.
Не уверен. Разные клиенты.
Странная дата сервера
Пользователь
Сообщений: Регистрация: 27.01.2017
06.02.2021 20:29:16
Опять Финам.
Клиент не хочет отправлять архив рабочего места. Может все же понять, что происходит на сервере брокера.
Определить выбранный язык QUIK из LUA
Пользователь
Сообщений: Регистрация: 27.01.2017
04.02.2021 15:10:02
В голову приходит одно: взять w32 и поискать главное окно. Если найдено на английском, то english. Правда, если несколько терминалов, то уже может быть не вариант.
Нулевые значения PRICEMIN и PRICEMAX
Пользователь
Сообщений: Регистрация: 27.01.2017
04.02.2021 14:20:10
При постановке Лимитной заявки необходимо не выходить за допустимый диапазон цен. Тыкать палочкой (отправить заявку и прочитать ответ) - не вариант, т.к. никто штрафы за превышение числа транзакций не отменял. Поэтому эти параметры критически важны.
Кстати, забыл уточнить, на срочной секции все корректно, параметры заполнены.
Определить выбранный язык QUIK из LUA
Пользователь
Сообщений: Регистрация: 27.01.2017
04.02.2021 13:49:42
Владимир, вот зачем в каждой ветке писать свое мнение... К сведению, от выбора языка интерфейса терминала можно и нужно выводить сообщения, комментарии на разных языках, что вполне естественно.
Нулевые значения PRICEMIN и PRICEMAX
Пользователь
Сообщений: Регистрация: 27.01.2017
04.02.2021 13:42:33
С начала этой недели у брокера Сбербанк данные PRICEMIN, PRICEMAX нулевые. Сам брокер ничего внятного сказать не может.
Определить выбранный язык QUIK из LUA
Пользователь
Сообщений: Регистрация: 27.01.2017
04.02.2021 12:00:57
Если имеется ввиду версия lua, то есть предопределенная глобальная константа _VERSION.
Эвента на изменение таблицы "Клиентский портфель"
Пользователь
Сообщений: Регистрация: 27.01.2017
03.02.2021 20:06:11
Если есть интерфейс у скрипта, ставить задержку меньше 50млс не рекомендуется. А если поставить 0, то по идее влиять не должно, раз у нас много ядер, но Квик все же "висит". Поэтому хоть что-то да лучше поставить.
Эвента на изменение таблицы "Клиентский портфель"
Пользователь
Сообщений: Регистрация: 27.01.2017
03.02.2021 18:30:41
Единый счет - это конструкция, когда данные собираются из разных мест. Вы бы сказали хоть какие изменения должны вызывать событие. Если деньги - это одно. Если позиции по бумагам - это другое. Портфель - слишком общее понятие.
Эвента на изменение таблицы "Клиентский портфель"
Пользователь
Сообщений: Регистрация: 27.01.2017
03.02.2021 17:11:09
Если говорить о доступных call back, то их список описан в документации. Не очень ясно, что требуется. Но можно предположить, что если речь про денежные средства, а не позиции, может подойти: OnMoneyLimit.
Но можете и сами организовать вызов некой функции при изменении данных портфеля, сделав регулярную проверку оного.
Отметки на графике QUIK средствами QLUA
Пользователь
Сообщений: Регистрация: 27.01.2017
03.02.2021 11:14:40
А зачем стирать уже поставленные метки? Можно ведь просто обновить параметры уже установленных.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
02.02.2021 16:05:59
Верну вопрос, т.к. он потерялся за потоком бессмысленных сообщений:
Можно ли утверждать, что время в параметре 'TIME', полученное в колбеке OnParam через getParamEx(class_code, sec_code, 'TIME') не может быть больше чем время последней записи getInfoParam('LASTRECORDTIME')?
PostMessage из LUA
Пользователь
Сообщений: Регистрация: 27.01.2017
02.02.2021 15:31:33
getItem позволяет получать данные только из определенных таблиц и формат ее вызова не такой.
Чтобы получить данные по деньгам, позициям надо обратиться к определенной таблице и просканировать строки, либо использовать специализированные функции для получения денежных лимитов, позиций и т.д., допустим getMoneyEx или getPortfolioInfoEx.
Что происходит утром?
Пользователь
Сообщений: Регистрация: 27.01.2017
01.02.2021 18:17:51
Вам надо уточнить, что Вы подразумеваете под "по новой запускает main". Также не очень понятно работает ли Квик круглосуточно или перезапускается.
main - это точка входа работы скрипта, если эта функция завершит свою работу, то скрипт прекратит выполнение. Поэтому повторный запуск main - это либо новый запуск скрипта, либо у Вас все же организованы циклы ожидания нового дня, где происходят какие-то действия приводящие к очистке переменных. Собственно объявленные Вами переменные могут только Вами и быть переопределены, т.е. тем кодом, что написан.
написал: include файлы и lua54.lib взято с оф. сайта lua.
Не точно, но возможно, вы взяли статическую библиотеку lua54.lib (~300 кб.). Надо использовать библиотеку импорта dll lua54.lib (~30 кб.) с тем, чтобы использовались функции QUIK из его lua54.dll. Либо надо самому создать библиотеку импорта lua54.lib, используя lua54.dll из QUIK.
Возможно. Но, как написал, просто сам собрал.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 27.01.2017
30.01.2021 19:37:04
Пришлось собрать lua, чтобы заработало. Да уж. Опять возникает вопрос: ну почему не 5.4.2, на который уже есть бинарники.
Отладка QUIK 8.11
Пользователь
Сообщений: Регистрация: 27.01.2017
30.01.2021 19:04:25
Ни у кого не было проблем с подключением dll, собранных под 5.4?
Я собрал одну библиотеку, в чистом lua она работает корректно. При подключении к Квик получаю ACCESS VIOLATION.
include файлы и lua54.lib взято с оф. сайта lua. Правда там нет 5.4.1, только 5.4.0 release 2 и 1
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
30.01.2021 10:21:07
Ну Вы же не показываете свой код, почему это должны делать другие.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Приведенный список можно продолжить, но, кому это интересно, может прочесть в файле OS_Quesha.pdf.
Дело в том, что Вы привели пример простого диалога, который очень просто пишется на lua. При этом у меня уже давно написан dsl, где я даже проще чем у вас создаю формы и реакции.
Хотелось бы понять, зачем это для реальной работы. Ведь диалог - это вообще последняя вещь, хоть и важная если пишешь не для себя.
Отладка QUIK 8.12
Пользователь
Сообщений: Регистрация: 27.01.2017
29.01.2021 21:52:30
Проверил подключение библиотек dll на версиях 11, 12 в режиме lua 5.4. Случайно подключил библиотеку для lua 5.3. Квик молча упал. Воспроизводится стабильно.
Вроде как моя ошибка, но хотелось бы наверно, чтобы это не приводило к аварийному падению.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
29.01.2021 21:05:08
Так такая ситуация бывает редко. Иначе бы это было явно видно. Просто когда выходит цена из прошлого, то она зачастую гораздо выше(ниже) текущей. Некоторые алгоритмы анализируют диапазон изменения цены и такие выпады мешают.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
29.01.2021 20:52:44
Владимир, Вы опять за свое.
Колбек OnOParam здесь используется просто как триггер, не более.
Цена берется последняя из параметра LAST в момент срабатывания колбека. Так что это тоже самое, что делаете Вы.
Но вот незадача, последняя цена кривая. Поэтому время и анализируется, чтобы понять почему она кривая. Иначе просто опрашивая цену, получаем ту, что была вчера. Ну так отправил брокер.
неужели OnParam самый быстрый?
Пользователь
Сообщений: Регистрация: 27.01.2017
29.01.2021 19:52:13
Вот сегодня брокер сбербанк выдал такую цену и время по SRH1: price = 26588, time = 184459
Это было примерно в такое время 2021-01-29 16:03:01
Возвращаясь к вопросу - это как понять? Почему время, полученное в колбеке OnParam через getParamEx(class_code, sec_code, 'TIME') - будущее. Хотя, судя по цене, это прошлое. Но т.к. здесь мы имеем только время, то равновероятно прошлое и будущее.
Можно ли утверждать, что время в параметре 'TIME' не может быть больше чем время последней записи getInfoParam('LASTRECORDTIME')? Хотелось бы верить, что хотя бы это выполняется.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
28.01.2021 17:47:18
Так я и спрашиваю какой такой случай требует использование этого продукта. Просто для примера.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 27.01.2017
28.01.2021 15:03:01
Не очень понятно, зачем это здесь, но ладно.
Я уже видел изделие в прошлый раз, на другом ресурсе. Кажется, что кота в мешке лучше не здесь показывать. Тем более с ссылкой на архив непонятного содержания на mail.ru. Код библиотек не проверить, луа код - ... Вы бы хоть абсолютные пути и отладочные выражения убрали из поставки, если это продукт. Лицензия не ясна. Я такое только в виртуалках распаковываю. А уж про запуск на рабочем сервере - даже не обсуждается. Интерфейс на iup уже вызывает вопрос о необходимости даже пробовать.
Что касается простой/сложный робот, то как-то не увидел проблем в написании скрипта с сложным интерфейсом и псевдоасинхронной обработкой очередей событий.
Раз уж Вы разместили это здесь, то хотелось бы увидеть пример применения, где средств lua будет явно недостаточно и необходимо использовать данный продукт.