Установка отметок на графике через скрипт

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

Вопрос - как это можно сделать и можно ли вообще?
Или где можно почитать об этом поподробнее?
 
Добрый день,

Добавить метку на график по нужным условиям можно с помощью функции "AddLabel". Более подробно о функции можно ознакомиться в документации из раздела "Функции для работы с метками":
http://arqatech.com/upload/iblock/022/quik_lua.zip
Также, примеры функций расчета индикаторов терминала QUIK можно скачать по ссылке:
ftp://ftp.quik.ru/public/INDICATORS.zip
 
Установил параметры метки следующим образом:

label={
TEXT="Тарам",
FONT_HEIGHT=25,
R=255,
G=255,
B=0,
Yvalue=0,
datetime=0
}

Пытаюсь поставить метку по условию:

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
 
Цитата
Егор Масалкин написал:
Ругается на label.Yvalue=t1.close; мол attempt to index global 't1' (a number value)
Значение  label.Yvalue должно являться строкой, в то время как у Вас возвращается число.
 
Цитата
Stanislav Tvorogov написал:
Цитата
Егор Масалкин   написал:
Ругается на 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 как к таблице, на что он и ругается.
 
Цитата
SDL написал:
Цитата
Stanislav Tvorogov   написал:
Цитата
Егор Масалкин   написал:
Ругается на 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-координата тоже...  
 
Не знаю как в последних версиях квика, но раньше эти скриптовые метки жутко тормозили терминал.
 
Цитата
lergen написал:
Не знаю как в последних версиях квика, но раньше эти скриптовые метки жутко тормозили терминал.
И всё-таки, можете подсказать по теме? Что я сделал не так, что метки у меня не отображаются?
 
Цитата
Егор Масалкин написал:
Цитата
lergen   написал:
Не знаю как в последних версиях квика, но раньше эти скриптовые метки жутко тормозили терминал.
И всё-таки, можете подсказать по теме? Что я сделал не так, что метки у меня не отображаются?
Добрый день,

Просьба прислать полный код исправленного скрипта.
 
Если я ничего не путаю, то метки всегда ставятся только за счет какого-то графического файлика, который собственно и отображается на графике.

А у вас этог параметр IMAGE_PATH не указан
 
Переделал скрипт.
Теперь он должен возле каждого пересечения графика ставить метку Icon.jpg, которая представляет собой оранжевый квадратик, и считает количество таких пересечений.
Вот только количество пересечений он считает и выводит, а метки на графике не появляются... Что я делаю не так?

label={
text="Тарам";
IMAGE_PATH=getScriptPath().."/Icon.jpg";
FONT_HEIGHT=25,
Yvalue=0,
date=0;
time=0;
}

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
 
Здравствуйте,
В свечках нет таких параметров date и time (см документацию)
Там есть только параметр datetime
 
Хм, однако, в метках есть только параметры date и time... как можно datetime разделить на date и time, если у datetime отдельно секунды, часы, минуты и прочее, а у метки эти параметры объединены?
 
Цитата
Егор Масалкин написал:
если у datetime отдельно секунды, часы, минуты и прочее, а у метки эти параметры объединены?

Взять отдельно секунды, часы, минуты и прочее и объединить
 
Цитата
Sergey Gorokhov написал:
Цитата
Егор Масалкин   написал:
если у datetime отдельно секунды, часы, минуты и прочее, а у метки эти параметры объединены?
Взять отдельно секунды, часы, минуты и прочее и объединить
И по какому принципу они объединяются?
Вроде простейший инструмент, но почему-то требуется множество дополнительных действий чтобы поставить метку на график...
 
Цитата
Егор Масалкин написал:
Цитата
Sergey Gorokhov   написал:
Цитата
Егор Масалкин   написал:
если у datetime отдельно секунды, часы, минуты и прочее, а у метки эти параметры объединены?
Взять отдельно секунды, часы, минуты и прочее и объединить
И по какому принципу они объединяются?
Вроде простейший инструмент, но почему-то требуется множество дополнительных действий чтобы поставить метку на график...

Формат времени для меток это строка HHMMSS.
datetime это таблица содержащая отдельно часы минуты и секунды.
Вам нужно их взять из этой таблицы и просто объединить как строку.
time = x.datetime.hour..x.datetime.min..x.datetime.sec

Почему так, объясняется тем что метки появились задолго до появления Lua в терминале.
И тек исторически сложилось, что у них формат даты времени у них именно такой.
Возможно, в будущем это как-то изменится, но сейчас работает именно так.
 
день день. Помоги решить вопрос
на графике не отображается метка (текст)
причем при проверки
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
}

label_id_text = AddLabel(tiker_id, label_params)

end

function main()
tiker_id = "SBER_ID"

number_of_candles = getNumCandles(tiker_id)
price, _, _ = getCandlesByIndex(tiker_id, 0, number_of_candles - 1, 1)  
sleep(300)

text = "ppppp "..price[0].close
labeldraw(price[0].close, text, "eeeeee")
message (tostring(price[0].close))
message (tostring(label_id_text))
end
 
версия терминала 10.0.1.18
 
Цитата
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
}

label_id_text = AddLabel(tiker_id, label_params)

end

function main()
tiker_id = "SBER_ID"

number_of_candles = getNumCandles(tiker_id)
price, _, _ = getCandlesByIndex(tiker_id, 0, number_of_candles - 1, 1)  
sleep(300)

text = "ppppp "..price[0].close
labeldraw(price[0].close, text, "eeeeee")
message (tostring(price[0].close))
message (tostring(label_id_text))
end
Метки выставляются в индикаторе, а вы написали скрипт.  
 
Общие сведения

Индикаторы технического анализа представляют собой отдельный класс скриптов,  которые удовлетворяют определенным условиям и расположены в папке 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
 
gngngn,
Вот решение Вашей хотелки - метки в скрипте:




это скрипт:
Код
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
 
Добрый день
код который вы скинули кладет терминал

у меня скорей всего что то с самим терминалом, пробивал несколько простых скриптов, метки создаются - message (tostring(label_id_text)) выводи id метки
 
Цитата
gngngn написал:
Добрый день
код который вы скинули кладет терминал

у меня скорей всего что то с самим терминалом, пробивал несколько простых скриптов, метки создаются - message (tostring(label_id_text)) выводи id метки
Чтобы выводились метки надо установить в скрипте интервал равный интервалу на графике.  Установлено 5 минут.
идентификатор графика установлен t ag = "SBER_ID"
версия QUIK 12.8.0.6  сервер тестовый
Страницы: 1
Читают тему
Наверх