Создал скрипт (по аналогии с тремя экранами Элдера) и в нем пишу лог.
Код
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 - работает. с правами на папку со скриптами и логами все в порядке.
что за пролтергейст какой-то.
У вас файл открывается в цикле много раз. Либо закрывайте его каждый раз, либо откройте один раз.
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).
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.
как я написал в первом сообщении - права на данную папку полные. Контролируемый доступ Срабатывает только в одном скрипте. Попробую переименовать переменные. Может в какой-то момент пересекутся константы скриптов и второй скрипт пытается открыть файл первого?!
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, Ну вот у меня сейчас, как и всегда, работают три запущенных копии скрипта: два боевых у разных брокеров и один тестовый, который реальных сделок не делает - хочу погонять пару месяцев и посмотреть, как работает алгоритм на больших интервалах. Иногда запускаю четвёртый, по историческим данным. НУ НИ РАЗУ не было ни малейших проблем.