Учусь работать с метками

Страницы: 1
RSS
Учусь работать с метками, Помощь в написании кода для выставлении меток на графике
 
Знающие программисты, всю голову сломал в поиске ошибки в написании кода или логики выполнения. Своих вариантов уже нет нужен свежий взгляд на проблему.

Пытаюсь вывести полученное значение в метке.

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)

end
end

if SumProd > SumPok and SumPok ~= 0 then

text = string.format ("%.2f", (SumProd / SumPok))

if text >= Settings['Параметр входа'] then

_TextLabel(Settings['Идентификатор графика'], T(Index - 1), SumProd + Settings['Отступ меток вверх'], 'TOP', Settings['Размер меток'], text)

end
end

end

return  SumPok, SumProd

end

_TextLabel = function(NGraf, 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(NGraf, label_params)
end
 
Вы разделите проблему на части, а то непонятно, что у вас не получается. В теме написано, что пытаетесь метку вывести. Так создайте простую метку, попробуйте её вывести, если выводится, то с остальными проблемами разбирайтесь
 
Цитата
Виталий Дерягина написал:
Знающие программисты, всю голову сломал в поиске ошибки в написании кода или логики выполнения. Своих вариантов уже нет нужен свежий взгляд на проблему.

Пытаюсь вывести полученное значение в метке.
Рекомендую сделать так:
Далее привожу фрагменты из своего рабочего скрипта :
Сделайте шаблон метки, например так:
Код
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"]=""}
В скрипте заполняете поля дату и значение и выводите метку на индикатор например так:
Код
label_mes.DATE=YYYYMMDD;  label_mes.HINT=tostring(tostring(buy).."/"..tostring(sell));
LabMes=AddLabel(Settings.tag,label_mes);
 
Цитата
nikolz написал:
Цитата
Рекомендую сделать так:
Далее привожу фрагменты из своего рабочего скрипта :
Сделайте шаблон метки, например так:
Код
[/CODE] [CODE]  label_mes.DATE = YYYYMMDD;  label_mes.HINT = tostring(tostring(buy) .. "/" .. tostring(sell));
LabMes =  AddLabel (Settings.tag,label_mes);
  
Цитата
nikolz написал:
Цитата
Виталий Дерягина написал:
Знающие программисты, всю голову сломал в поиске ошибки в написании кода или логики выполнения. Своих вариантов уже нет нужен свежий взгляд на проблему.

Пытаюсь вывести полученное значение в метке.
Рекомендую сделать так:
Далее привожу фрагменты из своего рабочего скрипта :
Сделайте шаблон метки, например так:
Код
   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" ] =  "" }
  
В скрипте заполняете поля дату и значение и выводите метку на индикатор например так:
Код
  label_mes.DATE = YYYYMMDD;  label_mes.HINT = tostring(tostring(buy) .. "/" .. tostring(sell));
LabMes =  AddLabel (Settings.tag,label_mes);

Спасибо за отклик. Попробовал сделать шаблон через локальную таблицу по вашему примеру, вставил в функцию 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
 
Сигнатура вызова NUMBER AddLabel(STRING chart_tag, TABLE label_params)

Первый параметр - это строка.
 
изменил  все равно не работает
Код
d = "20"
AddLabel (d, 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, теперь в Вашем примере

Цитата
Виталий Дерягина написал:
AddLabel (20, label)

  end

return 100
1)  Где у Вас  AddLabel (20, label)

  • chart_tag – тег графика, к которому привязывается метка,
2) return 100, что за 100 хотите вернуть в параметрах пишите ["Yvalue"]=101,

Прежде чем задавать какие то вопросы, попробуйте прочитать, справку хотя бы для того чтоб Вас понимали и разговаривать на одном языке.
 
Спасибо Nikolay ошибки в написании нашел.
Цитата
VPM написал:
1)  Где у Вас  AddLabel (20, label) chart_tag – тег графика, к которому привязывается метка,2) return 100, что за 100 хотите вернуть в параметрах пишите ["Yvalue"]=101,Прежде чем задавать какие то вопросы, попробуйте прочитать, справку хотя бы для того чтоб Вас понимали и разговаривать на одном языке.
Не судите меня строго, только пару недель занялся изучением языка LUA под Quik.
На простом примере, вывода линии со значением 100 и вывода метки при появлении первого индекса в OnCalculate()
Справкой пользуюсь,  только из справки
YVALUEDOUBLEЗначение параметра на оси 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)

 -- end

return 100
end
 
Спасибо за помощь 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
 
В качестве второго параметра os.date принимает число (unix time), Вы же передаете таблицу.
 
Цитата
Nikolay написал:
В качестве второго параметра os.date принимает число (unix time), Вы же передаете таблицу.
Код
if type(datetime) == 'table' then datetime = os.time(datetime) end
Мы приняли таблицу, этим проверили, что да это таблица, потом перевели в секунды
Код
label_params['DATE'] = os.date('%Y%m%d', datetime)  
А здесь просто преобразовали в нужный формат согласно os.date.

Или это так не работает?
 
Цитата
Виталий Дерягин написал:
Или это так не работает?
Да, это я пропустил взглядом эту строку. Советую просто вывести данные полученных параметров в лог, чтобы оценить что конкретно передается при вызове AddLabel.
 
Исправил ошибку в переменной, текущая index, а обращался к Index.
Через DebugView посмотрел и получается, что не происходит вызов функции _SetTextLabel. В чем может быть проблема?
 
Проверьте написание функции:
OnCalcul ate

Почему есть пробел. Хотя, по идее, такой код не должен был скомпилироваться. Впрочем, может на графике просто нет индекса 5, дырявый график.
 
Цитата
Виталий Дерягин написал:
Впрочем, может на графике просто нет индекса 5, дырявый график
Это была шутка или и в правду такое бывает? Посмотрел, нулевых значений на графике нет.
 
Цитата
Виталий Дерягин написал:
Цитата
Виталий Дерягин написал:
Впрочем, может на графике просто нет индекса 5, дырявый график
Это была шутка или и в правду такое бывает? Посмотрел, нулевых значений на графике нет.
Да, легко могут быть пропуски. На графике есть, а индекс пустой. У меня было однажды так, около двухсот начальных индексов были пустые.
Страницы: 1
Читают тему
Наверх