SetLabelParams

Страницы: 1
RSS
SetLabelParams
 
Здравствуйте.

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

насколько я могу предположить, что после обновления окна идентификатор остается тем же и функция Setlabelparams должна метку найти и переставить. если запрос setlabelparams происходит в момент обновления окна, там может произойти что-то неясное и, как я думаю, происходит. Но что?  

Каков должен быть алгоритм работы по перестановке метки из скрипта посредством setlabelparams? чтобы он работал в режиме связанных окон?


Напоминаю также о ошибке, заключающейся в отсутствии вызова ondestroy индикатора в том же режиме связанных окон. Это серьезная проблема - невозможно исполнить финализацию (закрыть процессы, удалить файлы, отвязаться от апишных дел и прочего)
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
 Замечен такой эффект. Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.

это правильное поведение?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Добрый день.

Цитата
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.  

Смена инструмента осуществляется при помощи настроек диаграммы?
Можете выложить Ваш скрипт.
На вопрос выше ответим позднее.
 
Цитата
Egor Zaytsev написал:
Добрый день.
Цитата
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.  
Смена инструмента осуществляется при помощи настроек диаграммы?
Можете выложить Ваш скрипт.
На вопрос выше ответим позднее.
скрипт можно написать так.

создаем скриптом  метку на графике с идентификатором xxx.

далее с периодичностью скажем в 100 миллисек ее перерисовываем посредством  setlabelparams

все работает, проблем нет.

теперь любым способом из пользовательского интерфейса руками заставляем обновиться график с идентификатором xxx.

в части случаев (когда везёт) метка продолжает переустанавоиваться.

А вот если переустановка попала на момент перерисовки графика, там получается эффект непредсказуемый.

метка по своему номеру становится недоступной, setlabelparams возвращает false, изображение метки на диаграмме или остаётся или исчезает, непредсказуемо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
Цитата
s_mike@rambler.ru написал:
Цитата
А вот если переустановка попала на момент перерисовки графика, там получается эффект непредсказуемый.
Нет сомнений в потокобезопасности?
 
Цитата
Борис Гудылин написал:
Цитата
Цитата
   s_mike@rambler.ru  написал:
Цитата
А вот если переустановка попала на момент перерисовки графика, там получается эффект непредсказуемый.
Нет сомнений в потокобезопасности?
о чем вы?

Речь идёт о работе с меткой из скрипта. Это единственный поток. Все остальное есть ответственность терминала.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Цитата
... Все остальное есть ответственность терминала.
А разработчики знают об этой ответственности?
 
Цитата
Egor Zaytsev написал:
Добрый день.
Цитата
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.  
Смена инструмента осуществляется при помощи настроек диаграммы?
Можете выложить Ваш скрипт.
На вопрос выше ответим позднее.
Здравствуйте! Ошибка воспроизводится на следующем скрипте:
Код
Settings = {
    Name = 'Example4',
    Mult = 1,
    Identifier = 'TESTCHART'
}

ChartID = 0
function Init()
    -- ChartID = 0 -- идентификатор метки
    plDate = '' -- дата метки
    plTime = '' -- время метки
    Data = 0 -- данные для графика
    PrintDbgStr('[QLUA]: DelAllLabels ' .. tostring(DelAllLabels(Settings.Identifier)))
    PrintDbgStr('[QLUA]: Init')
    testmodify = false
    return 1
end

function OnCalculate(index)
    -- получение информации об инструменте
    local t = getDataSourceInfo()
    SecCode = t.sec_code
    ClassCode = t.class_code

    -- Дата и время для метки
    plDate = string.format('%4d%02d%02d', T(index).year, T(index).month, T(index).day)
    plTime = string.format('%02d%02d%02d', T(index).hour, T(index).min, T(index).sec)

    Data = getNumberOf('all_trades') -- данные для метки

    -- если ID метки не найден, то рисуем новую. Иначе меняем старую
    if index == Size() then
        if ChartID == 0 then
            ChartID =
                PlotLabel(
                C(index),
                plDate,
                plTime,
                'text ' .. Data .. ' ' .. SecCode,
                Data .. ' ' .. SecCode,
                Settings.Identifier,
                'green'
            )
            PrintDbgStr('[QLUA]: ChartID =0, new Label, new ChartID= ' .. ChartID)
        else
            testmodify =
                ModifyLabel(
                C(index),
                plDate,
                plTime,
                'text ' .. Data .. ' ' .. SecCode,
                Data .. ' ' .. SecCode,
                Settings.Identifier,
                ChartID,
                'green'
            )
            PrintDbgStr('[QLUA]: ChartID =' .. ChartID .. ' modified ' .. tostring(testmodify))
        end
    end

    return index
end

function PlotLabel(fPRICE, fDATE, fTIME, fTEXT, fHINT, fCHARTTAG, fCOLOR)
    local r, g, b = 255, 255, 255

    if fCOLOR == 'green' then
        r = 0
        g = 255
        b = 0
    elseif fCOLOR == 'red' then
        r = 255
        g = 0
        b = 0
    end

    local label_params = {
        TEXT = tostring(fTEXT),
        IMAGE_PATH= "",
        ALIGNMENT = 'LEFT',
        YVALUE = fPRICE,
        DATE = fDATE,
        TIME = fTIME,
        R = r,
        G = g,
        B = b,
        TRANSPARENCY = 0,
        TRANSPARENT_BACKGROUND = 1,
        FONT_FACE_NAME = 'Lucida Console',
        FONT_HEIGHT = 10,
        HINT = tostring(fHINT)
    }

    return AddLabel(fCHARTTAG, label_params) or -1
end

function ModifyLabel(fPRICE, fDATE, fTIME, fTEXT, fHINT, fCHARTTAG, fCHARTID, fCOLOR)
    local r, g, b = 255, 255, 255

    if fCOLOR == 'green' then
        r = 0
        g = 255
        b = 0
    elseif fCOLOR == 'red' then
        r = 255
        g = 0
        b = 0
    end

    local label_params = {
        TEXT = tostring(fTEXT),
        IMAGE_PATH= "",
        ALIGNMENT = 'LEFT',
        YVALUE = fPRICE,
        DATE = fDATE,
        TIME = fTIME,
        R = r,
        G = g,
        B = b,
        TRANSPARENCY = 0,
        TRANSPARENT_BACKGROUND = 1,
        FONT_FACE_NAME = 'Lucida Console',
        FONT_HEIGHT = 10,
        HINT = tostring(fHINT)
    }
    return SetLabelParams(fCHARTTAG, fCHARTID, label_params)
end

function OnDestroy()
    DelAllLabels(Settings.Identifier)
end


В режиме связанных окон переключаемся на другой инструмент и потом обратно. Получаем две (!) потерявшиеся метки
 
Цитата
Алексей Ч написал:
Цитата
Egor Zaytsev   написал:
Добрый день.
Цитата
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.  
Смена инструмента осуществляется при помощи настроек диаграммы?
Можете выложить Ваш скрипт.
На вопрос выше ответим позднее.
Здравствуйте! Ошибка воспроизводится на следующем скрипте:
Код
  Settings  =  {
    Name  =   'Example4' ,
    Mult  =   1 ,
    Identifier  =   'TESTCHART' 
}

ChartID  =   0 
 function   Init ()
     -- ChartID = 0 -- идентификатор метки 
    plDate  =   ''   -- дата метки 
    plTime  =   ''   -- время метки 
    Data  =   0   -- данные для графика 
     PrintDbgStr ( '[QLUA]: DelAllLabels '   ..  tostring( DelAllLabels (Settings.Identifier)))
     PrintDbgStr ( '[QLUA]: Init' )
    testmodify  =   false 
     return   1 
 end 

 function   OnCalculate (index)
     -- получение информации об инструменте 
     local  t  =   getDataSourceInfo ()
    SecCode  =  t.sec_code
    ClassCode  =  t.class_code

     -- Дата и время для метки 
    plDate  =   string.format ( '%4d%02d%02d' , T(index).year, T(index).month, T(index).day)
    plTime  =   string.format ( '%02d%02d%02d' , T(index).hour, T(index).min, T(index).sec)

    Data  =   getNumberOf ( 'all_trades' )  -- данные для метки 

     -- если ID метки не найден, то рисуем новую. Иначе меняем старую 
     if  index  =  =   Size ()  then 
         if  ChartID  =  =   0   then 
            ChartID  = 
                PlotLabel(
                C(index),
                plDate,
                plTime,
                'text  ' .. Data .. '   ' .. SecCode,
                Data .. '   ' .. SecCode,
                Settings.Identifier,
                ' green'
            )
             PrintDbgStr ( '[QLUA]: ChartID =0, new Label, new ChartID= '   ..  ChartID)
         else 
            testmodify  = 
                ModifyLabel(
                C(index),
                plDate,
                plTime,
                'text  ' .. Data .. '   ' .. SecCode,
                Data .. '   ' .. SecCode,
                Settings.Identifier,
                ChartID,
                ' green'
            )
             PrintDbgStr ( '[QLUA]: ChartID ='   ..  ChartID  ..   ' modified '   ..  tostring(testmodify))
         end 
     end 

     return  index
 end 

 function   PlotLabel (fPRICE, fDATE, fTIME, fTEXT, fHINT, fCHARTTAG, fCOLOR)
     local  r, g, b  =   255 ,  255 ,  255 

     if  fCOLOR  =  =   'green'   then 
        r  =   0 
        g  =   255 
        b  =   0 
     elseif  fCOLOR  =  =   'red'   then 
        r  =   255 
        g  =   0 
        b  =   0 
     end 

     local  label_params  =  {
        TEXT  =  tostring(fTEXT),
        IMAGE_PATH =   "" ,
        ALIGNMENT  =   'LEFT' ,
        YVALUE  =  fPRICE,
        DATE  =  fDATE,
        TIME  =  fTIME,
        R  =  r,
        G  =  g,
        B  =  b,
        TRANSPARENCY  =   0 ,
        TRANSPARENT_BACKGROUND  =   1 ,
        FONT_FACE_NAME  =   'Lucida Console' ,
        FONT_HEIGHT  =   10 ,
        HINT  =  tostring(fHINT)
    }

     return   AddLabel (fCHARTTAG, label_params)  or   -  1 
 end 

 function   ModifyLabel (fPRICE, fDATE, fTIME, fTEXT, fHINT, fCHARTTAG, fCHARTID, fCOLOR)
     local  r, g, b  =   255 ,  255 ,  255 

     if  fCOLOR  =  =   'green'   then 
        r  =   0 
        g  =   255 
        b  =   0 
     elseif  fCOLOR  =  =   'red'   then 
        r  =   255 
        g  =   0 
        b  =   0 
     end 

     local  label_params  =  {
        TEXT  =  tostring(fTEXT),
        IMAGE_PATH =   "" ,
        ALIGNMENT  =   'LEFT' ,
        YVALUE  =  fPRICE,
        DATE  =  fDATE,
        TIME  =  fTIME,
        R  =  r,
        G  =  g,
        B  =  b,
        TRANSPARENCY  =   0 ,
        TRANSPARENT_BACKGROUND  =   1 ,
        FONT_FACE_NAME  =   'Lucida Console' ,
        FONT_HEIGHT  =   10 ,
        HINT  =  tostring(fHINT)
    }
     return   SetLabelParams (fCHARTTAG, fCHARTID, label_params)
 end 

 function   OnDestroy ()
     DelAllLabels (Settings.Identifier)
 end 


  
В режиме связанных окон переключаемся на другой инструмент и потом обратно. Получаем две (!) потерявшиеся метки
Добрый день.

Проверили у себя на вашем скрипте. Версия рабочего места 7.16.3. Проблема не воспроизвелась. Метки остаются на месте.
В таком случае, чтобы разобраться пришлите ваше рабочее место QUIK без ключей доступа и файла chm.
quiksupport@arqatech.com
 
Егор, здравствуйте!
Архив выслал на указанную почту. Видео работы тут https://1drv.ms/u/s!ArU667uon_8CoMtElOQbT3Hzup2qnA
 
Алексей Ч привел вам код индикатора, иллюстрирующий проблему отсутствия вызова ondestroy.

"Проверили у себя на вашем скрипте. Версия рабочего места 7.16.3. Проблема не воспроизвелась"

каким образом у вас не воспроизводится проблема - одному богу известно. Если ondestroy в режиме связанных окон не вызывается - вы не можете не получить размножение меток. Только или не пробовать ))


Я же изначально вам писал о проблеме, которая возникает при выставлении меток из скрипта. Если вызов  setlabelparams приходится на момент перерисовки графика с требуемым идентификатором, то происходят непредсказуемые вещи. Метка может оаздвоитьмя, может не раздвоиться.  Setlabelparams возвратит false, самочувствие дескриптора метки также нельзя предсказать
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
.... в скрипте есть и задвоение меток и Setlabelparams  false. Старая проблема. Я еще в 2016 году писал о ней в версии квика 7.5
 
 
Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
 
Добрый день,
     
      Ошибка, описанная в данном инциденте, будет исправлена в одной из       очередных версий программы.
      Приносим извинения за причиненные неудобства.
 
Алексей Ч, Добрый день,
     
      Описанная в данном инциденте ошибка исправлена в версии 7.18.1       терминала QUIK.
      Рекомендуем вам обновить версию программы.
     
      Приносим извинения за причиненные неудобства.
 
Добрый день,

к сожалению, после 5-10 переключений проблема вновь повторяется. Выслал на quiksupport архив с квиком.  
Страницы: 1
Читают тему
Наверх