повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
Есть Таблица текущих торгов и связанный с ней график. На график добавлен индикатор за основу взят пример индикатора 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 используете? Дело в том, что подобные проблемы ранее возникали, если версия ниже 7.5, то обновитесь до актуальной 7.10.
Владимир Киселев написал: dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua")
Владимир, так как у Вас версия 7.9, то можно пока не обновляться. Пришлите вот этот файл dofile(getWorkingFolder().."\\LuaScripts\\kv_log.lua") Мы проверим у себя.
Egor Zaytsev написал: ело в том, что подобные проблемы ранее возникали, если версия ниже 7.5, то обновитесь до актуальной 7.10.
В 7.10, как и в предыдущих, при смене инструмента скрипт индикатора перечитывается заново. При этом значения всех переменных принимают первоначальные значения. OnDestroy при этом не вызывается.
Надо делать так, как надо. А как не надо - делать не надо.
Egor Zaytsev написал: ело в том, что подобные проблемы ранее возникали, если версия ниже 7.5, то обновитесь до актуальной 7.10.
В 7.10, как и в предыдущих, при смене инструмента скрипт индикатора перечитывается заново. При этом значения всех переменных принимают первоначальные значения. OnDestroy при этом не вызывается.
Здравствуйте!
Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Старатель написал: скрипт индикатора перечитывается заново. При этом значения всех переменных принимают первоначальные значения. OnDestroy при этом не вызывается.
Добрый день.
То, что скрипт индикатора перечитывался заново. OnDestroy при этом не вызывался.
Egor Zaytsev написал: То, что скрипт индикатора перечитывался заново.
В этом есть свой плюс: при изменении кода индикатора не нужно выполнять кучу манипуляций по его удалению и повторному добавлению на график. Достаточно переключить инструмент в режиме связанных окон туда-обратно. А вот обнуление значений переменных - это проблема: теряются хендлеры файлов, меток и пр.
Надо делать так, как надо. А как не надо - делать не надо.
А вот обнуление значений переменных - это проблема: теряются хендлеры файлов, меток и пр.
Об этом и тема, поднятая мной. А ваш плюс?:
Цитата
Старатель написал: В этом есть свой плюс: при изменении кода индикатора не нужно выполнять кучу манипуляций по его удалению и повторному добавлению на график. Достаточно переключить инструмент в режиме связанных окон туда-обратно.
Вы используете Quik для "изменения кода"? или Вы пишите для более удобной работы в Quik?
Проблема отсутствия вызова "OnDestroy" при смене инструмента до сих пор актуальна (QUIK 8.13.1.6). Не вызываются даже финализаторы объектов Lua, созданных в контексте предыдущего инструмента. Годы идут, когда ожидать решения проблемы?)
Эти контексты (контексты Lua от предыдущих инструментов на графике) - тупо живые! Я сохранял lua_State* от них и проверял все в OnInit - в этих контекстах тестовые глобальные переменные и их значения сохранены. И финализаторы не вызываются даже при закрытии терминала. Утечка ресурсов в нетривиальном пользовательском индикаторе неизбежна.
К сожалению, на данный момент ошибка действительна не исправлена.
Будьте любезны, заведите/освежите "тикет", пожалуйста) Вставить вызов пользовательской функции OnDestroy и/или закрыть Lua контекст пользовательского скрипта (для вызова финализаторов) при смене инструмента графика, как это делается при удалении индикатора.
Извиняюсь, что влезаю в тему, но вроде как это касается обсуждаемого вопроса.
Вызывать OnDestroy() еще и при смене интервала инструмента надо бы, график же меняется. И соответственно, после смены интервала OnInit() заново вызывать.
Собственно, нужно это для того, чтобы скрипт индикатора понимал, что параметры графика изменили, и надо бы пересчитывать весь индикатор заново. Сейчас выкручиваюсь тем, что в OnCalculate(), отслеживаю не изменился ли инструмент или интервал графика, но это как-то "неправильно" по моему.
Здравствуйте BlaZed, Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Sergey Hlynovskii написал: Здравствуйте BlaZed , Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Похоже, у каждого вновь прибывшего сотрудникпа Арка свой маленький блокнотик, в который он чирикает пожелалки карандашиком.
в 2013 году Михаил Булычев дважды обещал мне исправить эту проблему - в приватной переписке и на этом форуме тоже.
Потом я поднимал эту тему в ином разрезе. Написал, что в момент смены инструмента на вызывается destroy() уже на этом форуме. Алексей Иванников попросил сделать скрипт и прислать , чтобы "провести исследования". Как понимаю, в надежде, чтобы я отвязался. Я прислал. 6 строчек. После длительных обсуждений и "проверок на непротиворечивость и соответствие политике компании" признали, ну и дальше по тексту, "в одной из следующих версий". В результате потеряли блокнотик, или рыбу завернули неудачно в ту самую страничку.
Сергей Горохов, помнится, тоже поучаствовал, и с его блокнотиком тоже беда приключилась. Или просто карандашик сломался и записать было нечем.
а вы какую рыбу любите, Сергей?
P.S. Номера обращений не нужно спрашивать, поиск по форуму даст все ответы.
Sergey Hlynovskii написал: Здравствуйте BlaZed , Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Какие новости по фиксу бага утечки ресурсов в скрипте индикатора? Вы же как баг это зарегистрировали, не так ли? Рука не поднимается (язык не поворачивается) назвать просьбу исправить такую грубую функциональность "пожеланием".
Анатолий, Я всё-таки пробежался по сообщениям службы техподдержки. Слова "Ваше пожелание зарегистрировано" встречаются более двухсот раз. Слова же "Ваше пожелание было реализовано в версии X.X.X терминала QUIK" встретились лишь 6 раз. Ещё реже встречается "Ваше пожелание учтено и будет внедрено в ближайших версиях" или "Ваше пожелание не реализовано. При его реализации сообщим Вам в этой ветке форума". Иногда встречаются просто шедевры, например: Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам, что реализация пожелания признана потенциально целесообразной. Если по результатам дальнейшего анализа, включающего юридические аспекты, анализ на непротиворечивость с общей политикой компании, никаких возражений не возникнет, мы постараемся включить... Или: С учётом ограниченного трудового ресурса и критичностью стоящих перед нами задач, к сожалению, вопреки Вашим ожиданиям, не представляется возможным сделать "всё и сразу, хорошо и правильно". Мы вынуждены расставлять соответствующие приоритеты, выделяя из них в первую очередь безусловно приоритетные задачи, критичные для всей системы в целом. Последний пример - фрагмент обращения лично ко мне
Ну и, наконец, пост одного из пользователей: Никто не просит вас отчитываться за каждое пожелание, но хотя бы список ближайших внедрений или вообще список, который вы учитываете, можете выложить. В конце концов есть конечный клиент, который написал вам об ошибке или пожелании. Вы присвоили номер, адресно в личном кабинете можно хранить список заявок со статусом и ответами? Это вообще стандартная практика по тех.поддержке по любому проекту. Сейчас все выглядит так, что вы просто делаете отписку в теме в надежде, что она затеряется и забудется за кучей аналогичных и других. А вот это фиг! Как мне здесь объяснили, "Текущая политика компании в отношении работы с клиентскими пожеланиями не предполагает открытого доступа к списку пожеланий и их статусам. В данном вопросе, в обозримой перспективе каких-либо изменений не предвидится".
Владимир написал: Я всё-таки пробежался по сообщениям службы техподдержки. Слова же "Ваше пожелание было реализовано в версии X.X.X терминала QUIK" встретились лишь 6 раз.