Не могу понять, что происходит с метками в момент обновления окна в режиме связанных окон.
насколько я могу предположить, что после обновления окна идентификатор остается тем же и функция Setlabelparams должна метку найти и переставить. если запрос setlabelparams происходит в момент обновления окна, там может произойти что-то неясное и, как я думаю, происходит. Но что?
Каков должен быть алгоритм работы по перестановке метки из скрипта посредством setlabelparams? чтобы он работал в режиме связанных окон?
Напоминаю также о ошибке, заключающейся в отсутствии вызова ondestroy индикатора в том же режиме связанных окон. Это серьезная проблема - невозможно исполнить финализацию (закрыть процессы, удалить файлы, отвязаться от апишных дел и прочего)
Замечен такой эффект. Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.
Смена инструмента осуществляется при помощи настроек диаграммы? Можете выложить Ваш скрипт. На вопрос выше ответим позднее.
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.
Смена инструмента осуществляется при помощи настроек диаграммы? Можете выложить Ваш скрипт. На вопрос выше ответим позднее.
скрипт можно написать так.
создаем скриптом метку на графике с идентификатором xxx.
далее с периодичностью скажем в 100 миллисек ее перерисовываем посредством setlabelparams
все работает, проблем нет.
теперь любым способом из пользовательского интерфейса руками заставляем обновиться график с идентификатором xxx.
в части случаев (когда везёт) метка продолжает переустанавоиваться.
А вот если переустановка попала на момент перерисовки графика, там получается эффект непредсказуемый.
метка по своему номеру становится недоступной, setlabelparams возвращает false, изображение метки на диаграмме или остаётся или исчезает, непредсказуемо.
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.
Смена инструмента осуществляется при помощи настроек диаграммы? Можете выложить Ваш скрипт. На вопрос выше ответим позднее.
Здравствуйте! Ошибка воспроизводится на следующем скрипте:
Код
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
В режиме связанных окон переключаемся на другой инструмент и потом обратно. Получаем две (!) потерявшиеся метки
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.
Смена инструмента осуществляется при помощи настроек диаграммы? Можете выложить Ваш скрипт. На вопрос выше ответим позднее.
Здравствуйте! Ошибка воспроизводится на следующем скрипте:
Код
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
Алексей Ч привел вам код индикатора, иллюстрирующий проблему отсутствия вызова ondestroy.
"Проверили у себя на вашем скрипте. Версия рабочего места 7.16.3. Проблема не воспроизвелась"
каким образом у вас не воспроизводится проблема - одному богу известно. Если ondestroy в режиме связанных окон не вызывается - вы не можете не получить размножение меток. Только или не пробовать ))
Я же изначально вам писал о проблеме, которая возникает при выставлении меток из скрипта. Если вызов setlabelparams приходится на момент перерисовки графика с требуемым идентификатором, то происходят непредсказуемые вещи. Метка может оаздвоитьмя, может не раздвоиться. Setlabelparams возвратит false, самочувствие дескриптора метки также нельзя предсказать