Учусь работать с метками, Помощь в написании кода для выставлении меток на графике
Пользователь
Сообщений: Регистрация: 05.11.2016
30.11.2023 12:40:26
Знающие программисты, всю голову сломал в поиске ошибки в написании кода или логики выполнения. Своих вариантов уже нет нужен свежий взгляд на проблему.
Пытаюсь вывести полученное значение в метке.
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)
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(NGraf, label_params) end
Пользователь
Сообщений: Регистрация: 18.12.2017
30.11.2023 17:07:27
Вы разделите проблему на части, а то непонятно, что у вас не получается. В теме написано, что пытаетесь метку вывести. Так создайте простую метку, попробуйте её вывести, если выводится, то с остальными проблемами разбирайтесь
Пользователь
Сообщений: Регистрация: 30.01.2015
01.12.2023 08:52:31
Цитата
Виталий Дерягина написал: Знающие программисты, всю голову сломал в поиске ошибки в написании кода или логики выполнения. Своих вариантов уже нет нужен свежий взгляд на проблему.
Пытаюсь вывести полученное значение в метке.
Рекомендую сделать так: Далее привожу фрагменты из своего рабочего скрипта : Сделайте шаблон метки, например так:
Код
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, метка не появилась. Думаю проблема у меня в логике вывода метки, т.к. все типы передаваемых данных в функцию шаблона метки правильные. При вводе параметров, когда должна выводится метка значения просто не отображаются (фото прилагаются)
Пользователь
Сообщений: Регистрация: 05.11.2016
09.12.2023 11:36:03
Что я делаю не так? Пытаюсь просто вывести метку на первом индексе, не получается
Код
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
Пользователь
Сообщений: Регистрация: 27.01.2017
09.12.2023 11:58:30
Сигнатура вызова NUMBER AddLabel(STRING chart_tag, TABLE label_params)
Первый параметр - это строка.
Пользователь
Сообщений: Регистрация: 05.11.2016
09.12.2023 16:45:47
изменил все равно не работает
Код
d = "20"
AddLabel (d, label)
end
return 100
end
Пользователь
Сообщений: Регистрация: 27.01.2017
09.12.2023 17:08:27
Проверьте все задаваемые параметры в документации или здесь Например, нет такого параметра datetime. Также имена параметров регистрозависимые.
Пользователь
Сообщений: Регистрация: 15.06.2023
09.12.2023 17:13:05
Виталий Дерягина, В каждой версии терминала содержится такой файл "QLUA.chm" это справка "Руководство пользователя QLua, "находится там куда установили квик.
Открываете, читаем: "Добавляет метку с заданными параметрами.
Формат вызова:
NUMBER AddLabel(STRING chart_tag, TABLE label_params)
Параметры:
chart_tag – тег графика, к которому привязывается метка,
label_params – таблица с параметрами метки.
Функция возвращает числовой идентификатор метки. В случае неуспешного завершения функция возвращает «nil».
Это то о чем Вам подсказал Nikolay, теперь в Вашем примере
chart_tag – тег графика, к которому привязывается метка,
2) return 100, что за 100 хотите вернуть в параметрах пишите ["Yvalue"]=101,
Прежде чем задавать какие то вопросы, попробуйте прочитать, справку хотя бы для того чтоб Вас понимали и разговаривать на одном языке.
Пользователь
Сообщений: Регистрация: 05.11.2016
09.12.2023 21:31:42
Спасибо ошибки в написании нашел.
Цитата
VPM написал: 1) Где у Вас AddLabel (20, label) chart_tag – тег графика, к которому привязывается метка,2) return 100, что за 100 хотите вернуть в параметрах пишите ["Yvalue"]=101,Прежде чем задавать какие то вопросы, попробуйте прочитать, справку хотя бы для того чтоб Вас понимали и разговаривать на одном языке.
Не судите меня строго, только пару недель занялся изучением языка LUA под Quik. На простом примере, вывода линии со значением 100 и вывода метки при появлении первого индекса в OnCalculate() Справкой пользуюсь, только из справки
YVALUE
DOUBLE
Значение параметра на оси Y, к которому будет привязана метка
) я понял, что значение параметра YVALUE, я могу задать любое значение по оси Y. Или это не так?
Пользователь
Сообщений: Регистрация: 15.06.2023
09.12.2023 23:33:32
Попробуйте так (на график добавьте 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)
-- end
return 100 end
Пользователь
Сообщений: Регистрация: 05.11.2016
13.12.2023 10:26:43
Спасибо за помощь ! Я понял почему не видно меток, они просто за пределами масштаба и их просто не видно, но они есть. А что по оси Y масштабирования нет? Или еще есть какой-то подвох?
Пользователь
Сообщений: Регистрация: 15.06.2023
13.12.2023 11:18:15
Цитата
Виталий Дерягина написал: Спасибо за помощь VPM ! Я понял почему не видно меток, они просто за пределами масштаба и их просто не видно, но они есть. А что по оси Y масштабирования нет? Или еще есть какой-то подвох?
По чему нет, собственно метка для этого и нужна, для вывода, какого то полученного или расчётного значения, YVALUE = (H(I)+L(I))*0.5 or С(I); Это можно представить как координаты на плоскости где х=DATE ,TIME, а у=значение цены.
Пользователь
Сообщений: Регистрация: 05.11.2016
13.12.2023 13:45:47
Цитата
VPM написал: Это можно представить как координаты на плоскости где х=DATE ,TIME, а у=значение цены.
Т.е. я правильно понимаю, к примеру, через функцию OnCalculate() высчитываю значение, вывожу это значение в отдельном окне (строю свой график) и вычисленное значение можно считать за координату Y?
Пользователь
Сообщений: Регистрация: 15.06.2023
13.12.2023 16:26:51
Виталий Дерягина, все Вы правильно понимаете, просто нужно быть внимательней! Пробуйте тот же код:
Код
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
Пользователь
Сообщений: Регистрация: 05.11.2016
08.04.2024 09:54:29
Спасибо ! Метки появляются, но что у меня здесь не так? На 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
Пользователь
Сообщений: Регистрация: 27.01.2017
08.04.2024 09:59:54
В качестве второго параметра os.date принимает число (unix time), Вы же передаете таблицу.
Пользователь
Сообщений: Регистрация: 05.11.2016
08.04.2024 10:26:33
Цитата
Nikolay написал: В качестве второго параметра os.date принимает число (unix time), Вы же передаете таблицу.
Код
if type(datetime) == 'table' then datetime = os.time(datetime) end
Мы приняли таблицу, этим проверили, что да это таблица, потом перевели в секунды
Да, это я пропустил взглядом эту строку. Советую просто вывести данные полученных параметров в лог, чтобы оценить что конкретно передается при вызове AddLabel.
Пользователь
Сообщений: Регистрация: 05.11.2016
08.04.2024 14:04:31
Исправил ошибку в переменной, текущая index, а обращался к Index. Через DebugView посмотрел и получается, что не происходит вызов функции _SetTextLabel. В чем может быть проблема?
Пользователь
Сообщений: Регистрация: 27.01.2017
09.04.2024 11:47:33
Проверьте написание функции: OnCalcul ate
Почему есть пробел. Хотя, по идее, такой код не должен был скомпилироваться. Впрочем, может на графике просто нет индекса 5, дырявый график.
Пользователь
Сообщений: Регистрация: 05.11.2016
09.04.2024 15:56:07
Цитата
Виталий Дерягин написал: Впрочем, может на графике просто нет индекса 5, дырявый график
Это была шутка или и в правду такое бывает? Посмотрел, нулевых значений на графике нет.