Простой код по созданию файла с ценами из all_trades таблички

Страницы: 1
RSS
Простой код по созданию файла с ценами из all_trades таблички, файл создаётся, но пустой, табличку получаем.
 
Цитата
boom = {}
ttime = {}
is_run = 1

function OnStop()
   is_run = 0
end

function main()
   while is_run == 1 do
       file = io.open("res.txt", "w+t")
           g = getNumberOf("all_trades")-1
           for i=0, g do
               boom = getItem("all_trades", i)
               message(tostring(boom.price),3)
               file:write(tostring(boom.price).. "\n")
               i = i+1
               sleep(1000)
           end
       file:close()
   end
end
 
как всегда, стоит только начать жаловаться, как всё заработает)))
 
Нет, поторопился, не работает. Пустой файл!
 
добавьте команду
file:flush()
 
Цитата
Sergey Gorokhov пишет:
добавьте команду
file:flush()
А разве одного file:close() не достаточно?
 
Цитата
Дмитрий пишет:
А разве одного file:close() не достаточно?
Вы посмотрите код, он до close не доходит просто.
С учетом sleep чтобы добраться до close надо ждать суток трое
 
Цитата
Sergey Gorokhov пишет:
С учетом sleep чтобы добраться до close надо ждать суток трое
Это верно
 
Как минимум, открытие и закрытие файла надо вынести за тело цикла while.
 
Николай Бехтерев, советую вам оформлять свой код с отступами внутри циклов, а чтобы эти отступы не пропадали при размещении сообщения на форуме - пользоваться кнопочкой "оформление текста в виде кода".
Иначе бывает трудно сходу вникнуть в логику работы вашего алгоритма.
 
Цитата
Дмитрий пишет:
Николай Бехтерев , советую вам оформлять свой код с отступами внутри циклов, а чтобы эти отступы не пропадали при размещении сообщения на форуме - пользоваться кнопочкой "оформление текста в виде кода".
Иначе бывает трудно сходу вникнуть в логику работы вашего алгоритма.
Просто ошибся с кнопкой при составлении вопроса, а редактировать сообщения на этом движке видимо никак.
 
Выручайте, не могу понять почему не создаётся файл. Логику всех if then end проверил, о том что верно мне сообщают message(), но почему не создаётся файл я понять не могу.
В прошлый раз, вынеся команды по файлу за пределы циклы while всё сработало, но теперь чуть более сложная схема и опять всё по нулям:

Код
boom = {}
ttime = {}
is_run = 1
candle = {}
range = 20

function OnStop()
   is_run = 0
end

function OnClose()
   candle.o = 0
   candle.h = 0
   candle.l = 0
   candle.c = 0
end

function OnCleanUp()
   candle.o = 0
   candle.h = 0
   candle.l = 0
   candle.c = 0
end

function main()
   file = io.open("res.txt", "w+t")
   while is_run == 1 do
         candle.o = 0
         candle.h = 0
         candle.l = 0
         candle.c = 0
         g = getNumberOf("all_trades")-1
         for i=0, g do
            boom = getItem("all_trades", i)
            message("New Price get".." - "..tostring(boom.price),3)
            if candle.c == 0 then
               candle.o = boom.price
               candle.h = boom.price
               candle.l = boom.price
               candle.c = boom.price
            elseif boom.price > candle.h then
               message(tostring(candle.l+range).." ".."High test",1)
                  if boom.price >= (candle.l + range) then
                     candle.h = boom.price
                     candle.c = boom.price
                     message("New Candle from new HIGH".." "..tostring(candle.o).." "..tostring(candle.h).." "..tostring(candle.l).." "..tostring(candle.c),2)
                     strin = tostring(candle.o)..","..tostring(candle.h)..","..tostring(candle.l)..","..tostring(candle.c)
                     file:write(strin.."\n")
                     candle.o = 0
                     candle.h = 0
                     candle.l = 0
                     candle.c = 0
                  else
                     message("GET NEW HIGH",3)
                     candle.h = boom.price
                  end
            elseif boom.price < candle.l then
               message(tostring(candle.h-range).." ".."Low Test",1)
                  if boom.price <= (candle.h - range) then
                     candle.l = boom.price
                     candle.c = boom.price
                     message("New Candle from new LOW".." "..tostring(candle.o).." "..tostring(candle.h).." "..tostring(candle.l).." "..tostring(candle.c),2)
                     strin = tostring(candle.o)..","..tostring(candle.h)..","..tostring(candle.l)..","..tostring(candle.c)
                     file:write(strin.."\n")
                     candle.o = 0
                     candle.h = 0
                     candle.l = 0
                     candle.c = 0
                  else
                     message("GET NEW LOW",3)
                     candle.l = boom.price
                  end
            end
            i=i+1
            message("GET OUT FOR THE NEW ROUND",3)
            sleep(100)
         end
      
   end
   file:close()
end
 
ЧО НЕ ТАК ТО?
P.S. идея в том, чтобы получить из потока сделок range барчики, например.
 
Цитата
Николай Бехтерев пишет:
ЧО НЕ ТАК ТО?
Николай,Вам уже объяснили что информация в файле появится только после выполнения close() или flush()
В Вашем коде нету flush()  есть только close() который сработает в лучшем случае при остановке скрипта.
Рекомендация остается прежней, добавьте команду file:flush()  сразу после file:write
 
и уберите message слишком частое их использование приводит к тормозам. Используйте для диагностики PrintDbgStr
 
Цитата
Sergey Gorokhov пишет:
Цитата
Николай Бехтерев пишет:
ЧО НЕ ТАК ТО?
Николай,Вам уже объяснили что информация в файле появится только после выполнения close() или flush()
В Вашем коде нету flush() есть только close() который сработает в лучшем случае при остановке скрипта.
Рекомендация остается прежней, добавьте команду file:flush() сразу после file:write
Я понимаю, что после выполнения close()! Поэтому посмотрел, увидел, что набежало пару нужных строк, жму стоп, останавливается скрипт И ТИШИНА. Даже файл не создан. Хотя команды всё выполнены и должен быть файл как минимум с одной строкой...
 
Добрый день.
Попробуйте так:

Код
... 
file = io.open(getScriptPath() .."\\res.txt", "w+t") 
assert(file) 
...
 
Цитата
Michael Bulychev пишет:
Добрый день.
Попробуйте так:
Код
 ... 
file = io.open(getScriptPath() .."\\res.txt", "w+t") 
assert(file) 
...
 
в чём идея команды assert? прост не нашёл документацию на русском, а на инглише туманно))))
 
и да, сработало.
 
Функция assert() выдает сообщение об ошибке, если значение её первого параметра равно false (то есть nil или false).
из одного блога, нашёл гуглем за 30 сек. по запросу "Lua assert"

А "зарабобтало" у вас потому, что добавили getScriptPath()
Беда в том, что QUIK из скриптов создаёт файлы в том каталоге, из которого вы последний раз открывали како-либо файл (со скриптом, згружали настройки  - и т.п.), либо в каталоге самого квика.

При добавке getScriptPath() файл гарантированно создаётся рядом со скриптом - вот вы его и нашли. До этого он тоже создавался, но где - ответ даст только поиск по диску.
 
Цитата
swerg пишет:
Функция assert() выдает сообщение об ошибке, если значение её первого параметра равно false (то есть nil или false ).
из одного блога , нашёл гуглем за 30 сек. по запросу "Lua assert"

А "зарабобтало" у вас потому, что добавили getScriptPath()
Беда в том, что QUIK из скриптов создаёт файлы в том каталоге, из которого вы последний раз открывали како-либо файл (со скриптом, згружали настройки - и т.п.), либо в каталоге самого квика.

При добавке getScriptPath() файл гарантированно создаётся рядом со скриптом - вот вы его и нашли. До этого он тоже создавался, но где - ответ даст только поиск по диску.
Спасибо! :) А я кинулся на оф. сайт, а там документалка на русском недоступна и про гугл даже не вспомнил.
Страницы: 1
Читают тему
Наверх