Здравствуйте. Хочу для удобства визуализации сделать так, чтобы скрипт QLUA отмечал на графике точки по нужным мне параметрам. Т.е. например если произошло пересечение средних - чтобы на графиках появилась соответствующая отметка.
Вопрос - как это можно сделать и можно ли вообще? Или где можно почитать об этом поподробнее?
QUIK clients support
Сообщений: Регистрация: 27.01.2015
25.10.2016 07:21:47
Добрый день,
Добавить метку на график по нужным условиям можно с помощью функции "AddLabel". Более подробно о функции можно ознакомиться в документации из раздела "Функции для работы с метками":
Также, примеры функций расчета индикаторов терминала QUIK можно скачать по ссылке:
for v=2,N1,1 do t1=getCandlesByIndex("MVAs",0, v-1, 1)[0].close; t2=getCandlesByIndex("MVAl",0, v-1, 1)[0].close; t11=getCandlesByIndex("MVAs",0, v-2, 1)[0].close; t22=getCandlesByIndex("MVAl",0, v-2, 1)[0].close; if (t1>t2) and (t11<t22) then D=getCandlesByIndex("MVAl",0, v-1, 1)[0].datetime; t2d=D.day; t2h=D.hour; label.Yvalue=t1.close; label.datetime=D; AddLabel("MVAl",label) end end
Ругается на label.Yvalue=t1.close; мол attempt to index global 't1' (a number value)
Что это значит? Версия 7.2.1.5
QUIK clients support
Сообщений: Регистрация: 27.01.2015
25.10.2016 13:03:13
Цитата
Егор Масалкин написал: Ругается на label.Yvalue=t1.close; мол attempt to index global 't1' (a number value)
Значение label.Yvalue должно являться строкой, в то время как у Вас возвращается число.
Егор Масалкин написал: Ругается на label.Yvalue=t1.close; мол attempt to index global 't1' (a number value)
Значение label.Yvalue должно являться строкой, в то время как у Вас возвращается число.
Рискну предположить иное:
t1=getCandlesByIndex("MVAs",0, v-1, 1)[0].close
Здесь взяли поле close свечи, t1 - число.
label.Yvalue=t1.close;
Здесь еще раз пытаетесь взять поле close, обращаясь к t1 как к таблице, на что он и ругается.
Да, и правда косячнул с полями объекта. Поправил, компилируется нормально, но на графике метки не выставляются =_= Как они вообще должны выглядеть? Почему их не видно? Вроде и Х-координата задана (datetime), Y-координата тоже...
Пользователь
Сообщений: Регистрация: 03.02.2015
27.10.2016 16:50:36
Не знаю как в последних версиях квика, но раньше эти скриптовые метки жутко тормозили терминал.
Пользователь
Сообщений: Регистрация: 19.10.2016
27.10.2016 18:04:40
Цитата
lergen написал: Не знаю как в последних версиях квика, но раньше эти скриптовые метки жутко тормозили терминал.
И всё-таки, можете подсказать по теме? Что я сделал не так, что метки у меня не отображаются?
lergen написал: Не знаю как в последних версиях квика, но раньше эти скриптовые метки жутко тормозили терминал.
И всё-таки, можете подсказать по теме? Что я сделал не так, что метки у меня не отображаются?
Добрый день,
Просьба прислать полный код исправленного скрипта.
Пользователь
Сообщений: Регистрация: 20.04.2016
29.10.2016 21:54:41
Если я ничего не путаю, то метки всегда ставятся только за счет какого-то графического файлика, который собственно и отображается на графике.
А у вас этог параметр IMAGE_PATH не указан
Пользователь
Сообщений: Регистрация: 19.10.2016
16.11.2016 09:54:24
Переделал скрипт. Теперь он должен возле каждого пересечения графика ставить метку Icon.jpg, которая представляет собой оранжевый квадратик, и считает количество таких пересечений. Вот только количество пересечений он считает и выводит, а метки на графике не появляются... Что я делаю не так?
function SetLabel(x) label.date=x.date; label.time=x.time; label.Yvalue=x.close; AddLabel("MVAl",label); end
s=0; l=0;
function OnInit()
N1=getNumCandles("MVAs")
for v=2,N1,1 do t=getCandlesByIndex("MVAs",0, v, 1)[0]; t1=getCandlesByIndex("MVAs",0, v-1, 1)[0].close; t2=getCandlesByIndex("MVAl",0, v-1, 1)[0].close; t11=getCandlesByIndex("MVAs",0, v-2, 1)[0].close; t22=getCandlesByIndex("MVAl",0, v-2, 1)[0].close; if (t1>t2) and (t11<t22) then SetLabel(t); s=s+1; end if (t1<t2) and (t11>t22) then SetLabel(t); l=l+1; end end
message(tostring(s).." "..tostring(l)); end
Пользователь
Сообщений: Регистрация: 23.01.2015
16.11.2016 10:20:34
Здравствуйте, В свечках нет таких параметров date и time (см документацию) Там есть только параметр datetime
Пользователь
Сообщений: Регистрация: 19.10.2016
16.11.2016 10:57:28
Хм, однако, в метках есть только параметры date и time... как можно datetime разделить на date и time, если у datetime отдельно секунды, часы, минуты и прочее, а у метки эти параметры объединены?
Пользователь
Сообщений: Регистрация: 23.01.2015
16.11.2016 11:04:36
Цитата
Егор Масалкин написал: если у datetime отдельно секунды, часы, минуты и прочее, а у метки эти параметры объединены?
Взять отдельно секунды, часы, минуты и прочее и объединить
Егор Масалкин написал: если у datetime отдельно секунды, часы, минуты и прочее, а у метки эти параметры объединены?
Взять отдельно секунды, часы, минуты и прочее и объединить
И по какому принципу они объединяются? Вроде простейший инструмент, но почему-то требуется множество дополнительных действий чтобы поставить метку на график...
Егор Масалкин написал: если у datetime отдельно секунды, часы, минуты и прочее, а у метки эти параметры объединены?
Взять отдельно секунды, часы, минуты и прочее и объединить
И по какому принципу они объединяются? Вроде простейший инструмент, но почему-то требуется множество дополнительных действий чтобы поставить метку на график...
Формат времени для меток это строка HHMMSS. datetime это таблица содержащая отдельно часы минуты и секунды. Вам нужно их взять из этой таблицы и просто объединить как строку. time = x.datetime.hour..x.datetime.min..x.datetime.sec
Почему так, объясняется тем что метки появились задолго до появления Lua в терминале. И тек исторически сложилось, что у них формат даты времени у них именно такой. Возможно, в будущем это как-то изменится, но сейчас работает именно так.
Пользователь
Сообщений: Регистрация: 12.11.2025
12.11.2025 12:21:46
день день. Помоги решить вопрос на графике не отображается метка (текст) причем при проверки message (tostring(label_id_text)) сообщение выдает id метки Так же на графике при нажатии правой кнопки при выборе удалить, строка "все метки в диаграмме" становится активной (получается метка на график попадает, но ее не видно) скрипт отображения метки следующий:
function labeldraw(price, textlabel, texthint) label_params = { TEXT = textlabel, ALIGNMENT = "LEFT", DATE = tostring(os.date("%Y%m%d")), TIME = tostring(os.date("%H%M%S")), R = 0, G = 0, B = 0, TRANSPARENCY = 90, FONT_HEIGHT = 10, TRANSPARENT_BACKGROUND = 1, YVALUE = price, HINT = texthint }
text = "ppppp "..price[0].close labeldraw(price[0].close, text, "eeeeee") message (tostring(price[0].close)) message (tostring(label_id_text)) end
Пользователь
Сообщений: Регистрация: 12.11.2025
12.11.2025 12:43:37
версия терминала 10.0.1.18
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 14:14:35
Цитата
gngngn написал: день день. Помоги решить вопрос на графике не отображается метка (текст) причем при проверки message (tostring(label_id_text)) сообщение выдает id метки Так же на графике при нажатии правой кнопки при выборе удалить, строка "все метки в диаграмме" становится активной (получается метка на график попадает, но ее не видно) скрипт отображения метки следующий:
function labeldraw(price, textlabel, texthint) label_params = { TEXT = textlabel, ALIGNMENT = "LEFT", DATE = tostring(os.date("%Y%m%d")), TIME = tostring(os.date("%H%M%S")), R = 0, G = 0, B = 0, TRANSPARENCY = 90, FONT_HEIGHT = 10, TRANSPARENT_BACKGROUND = 1, YVALUE = price, HINT = texthint }
text = "ppppp "..price[0].close labeldraw(price[0].close, text, "eeeeee") message (tostring(price[0].close)) message (tostring(label_id_text)) end
Метки выставляются в индикаторе, а вы написали скрипт.
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 14:16:33
Общие сведения
Индикаторы технического анализа представляют собой отдельный класс скриптов, которые удовлетворяют определенным условиям и расположены в папке LuaIndicators в каталоге терминала. Если папка отсутствует в каталоге, необходимо создать ее вручную. Список скриптов не доступен из диалога Сервисы / LUA скрипты....
При добавлении нового индикатора на график плагин qlua сканирует папку LuaIndicators, проверяет файлы с расширением lua и luac (скомпилированные скрипты lua) на соответствие следующим требованиям:
определена функция Init,
определена функция OnCalculate,
определена таблица Lua с именем Settings, в которой есть поле «Name».
Пример минимального корректного кода для индикатора:
Settings={} Settings.Name = "minimal" function Init() return 1 end function OnCalculate(index) return 1 end
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 15:56:51
, Вот решение Вашей хотелки - метки в скрипте:
это скрипт:
Код
label_params={["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"]=10,["HINT"]=""}
function labeldraw(price, YYYYMMDD,HMS,textlabel, texthint)
label_params.TEXT = textlabel;
label_params.DATE = YYYYMMDD;
label_params.TIME =HMS;
label_params.YVALUE = price;
label_params.HINT = texthint;
label_id_text = AddLabel(tag, label_params)
end
function main()
local i=0; local _size=0;
while true do
local size= getNumCandles(tag) message (size)
-- if size>_size then price, _, _ = getCandlesByIndex(tiker_id, 0, size - 1, 1) _size=size; end
while size>i do
local t, _, _ = getCandlesByIndex(tag, 0, i, 1)
local z=t[0]; local Hi,Li,Ci,Oi=z.high,z.low,z.close,z.open;
i=i+1;
local Ti=ds:T(i)
YYYYMMDD=100*(100*Ti.year+Ti.month)+Ti.day;
HMS=100*(100*Ti.hour+Ti.min)+Ti.sec;
labeldraw(Hi, YYYYMMDD,HMS,"A", "B")
end
sleep(1)
end
end
function OnInit(p) -- инициализация функции main
sec,clas,int="SBER","QJSIM",5;
tag = "SBER_ID"
ds=CreateDataSource ("sec","QJSIM",5)
while ds==nil do ds,err=CreateDataSource(clas,sec,int); sleep(1); end
end
Пользователь
Сообщений: Регистрация: 12.11.2025
12.11.2025 19:44:56
Добрый день код который вы скинули кладет терминал
у меня скорей всего что то с самим терминалом, пробивал несколько простых скриптов, метки создаются - message (tostring(label_id_text)) выводи id метки
Пользователь
Сообщений: Регистрация: 30.01.2015
12.11.2025 20:06:40
Цитата
gngngn написал: Добрый день код который вы скинули кладет терминал
у меня скорей всего что то с самим терминалом, пробивал несколько простых скриптов, метки создаются - message (tostring(label_id_text)) выводи id метки
Чтобы выводились метки надо установить в скрипте интервал равный интервалу на графике. Установлено 5 минут. идентификатор графика установлен t ag = "SBER_ID" версия QUIK 12.8.0.6 сервер тестовый
Пользователь
Сообщений: Регистрация: 22.02.2023
12.11.2025 22:27:47
Цитата
gngngn написал: у меня скорей всего что то с самим терминалом
Похоже, что так. Попробовал Ваш скрипт, всё работает. Версия 10.1.2.2
Скрытый текст
Код
function labeldraw(price, textlabel, texthint)
label_params = {
TEXT = textlabel,
ALIGNMENT = "LEFT",
DATE = tostring(os.date("%Y%m%d")),
TIME = tostring(os.date("%H%M%S")),
R = 250,
G = 200,
B = 0,
TRANSPARENCY = 90,
FONT_HEIGHT = 12,
TRANSPARENT_BACKGROUND = 1,
YVALUE = price,
HINT = texthint
}
label_id_text = AddLabel(tiker_id, label_params)
end
function main()
tiker_id = "SBER_ID"
price, _, _ = getCandlesByIndex(tiker_id, 0, getNumCandles(tiker_id)-1, 1)
sleep(300)
text = "ppppp "..price[0].close
labeldraw(price[0].close, text, "eeeeee")
PrintVar(price[0].close,label_id_text)
end
--============================================================
function PrintVar(...)
local lin = ""
for i, v in ipairs {...} do
lin = (lin ..(tostring(v)).." ")
end
Print(lin)
end
function Print(v)
PrintDbgStr(tostring(v))
end