повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
Пользователь
Сообщений: Регистрация: 22.04.2017
22.04.2017 15:59:28
Есть Таблица текущих торгов и связанный с ней график. На график добавлен индикатор за основу взят пример индикатора ATR. Изменения:
Код
dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua")
inited = false
function Init()
if not inited then
kvLogOpen()
kvLog("ATR Price Init")
func = ATR()
inited = true
end
return #Settings.line
end
function OnDestroy()
if inited then
kvLog("ATR Price OnDestroy")
kvLogClose()
inited = false
end
end
function OnCalculate(Index)
if Index == 1 then kvLog("ATR Price OnCalculate(Index == 1)") end
return func(Index, Settings)
end
Соответственно теряется дескриптор открытого в первый раз файла лога. Как можно этого избежать?
Скрытый текст
Файл kv_log.lua
Код
kvLogFile = nil
kvLogFileCnt = 0
function kvLogOpen()
if kvLogFileCnt == 0 then
kvLogFile = io.open(getWorkingFolder().."\\LuaScripts\\kvLog.log", "a+t")
end
if kvLogFile then
kvLogFileCnt = kvLogFileCnt + 1
end
end
function kvLogClose()
if kvLogFile then
kvLogFileCnt = kvLogFileCnt - 1
if kvLogFileCnt == 0 then
kvLogFile:close()
kvLogFile = nil
end
end
end
function kvLog(s)
if kvLogFile ~= nil then
kvLogFile:write(getInfoParam("LOCALTIME").. " : " .. s .. "\n")
kvLogFile:flush()
end
end
QUIK clients support
Сообщений: Регистрация: 27.01.2015
24.04.2017 11:14:16
Добрый день.
Уточните, какую версию клиентского места QUIK используете? Дело в том, что подобные проблемы ранее возникали, если версия ниже 7.5, то обновитесь до актуальной 7.10.
Пользователь
Сообщений: Регистрация: 22.04.2017
24.04.2017 15:52:58
версия 7.9.1.1 - последняя на серверах Открытие Брокер. Не будет конфликтов если обновлюсь с вашего сайта?
QUIK clients support
Сообщений: Регистрация: 27.01.2015
24.04.2017 18:17:47
Цитата
Владимир Киселев написал: dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua")
Владимир, так как у Вас версия 7.9, то можно пока не обновляться. Пришлите вот этот файл dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua") Мы проверим у себя.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
24.04.2017 18:25:52
Цитата
Egor Zaytsev написал: ело в том, что подобные проблемы ранее возникали, если версия ниже 7.5, то обновитесь до актуальной 7.10.
В 7.10, как и в предыдущих, при смене инструмента скрипт индикатора перечитывается заново. При этом значения всех переменных принимают первоначальные значения. OnDestroy при этом не вызывается.
Надо делать так, как надо. А как не надо - делать не надо.
Egor Zaytsev написал: ело в том, что подобные проблемы ранее возникали, если версия ниже 7.5, то обновитесь до актуальной 7.10.
В 7.10, как и в предыдущих, при смене инструмента скрипт индикатора перечитывается заново. При этом значения всех переменных принимают первоначальные значения. OnDestroy при этом не вызывается.
Здравствуйте!
Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Пользователь
Сообщений: Регистрация: 22.04.2017
25.04.2017 13:56:28
Цитата
Egor Zaytsev написал: Пришлите вот этот файл dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua") Мы проверим у себя.
Его текст в первом сообщении под спойлером (скрытый текст). пока не разобрался как у вас прикреплять файлы.
Egor Zaytsev написал: Пришлите вот этот файл dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua") Мы проверим у себя.
Его текст в первом сообщении под спойлером (скрытый текст). пока не разобрался как у вас прикреплять файлы.
Здравствуйте, Мы зарегистрировали обращение. Как будет результат дадим здесь ответ.
QUIK clients support
Сообщений: Регистрация: 27.01.2015
27.04.2017 15:53:41
Добрый день,
Ошибка, описанная в данном инциденте, будет исправлена в одной из очередных версий программы. Приносим извинения за причиненные неудобства.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
27.04.2017 15:57:45
Что вы признали ошибкой? Обнуление значений переменных?
Надо делать так, как надо. А как не надо - делать не надо.
QUIK clients support
Сообщений: Регистрация: 27.01.2015
28.04.2017 09:49:31
Цитата
Старатель написал: скрипт индикатора перечитывается заново. При этом значения всех переменных принимают первоначальные значения. OnDestroy при этом не вызывается.
Добрый день.
То, что скрипт индикатора перечитывался заново. OnDestroy при этом не вызывался.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
28.04.2017 10:18:31
Цитата
Egor Zaytsev написал: То, что скрипт индикатора перечитывался заново.
В этом есть свой плюс: при изменении кода индикатора не нужно выполнять кучу манипуляций по его удалению и повторному добавлению на график. Достаточно переключить инструмент в режиме связанных окон туда-обратно. А вот обнуление значений переменных - это проблема: теряются хендлеры файлов, меток и пр.
Надо делать так, как надо. А как не надо - делать не надо.
А вот обнуление значений переменных - это проблема: теряются хендлеры файлов, меток и пр.
Об этом и тема, поднятая мной. А ваш плюс?:
Цитата
Старатель написал: В этом есть свой плюс: при изменении кода индикатора не нужно выполнять кучу манипуляций по его удалению и повторному добавлению на график. Достаточно переключить инструмент в режиме связанных окон туда-обратно.
Вы используете Quik для "изменения кода"? или Вы пишите для более удобной работы в Quik?
Пользователь
Сообщений: Регистрация: 22.04.2017
28.04.2017 16:07:33
P.S.: и парный OnDestroy() совсем не мешает
Цитата
Владимир Киселев написал: удалению и повторному добавлению на график
на график
Пользователь
Сообщений: Регистрация: 07.11.2019
12.06.2021 16:37:26
Проблема отсутствия вызова "OnDestroy" при смене инструмента до сих пор актуальна (QUIK 8.13.1.6). Не вызываются даже финализаторы объектов Lua, созданных в контексте предыдущего инструмента. Годы идут, когда ожидать решения проблемы?)
Пользователь
Сообщений: Регистрация: 07.11.2019
12.06.2021 16:44:04
Эти контексты (контексты Lua от предыдущих инструментов на графике) - тупо живые! Я сохранял lua_State* от них и проверял все в OnInit - в этих контекстах тестовые глобальные переменные и их значения сохранены. И финализаторы не вызываются даже при закрытии терминала. Утечка ресурсов в нетривиальном пользовательском индикаторе неизбежна.
QUIK clients support
Сообщений: Регистрация: 27.01.2015
15.06.2021 08:32:43
Добрый день.
К сожалению, на данный момент ошибка действительна не исправлена.
К сожалению, на данный момент ошибка действительна не исправлена.
Будьте любезны, заведите/освежите "тикет", пожалуйста) Вставить вызов пользовательской функции OnDestroy и/или закрыть Lua контекст пользовательского скрипта (для вызова финализаторов) при смене инструмента графика, как это делается при удалении индикатора.
QUIK clients support
Сообщений: Регистрация: 27.01.2015
16.06.2021 10:42:35
Добрый день.
Информация добавлена в обращение.
Пользователь
Сообщений: Регистрация: 20.12.2020
16.06.2021 12:33:45
Извиняюсь, что влезаю в тему, но вроде как это касается обсуждаемого вопроса.
Вызывать OnDestroy() еще и при смене интервала инструмента надо бы, график же меняется. И соответственно, после смены интервала OnInit() заново вызывать.
Собственно, нужно это для того, чтобы скрипт индикатора понимал, что параметры графика изменили, и надо бы пересчитывать весь индикатор заново. Сейчас выкручиваюсь тем, что в OnCalculate(), отслеживаю не изменился ли инструмент или интервал графика, но это как-то "неправильно" по моему.
Пользователь
Сообщений: Регистрация: 04.06.2021
25.06.2021 10:23:27
Здравствуйте BlaZed, Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Пользователь
Сообщений: Регистрация: 30.01.2015
25.06.2021 13:47:38
Цитата
Sergey Hlynovskii написал: Здравствуйте BlaZed , Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Похоже, у каждого вновь прибывшего сотрудникпа Арка свой маленький блокнотик, в который он чирикает пожелалки карандашиком.
в 2013 году Михаил Булычев дважды обещал мне исправить эту проблему - в приватной переписке и на этом форуме тоже.
Потом я поднимал эту тему в ином разрезе. Написал, что в момент смены инструмента на вызывается destroy() уже на этом форуме. Алексей Иванников попросил сделать скрипт и прислать , чтобы "провести исследования". Как понимаю, в надежде, чтобы я отвязался. Я прислал. 6 строчек. После длительных обсуждений и "проверок на непротиворечивость и соответствие политике компании" признали, ну и дальше по тексту, "в одной из следующих версий". В результате потеряли блокнотик, или рыбу завернули неудачно в ту самую страничку.
Сергей Горохов, помнится, тоже поучаствовал, и с его блокнотиком тоже беда приключилась. Или просто карандашик сломался и записать было нечем.
а вы какую рыбу любите, Сергей?
P.S. Номера обращений не нужно спрашивать, поиск по форуму даст все ответы.
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 07.11.2019
05.09.2021 11:34:24
Цитата
Sergey Hlynovskii написал: Здравствуйте BlaZed , Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Какие новости по фиксу бага утечки ресурсов в скрипте индикатора? Вы же как баг это зарегистрировали, не так ли? Рука не поднимается (язык не поворачивается) назвать просьбу исправить такую грубую функциональность "пожеланием".
Пользователь
Сообщений: Регистрация: 25.09.2020
05.09.2021 22:03:10
Анатолий, Я всё-таки пробежался по сообщениям службы техподдержки. Слова "Ваше пожелание зарегистрировано" встречаются более двухсот раз. Слова же "Ваше пожелание было реализовано в версии X.X.X терминала QUIK" встретились лишь 6 раз. Ещё реже встречается "Ваше пожелание учтено и будет внедрено в ближайших версиях" или "Ваше пожелание не реализовано. При его реализации сообщим Вам в этой ветке форума". Иногда встречаются просто шедевры, например: Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам, что реализация пожелания признана потенциально целесообразной. Если по результатам дальнейшего анализа, включающего юридические аспекты, анализ на непротиворечивость с общей политикой компании, никаких возражений не возникнет, мы постараемся включить... Или: С учётом ограниченного трудового ресурса и критичностью стоящих перед нами задач, к сожалению, вопреки Вашим ожиданиям, не представляется возможным сделать "всё и сразу, хорошо и правильно". Мы вынуждены расставлять соответствующие приоритеты, выделяя из них в первую очередь безусловно приоритетные задачи, критичные для всей системы в целом. Последний пример - фрагмент обращения лично ко мне
Ну и, наконец, пост одного из пользователей: Никто не просит вас отчитываться за каждое пожелание, но хотя бы список ближайших внедрений или вообще список, который вы учитываете, можете выложить. В конце концов есть конечный клиент, который написал вам об ошибке или пожелании. Вы присвоили номер, адресно в личном кабинете можно хранить список заявок со статусом и ответами? Это вообще стандартная практика по тех.поддержке по любому проекту. Сейчас все выглядит так, что вы просто делаете отписку в теме в надежде, что она затеряется и забудется за кучей аналогичных и других. А вот это фиг! Как мне здесь объяснили, "Текущая политика компании в отношении работы с клиентскими пожеланиями не предполагает открытого доступа к списку пожеланий и их статусам. В данном вопросе, в обозримой перспективе каких-либо изменений не предвидится".
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
07.09.2021 17:45:23
Цитата
Владимир написал: Я всё-таки пробежался по сообщениям службы техподдержки. Слова же "Ваше пожелание было реализовано в версии X.X.X терминала QUIK" встретились лишь 6 раз.
:
Цитата
Результатов: примерно 53 (0,28 сек.)
Пользователь
Сообщений: Регистрация: 25.09.2020
07.09.2021 18:57:31
swerg, Мне насрать на Гугл. Я пробежался по сообщениям службы техподдержки на форуме "Программирование на языке Lua".
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2025 14:22:10
Судя по всему это так и не будет исправлено. Сейчас при смене инструмента не то что OnDestroy не вызывается, а происходит полная инициализация индикатора заново, т.е. выполняется с тела фала. Это легко можно проверить сделав инициализацию лог файла с отметкой времени в теле скрипта индикатора. И по традиции, при добавлении индикатора на график а также иногда и при смене инструмента, это происходит два раза, первый раз без вызовов Init, второй раз уже с ним. Поэтому лог файл определенный в теле, закроется как мусор, а первый холостой вызов даст еще и холостое создание лог файла.
Спрашивается... Зачем? Почему так до сих пор? Об этом говорили еще в 2016 году.
По этой причине логи в индикаторах очень часто повреждаются, т.к. не закрываются корректно при смене инструмента на графике. Также при смене инструмента на графике происходит перенумерация ранее выведенных меток и это происходит явно параллельно с выполнением индикатора. Поэтому иногда старые метки уже считываются, а иногда нет. И это приводит к невозможности управлением меток на графике, сводя к ограниченному использованию, запрещающему смену инструмента.