В этой теме буду выкладывать переходящие из версии к версии баги QUIK и QLUA. Для себя уже давно составил коллекцию уязвимостей скриптов на QLUA и скриптов QLUA-индикаторов. Для справки: QLUA-индикаторов в QUIK используется отдельная усечённая sandbox-реализация LUA VM.
Итак, вот "код", а точнее, BUG в формате OnePageLesson:
Код
--testBUG#0001
Settings=
{
Name = "test Labels",
ChartID1 = "rima",
line =
{
{
Name = "test Labels",
Color = RGB(0,0,255),
Type = TYPE_LINE,
Width = 1
}
}
}
labelparams1 = {
TEXT = "",
IMAGE_PATH = getScriptPath() .. "заведомо отсутствующий файл и путь",
ALIGNMENT = "RIGHT",
YVALUE = 0,
DATE = "19000101",
TIME = "100000",
R = 0,
G = 0,
B = 255,
TRANSPARENCY = 0,
TRANSPARENT_BACKGROUND = 0,
FONT_FACE_NAME = "Arial",
FONT_HEIGHT = 18,
HINT = ""
}
function Init()
lab1 = AddLabel(Settings.ChartID1, labelparams1)
return 1
end
function OnCalculate(index)
return nil
end
function OnDestroy()
DelAllLabels(Settings.ChartID1)
end
Действия:
при успешно загруженном квике создаю график RIM5 с идентификатором "rima"
накладываю на него этот "индикатор". Индикатор успешно наложился, что подтверждается добавлением подписи на pane чарта. (то, что сам индикатор "пустой" - в данном случае, не суть)
сохраняем настройки окон (и, соответственно индикаторов) в файл info.wnd (стандартными средствами через соответствующий пункт меню)
отключаемся от сервера и выключаем квик
пытаемся вновь запустить квик и, ... ждём. долго так ждём, потом опять ждём. а тем временем, на экране:
старина QUIK нам каГбе намекает, что ждать можно чуть меньше чем (ну вы поняли... :) )) )
-----------------------------------
Пояснения: сам файл скрипта-индикатора находится в стандартном месте, в папке LuaIndicators. -----------------------------------
Возможные причины: Индикаторная "песочница" LUA VM слабо устойчива к параметрам и их корректности в функции AddLabel. И похоже даже использование pcall - не спасает. Кроме того, перед запуском QUIK, а точнее QLUA парсит всю папку и подпапки LuaIndicators, пытаясь запустить каждый, находящийся в ней скрипт (а это уже повод для использования в вирусописательстве). -----------------------------------
Методы устранения: все, абсолютно все параметры передаваемые из пользовательских скриптов обязаны проверяться на валидность прежде чем целиком и полностью заглатывать таблицу (в данном случае). То есть, внутри AddLabel (qlua-side) сперва должна быть проверка на валидность параметров. Уверен, что она у вас итак есть. так что спишем на недочёт. Кроме того, для скриптов просто обязан быть watchdog-таймер (даже в интернет-браузерах это есть и пользователю всегда предлагается отключить тормозной скрипт) -----------------------------------
Советую обратить внимание на фразу, что даже если у нас индикатор не наложен ни на один график НО! присутствует в папке индикаторов - баг (зависание) обеспечен.
делал всё именно так, как написано в скрипте-примере.
и вообще, причём здесь, с ней или без неё? getScriptPath - одинаково доступна и в обычных скриптах и в скриптах-индикаторах. по кр. мере - так сказано в вашей документации.
ваша задача, как разработчиков - обеспечить 100%-ную стабильность квика - дабы он при любом раскладе не зависал от скриптов. если скриптовая система ( в клуа-вской реализации) заведомо не обладает устойчивостью к действиям пользователя то, спрашивается: на хрена козе баян??
sam063rus пишет: делал всё именно так, как написано в скрипте-примере.
и вообще, причём здесь, с ней или без неё? getScriptPath - одинаково доступна и в обычных скриптах и в скриптах-индикаторах. по кр. мере - так сказано в вашей документации.
Просьба уточнить это требуется для воспроизведения описанной ситуации
sam063rus пишет: ваша задача, как разработчиков - обеспечить 100%-ную стабильность квика - дабы он при любом раскладе не зависал от скриптов. если скриптовая система ( в клуа-вской реализации) заведомо не обладает устойчивостью к действиям пользователя то, спрашивается: на хрена козе баян??
Второе предупреждение, следите за языком. Просьба вести культурный диалог.
мне неинтересны ваши предупреждения да и в общем-то диалог с вами. судя по вашим ответам - вы не обладаете необходимой минимальной компетенцией, чтоб отвечать на вопросы пользователей по квику. Советую для начала, набраться опыта - хотя бы до уровня Михаила Булычева (это единственный человек, компетентность которого не вызывает сомнений).
поэтому, вы можете меня смело забанить на этому форуме. я от этого абсолютно ничего не потеряю.
мне неинтересны ваши предупреждения да и в общем-то диалог с вами. судя по вашим ответам - вы не обладаете необходимой минимальной компетенцией, чтоб отвечать на вопросы пользователей по квику. Советую для начала, набраться опыта - хотя бы до уровня Михаила Булычева (это единственный человек, компетентность которого не вызывает сомнений).
поэтому, вы можете меня смело забанить на этому форуме . я от этого абсолютно ничего не потеряю.
Удачи вам, Сергей...
))
Михаил это разработчик, а не сотрудник саппорта. И его работа заключается в разработке. Соответсвенно его появление на форуме абсолютно на добровольной основе. Поэтому Вам в любом случае придется довольствоваться тем что есть. Если заявлено о проблеме, то первый шаг к ее изучению, это попытка воспроизвести. Собственно это правило которого придерживаются специалисты в любой отрасли. В Вашем случае, приведенный код не приводит к зависаниям. Но это потому, что я убрал функцию getScriptPath Если ее оставить то код вообще не запуститься. От сюда и логичный вопрос, как Вы его запускали
в последний раз (третий) говрю, именно так, как и написано в примере кода. то есть ВМЕСТЕ с getscriptpath
p.s. вместе с той же getscripthpath у меня есть и вполне отлично работающий пример. главное, чтобы путь и файл были корректными и РЕАЛЬНО существовали.
так что ещё раз хочу отметить абсолютно нет никакой разницы есть gescriptpath или нет в скрипте.
подразумевается, файл blueline.bmp реально существует и находится в папке LuaIndicators. По крайней мере у меня так)))
----------------------- у меня всё это дело успешно работает в скрипте-индикаторе отображения спреда Best Quotes. Полностью скрипт не могу привести - т.к. не собираюсь дарить его дармоедам (речь разумеется не о вас)
sam063rus пишет: для начала, начнём именно с этого момента. почему у вас именно так. Хотелось бы услышать ваши мысли по этому поводу?
так как у Вас терминал зависает и без функции getScriptPath то скорее всего она не причем. но с ней явно есть какая-то беда. с этим разберемся отдельно, это уже наша внутренняя тема.
могу только дать не большую наводку: если IMAGE_PATH ="" - то так тоже всё работает. т.к. путь не является некорректным или содержащим отсутствующий файл. а является просто пустым, что не считается недопустимым или ошибочным в функции AddLabel.
если далее присвоить IMAGE_PATH эту конструкцию: labelimagepath1 = getScriptPath() .. "\\blueline.bmp" - то, тоже всё работает. Таким образом, тут думаю имеет крайне важное значение порядок инициализации labelparams в AddLabel. То есть если IMAGE_PATH в ней НЕ является пустым и содержит не правильный путь то, именно тогда начинаются "грабли".
sam063rus пишет: если далее присвоить IMAGE_PATH эту конструкцию: labelimagepath1 = getScriptPath() .. "\\blueline.bmp" - то, тоже всё работает. Таким образом, тут думаю имеет крайне важное значение порядок инициализации labelparams в AddLabel. То есть если IMAGE_PATH в ней НЕ является пустым и содержит не правильный путь то, именно тогда начинаются "грабли".
тем, что у меня куча программ СТАБИЛЬНО работает на этой системе и ради каких-то "псевдоновшеств" семёрки и восьмёрки - я пока не собираюсь "перекапывать огород". К тому же XP для меня более чем изучена, а в других системах - куча недосказанностей.
Sergey Gorokhov пишет: так как у Вас терминал зависает и без функции getScriptPath то скорее всего она не причем. но с ней явно есть какая-то беда. с этим разберемся отдельно, это уже наша внутренняя тема.
Явная беда именно с ней. У меня в скриптах индикаторов эта функция использовалась и с версии 6.17 эти индикаторы перестали работать. В 6.16 всё было ок. Вставка message(getScriptPath()) в самое начало скрипта индикатора у меня стабильно воспроизводит проблему.
Sergey Gorokhov пишет: так как у Вас терминал зависает и без функции getScriptPath то скорее всего она не причем. но с ней явно есть какая-то беда. с этим разберемся отдельно, это уже наша внутренняя тема.
Явная беда именно с ней. У меня в скриптах индикаторов эта функция использовалась и с версии 6.17 эти индикаторы перестали работать. В 6.16 всё было ок. Вставка message(getScriptPath()) в самое начало скрипта индикатора у меня стабильно воспроизводит проблему.
Добрый день,
Ошибка будет исправлена в одной из следующих версий программы
Здравствуйте! Также обнаружил, что любой вызов функции getScriptPath() в скрипте индикатора (и вообще любого скрипта, находящегося в папке LuaIndicators) приводит к зависанию терминала при попытке открыть окно добавления индикатора на график, но только в том случае, если вызов getScriptPath() производится не внутри какой-либо другой функции (типа Init(), OnCalculate() и т.п.). Версия терминала 6.16.0.42
Дмитрий пишет: Здравствуйте! Также обнаружил, что любой вызов функции getScriptPath() в скрипте индикатора (и вообще любого скрипта, находящегося в папке LuaIndicators) приводит к зависанию терминала при попытке открыть окно добавления индикатора на график, но только в том случае, если вызов getScriptPath() производится не внутри какой-либо другой функции (типа Init(), OnCalculate() и т.п.). Версия терминала 6.16.0.42
Здравствуйте, Мы в курсе описанной проблемы. Она будет исправлена в одной из следующих версий программы.
Решил не создавать новую тему, эта вполне подходит по названию.
Читаем документацию QLua.chm :
Цитата
SetValue Функция предназначена для установки указанного значения на выбранной линии определенной свечи индикатора: Формат вызова: BOOLEAN SetValue(NUMBER index, NUMBER line_number, NUMBER value) Параметры:
index – индекс свечи;
line_number – номер линии;
value – индекс первой свечки. Первая (самая левая) свечка имеет индекс 0.
Ясно, что value – это не индекс первой свечки, а значение, которое мы устанавливаем. Однако, эта "опечатка" - еще не беда.
Беда в том, что из следующего за этим предложения "Первая (самая левая) свечка имеет индекс 0." легко можно прийти к выводу, что для функций SetValue, GetValue и SetRangeValue нумерация свечей индикатора начинается с 0. В то же время несложный тест показывает, что это не так - нумерация на самом деле начинается с 1. На всякий случай прошу разработчиков разъяснить - это действительно ошибка в документации или же ошибка в работе перечисленных функций? А также впоследствии прошу ее исправить.
Заметил также еще одну особенность работы функций SetValue и SetRangeValue - если с их помощью установить значения индикатора (индикатор рисовал в отдельном окне), которые выходят за границы минимальных/максимальных значений индикатора, установленных ранее с помощью return в OnCalculate, то новые значения в итоге не видны, так как оказываются за границами окна (автомасштабирование на такую смену значений индикатора не реагирует). Прошу исправить это в следующих версиях терминала.
насчёт документации разработчикам уже даже и перестал напоминать :) )) просто отчаился - это бесполезно. Даже тему создал: https://forum.quik.ru/forum8/topic521/ а в ответ - тишина. думаю, недолго осталось - эволюция сделает своё дело - безответственные фирмы - рано или поздно разваливаются...
Дмитрий пишет: это действительно ошибка в документации или же ошибка в работе перечисленных функций?
Здравствуйте, Это ошибка в документации, мы ее обязательно поправим.
Цитата
Дмитрий пишет: если с их помощью установить значения индикатора (индикатор рисовал в отдельном окне), которые выходят за границы минимальных/максимальных значений индикатора, установленных ранее с помощью return в OnCalculate, то новые значения в итоге не видны
Указанная проблема у нас не воспроизводится. Тестировали на терминале версии 6.17.1.17. Если у Вас терминал более старой версии, выполните обновление. Если такой же версии, приведите пример скрипта.
Sergey Gorokhov пишет: Указанная проблема у нас не воспроизводится. Тестировали на терминале версии 6.17.1.17. Если у Вас терминал более старой версии, выполните обновление. Если такой же версии, приведите пример скрипта.
Я тестировал на терминале точно такой же версии (на часовом графике, отключив связь с сервером). Вот пример скрипта:
Код
Settings =
{
Name = "Test",
line =
{
{
Name = "Hour",
Color = RGB(0, 255, 0),
Type = TYPE_HISTOGRAM
}
}
}
function Init()
return 1
end
function OnCalculate(index)
if index == 9 then
for i = 1, 8 do
SetValue(i, 1, i) -- 2) получаем значения индикатора: 1, 2, 3, 4, 5, 6, 7, 8, 18
end
end
SetRangeValue(1, 2, 4, -3) -- 3) получаем значения индикатора: 1, -3, -3, -3, 5, 6, 7, 8, 18
return T(index).hour -- 1) получаем значения индикатора: 10, 11, 12, 13, 14, 15, 16, 17, 18
end
В итоге в (отдельном) окне с индикатором отображается шкала по вертикали от 9 до 24 и все первые 8 значений индикатора не видны.
Дмитрий пишет: Заметил также еще одну особенность работы функций SetValue и SetRangeValue - если с их помощью установить значения индикатора (индикатор рисовал в отдельном окне), которые выходят за границы минимальных/максимальных значений индикатора, установленных ранее с помощью return в OnCalculate, то новые значения в итоге не видны, так как оказываются за границами окна (автомасштабирование на такую смену значений индикатора не реагирует).
Здравствуйте! Удалось ли воспроизвести проблему с помощью приведенного мною скрипта?
Дмитрий пишет: Заметил также еще одну особенность работы функций SetValue и SetRangeValue - если с их помощью установить значения индикатора (индикатор рисовал в отдельном окне), которые выходят за границы минимальных/максимальных значений индикатора, установленных ранее с помощью return в OnCalculate, то новые значения в итоге не видны, так как оказываются за границами окна (автомасштабирование на такую смену значений индикатора не реагирует).
Здравствуйте! Удалось ли воспроизвести проблему с помощью приведенного мною скрипта?
Да, описанное поведение воспроизводится. Ответа по проблеме пока нет.
s_mike@rambler.ru пишет: Было бы неплохо также распространить автомасштабирование на установленные метки.
Михаил, Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Sergey Gorokhov пишет: Указанная проблема у нас не воспроизводится. Тестировали на терминале версии 6.17.1.17. Если у Вас терминал более старой версии, выполните обновление. Если такой же версии, приведите пример скрипта.
Я тестировал на терминале точно такой же версии (на часовом графике, отключив связь с сервером). Вот пример скрипта:
Код
Settings =
{
Name = "Test",
line =
{
{
Name = "Hour",
Color = RGB(0, 255, 0),
Type = TYPE_HISTOGRAM
}
}
}
function Init()
return 1
end
function OnCalculate(index)
if index == 9 then
for i = 1, 8 do
SetValue(i, 1, i) -- 2) получаем значения индикатора: 1, 2, 3, 4, 5, 6, 7, 8, 18
end
end
SetRangeValue(1, 2, 4, -3) -- 3) получаем значения индикатора: 1, -3, -3, -3, 5, 6, 7, 8, 18
return T(index).hour -- 1) получаем значения индикатора: 10, 11, 12, 13, 14, 15, 16, 17, 18
end
В итоге в (отдельном) окне с индикатором отображается шкала по вертикали от 9 до 24 и все первые 8 значений индикатора не видны.
Добрый день,
Описанная ошибка будет исправлена в одной из ближайших версий программы. Приносим извинения за причиненные неудобства.
2. В теле индикатора (за пределами функций) нельзя указывать ничего, кроме "тупых" присваиваний. Кстати, определение функций, с точки зрения луа, это тоже "тупое" присваивание. Иначе индикатор просто не появится в списке. Так строка в теле индикатора log=FilePath.."\"..FileName (кроме присваивания, есть вычисление) не даст появится ему в списке.
если вынести основную мысль и перенести по аналогии то получим:
похоже когда свойству в таблице параметров метки прямо указываешь в качестве значения формулу да ещё и с функцией - QLua этого переварить не может. А когда по отдельности - через буферную переменную - то всё ОК. Что было мной подтверждено выше. Так что тут не только и не столько была проблема с getScriptPath - сколько вот в таких "мелочах" и недосказанностях.
Но, как всегда, истинную причину нам опять не сказали. В общем, всё приходится вытягивать.
Дмитрий пишет: В итоге в (отдельном) окне с индикатором отображается шкала по вертикали от 9 до 24 и все первые 8 значений индикатора не видны.
Описанная ошибка будет исправлена в одной из ближайших версий программы.
А я предлагаю добавить отдельную опцию для индикаторов "Автоматически масштабировать" - иногда требуется видеть только близкие к цене значения индикатора, а далёкие от графика цены - не важны.
Надо делать так, как надо. А как не надо - делать не надо.
Дмитрий пишет: В итоге в (отдельном) окне с индикатором отображается шкала по вертикали от 9 до 24 и все первые 8 значений индикатора не видны.
Описанная ошибка будет исправлена в одной из ближайших версий программы.
А я предлагаю добавить отдельную опцию для индикаторов "Автоматически масштабировать" - иногда требуется видеть только близкие к цене значения индикатора, а далёкие от графика цены - не важны.
s_mike@rambler.ru пишет: Было бы неплохо также распространить автомасштабирование на установленные метки.
Добрый день,
Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам, что реализация пожелания признана потенциально целесообразной. Если по результатам дальнейшего анализа, включающего юридические аспекты, анализ на непротиворечивость с общей политикой компании, никаких возражений не возникнет, мы постараемся включить Ваше пожелание в план доработок при выпуске одной из следующих версий нашего ПО.
Sergey Gorokhov пишет: Указанная проблема у нас не воспроизводится. Тестировали на терминале версии 6.17.1.17. Если у Вас терминал более старой версии, выполните обновление. Если такой же версии, приведите пример скрипта.
Я тестировал на терминале точно такой же версии (на часовом графике, отключив связь с сервером). Вот пример скрипта:
Код
Settings =
{
Name = "Test",
line =
{
{
Name = "Hour",
Color = RGB(0, 255, 0),
Type = TYPE_HISTOGRAM
}
}
}
function Init()
return 1
end
function OnCalculate(index)
if index == 9 then
for i = 1, 8 do
SetValue(i, 1, i) -- 2) получаем значения индикатора: 1, 2, 3, 4, 5, 6, 7, 8, 18
end
end
SetRangeValue(1, 2, 4, -3) -- 3) получаем значения индикатора: 1, -3, -3, -3, 5, 6, 7, 8, 18
return T(index).hour -- 1) получаем значения индикатора: 10, 11, 12, 13, 14, 15, 16, 17, 18
end
В итоге в (отдельном) окне с индикатором отображается шкала по вертикали от 9 до 24 и все первые 8 значений индикатора не видны.
Добрый день,
Описанная в данном инциденте ошибка была исправлена в версии 7.0.0 терминала QUIK. Данная версия терминала была выслана всем брокерам, использующим систему QUIK вчера, 07.10.2015, в установленном порядке передачи обновлений . Рекомендуем Вам дождаться обновления версии терминала у Вашего брокера и обновить Ваш терминал.
Дмитрий написал: Решил не создавать новую тему, эта вполне подходит по названию.
Читаем документацию QLua.chm :
Цитата
SetValue
Функция предназначена для установки указанного значения на выбранной линии определенной свечи индикатора: Формат вызова: BOOLEAN SetValue(NUMBER index, NUMBER line_number, NUMBER value)
Параметры: index – индекс свечи; line_number – номер линии; value – индекс первой свечки. Первая (самая левая) свечка имеет индекс 0.
Ясно, что value – это не индекс первой свечки , а значение, которое мы устанавливаем. Однако, эта "опечатка" - еще не беда.
Беда в том, что из следующего за этим предложения " Первая (самая левая) свечка имеет индекс 0." легко можно прийти к выводу, что для функций SetValue, GetValue и SetRangeValue нумерация свечей индикатора начинается с 0. В то же время несложный тест показывает, что это не так - нумерация на самом деле начинается с 1. На всякий случай прошу разработчиков разъяснить - это действительно ошибка в документации или же ошибка в работе перечисленных функций? А также впоследствии прошу ее исправить.
Заметил также еще одну особенность работы функций SetValue и SetRangeValue - если с их помощью установить значения индикатора (индикатор рисовал в отдельном окне), которые выходят за границы минимальных/максимальных значений индикатора, установленных ранее с помощью return в OnCalculate, то новые значения в итоге не видны, так как оказываются за границами окна (автомасштабирование на такую смену значений индикатора не реагирует). Прошу исправить это в следующих версиях терминала.
Добрый день.
Данная проблема была устранена в версии 7.4.0 терминала QUIK.
swerg написал: Вот бы еще кто-нибудь потрудился пояснить как именно исправлена ошибка с SetValue
Добрый день,
В руководстве пользователя QLUA.chm исправлено описание на следующее: value - устанавливаемое значение. Параметр может иметь значение «nil». Функция возвращает «true» в случае успешного завершения, иначе – «false».