Ошибка до сих пор присутствует, но в другом формате. Если закрыть дата сорс для нужного инструмента, то обратно открыть для него же с становкой колбэка не получится.
Уведомление о необходимости обновления торговых терминалов в связи с изменениями на срочном рынке Московской биржи, Список проблем при работе устаревших версий QUIK после обновления торговой системы срочного рынка МБ
Нельзя будет снять заявку так: kill_order(ordnum,ordSECCODE,class) Потому что вот это: ordnum=get_value(get_item("ORDERS",count-gc),"NUMBER") работать НЕ будет.
Вот ввели 19-значные заявки, и тем не менее, у меня такая конструкция работает, и потом этот ordnum можно отправить в транзакцию снятия заявки.
Главное, не преобразовывать эту переменную в число, иначе она почему-то становится немного отличающейся от исходной (плюс-минус 100).
Да, Арка облажалась. Столько готовилась, и при релизе не учла. Сейчас крови будет море, те кто использовал это как номера в скриптах, получат "массу" приятного.
Жаль. У меня тоже есть дллки без прилинкованного луа и даже без сишного рантайма. Я их всех тут перепробовал по тридцать раз в 8.6 после вашего сообщения и ничего такого не обнаружил. Поэтому хотелось понять, как вы такого эффекта добились.
От Квик никто не ответил. Я склоняюсь, что это моя ошибка где-то. Не хочу теребить о несуществующих проблемах разрабов. Если будет кто-то еще со схожей проблемой, я попробую что-то нарыть.
timber написал: Нет, я только скомпилировал с хидером, чтобы отойти от меняющихся наборов функций.
Как вы это сделали? Если заинклюдить lua.h и потом вызвать хоть одну функцию из него, не линкуясь с lua53.lib, линкер скажет unresolved external. Значит, вы объявляете указатели на луа-функции и потом их инициализируете ручками через GetProcAddress, верно? И откуда берете хэндл lua53.dll? Через GetModuleHandle("lua53.dll"), так? И на этом этапе получаете периодически NULL, так? Или иначе как-то?
Спасибо за информацию и расвитие кругозора. Может быть у меня ошибка, может быть в Квик. Не знаю, надо долго разбираться. В итоге я забиваю на проблему. Оно работает, в принципе. И мне этого достаточно. Будет дискомфорт продолжу. Или программисты Арки что-то сами найдут.
timber написал: Это же динамическая библиотека, и мой скрипт загружается в процесс как и эта dll. А скрипт написан на C и слинкован с хидером. Раньше были экспортные функции, но решил, что хидер надежнее.
Не понял. Вы включили lua.h, но не линковали с lua53.lib, так? Тогда это ваша задача, искать или загружать lua53.dll и тащить из нее функции через GetProcAddress, хидер сам по себе ничего такого не делает.
Цитата
timber написал: А проблема в том, что иногда при старте скрипта пишется ошибка что lua53.dll не найдена (видимо еще не загружена в процесс). А если закрыть окно с управлением скриптов и открыть, и еще раз запустиь - магически dll уже будет находится.
Этого не может быть, потому что не может быть никогда (про не загружена в процесс). Это раньше была заглушка lua5.1.dll и весь луа по факту сидел в qlua.dll, теперь все иначе, весь луа в lua53.dll находится, и если квик вообще смог ваш скрипт запустить, это стопроцентно означает, что lua53.dll уже загружена и должна находиться через GetModuleHandle.
Мысль пришла - вы, часом, весь луа в своей длл не продублировали?
1) Я и делаю через GetProcAddress 2) Я новый код уже перекомпилировал под qlua.dll обратно и пробую на 8.2. Работает как часы. Думаю, что глюка у Арки. В добаков в 8.5, 8.6 так же работает, но со второй попытки. Думается, ребята что-то перемудрили.
Нет, я только скомпилировал с хидером, чтобы отойти от меняющихся наборов функций.
Непонятно, об чем речь. Если о qlua.dll, то при старте загружается, если ее убрать, квик стартанет без пункта меню с луа-скриптами и ничего запустить в принципе не получится. Если о lua53.dll, то в любом случае ДО запуска вашего скрипта, опять же скрипт физически невозможно запустить без нее. Если о какой-то своей подгружаемой длл, то она грузится явно вызовом package.loadlib и на нее действует обычное правило сборки мусора, то есть если она из области видимости вышла и никаких ссылок на нее не осталось (вроде глобальных функций из нее), то будет выгружена. Видимо, вот этот последний вариант и имеется в виду, тогда смотрите, каким образом теряете все ссылки на длл.
Это же динамическая библиотека, и мой скрипт загружается в процесс как и эта dll. А скрипт написан на C и слинкован с хидером. Раньше были экспортные функции, но решил, что хидер надежнее. Это вкратце, как сделано.
А проблема в том, что иногда при старте скрипта пишется ошибка что lua53.dll не найдена (видимо еще не загружена в процесс). А если закрыть окно с управлением скриптов и открыть, и еще раз запустиь - магически dll уже будет находится.
Подозреваю, что lua53 не грузится на старте. Поэтому и глюк такой. А скрипт у меня не тянет их dll, так как скомпилирован с хидером.
Перемудрили они видимо с lua53. Заглушка эта не используется самим терминалом. Поэтому скрипты могут попадать на такие пакости.
В состав предлагаемой нами библиотеки lua53.dll данный макрос добавлен не был. При необходимости использовать функционал lua.5.1 - Вы можете самостоятельно добавить такой макрос в ваш скрипт/программу, либо использовать какой-либо иной подход, с использованием стандартных функций lua5.3.
Функции lua_remove не было и нет в функционале QLUA. В LUA5.1 и LUA5.3, используемых в терминале до версии 8.5 и начиная с версии 8.5 - данная функция также присутствует.
Просьба уточнить, на основании чего возник такой вопрос?
В том, что выдает ошибку теперь, что не найдена функция.
Я не знал, что у вас не оригинальный LUA. Глянул в вашу dll в дистрибутиве с вашего сайта. Нет такой функции в вашей dll.
lua53 - там нет. lua5.1 - еще есть.
Функция из спецификации LUA языка. Вы зачем ее удалили?
Функции lua_remove не было и нет в функционале QLUA. В LUA5.1 и LUA5.3, используемых в терминале до версии 8.5 и начиная с версии 8.5 - данная функция также присутствует.
Просьба уточнить, на основании чего возник такой вопрос?
В том, что выдает ошибку теперь, что не найдена функция.
Я не знал, что у вас не оригинальный LUA. Глянул в вашу dll в дистрибутиве с вашего сайта. Нет такой функции в вашей dll.
timber написал: )) Смешно. Ну скажите тогда, как при этом неудобстве через LUA понимать какой лимит пришел?
Что именно смешно? Если Вы хотите конструктивный диалог, извольте говорить предметно. И что именно в LUA Вам мешает проверить лимит? Или Вам в принципе не понятно зачем нужен Тх лимит?
Куда уж конструктивнее? Написал сразу - нужна информация по лимитам. Работаю через LUA. Согласно вашей (не брокера) документации определением позиции идет по коду инструмента и типу лимита. Вот с последним беда. Не может он правильно определить, потому что он дублируется для разных типов лимитов. Я про числовое значение. А строковое у вас не получить через LUA. Виноваты разумеется все (брокер, мы-трейдеры), кроме вас.
Т.е. проблема в том что для Тх лимита параметр limit_kind равен 0? Простите но из Вашего первоначального обращения это не очевидно. Естественно такой проблемы не должно быть, для Тх лимитов limit_kind должен быть равен 365. ниже скриншот доказывающий что это так:
От Вас нужен пример кода на котором воспроизводится проблема и уточните версию терминала.
у вас на картинке T365. А у брокер Tx. И в документации так же.
timber написал: )) Смешно. Ну скажите тогда, как при этом неудобстве через LUA понимать какой лимит пришел?
Что именно смешно? Если Вы хотите конструктивный диалог, извольте говорить предметно. И что именно в LUA Вам мешает проверить лимит? Или Вам в принципе не понятно зачем нужен Тх лимит?
Куда уж конструктивнее? Написал сразу - нужна информация по лимитам. Работаю через LUA. Согласно вашей (не брокера) документации определением позиции идет по коду инструмента и типу лимита. Вот с последним беда. Не может он правильно определить, потому что он дублируется для разных типов лимитов. Я про числовое значение. А строковое у вас не получить через LUA. Виноваты разумеется все (брокер, мы-трейдеры), кроме вас.
timber написал: Визуально строчки располагаются отдельно.
При чем тут это?
При том, что значение числовым образом одинаковое. Не должно ли быть слияние строчек в этом случае.
Нормальный софт должен иметь проверку на дурака, и не дать вводить одинаковые значения для разных лимитов. Но так как мы имеем дело с Квик, тут всякое возможно :-) Поэтому лишний раз уточняю.
kroki написал: В каких реальных случаях вызываются OnDepoLimitDelete(), OnMoneyLimitDelete(), OnFuturesLimitDelete() (первые два для limit_kind >= 0, внутренние не особо интересны)? Кто-нибудь встречал эти вызовы в реале?
Они вызываются когда брокер удаляет лимит. Необходимость удалить лимит возникает в случае если его неправильно задали, а это к счастью происходит крайне редко.
Цитата
kroki написал: Кстати, а зачем вызываются ползовательские callbacks с limit_kind < 0? Какие осмысленные действия он бы мог сделать (хотя бы в теории)?
Лимиты с limit_kind < 0 являются техническими и действительно для конечного пользователя не несут смысла. Но тем не менее они есть и по этому колбеки срабатывают.
Мое предположение, что метод CreateDataSource обращается к тем же данным, что и колбэк (раз он умеет сразу получать инфомацию о количество записей). Тут и происходит дедлок, по всей видимости, что приводит к зависанию программы. Итого, имеет два потока. Один пытается подписаться на данный. Другой пытается обработать новые данные. Так как первый поток лезет еще и к самим данным, то это приводит к зависанию.
Sergey Gorokhov написал: Здравствуйте, Такое может быть, если в каком-либо колбеке происходит зависание. Например если в колбеке, используется какой-либо тяжелый цикл. Или если выход из колбека предусмотрен только когда в другом колбеке что-то произойдет. Или вовсе это бесконечный цикл. Нельзя такого допускать, все подобные вещи должны быть в main() В любом случае, гадать не лучший вариант для решения проблемы. Если требуется точный диагноз, необходимо предоставить полную версию кода скрипта.
Все проще. Удалены все колбэки. Идет циклом подписка на данные. Если в середине цикла хотя бы одна подписка выдает ошибку, то все зависает.
Периодически Квик висит если делать подписку сразу на несколько инструментов. Скрипт пишет ошибку подписки на данные, и затем висит намертво программа. При этом висит только сам Квик. Скрипт продолжает работать и даже торгует.
function OnParam(class, sec) if class == "INDX" and sec == "RTSSTD" then local h = tonumber(getParamEx("INDX", "RTSSTD", "HIGHVAL").param_value); local l = tonumber(getParamEx("INDX", "RTSSTD", "LOWVAL").param_value);
27-7-2017 12:12:32.567 H = 0 27-7-2017 12:12:32.567 L = 0 27-7-2017 12:12:33.556 H = 0 27-7-2017 12:12:33.557 L = 0 27-7-2017 12:12:34.428 H = 0 27-7-2017 12:12:34.428 L = 0 27-7-2017 12:12:36.9 H = 0 27-7-2017 12:12:36.9 L = 0 27-7-2017 12:12:39.794 H = 0 27-7-2017 12:12:39.794 L = 0 27-7-2017 12:12:45.805 H = 0 27-7-2017 12:12:45.805 L = 0 27-7-2017 12:12:46.909 H = 0 27-7-2017 12:12:46.909 L = 0 27-7-2017 12:12:48.79 H = 0
timber написал: Хочу написать на Си код вызова CreateDataSource. Скажите, какие числовые значения принимает параметр interval?
message(tostring(INTERVAL_M1))
1. А это разве строка? В документации написано, что NUMBER. Я думал, что это число. 2. Могли бы вы помочь выветси это значение? С Луа практически не знаком, я ради этого числа особого смысла нет начинать. Заранее благодарю.
Еще раз прочитал документацию и понял, что не взлетит.
Обработчики принимают только индекс, без указания источника. Тоесть одновременный запрос нескольких инструментов невозможен.
timber написал: Хочу написать на Си код вызова CreateDataSource. Скажите, какие числовые значения принимает параметр interval?
message(tostring(INTERVAL_M1))
1. А это разве строка? В документации написано, что NUMBER. Я думал, что это число. 2. Могли бы вы помочь выветси это значение? С Луа практически не знаком, я ради этого числа особого смысла нет начинать. Заранее благодарю.
Для транзакций, поле ACCOUNT + CLIENT_CODE. Как получить этот список средствами Луа. До этого всегда использовал хардкод, но хочу понять как это лучше сделать.
Сейчас в этот параметр не передается то, что изменилось. Поэтому из-за большого количества полей скрипт создает нагрузку при вызое getParamEx. Можно ли туда передавать как-то список изменений, что действительно поменялось.