Бес Паники (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
nikolz написал:
Задача смены лог файла при смене инструмента решается другим способом.
Конечно решается. И решена (вариант решения есть и в тексте предыдущего сообщения). Это просто пример/иллюстрация невозможности освободить ресурсы, когда индикатор фактически больше не работает, "ожидая" закрытия окна.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Oleg Kuzembaev написал:
Добрый день.

Не могли бы вы, пожалуйста, прислать на нашу почту  quiksupport@arqatech.com  часть или весь скрипт, в котором представлена описываемая процедура, а также описание и/или скриншоты с ошибкой возникающей в процессе?  

На почту присылать так себе идея, скрипт многомодульный, индикаторы увязаны с торговыми скриптами и имеют общие библиотеки/компоненты.
Там суть проблемы просто потеряется.

Подготовил простейший пример, когда требуется сохранить лог и от предыдущего исполняемого экземпляра скрипта индикатора и новому экземпляру тоже дать возможность вести лог. Для этого достаточно (казалось бы) переименовать старый лог-файл при открытии нового. НО!!! для этого, как минимум, нужно старый лог закрыть. И вот это как раз недоступно. Закрывать же каждый раз при записи очередной строки в лог (и соответственно открывать тоже) - совсем не вариант, так как логи бывают огромные и время выполнения логирования часто критично.
Код
Settings = {
   Name = 'Test',
   line = {
      {
         Name = 'Test',
         Color = RGB(255, 255, 0),
         Type = TYPE_LINE,
         Width = 1
      }
   }
}


oldLogFilePath = 'test_.log'
logFilePath = 'test.log'
logFile = nil


function Init()
   return #(Settings.line)
end


function OnDestroy()
   io.close(logFile)
end


function OnCalculate(ci)

   if logFile == nil then
      if FileExists(logFilePath) then
         
         if FileExists(oldLogFilePath) then
            os.remove(oldLogFilePath)
         end
         
         local renRes, renErr = os.rename(logFilePath, oldLogFilePath)
         if not renRes then
            message(renErr)
         end
         
      end
      logFile = io.open(logFilePath, 'w')
   end

   Log(tostring(ci))
   return ci
   
end


function Log(txt) 
   if logFile ~= nil then 
      logFile:write(txt, '\n')
   end
end


function FileExists(path)
   local f = io.open(path, "r")
   if f ~= nil then 
      io.close(f) 
      return true 
   else 
      return false 
   end
end

В данном примере, если бы OnDestroy() срабатывал, пусть даже не сразу (не проблема сделать пачку логов, выдавая имена по кругу) то все файлы в итоге были бы закрыты, а так, по факту, OnDestroy() похоже срабатывает только при закрытии приложения, возможно при закрытии окна графика (давно разбирался, уже не помню, когда срабатывает, зато ясно что при смене инструмента НЕ срабатывает). Проблема резко усугубляется, если индикатор не один, инструментов десятки, и графиков с индикаторами тоже далеко не один. И логирование - только одна из задач, когда нужно держать файл открытым пока выполняется скрипт.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Уважаемая поддержка QUIK,
проблема, указанная в этом топике (отсутствие срабатывания OnDestroy() в индикаторах при смене инструмента) действительно не всегда решается контролем индекса свечи. Некоторые операция нужно выполнять именно по OnDestroy(). Например - закрывать файлы, которые открывает скрипт индикатора в процессе работы (так как объекты/таблицы/указатели/хэндлы доступны только в том экземпляре скрипта, который их открыл, не говоря уже о том, что закрывать из другого экземпляра - это мега-костыль само по себе). Иногда файлы перестают открываться вообще, если много раз менять инструменты. Помогает только перезапуск QUIK. Пожалуйста, реализуйте вызов OnDestroy(), чтобы можно было хотя бы очистить память и закрыть файлы, чтобы не копить в приложении выделенную память и хэнлы открытых файлов. Это не просто хотелка, это ошибка приложения QUIK.
Страницы: 1
Наверх