Знающие программисты, всю голову сломал в поиске ошибки в написании кода или логики выполнения. Своих вариантов уже нет нужен свежий взгляд на проблему.
Пытаюсь вывести полученное значение в метке.
OnCalcul ate = function(index)
if Schet < index then
if os.time(T(index-1)) >= DTSec then
local Prod = 0 local Pok = 0
Prod, Pok = _SumFunction (index)
SumProd = SumProd + Prod
SumPok = SumPok + Pok
Schet = index
end end
local text = ''
if SumPok and SumProd ~= 0 then
if SumPok > SumProd and SumProd ~= 0 then
text = string.format ("%.2f", (SumPok / SumProd))
if text >= Settings['Параметр входа'] then
local id = _TextLabel(Settings['Идентификатор графика'], T(Index - 1), SumPok + Settings['Отступ меток вверх'], 'TOP', Settings['Размер меток'], text)
Вы разделите проблему на части, а то непонятно, что у вас не получается. В теме написано, что пытаетесь метку вывести. Так создайте простую метку, попробуйте её вывести, если выводится, то с остальными проблемами разбирайтесь
Виталий Дерягина написал: Знающие программисты, всю голову сломал в поиске ошибки в написании кода или логики выполнения. Своих вариантов уже нет нужен свежий взгляд на проблему.
Пытаюсь вывести полученное значение в метке.
Рекомендую сделать так: Далее привожу фрагменты из своего рабочего скрипта : Сделайте шаблон метки, например так:
Код
local label_mes={["TEXT"]="",["IMAGE_PATH"]="",["ALIGNMENT"]="LEFT",["YVALUE"]=0,["DATE"]=0,["TIME"]=0,["R"]=255,["G"]=255,["B"]=255,
["TRANSPARENCY"]=0,["TRANSPARENT_BACKGROUND"]=0,["FONT_FACE_NAME"]='Times New Roman',["FONT_HEIGHT"]=18,["HINT"]=""}
В скрипте заполняете поля дату и значение и выводите метку на индикатор например так:
Виталий Дерягина написал: Знающие программисты, всю голову сломал в поиске ошибки в написании кода или логики выполнения. Своих вариантов уже нет нужен свежий взгляд на проблему.
Пытаюсь вывести полученное значение в метке.
Рекомендую сделать так: Далее привожу фрагменты из своего рабочего скрипта : Сделайте шаблон метки, например так:
Спасибо за отклик. Попробовал сделать шаблон через локальную таблицу по вашему примеру, вставил в функцию OnCalculate, метка не появилась. Думаю проблема у меня в логике вывода метки, т.к. все типы передаваемых данных в функцию шаблона метки правильные. При вводе параметров, когда должна выводится метка значения просто не отображаются (фото прилагаются)
Что я делаю не так? Пытаюсь просто вывести метку на первом индексе, не получается
Код
OnCalcul ate = function(index)
if index == 1 then
label={
["TEXT"]="Тарам",
["FONT_HEIGHT"]=25,
["R"]=255,
["G"]=255,
["B"]=0,
["FONT_FACE_NAME"]='Times New Roman',
["FONT_HEIGHT"]=18,
["Yvalue"]=101,
["datetime"]=20191007
}
AddLabel (20, label)
end
return 100
end
Проверьте все задаваемые параметры в документации или здесь https://luaq.ru/AddLabel.html Например, нет такого параметра datetime. Также имена параметров регистрозависимые.
Виталий Дерягина, В каждой версии терминала содержится такой файл "QLUA.chm" это справка "Руководство пользователя QLua, "находится там куда установили квик.
Открываете, читаем: "Добавляет метку с заданными параметрами.
Формат вызова:
NUMBER AddLabel(STRING chart_tag, TABLE label_params)
Параметры:
chart_tag – тег графика, к которому привязывается метка,
label_params – таблица с параметрами метки.
Функция возвращает числовой идентификатор метки. В случае неуспешного завершения функция возвращает «nil».
Это то о чем Вам подсказал Nikolay, теперь в Вашем примере
VPM написал: 1) Где у Вас AddLabel (20, label) chart_tag – тег графика, к которому привязывается метка,2) return 100, что за 100 хотите вернуть в параметрах пишите ["Yvalue"]=101,Прежде чем задавать какие то вопросы, попробуйте прочитать, справку хотя бы для того чтоб Вас понимали и разговаривать на одном языке.
Не судите меня строго, только пару недель занялся изучением языка LUA под Quik. На простом примере, вывода линии со значением 100 и вывода метки при появлении первого индекса в OnCalculate() Справкой пользуюсь, только из справки
YVALUE
DOUBLE
Значение параметра на оси Y, к которому будет привязана метка
) я понял, что значение параметра YVALUE, я могу задать любое значение по оси Y. Или это не так?
Попробуйте так (на график добавьте 20 - chart_tag – тег графика, к которому привязывается метка) function get_date(td)-- получаем local d = string.format('%.4d%.2d%.2d',td.year,td.month,td.day) if d~=nil then return d else return '0' end end function get_time(td)-- получаем local t = string.format('%.2d%.2d%.2d',td.hour,td.min,td.sec) --or T--.datetime if t~=nil then return t else return '000000' end end
OnCalcul ate = function(index)
--if index == 1 then label={ TEXT="Тарам", FONT_HEIGHT=25, R=255, G=255, B=0, FONT_FACE_NAME='Times New Roman', FONT_HEIGHT=18, --Yvalue=101, ---datetime"]=20191007 YVALUE=101, DATE = get_date( T(index) ), TIME = get_time( T(index) ) } AddLabel ('20', label)
Спасибо за помощь VPM! Я понял почему не видно меток, они просто за пределами масштаба и их просто не видно, но они есть. А что по оси Y масштабирования нет? Или еще есть какой-то подвох?
Виталий Дерягина написал: Спасибо за помощь VPM ! Я понял почему не видно меток, они просто за пределами масштаба и их просто не видно, но они есть. А что по оси Y масштабирования нет? Или еще есть какой-то подвох?
По чему нет, собственно метка для этого и нужна, для вывода, какого то полученного или расчётного значения, YVALUE = (H(I)+L(I))*0.5 or С(I); Это можно представить как координаты на плоскости где х=DATE ,TIME, а у=значение цены.
VPM написал: Это можно представить как координаты на плоскости где х=DATE ,TIME, а у=значение цены.
Т.е. я правильно понимаю, к примеру, через функцию OnCalculate() высчитываю значение, вывожу это значение в отдельном окне (строю свой график) и вычисленное значение можно считать за координату Y?
Виталий Дерягина, все Вы правильно понимаете, просто нужно быть внимательней! Пробуйте тот же код:
Код
function OnCalculate(index)
local median = (H(index)+L(index))*0.5 or C(index);
local label={TEXT="Тарам",
FONT_HEIGHT=25,
R=255,G=255,B=0,
FONT_FACE_NAME='Times New Roman',
FONT_HEIGHT=18,
DATE = get_date( T(index) ),TIME = get_time( T(index) )
YVALUE=median,
};
AddLabel ('20', label)
if index == Size()-1 then
return С(index)
end
end
Спасибо VPM! Метки появляются, но что у меня здесь не так? На 5 индексе, на простой линии со значением 100, пытаюсь вывести метку при помощи функции. Метка не появляется. Сам код подсмотрел из работающего индикатора.
Код
OnCalcul ate = function(index)
if index == 5 then
_SetTextLabel(Settings['Идентификатор графика'], T(Index - 1), 100+Settings['Отступ меток вверх'], 'BOTTOM', Settings['Размер меток'], 'привет')
end
return 100
end
_SetTextLabel = function(tag, datetime, hi, alignment, font_size, text, hint)
if type(datetime) == 'table' then datetime = os.time(datetime) end
label_params = {}
label_params['TEXT'] = text
label_params['ALIGNMENT'] = alignment
label_params['YVALUE'] = hi
label_params['DATE'] = os.date('%Y%m%d', datetime)
label_params['TIME'] = os.date('%H%M%S', datetime)
label_params['R'] = Settings['Цвет меток R (0-255)']
label_params['G'] = Settings['Цвет меток G (0-255)']
label_params['B'] = Settings['Цвет меток B (0-255)']
label_params['TRANSPARENCY'] = 0
label_params['TRANSPARENT_BACKGROUND'] = 1
label_params['FONT_FACE_NAME'] = 'Verdana'
label_params['FONT_HEIGHT'] = font_size
if hint ~= nil then
label_params['HINT'] = hint
end
return AddLabel(tag, label_params)
end
Да, это я пропустил взглядом эту строку. Советую просто вывести данные полученных параметров в лог, чтобы оценить что конкретно передается при вызове AddLabel.
Исправил ошибку в переменной, текущая index, а обращался к Index. Через DebugView посмотрел и получается, что не происходит вызов функции _SetTextLabel. В чем может быть проблема?