Волшебное исчезание меток

Страницы: 1
RSS
Волшебное исчезание меток
 
Всем добрый день!

Столкнулся с тем, что после аварийного выхода из терминала  при его зависании по сторонней причине, исчезают все метки
добавленные при помощи функции  AddLabel после последнего запуска скрипта.
Очень неприятно и в голову ничего не пришло кроме сохранения параметров меток в файл при их создании с последующим удалением и пересозданием каждой при новом запуске.
Наверное можно было бы решить эту проблему имея в lua функцию сохранения параметров терминала
в файл info.wnd, но увы. Кто-то нашел решение этой проблемы?

Попутно изучая в доках функцию AddLabel на предмет что курили разработчики когда придумали использовать для параметра "Время в формате «ЧЧММСС»..." тип "NUMBER" наехал вот на такую шутку:
Код
   local a="09:15:18"
   local b=string.gsub(a,":","")
   local c=tonumber(b)
   local d=tonumber(string.gsub(a,":",""))
   message(tostring(c).." "..tostring(d))
Результат:
91518 nil

Кто коллекционирует, дарю ))
v.9.8.0.11, Lua 5.3.5
 
string.gsub возвращает два параметра, поэтому tonumber воспримет второй как базу, что и приводит к nil. Скобки добавить надо, чтобы ограничить одним параметром возвращаемое значение gsub.
 
А метки да, исчезают. Как я понимаю из-за ошибки создания дампа состояния при падении. Приходится хранить параметры метки в файле состояния скрипта. Впрочем, я предпочитаю все хранить независимо, чтобы всегда иметь возможность при перезапуске проверить и выявить все различия.
 
Цитата
Nikolay написал:
А метки да, исчезают. Как я понимаю из-за ошибки создания дампа состояния при падении. Приходится хранить параметры метки в файле состояния скрипта. Впрочем, я предпочитаю все хранить независимо, чтобы всегда иметь возможность при перезапуске проверить и выявить все различия.
Там есть еще один прикол - после выпада в дамп и последующего запуска GetLabelParams возвращает параметры метки, хотя на графике ее нет.
Приходится их по одной удалять их по возвращаемому uid и создавать с новым из сохраненных параметров.
 
Kolossi, А нафига ВЫПАДАТЬ в дамп? Лично я сбрасываю дамп на диск раз в 5 минут... нет, вру - даже чаще: раз в 100 секунд, и потери данных здесь будут только если именно в момент сброса дампа Квик и сдохнет. Но вероятность этого прекрасного события вряд ли отличается от нуля, и все данные оказываются хорошо сохранившимися. Ну, разве что в эти 100 секунд что-то произойдёт.
 
Владимир,я имел ввиду закрытие терминала после его зависания и последующий запуск. А с сохранением жизненно важных переменных и таблиц у меня давно все отлажено.

В итоге я считаю, что отсутствие меток на графике при наличии их параметров в системе в подобной ситуации является багом и подлежит рассмотрению и исправлению в ближайших версиях квика.  Но похоже так считаю только я (
 
Kolossi, Я, во всяком случае, считаю иначе: все эти графики с метками для торговли не нужны от слова совсем, и потому я категорически против любых изменений Квика, который и без того на ладан дышит.  
 
Владимир, дык для торговли и Lua не нужен, только здесь другая тема.
 
Kolossi, Кому как. Мне, например,  для торговли только Lua и нужен. А тема здесь направлена на потенциальное изменение софта Квика. НЕ НАДО ЭТОГО ДЕЛАТЬ!!!
 
Цитата
Владимир написал:
Kolossi, Кому как. Мне, например,  для торговли только Lua и нужен. А тема здесь направлена на потенциальное изменение софта Квика. НЕ НАДО ЭТОГО ДЕЛАТЬ!!!
Как обычно на любом форуме есть человек постоянно лезущий в любую тему "со своим единственно правильным мнением" не обращая внимание на то, что оно никого не интересует. Давайте не будем засорять ветку.
 
Kolossi, 99% всех веток практически любого форума, не говоря уже про этот, есть чистейший мусор. В частности, Ваша ветка. Несмотря на то, что здесь в достатке специализированных форумов ("Пожелания по развитию функциональных возможностей системы QUIK", "Вопросы по работе с графиками в системе QUIK", "Вопросы по эксплуатации системы QUIK, не выделенные в отдельные темы форума"), народ постоянно лезет в "Программирование на языке Lua" со своими дурацкими пожеланиями, которые "подлежит рассмотрению и исправлению в ближайших версиях квика", хотя софт уже настолько изуродован аналогичными пожеланиями их предшественников, что уже едва справляется со своими первоначальными задачами. Давайте не будем засорять форум. :wink:  
 
Kolossi, добрый день.

При аварийном завершении работы терминала QUIK действительно не сохраняется текущий wnd-файл и утрачиваются изменения, внесенные в конфигурацию в ходе последней рабочей сессии.
Сохранение текущего wnd-файла с помощью QLua-функции в силу ряда причин не может быть реализовано, и решением описанной проблемы видится именно используемый Вами способ - сохранение параметров в текстовый файл.

Что касается приведенного Вами фрагмента кода, как написал ранее Nikolay, функция string.gsub() возвращает два значения, из-за чего невозможно корректно выполнить преобразование tonumber.
 
Все намного веселее, как оказалось.

Установил метки, запомнил их ID. Аварийно завершаю терминал. Перезапускаю терминал. Скрипт считывает метки и проверяет их.

Часть меток меняет свой id. Например, было 155 стало 162. Возможно часть меток исчезла, а может и сами как-то переиндексировались. В результате считывая метку, получаем чужие данные.

Но это очень плохо. Если нет гарантий, что id метки неизменен, то надо каждый раз искать, проверять, что метка та же, что и была.
 
Ну и сразу предложение:

Обязательно нужен метод ПолучитьВсеМетки - возвращает массив с индексами всех меток на указанном графике.

И желательно иметь метод ПриСдвигеМетки. Его, конечно, лучше сделать как регистрируемый колбек на метку, типа RegisterOnMoveLabel(id, chrt_id, func). Вызываемый по событию "MOUSE_RELEASED". Т.е. указателем взяли - отпустили.
Сейчас же приходится постоянно опрашивать метку на предмет новых данных - не самое лучшее занятие.
 
Nikolay, добрый день.

Цитата
Nikolay написал:
Установил метки, запомнил их ID. Аварийно завершаю терминал. Перезапускаю терминал. Скрипт считывает метки и проверяет их.Часть меток меняет свой id. Например, было 155 стало 162. Возможно часть меток исчезла, а может и сами как-то переиндексировались. В результате считывая метку, получаем чужие данные.
Уточните, как именно Вы аварийно завершаете работу терминала? Так же просьба подробно описать последовательность Ваших действий. Для анализа проблемы просьба прислать скрипт с уточнениями нам на quiksupport@arqatech.com со ссылкой на данную ветку форума.
 
Цитата
Nikolay написал:
И желательно иметь метод ПриСдвигеМетки.
Цитата
Nikolay написал:
Обязательно нужен метод ПолучитьВсеМетки
Ваши пожелания зарегистрированы. Мы постараемся рассмотреть их и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожеланий в будущих версиях ПО.
 
Цитата
Уточните, как именно Вы аварийно завершаете работу терминала? Так же просьба подробно описать последовательность Ваших действий. Для анализа проблемы просьба прислать скрипт с уточнениями нам на  quiksupport@arqatech.com  со ссылкой на данную ветку форума.
Ок. Раз Вы сами не можете проверить происходит ли переиндексация меток при каждом запуске терминала, вот два скрипта.

Первый добавляет метки:
Код
local path = _G.getScriptPath()

local sleep = _G.sleep
local log_file

local AddLabel          = _G.AddLabel

local function init_log()
    log_file = io.open(path.."\\add_labels_test.txt", "w")
end
local function close_log()
    if io.type(log_file) == 'file' then
        log_file:close()
    end
    log_file = nil
end

local function log_tostring(...)
    local n = select('#', ...)
    if n == 1 then
    return tostring(select(1, ...))
    end
    local t = {}
    for i = 1, n do
    t[#t + 1] = tostring((select(i, ...)))
    end
    return table.concat(t, " ")
end

local function log(...)
    if not log_file then return end
    log_file:write(tostring(os.date("%c", os.time())).." "..log_tostring(...).."\n");
    log_file:flush();
end

function _G.OnStop()
    close_log()
end

function _G.main()

    init_log()
    log('start')

    local tag = 'virt_test'

    local date = tonumber(os.date('%Y%m%d', os.time())) or 0
    local time = tonumber(os.date('%H%M%S', os.time() - 120)) or 0

    local label_params = {}
    label_params.YVALUE = 172.0
    label_params.TEXT = ''
    label_params.HINT = ''
    label_params.DATE = date
    label_params.TIME = time
    label_params.FONT_FACE_NAME = 'Arial'
    label_params.ALIGNMENT = 'RIGHT'
    label_params.FONT_HEIGHT    = 3
    label_params.TRANSPARENT_BACKGROUND    = 1

    for i = 1, 100 do
        label_params.TEXT = tostring(i)..': |||||||||||||||||||||||||||'
        label_params.YVALUE = label_params.YVALUE + 0.1
        local l_id = AddLabel(tag, label_params)
        log('add label', i, 'id', l_id)
        sleep(10)
    end

end

Второй читает:
Код
local path = _G.getScriptPath()

local log_file

local GetLabelParams    = _G.GetLabelParams

local function init_log()
    log_file = io.open(path.."\\check_labels_test.txt", "w")
end
local function close_log()
    if io.type(log_file) == 'file' then
        log_file:close()
    end
    log_file = nil
end

local function log_tostring(...)
    local n = select('#', ...)
    if n == 1 then
    return tostring(select(1, ...))
    end
    local t = {}
    for i = 1, n do
    t[#t + 1] = tostring((select(i, ...)))
    end
    return table.concat(t, " ")
end

local function log(...)
    if not log_file then return end
    log_file:write(tostring(os.date("%c", os.time())).." "..log_tostring(...).."\n");
    log_file:flush();
end

function _G.OnStop()
    close_log()
end

function _G.main()

    init_log()
    log('start')

    local tag = 'virt_test'

    for l_id = 1, 1000 do
        local l_params = GetLabelParams(tag, l_id)
        if l_params then
            log('find label', 'id', l_id, 'text', l_params.text)
        end
    end

end

Запускаем терминал. Запускаем скурипт, добавляющий метки. Удаляем несколько меток, чтобы образовались дырки в последовательности id меток. Можно еще проще сделать - добавить метка, удалить все метки и заново добавить. В результате id меток будет начинаться не с 1.

Tue Mar  7 13:30:26 2023 start
Tue Mar  7 13:30:26 2023 add label 1 id 101.0
Tue Mar  7 13:30:26 2023 add label 2 id 102.0
Tue Mar  7 13:30:26 2023 add label 3 id 103.0
Tue Mar  7 13:30:26 2023 add label 4 id 104.0
Tue Mar  7 13:30:26 2023 add label 5 id 105.0
Tue Mar  7 13:30:26 2023 add label 6 id 106.0
Tue Mar  7 13:30:26 2023 add label 7 id 107.0
Tue Mar  7 13:30:26 2023 add label 8 id 108.0
Tue Mar  7 13:30:26 2023 add label 9 id 109.0

Теперь закрываем терминал, даже не аварийно. Запускаем терминал заново. Запускаем второй скрипт и видим что метки получили индексы с 1, тем самым те индексы, что были получена при добавлении утеряны. Вывод: при каждом запуске терминала происходит переиндексация меток.

Tue Mar  7 13:30:02 2023 start
Tue Mar  7 13:30:02 2023 find label id 1 text 1: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 2 text 2: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 3 text 3: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 4 text 4: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 5 text 5: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 6 text 6: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 7 text 7: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 8 text 8: |||||||||||||||||||||||||||
Страницы: 1
Читают тему (гостей: 1)
Наверх