ошибка в использовании io

Страницы: 1
RSS
ошибка в использовании io, вопрос по синтаксису
 
Создал скрипт (по аналогии с тремя экранами Элдера) и в нем пишу лог.
Код
f = nil            --указатель на файл лога
MA = 0
sec_code = "SRH3"
function main()
    while is_run do
        if IsWindowClosed(t) then
            is_run=false
            return        
        end 
        exMA()
        f, error_desc   = io.open(getScriptPath() .. "\\M15_".. sec_code ..".log", "a")
        if not f then 
      message("Ошибка получения файла лога:" .. error_desc)
   else
      writeToLog("MA" .. tostring(MA))
   end
        sleep(50) 
   end
end

function writeToLog(proc_name)
    f:write(os.date() .. " ".. proc_name .. "\n")
    f:flush()
end
работает. делаю копию скрипта. меняю тикер на SRM3 запускаю скрипт и падает квик с ошибкой.
D:\LUA\M15_SRM.lua:524: attempt to index a nil value (global 'f')причем файл создается.
делаю третий файл с тикером RIH3. запускаю SRH3 - работает, запускаю RIH3 - работает. запускаю SRM3 - падает.
открываю снова терминал. закрываю все скрипты. запускаю SRM3 - работает. запускаю SRH3 - работет. запускаю RIH3 - работает.
с правами на папку со скриптами и логами все в порядке.

что за пролтергейст какой-то.
 
Цитата
Eldar написал:
Создал скрипт (по аналогии с тремя экранами Элдера) и в нем пишу лог.
Код
  f  =   nil              --указатель на файл лога 
MA  =   0 
sec_code  =   "SRH3" 
 function   main ()
     while  is_run  do 
         if   IsWindowClosed (t)  then 
            is_run =  false 
             return         
         end  
        exMA()
        f, error_desc    =   io.open ( getScriptPath ()  ..   "\\M15_"  ..  sec_code  .. ".log",  "a" )
         if   not  f  then  
       message ( "Ошибка получения файла лога:"   ..  error_desc)
    else 
      writeToLog( "MA"   ..  tostring(MA))
    end 
         sleep ( 50 ) 
    end 
 end 

 function   writeToLog (proc_name)
    f:write( os.date ()  ..   " "  ..  proc_name  ..   "\n" )
    f:flush()
 end 
  
работает. делаю копию скрипта. меняю тикер на SRM3 запускаю скрипт и падает квик с ошибкой.
D:\LUA\M15_SRM.lua:524: attempt to index a nil value (global 'f')причем файл создается.
делаю третий файл с тикером RIH3. запускаю SRH3 - работает, запускаю RIH3 - работает. запускаю SRM3 - падает.
открываю снова терминал. закрываю все скрипты. запускаю SRM3 - работает. запускаю SRH3 - работет. запускаю RIH3 - работает.
с правами на папку со скриптами и логами все в порядке.

что за пролтергейст какой-то.
У вас файл открывается в цикле много раз.
Либо закрывайте его каждый раз, либо откройте один раз.
 
Цитата
nikolz написал:
Цитата
Eldar написал:
Создал скрипт (по аналогии с тремя экранами Элдера) и в нем пишу лог.  
Код
    f   =     nil                --указатель на файл лога  
MA   =     0  
sec_code   =     "SRH3"  
  function    main ()
      while   is_run   do  
          if     IsWindowClosed  (t)   then  
            is_run  =    false  
              return          
          end   
        exMA()
        f, error_desc     =    io.open (  getScriptPath  ()   ..     "\\M15_"    ..   sec_code   ..   ".log" ,  "a" )
          if     not   f   then   
        message  (  "Ошибка получения файла лога:"     ..   error_desc)
     else  
      writeToLog(  "MA"     ..   tostring(MA))
     end  
          sleep  (  50  ) 
     end  
  end  

  function    writeToLog (proc_name)
    f:write( os.date ()   ..     " "    ..   proc_name   ..     "\n"  )
    f:flush()
  end  
    
 работает. делаю копию скрипта. меняю тикер на SRM3 запускаю скрипт и падает квик с ошибкой.
D:\LUA\M15_SRM.lua:524: attempt to index a nil value (global 'f')причем файл создается.
делаю третий файл с тикером RIH3. запускаю SRH3 - работает, запускаю RIH3 - работает. запускаю SRM3 - падает.
открываю снова терминал. закрываю все скрипты. запускаю SRM3 - работает. запускаю SRH3 - работет. запускаю RIH3 - работает.
с правами на папку со скриптами и логами все в порядке.

что за пролтергейст какой-то.
У вас файл открывается в цикле много раз.
Либо закрывайте его каждый раз, либо откройте один раз.
пардон. не так написал. кода много, писал пример. .

Код
f, error_desc   = io.open(getScriptPath() .. "\\M15_".. sec_code ..".log", "a")
        if not f then 
      message("Ошибка получения файла лога:" .. error_desc)
   else
      writeToLog("MA" .. tostring(MA))
   end

данный кусок кода присутствует только в function OnInit(quik_path).
 
Цитата
Eldar
Код
  f, error_desc    =   io.open ( getScriptPath ()  ..   "\\M15_"  ..  sec_code  .. ".log",  "a" )
         if   not  f  then  
       message ( "Ошибка получения файла лога:"   ..  error_desc)
    else 
      writeToLog( "MA"   ..  tostring(MA))
    end   

данный кусок кода присутствует только в function OnInit(quik_path).
Для начала попробуйте заменить функцию getScriptPath () на явный путь. Т е напишите имя файла путь и тип файла одной строкой  например   "D:/test.log"
 
Файл может быть не доступен для записи (права доступа, заблокирован другим процессом).
Также может быть включен Контролируемый доступ к папкам Windows.
 
Цитата
Nikolay написал:
Файл может быть не доступен для записи (права доступа, заблокирован другим процессом).
Также может быть включен Контролируемый доступ к папкам Windows.

как я написал в первом сообщении - права на данную папку полные. Контролируемый доступ
Срабатывает только в одном скрипте. Попробую переименовать переменные. Может в какой-то момент пересекутся константы скриптов и второй скрипт пытается открыть файл первого?!
 
Цитата
nikolz написал:
Цитата
Eldar
 
Код
    f, error_desc     =    io.open (  getScriptPath  ()   ..     "\\M15_"    ..   sec_code   ..   ".log" ,  "a" )
          if     not   f   then   
        message  (  "Ошибка получения файла лога:"     ..   error_desc)
     else  
      writeToLog(  "MA"     ..   tostring(MA))
     end      
 
данный кусок кода присутствует только в function OnInit(quik_path).
Для начала попробуйте заменить функцию getScriptPath () на явный путь. Т е напишите имя файла путь и тип файла одной строкой  например   "D:/test.log"
функция getScriptPath() неправильно работает? Выведу отладочную информацию по путям.
от функции не хочу отказываться, так как в скриптах задействован механизм "версионнойсти". Раскладываю по папкам разные даты и версии.  
 
Eldar,  getScriptPath() прекрасно работает - одна из немногих функций, которая ни разу не была замечена в глюках. Скорее всего, ошибка где-то в Вашем коде.
 
Цитата
Владимир написал:
Eldar,  getScriptPath() прекрасно работает - одна из немногих функций, которая ни разу не была замечена в глюках. Скорее всего, ошибка где-то в Вашем коде.
да. данная функция работает хорошо. отладочная информация в порядке.
код примитивный.но падает именно на этой строке "file_log:write(os.date() .. " ".. proc_name .. "\n")"
 
Цитата
Владимир написал:
Eldar,  getScriptPath() прекрасно работает - одна из немногих функций, которая ни разу не была замечена в глюках. Скорее всего, ошибка где-то в Вашем коде.
причем с файлом лога проблем нет. я в него захожу, меняю символ и сохраняю. открываю терминал и скрипт падает.

код без математики

Код
--константы
ds = {} --таблица datasource по инструментам
--переменные скрипта
is_run = true      --Режим работы скрипта, работает или остановлен
shares = {}      --Список акций
shares_count = 0   --Количество акций
SEC_PRICE_STEP=0 --шаг цены
t = nil   --Данные для визуальной таблицы
sec_code = "CRH3"
class_code = "SPBFUT"
QUANTITY = 1
MAX_QUANTITY = 1 --максимальное количество дозакупки


file_log = nul         --указатель на файл лога
count_error = 0    --количество ошибок

--Дополнительый поток
function main()
   while is_run do
      if IsWindowClosed(t) then
         is_run=false
         return        
      end   
      sleep(50)
   end
end

event_table = {
        [QTABLE_LBUTTONDBLCLK] = "Левый даблклик",
        [QTABLE_RBUTTONDBLCLK]  = "Правый даблклик",        
        [QTABLE_CLOSE] = "Закрыли таблицу"
        }

-- колбек на изменение данных. расчитывает в текущей свече данные ЕМА и показывает в таблице.
function collback_H1( index )
end


--События основного потока
function OnInit(quik_path)
   --Создаем структуру, описывающую таблицу
   t = AllocTable()

   --столбцы
   CreateWindow(t)
   SetWindowPos(t, 200, 200, 600, 110)
   SetTableNotificationCallback(t, table_str)
   

      InsertRow(t, -1)
      InsertRow(t, -1)
      InsertRow(t, -1)

    
-- заполняем таблицу используя сортировку по ключам
   SetCell(t, 2, 1, tostring(sec_code))

   SetCell(t, 3, 9, tostring(currentprice))
   SERVERTIME = getInfoParam("SERVERTIME")
   file_log, error_desc   = io.open(getScriptPath() .. "\\M15_".. sec_code ..".log", "a")
   if not file_log then 
      message("Ошибка получения файла лога:" .. error_desc)
   else
      writeToLog("OnInit")
      writeToLog(SERVERTIME)
   end
end

function OnStop()
   is_run = false
   DestroyTable(t)
   writeToLog("OnStop")   
end

--служебные функции
function quantity_total() --подсчет количество позиций
end

function price_total() --цена позиции
end

function table_str(t_id, msg, par1, par2)
   --par1 номер строки. par2 номер колонки
   if msg == QTABLE_CLOSE then 
      is_run=false
      return
   elseif (par1 == 3) and (par2 == 9) and (msg == QTABLE_LBUTTONDBLCLK) then
      
   end
end


function apply_scale(value) --округляем до шага цены
   return math.floor((tonumber(value) or 0)/SEC_PRICE_STEP+0.5)*SEC_PRICE_STEP
end

function format_scale(value, scale)
    return string.format("%."..scale .."f", tonumber(value) or 0)
end

function writeToLog(proc_name)
    file_log:write(os.date() .. " ".. proc_name .. "\n")
    file_log:flush()
end
 
может проблема с количеством открытия файлов?
у меня 3 индикатора сохраняют свои данные в SqlLite3. и еще 4 скрипта с указанным кодом сохраняют логи. вот как раз с 4ым и падает. теперь в другом скрипте.

эти четыре скрипта ОДИНАКОВЫЕ. там разница только в тикерах (Сбер 2 контракта, РИ, СИ). хотел в одном скрипте все указать, но пока идет отладка 4 разные делаю.
 
Eldar, Ни с файлом лога проблем нет - он у меня открывается в режиме дописывания и работает месяцами, ни с файлом портфеля - он перезаписывается каждую пару минут на случай падения, никаких проблем нет. А в режиме работы по историческим данным ещё и третий файл используется. Только вот во время работы скриптов я в эти файлы не лезу, по крайней мере, в режиме записи. Думаю, именно поэтому скрипт и падает. Если, конечно, он работал в момент редактирования файла. Вот все операторы с этой функцией в моём скрипте - все работают как часы тыщу лет, и ни разу не правились:
F=io.open(getScriptPath().."//IN.TXT","r");
k=io.open(getScriptPath().."//OUT.TXT","w");
F=io.open(getScriptPath().."//LOG.TXT","a");
FF=io.open(getScriptPath().."//DATA.TXT","r");
 
Цитата
Владимир написал:
Eldar, Ни с файлом лога проблем нет - он у меня открывается в режиме дописывания и работает месяцами, ни с файлом портфеля - он перезаписывается каждую пару минут на случай падения, никаких проблем нет. А в режиме работы по историческим данным ещё и третий файл используется. Только вот во время работы скриптов я в эти файлы не лезу, по крайней мере, в режиме записи. Думаю, именно поэтому скрипт и падает. Если, конечно, он работал в момент редактирования файла. Вот все операторы с этой функцией в моём скрипте - все работают как часы тыщу лет, и ни разу не правились:
F=io.open(getScriptPath().."//IN.TXT","r");
k=io.open(getScriptPath().."//OUT.TXT","w");
F=io.open(getScriptPath().."//LOG.TXT","a");
FF=io.open(getScriptPath().."//DATA.TXT","r");
в момент работы скрипта не лезу в файлы. проверял после падения терминала, чтобы узнать открыт файл или нет.
 
Eldar, У меня все тикеры обслуживает один скрипт. Как акции, так и фьючерсы.
 
Eldar, Ну вот у меня сейчас, как и всегда, работают три запущенных копии скрипта: два боевых у разных брокеров и один тестовый, который реальных сделок не делает - хочу погонять пару месяцев и посмотреть, как работает алгоритм на больших интервалах. Иногда запускаю четвёртый, по историческим данным. НУ НИ РАЗУ не было ни малейших проблем.
 
Цитата
Владимир написал:
Eldar, У меня все тикеры обслуживает один скрипт. Как акции, так и фьючерсы.
ну вот когда доделаю скрипт, выведу с одном.
 
Цитата
Eldar написал:
"file_log:write(os.date() .. " ".. proc_name .. "\n")"
если еще актуально, то напишите так:
"file_log:write(tostring(os.date()) .. " ".. tostring(proc_name) .. "\n")"
 
Цитата
nikolz написал:
Цитата
Eldar написал:
"file_log:write(os.dat
Код
e() .. " ".. proc_name .. "\n")"
если еще актуально, то напишите так:
"file_log:write(tostring(os.date()) .. " ".. tostring(proc_name) .. "\n")"
согласно документации данное выражение и так вернёт строку, так что имеет ли смысл в этом?
или опять в квике гениальные программисты наваяли?!
Код
os.date() .. " ".. proc_name .. "\n"
Страницы: 1
Читают тему
Наверх