QLua-Indicators SandBox Internals

Страницы: 1
RSS
QLua-Indicators SandBox Internals
 
Как уже много раз было сказано и подтверждено разработчиками - виртуальные машины, используемые для QLua-скриптов и QLua-индикаторов - разные. В том числе, у них разный состав глобальных переменных, функций и т. п.

Ниже, с помощью простенького скрипта запущенного в режиме фейк-индикатора мне удалось получить более полный (по сравнению со штатной документацией) список всего того, что поддерживается в окружении QLua-Indicators VM:
Скрытый текст
Среди этого списка - есть некоторые вещи, которые я хотел бы прояснить у разработчиков:
  1. Что такое function getQuoteLevel2Ex . У нас, как бы ведь уже есть не "Ex"
  2. Что такое function newproxy
 
версия QUIK: 6.17.1.17
 
Цитата
Код
 Что такое function getQuoteLevel2Ex . У нас, как бы ведь уже есть не "Ex"
Это аналог с некоторыми изменениями. Прироста производительности не даёт. Не документирована и потому к использованию не рекомендуется.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
это понятно. но хотелось бы подробностей её введения, а также насчёт второй функции.
 
насчёт newproxy:
ответ похоже найден:
http://lua-users.org/wiki/HiddenFeatures
http://stackoverflow.com/questions/23592388/create-new-empty-userdata-from-pure-lua
 
как известно - всё познаётся в сравнении. Поэтому, расширил своё мини-"исследование". Ниже приведена таблица различий на уровне двух виртуальных машин (скриптов и скриптов-индикаторов).
Разумеется, эта таблица - не полная и не может быть полной по определению.
Внимание! Те функции, переменные, константы и т. п., которые работают в обоих виртуальных машинах (и в скриптах и в скриптах-индикаторах) - НЕПОКАЗАНЫ!
Скрытый текст

Скрытый текст
Видно, что основное отличие выразилось в отсутствии доступа к классу QTable из скриптов-индикаторов, а также отсутствии функции "sleep". А также в отсутствии "знаменитого" CreateDataSource. При том, что все остальные функции - вполне доступны: можно создавать/управлять метками, работать с такими функциями, как getLinesCount, getCandleByIndex, как из индикаторов - так и из скриптов.

Ещё топик на родственную тему: https://forum.quik.ru/forum10/topic518/
 
И, кстати, попутно выяснилось о существовании функции SettableCallback (не путать с SettableNotificationCallback) в скриптах QLua VM. Что-то я её тоже не встречал в документации...
 
Кроме того, в таблицах не высветились штатные коллбеки скриптов QLua-script VM: OnInit,OnAllTrade и т.п. Но, это уже тема для отдельного топика...
 
Цитата
sam063rus пишет:
Кроме того, в таблицах не высветились штатные коллбеки скриптов QLua-script VM : OnInit,OnAllTrade и т.п. Но, это уже тема для отдельного топика...
забегая вперёд- можно сказать, что насчёт этого нет на самом деле никаких противоречий - бо как запись об этих функциях в глобальной таблице ещё не существует, потому как они ещё не были созданы пользователем. На то они и коллбеки)) Но всё можешь измениться - если их прописать в скрипте.
 
Ещё интересный материал по теме: http://forum.qlua.org/post1395.html#p1395
 
Очередное небольшое "открытие":
Итак,

Действия:

1. Сделал тестовый скриптик и попытался наложить на график. Саму библиотеку qte - положил вместе с индикатором.

Скрытый текст

Result
-> Не прокатило, - он даже не появился в списке индикаторов.

2. Немного "допилил" скриптик - разместил "пути" и require - в функции Init()
Скрытый текст
Result -> скрипт запустился, попутно выяснилось следующие вещи:
  1. Все эти Ваши м-м э-э... так называемые графики и индикаторы-порисульки - работают в основном потоке квика
  2. Чем больше Вы на "открываете" графиков и таблиц, чем больше наложите индикаторов - тем медленее будет Ваш квик.
  3. Получается, имеет значение место расположения "путей" и функции require.
3. Вернул опять - всё, как было. Поместил "пути" и require в самое начало скрипта
см. пример из "1"-ой версии

Result -> старина квик - не вынес всего этого (нувыпоняли...  :) ) )
Он просто завис и даже экран побелел :) ))

Скорей всего: проблема в том, что по великой "умности" разработчиков - своей функцией getScriptPath - они нае... (перемудрили) самих себя. Всякий раз - она выдаёт совершенно разные пути. Причём, весьма "неисповедимые".

--------------------

Далее, исследование продолжать не стал - т.к. то, что нужно уже выяснил: индикаторы работают в одном потоке с квиком, есть ли разница где находится require или нет - уже нестоль важно (для меня) - да и с getScriptPath - похоже - никто не спешит разбираться.
 
Начинаем разбираться с getScriptPath()
Итак, "поехали"

Такой код - вешает намертво квик - он даже не может толком загрузиться. Бо как начинает выполнение скриптов индикаторов сразу же при своей загрузке:
Скрытый текст
ок! "Спрячем" getScriptPath() в коллбек Init():
Скрытый текст
Скрипт благополучно и правильно отобразил путь


Ладно, удалим индикатор и по новой наложим на график.
Что ж, и так всё работает.

Вернём getScriptPath обратно наверх. (см. первый вариант кода)
не выключая квик, удалим и по новой наложим индикатор

И тут, разгадка:

Код
 E@
O:\Program Files\smth\LuaIndicators\testGetscriptPath
ещё раз переналожим индикатор:

Код
EЃ

O:\Program Files\smth\LuaIndicators\testGetscriptPath
 
Таким образом, при работе getScripthPath на выходе, собирается какой-то случайный мусор.
 
Причина такого непредсказуемого "поведения" - для меня известна...
Однако, понадеемся услышать мнение на этот счёт от разработчиков (с обязательным отражением в документации).
Итак, разработчики - You are Welcome! :))
 
p.s. как закончу с "песочницей" QLUA-Indicators VM -> примусь за QLUA-script VM
 
Про глюки с getScriptPath() уже известно (обсуждалось в Вашей же теме):
https://forum.quik.ru/messages/forum10/message4547/topic335/#message4547
Цитата
Sergey Gorokhov пишет:
Цитата
Дмитрий пишет:
Здравствуйте!
Также обнаружил, что любой вызов функции getScriptPath() в скрипте индикатора (и вообще любого скрипта, находящегося в папке LuaIndicators) приводит к зависанию терминала при попытке открыть окно добавления индикатора на график, но только в том случае, если вызов getScriptPath() производится не внутри какой-либо другой функции (типа Init(), OnCalculate() и т.п.). Версия терминала 6.16.0.42
Здравствуйте,
Мы в курсе описанной проблемы.
Она будет исправлена в одной из следующих версий программы.
 
Цитата
Дмитрий пишет:
уже известно (обсуждалось в Вашей же теме):
пока ничего ОФФИЦИАЛЬНО неизвестно. То, что они там в курсе - не объясняет причины.
 
Лично меня - не устраивает извечная констатация факта и очередные "приносим свои извинения". Мне нужна - причина. + толковая, соответствующая реальной жизни - документация.
 
ещё одна небольшая подробность:

та же функция но, только в QLUA-script VM - ведёт себя абсолютно стабильно:

Код
message(getScriptPath())

is_run = true

function main()

  while is_run do
    sleep(100)
  end

end

function OnStop()

is_run = false
return 1000
end
 
Что говорит о том, что эти функции - абсолютно разные физически и имеют лишь общим - только название.
 
Цитата
sam063rus пишет:
ещё одна небольшая подробность:

та же функция но, только в QLUA-script VM - ведёт себя абсолютно стабильно:
Код
 message(getScriptPath())

is_run = true

function main()

  while is_run do
    sleep(100)
  end

end

function OnStop()

is_run = false
return 1000
end
  
Что говорит о том, что эти функции - абсолютно разные физически и имеют лишь общим - только название.
Это говорит лишь о том, что скрипты и индикаторы исполняются в разных средах. Что, в общем-то, должно быть очевидно.

Ваш бы энергию да в мирных целях...
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru пишет:
Что, в общем-то, должно быть очевидно.
да вот, что-то мне это теперь уже особо не очевидно бо как  и там и там:
1. функция загружена
2. инициализирована
3. находится не в коллбеке
Понятное дело, что машины разные и пути папок, которые транслирует функция разные - но, в одном случае, она "мусорит", а в другом нет.
 
1. Не стоит размещать в папке LuaIndicators никаких файлов, кроме самих индикаторов, поскольку при добавлении любого индикатора каждый файл в этой папке сканируется минимум два раза:
Цитата
При добавлении нового индикатора на график плагин qlua сканирует папку LuaIndicators, проверяет файлы с расширением lua и luac (скомпилированные скрипты lua) [брехня! проверяются все файлы. Примеч. автора, т.е. меня] на соответствие следующим требованиям
2. Не стоит делать в теле индикатора (вне функций) что-либо, кроме объявления таблицы Settings, поскольку эти действия также будут выполняться минимум два раза при добавлении любого индикатора. Лучше сделать инициализацию в Init()

3. Если очень хочется, то вместо getScriptPath() можно использовать
Код
getWorkingFolder().."\\LuaIndicators"
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель,
или в кратце - такая "песочница" - пока ничего кроме очередных глюков не принесла. -> скрипты весьма нестабильны, полного доступа к qchart - они не представляют, а только "дразнят". Запускаются "автоматом", при старте квика (чем не основа для вирусописательства?). Ну и спрашивается, "на хрена козе баян?"
 
Цитата
sam063rus пишет:
Запускаются "автоматом", при старте квика (чем не основа для вирусописательства?)
Вы можете привести конкретный пример скрипта, который не будучи добавленным на график автоматически запускается при старте QUIK?
Надо делать так, как надо. А как не надо - делать не надо.
 
Выше, глагол "добавлении" используется в настоящем времени несовершенного вида, т.е. указанные действия выполняются в момент добавления индикатора на график.
Надо делать так, как надо. А как не надо - делать не надо.
 
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель пишет:
Цитата
sam063rus пишет:
Запускаются "автоматом", при старте квика (чем не основа для вирусописательства?)
Вы можете привести конкретный пример скрипта, который не будучи добавленным на график автоматически запускается при старте QUIK?
специально для Вас, потратил время:
Скрытый текст
Индикатор - не добавлен, но присутствует в списке индикаторов. Квик, просил передать, что он висит до сих пор:)))

ну, или, если без getScriptPath, а просто голый мессэдж:
Скрытый текст
 
Цитата
Старатель пишет:
Только не при старте QUIK, а при добавлении индикаторов. Надеюсь это пофиксят.
вы попробуйте - и сами убедитесь. просто добавьте мой последний скриптик и в системных сообщениях - всё увидите:)))

версия 6.17.1.17

я уже, как 3 месяца об этом говорю - никто не слышит.
 
как видите, в "индикаторе", ни на графике - нигде - нет привязки ни кодному источнику данных/либо графику - но он всё-равно запускается. И причём, несколько раз:

Код
testBug#00002
testBug#00002
testBug#00002
testBug#00002
testBug#00002
testBug#00002
testBug#00002
testBug#00002
testBug#00002
testBug#00002
testBug#00002
 
Цитата
sam063rus пишет:
Индикатор - не добавлен, но присутствует в списке индикаторов.
т.е. - я вообще ничего не делал: я просто кинул его в папку LuaIndicators и включил квик - в итоге, не будучи ни на одном графике - он сам запустился.
 
Цитата
sam063rus пишет:
т.е. - я вообще ничего не делал: я просто кинул его в папку LuaIndicators и включил квик - в итоге, не будучи ни на одном графике - он сам запустился.
Да, действительно. Если на графике добавлен хоть один Lua-индикатор, то при старте QUIK будут запускаться все скрипты из папки LuaIndicators. Причём столько раз, сколько открыто Lua-индикаторов. Это ещё один повод, чтобы вне колбеков ничего лишнего не размещать.
Цитата
sam063rus пишет:
но он всё-равно запускается. И причём, несколько раз

Очевидно, у вас добавлено несколько Lua-индикаторов на графиках.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель пишет:
Причём столько раз, сколько открыто Lua-индикаторов.
поверьте - у меня индикаторов - много больше чем 11 на всех вкладках. конкретно на той вкладке - которая последняя (перед предыдущем отключением квика) - там вообще нет индикаторов - только окно системных сообщений.
 
Тогда можно предположить следующий алгоритм. Из документации:
Цитата
При выборе пункта меню Настройки/Сохранить настройки в файл, сохраняются все значения из таблицы Settings в wnd-файл.
При загрузке настроек из файла, модуль qchart получает от модуля qlua список индикаторов и автоматически создает индикатор по его имени.
При этом имя самого файла Lua-индикатора не сохраняется. Поэтому при создании индикатора последовательно перебираются файлы из папки LuaIndicators, пока не будет найден индикатор с именем Settings.Name.
Поиск, очевидно, происходит путём их запуска.
Надо делать так, как надо. А как не надо - делать не надо.
Страницы: 1
Читают тему
Наверх