Добрый день! Скажите, а можно ли с помощью луа на графике нарисовать горизонтальную линию, а потом её двигать мышкой вверх вниз... И чтобы скрипт, который её нарисовал, понимал, что линия передвинулась туда-то.
Вообще это реально средствами луа сделать без длл, корутин и прочих приблуд?
Добрый день! Скажите, а можно ли с помощью луа на графике нарисовать горизонтальную линию, а потом её двигать мышкой вверх вниз... И чтобы скрипт, который её нарисовал, понимал, что линия передвинулась туда-то.
Вообще это реально средствами луа сделать без длл, корутин и прочих приблуд?
А где это Вы в LUA видели операторы для рисования чего-нибудь и без DLL?
Николай, думаю по вопросу понятно что я не специалист по луа. И что в нем может быть в квике или не может мне не известно. Ведь нет исчерпывающей документации от авторов квика. Такой документации, по которой можно выяснить ВСЕ что можно сделать на луа в квике.
Для выводов на график нашел только метки, предположил, что вместо текста можно и линию нарисовать. Но это больше к квику, скорее будет относиться, чем к самому луа.
Михаил, а можете дать наводку где копать для моей задачи? Реально указать прямо цену как координату для линии на чарте?
Я могу присоветовать только один путь. Использование вместо инструмента рисования горизонтальной линии самомписного индикатора. Если такой путь устраивает - тогда сделать можно. Мышкой двигать этот уровень будет можно и задавать точное значение тоже. Но это будет не столь удобно как хотелось бы.
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 пишет: или проще. Галку снял в табл, линия стала пунктиром. переставил, галку поставил, линия стало жирной и инициализировалась.
И утром завтрак в постель принесла? ) Можно конечно, если это ОЧЕНЬ хочется. Два рисунка - тонкая и толстая линия. Через winAPI читаем нажатие мышки, меняется лэйбл, новый не только тоньше, но и другого цвета. Отпускаем мышку, на новой позиции рисунок подменяется прежним. Только результат не стоит труда.
Я не знаю как через WinAPI обработать мышь. Если б знал такие вещи не искал бы решения без длл и прочего. Но если предположить, что как-то получится считать, то алгоритм будет такой?: скрипт уловил что меняется координата метки. Кнопка мышки зажата. Жду пока отпустится. Отпустилась. Пускаем в работу новые координаты. Так?
Посмотрел. Чтобы WinAPI обработать, надо подключать библиотеку. А на сколько я понял, подключение библиотеки всегда риск краха квика. Потому и стараюсь пусть криво, но без них.
Сергей, а вы сами пользуетесь подключаемыми библиотеками? Может, зря я так к ним отношусь? Еще смущает то, что у их переделывают под квик, судя по аннотациям. Что-то там прописывают или еще что. А я не разбираюсь, знать не знаю что в ней. И думается, что не безопасно брать, качать и подключать. В данном случае, конечно, событие мыши и не в окне моей таблицы было бы предпочтительнее использовать. Я ведь правильно понимаю, что SetTableNotificationCallback будет работать только тогда, когда событие произошло при нахождении курсора в границах созданной таблицы?
В рабочих скриптах, которые должны работать автономно весь день, стараюсь не использовать сторонние библиотеки ввиду их возможной нестабильной работы с QUIK (часто при выходе новой версии что-то ломается).
Цитата
Viktor MMM пишет: Я ведь правильно понимаю, что SetTableNotificationCallback будет работать только тогда, когда событие произошло при нахождении курсора в границах созданной таблицы?
Только, когда окно таблицы активно.
Надо делать так, как надо. А как не надо - делать не надо.
Понял, спасибо. Поэкспериментирую. Получается, что в момент нажатия на линию, окно могло быть активным. Но в момент отпускания, скорее активным станет окно графика. Да, надо попробовать. Спасибо!
Проще сделать не хоткей, а именно кнопочку "Готово", при нажатии которой будут применены новые координаты линии (т.к. в любом случае после смещения линии надо будет кликать в окно таблицы).
Надо делать так, как надо. А как не надо - делать не надо.
Получается так. Если пошло изменение полосы, то заявки снимаются и она становится неактивной. Нажали готово - и работа подхватывается Как то так. Конечно, блин, с контролем мышки было б шикарно. Порылся в инете, w32 не имеет в составе функций работы с мышью.
Viktor MMM пишет: Получается так. Если пошло изменение полосы, то заявки снимаются и она становится неактивной. Нажали готово - и работа подхватывается Как то так. Конечно, блин, с контролем мышки было б шикарно. Порылся в инете, w32 не имеет в составе функций работы с мышью.
Вы точно готовы выходить за рамки справки по QLUA с таким багажом?:
Цитата
Viktor MMM пишет: Я не знаю как через WinAPI обработать мышь. Если б знал такие вещи не искал бы решения без длл и прочего.
Цитата
Viktor MMM пишет:
Николай, думаю по вопросу понятно что я не специалист по луа. И что в нем может быть в квике или не может мне не известно.
Цитата
Viktor MMM пишет: Посмотрел. Чтобы WinAPI обработать, надо подключать библиотеку. А на сколько я понял, подключение библиотеки всегда риск краха квика.
Не знаю что и ответить. Получается, не готов. Да и подменить метку во время перетаскивания не получается. Так что необходимости в обработке клика отпускания нет.
Хотяяя))) может и есть. Я понял что готового решения нет. Лопатить длл-ки мне не по зубам. Чужую, из непроверенного источника так сходу побоюсь ставить.
Как вариант: если скрипт обнаружил, что метка сместилась, задать некий таймаут ожидания полного перемещения метки, после окончания которого считать, что метка установлена на нужном уровне цены.
Надо делать так, как надо. А как не надо - делать не надо.
Viktor MMM, Удивляете Вы меня, то говорите, что не программист и тут же беретесь за WinApi. Это как не умея водить авто записаться на участие в формуле1. Вам же сказали , что сделать нельзя.
Вопрос появился. Как менять параметры метки? Через SetLabelParams вижу только то, что метка перестает передвигаться вручную. Я менял файл отображение метки. Отображение не изменилось)). Если удалять и ставить новую, то понятно все работает. Зачем тогда SetLabelParams? (True выдает по результату замены)
Хотелось бы, конечно, поменять параметр метки и увидеть на графике результат этих изменений без сокращения дальнейшего функционала. Это вообще возможно?
Viktor MMM пишет: Я менял файл отображение метки. Отображение не изменилось)).
Попробуйте использовать только bmp-файл: с gif бывают проблемы. Также поиграйте с прозрачностью метки (TRANSPARENCY): при замене файла прозрачной становится вся метка полностью.
Надо делать так, как надо. А как не надо - делать не надо.
У меня bmp. Попробую поиграть прозрачностью. Но мне в будущем надо будет менять метку на пунктирную, например. И прозрачность не поможет.
А как вы используете SetLabelParams? Ведь по моему опыту получается, что эта функция не работает. Метка не изменяется, более того становится не перетаскиваемой руками. Что-то не так делаю? Как вы меняете метку по ходу жизни скрипта?
Я думал, что если есть метка и я прописываю SetLabelParams, то после этой функции, если результат true, метка на графике преобразуется с учетом внесенных изменений. Может, разработчики ответят для чего SetLabelParams и как её использовать?
С изменениями разобрался. Осталось самое главное. Почему после применения SetLabelParams метку не возможно передвинуть вручную? Это баг или я не правильно использую? Разарлботчики, ответьте, пожалуйста.
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