Рисовать линию на графике

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

Вообще это реально средствами луа сделать без длл, корутин и прочих приблуд?
 
Вообще нераельно
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Viktor MMM пишет:
Цитата
Добрый день!
Скажите, а можно ли с помощью луа на графике нарисовать горизонтальную линию, а потом её двигать мышкой вверх вниз... И чтобы скрипт, который её нарисовал, понимал, что линия передвинулась туда-то.

Вообще это реально средствами луа сделать без длл, корутин и прочих приблуд?
А где это Вы в LUA видели операторы для рисования чего-нибудь и без DLL?
 
Михаил, спасибо, понял.

Николай, думаю по вопросу понятно что я не специалист по луа. И что в нем может быть в квике или не может мне не известно. Ведь нет исчерпывающей документации от авторов квика. Такой документации, по которой можно выяснить ВСЕ что можно сделать на луа в квике.

Для выводов на график нашел только метки, предположил, что вместо текста можно и линию нарисовать. Но это больше к квику, скорее будет относиться, чем к самому луа.

Михаил, а можете дать наводку где копать для моей задачи? Реально указать прямо цену как координату для линии на чарте?
 
Я могу присоветовать только один путь. Использование вместо инструмента рисования горизонтальной линии самомписного индикатора. Если такой путь устраивает - тогда сделать можно. Мышкой двигать этот уровень будет можно и задавать точное значение тоже. Но это будет не столь удобно как хотелось бы.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Индикатор:
Код
Settings = {
  Name = 'HLine',
  Value = 0,
  line = {
    {
      Name = 'HLine',
      Type = TYPE_LINE,
      Width = 2
    }
  }
}

function Init()
  return 1
end

function OnCalculate(index)
  return Settings.Value
end
Перемещение линии через настройки индикатора. Хоть мышкой двигать нельзя, но можно задать точный уровень цены, что удобнее стандартной линии.
Значение линии можно считывать в своём скрипте.
Надо делать так, как надо. А как не надо - делать не надо.
 
Спасибо большое! Сейчас поколдую с метками и перейду к индикатору. Никогда ими не занимался, разбираться надо будет..
Спасибо!
 
Можно создать метку в виде горизонтальной линии. И в цикле опрашивать состояние метки функцией GetLabelParams, и проверять, не изменился ли параметр YVALUE.
Тогда можно будет двигать линию мышкой.

Но сразу о багах:
1) метку нужно обязательно создавать без подписи (TEXT), иначе она будет визуально позиционироваться не там, где нужно, и при масштабировании графика смещаться;
2) функция GetLabelParams возвращает таблицу с названиями параметров в нижнем регистре, тогда как эти параметры в функции AddLabel задаются в верхнем регистре;
3) функция GetLabelParams возвращает значения всех параметров в строковом виде, несмотря на то, что часть параметров типа number.
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель, спасибо!
Все это сейчас понял кроме того что строковые данные)
Зашел чтобы отписаться что все решил метками, а вы уже разложили мое решение)
И с нижним регистром разобрался. И что текста не надо))
И линию нарисовал. В общем, победил.
Линия есть, позиционируется точно, двигается мышкой, никаких длл и прочего.
Спасибо!!!
 
один мааааленький косяк.
Координата меняется сразу, не ждет отпускания мышки.
Может и не косяк, но.. как то не нравится мне это. дернется рука и.. нечего дергаться)
 
Цитата
Viktor MMM пишет:
Координата меняется сразу, не ждет отпускания мышки.
Это да, есть такое...
Цитата
Viktor MMM пишет:
Линия есть, позиционируется точно
Что значит "точно"? Вот у меня "точно" никак не получается: с шагом цены не совпадает ))
Надо делать так, как надо. А как не надо - делать не надо.
 
аааа, ну шаг я не проверял.
По отпусканию мыши есть мысли?
Или придется дублировать хоткеем перенос?

Объясню. Проблемы шага цены, рывков и прочего решились бы событием "метка поставлена".
Тогда программно метку можно было б привязать к шагу. Ну и инициализировать изменение.
Если мышь не доступна, то на ум идет установить хоткей. Нажимаешь его скрипт ждет отпускания, чтобы инициализировать новый уровень/уровни линий.  
Есть такой функционал? вроде какие то события были.. надо поизучать.
 
или проще. Галку снял в табл, линия стала пунктиром. переставил, галку поставил, линия стало жирной и инициализировалась.
 
Цитата
Viktor MMM пишет:
аааа, ну шаг я не проверял.
По отпусканию мыши есть мысли?
Или придется дублировать хоткеем перенос?

Объясню. Проблемы шага цены, рывков и прочего решились бы событием "метка поставлена".
Тогда программно метку можно было б привязать к шагу. Ну и инициализировать изменение.
Если мышь не доступна, то на ум идет установить хоткей. Нажимаешь его скрипт ждет отпускания, чтобы инициализировать новый уровень/уровни линий.
Есть такой функционал? вроде какие то события были.. надо поизучать.
Обрабатывать нажатие мышки через winAPI
 
Цитата
Viktor MMM пишет:
или проще. Галку снял в табл, линия стала пунктиром. переставил, галку поставил, линия стало жирной и инициализировалась.
И утром завтрак в постель принесла? )
Можно конечно, если это ОЧЕНЬ хочется. Два рисунка - тонкая и толстая линия. Через winAPI читаем нажатие мышки, меняется лэйбл, новый не только тоньше, но и другого цвета. Отпускаем мышку, на новой позиции рисунок подменяется прежним. Только результат не стоит труда.
 
Цитата
Старатель пишет:
Цитата
Viktor MMM пишет:
Линия есть, позиционируется точно
Что значит "точно"? Вот у меня "точно" никак не получается: с шагом цены не совпадает ))
Корректировка полученных координат по шагу цены и возврат лейблу скорректированных.
 
Я не знаю как через WinAPI обработать мышь. Если б знал такие вещи не искал бы решения без длл и прочего.
Но если предположить, что как-то получится считать, то алгоритм будет такой?:
скрипт уловил что меняется координата метки. Кнопка мышки зажата. Жду пока отпустится. Отпустилась. Пускаем в работу новые координаты.
Так?
 
Посмотрел. Чтобы WinAPI обработать, надо подключать библиотеку. А на сколько я понял, подключение библиотеки всегда риск краха квика. Потому и стараюсь пусть криво, но без них.
 
Тогда создаёте окно CreateWindow, рисуете в нём нужные кнопочки и отслеживаете нажатие SetTableNotificationCallback.
Надо делать так, как надо. А как не надо - делать не надо.
 
Сергей, а вы сами пользуетесь подключаемыми библиотеками? Может, зря я так к ним отношусь?
Еще смущает то, что у их переделывают под квик, судя по аннотациям. Что-то там прописывают или еще что. А я не разбираюсь, знать не знаю что в ней. И думается, что не безопасно брать, качать и подключать.
В данном случае, конечно, событие мыши и не в окне моей таблицы было бы предпочтительнее использовать.
Я ведь правильно понимаю, что SetTableNotificationCallback будет работать только тогда, когда событие произошло при нахождении курсора в границах созданной таблицы?
 
В рабочих скриптах, которые должны работать автономно весь день, стараюсь не использовать сторонние библиотеки ввиду их возможной нестабильной работы с QUIK (часто при выходе новой версии что-то ломается).
Цитата
Viktor MMM пишет:
Я ведь правильно понимаю, что SetTableNotificationCallback будет работать только тогда, когда событие произошло при нахождении курсора в границах созданной таблицы?
Только, когда окно таблицы активно.
Надо делать так, как надо. А как не надо - делать не надо.
 
Понял, спасибо. Поэкспериментирую.
Получается, что в момент нажатия на линию, окно могло быть активным. Но в момент отпускания, скорее активным станет окно графика.
Да, надо попробовать.
Спасибо!
 
Проще сделать не хоткей, а именно кнопочку "Готово", при нажатии которой будут применены новые координаты линии (т.к. в любом случае после смещения линии надо будет кликать в окно таблицы).
Надо делать так, как надо. А как не надо - делать не надо.
 
Получается так.
Если пошло изменение полосы, то заявки снимаются и она становится неактивной. Нажали готово - и работа подхватывается
Как то так.
Конечно, блин, с контролем мышки было б шикарно.
Порылся в инете, w32 не имеет в составе функций работы с мышью.
 
Цитата
Viktor MMM пишет:
Порылся в инете, w32 не имеет в составе функций работы с мышью.
w32 - это Win32API?
или что?
 
Тут нашел.
 
Цитата
Viktor MMM пишет:
Получается так.
Если пошло изменение полосы, то заявки снимаются и она становится неактивной. Нажали готово - и работа подхватывается
Как то так.
Конечно, блин, с контролем мышки было б шикарно.
Порылся в инете, w32 не имеет в составе функций работы с мышью.
Ну так "поройтесь в инете" на предмет именно winAPI, вот тут например
https://msdn.microsoft.com/en-us/library/windows/desktop/ff468877(v=vs.85).aspx
и добавьте в w32, библиотека вроде в исходном коде есть по вашей ссылке.

Вы точно готовы выходить за рамки справки по QLUA с таким багажом?:

Цитата
Viktor MMM пишет:
Я не знаю как через WinAPI обработать мышь. Если б знал такие вещи не искал бы решения без длл и прочего.
Цитата
Viktor MMM пишет:

Николай, думаю по вопросу понятно что я не специалист по луа. И что в нем может быть в квике или не может мне не известно.
Цитата
Viktor MMM пишет:
Посмотрел. Чтобы WinAPI обработать, надо подключать библиотеку. А на сколько я понял, подключение библиотеки всегда риск краха квика.
 
Не знаю что и ответить. Получается, не готов.
Да и подменить метку во время перетаскивания не получается. Так что необходимости в обработке клика отпускания нет.  
 
Хотяяя))) может и есть.
Я понял что готового решения нет. Лопатить длл-ки мне не по зубам. Чужую, из непроверенного источника так сходу побоюсь ставить.
 
Как вариант: если скрипт обнаружил, что метка сместилась, задать некий таймаут ожидания полного перемещения метки, после окончания которого считать, что метка установлена на нужном уровне цены.
Надо делать так, как надо. А как не надо - делать не надо.
 
придется кликать по таблице. Сдвинулась - деактивирован уровень. Кликнул на ячейку - отлипло.
Таймауты может и внесу.
 
Viktor MMM,
Удивляете Вы меня,
то говорите, что не программист и тут же беретесь за WinApi.
Это как не умея водить авто записаться на участие в формуле1.
Вам же сказали , что сделать нельзя.
 
Цитата
Старатель пишет:
Можно создать метку в виде горизонтальной линии.
метку нужно обязательно создавать без подписи (TEXT)
А как без текста сделать метку в виде линии? Использовать файл с изображением?
 
Ну да, графическую метку. Потому что текстовую линию у меня не получилось расположить строго по заданной цене.
Надо делать так, как надо. А как не надо - делать не надо.
 
paint в помощь, bmp или gif и красота.
 
Если надо рядом с линией и текст написать, то способ тоже есть.
 
Две метки?
Надо делать так, как надо. А как не надо - делать не надо.
 
Да. Вторую по тем-же координатам. Только текстовую. И таскать её за первой. Пока все гладко работает. Понятно что коряво, но приемлемо.
 
Вопрос появился.
Как менять параметры метки?
Через SetLabelParams вижу только то, что метка перестает передвигаться вручную.
Я менял файл отображение метки. Отображение не изменилось)). Если удалять и ставить новую, то понятно все работает.
Зачем тогда SetLabelParams? (True выдает по результату замены)

Хотелось бы, конечно, поменять параметр метки и увидеть на графике результат этих изменений без сокращения дальнейшего функционала. Это вообще возможно?
 
Цитата
Viktor MMM пишет:
bmp или gif и красота.
Цитата
Viktor MMM пишет:
Я менял файл отображение метки. Отображение не изменилось)).
Попробуйте использовать только bmp-файл: с gif бывают проблемы.
Также поиграйте с прозрачностью метки (TRANSPARENCY): при замене файла прозрачной становится вся метка полностью.
Надо делать так, как надо. А как не надо - делать не надо.
 
У меня bmp.
Попробую поиграть прозрачностью.
Но мне в будущем надо будет менять метку на пунктирную, например. И прозрачность не поможет.

А как вы используете SetLabelParams?
Ведь по моему опыту получается, что эта функция не работает. Метка не изменяется, более того становится не перетаскиваемой руками. Что-то не так делаю?
Как вы меняете метку по ходу жизни скрипта?

Я думал, что если есть метка и я прописываю SetLabelParams, то после этой функции, если результат true, метка на графике преобразуется с учетом внесенных изменений.
Может, разработчики ответят для чего SetLabelParams и как её использовать?
 
 С изменениями разобрался.
Осталось самое главное.
Почему после применения  SetLabelParams метку не возможно передвинуть вручную?
Это баг или я не правильно использую? Разарлботчики, ответьте, пожалуйста.
 
интерактивный индикатор
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Простите за детский вопрос. Не получается вставить метку на график:

label_params={}
label_params.TEXT="ТECT"
label_params.IMAGE_PATH=""
label_params.ALIGNMENT="LEFT"
label_params.DATE=20151207
label_params.TIME=111400
label_params.YVALUE=80840
label_params.TRANSPARENCY=50
label_params.TRANSPARENT_BACKGROUND=0
label_params.HINT=""
label_params.R=255
label_params.G=0
label_params.B=0
label_params.FONT_FACE_NAME="Arial"
label_params.FONT_HEIGHT='18'

x=AddLabel("RIZ5", label_params)
message(tostring(x))

chart_tag прописан. Функция к сожалению ошибку не комментирует. Что не так делаю?
 
Добрый день.

Проверили, код работает.
Возможно вы не указали идентификатор в настройках графика. Там должно быть прописано RIZ5, согласно вашему коду.
 
Да нашел. Не в то место я его прописывал.
Спасибо.
 
Цитата
Старатель написал:
Индикатор:
Код
  Settings  =  {
  Name  =   'HLine' ,
  Value  =   0 ,
  line  =  {
    {
      Name  =   'HLine' ,
      Type  =  TYPE_LINE,
      Width  =   2 
    }
  }
}

 function   Init ()
   return   1 
 end 

 function   OnCalculate (index)
   return  Settings.Value
 end   
Перемещение линии через настройки индикатора. Хоть мышкой двигать нельзя, но можно задать точный уровень цены, что удобнее стандартной линии.
Значение линии можно считывать в своём скрипте.
Добрый день


Могу передавать индикатору (на примере горизонтальной линии) не только значение самой линии, но и ее цвет?


вроде того:

Код
function OnCalculate(index)
  Value = 74850.0
  Color = RGB(0, 128, 0)
  
  return Value, Color
end
Страницы: 1
Читают тему
Наверх