Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
Пользователь
Сообщений: Регистрация: 04.03.2015
14.06.2016 16:44:28
Здравствуйте. Подскажите пожалуйста, как осуществлять отладку скриптов на Lua? Возможно ли подключиться к работе скрипта в Quik?
Пользователь
Сообщений: Регистрация: 23.01.2015
14.06.2016 17:02:06
Здравствуйте, Существуют сторонние отладчики, например decode
Пользователь
Сообщений: Регистрация: 04.03.2015
14.06.2016 17:32:32
Спасибо!
Пользователь
Сообщений: Регистрация: 02.12.2015
Ростовская обл., г. Батайск
07.07.2016 08:47:09
UP Decoda () часто отключается и возобновляет работу только перезагрузки. Требует введения имени переменной. Неудобно. Мне вполне по душе реализация QPILE, где вбиваешь волшебный breakpoint() в заветном месте и видишь сразу все свои переменные в формате НАЗВАНИЕ_ПЕРЕМЕННОЙ;ЗНАЧЕНИЕ. Там, правда, очень не хватало сортировки по имени переменной. Может быть кто готов поделиться своими наработками (пивом угощаю)? Хотелось бы аналог описанный выше. Ну, и конечно, хотелось бы увидеть реализацию по умолчанию от Вас, уважаемые разработчики. Спасибо!
Михаил Понамаренко (pmntrade.ru) написал: НАЗВАНИЕ_ПЕРЕМЕННОЙ;ЗНАЧЕНИЕ
а еще крупнее шрифта небыло?
Копировал из Notepade++. Не знал, что он поддерживает форматирование.
Пользователь
Сообщений: Регистрация: 19.11.2016
19.11.2016 21:23:13
Скачал Decoder, но запустить его не получилось - выдает ошибку 0хс000007b (ошибка при запуске приложения). Раньше я программировал на MQL4 в MetaTrader 4 (Forex), там есть встроенный отладчик и вопросов не было. Теперь хочу перенести свои индикаторы c MQL4 в Lua. Но прежде чем изучать язык Lua, хотелось бы понять - как отладить индикатор в Lua? А для начала - как найти, где ошибка в синтаксисе индикатора? Обязательно ли для этого нужен Decoder? Надеюсь на вашу помощь коллеги.
Пользователь
Сообщений: Регистрация: 30.01.2015
19.11.2016 22:28:33
Не мучайтесь. Отладочнaя печать в файл или printdbgstr в debugview. все остальное - трата времени.
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 19.11.2016
20.11.2016 13:48:45
Цитата
написал: Не мучайтесь. Отладочнaя печать в файл или printdbgstr в debugview. все остальное - трата времени.
Скачал debugview и запустил его. А что делать дальше? Как начать отладку файла индикатора с расширением lua в Quik? (в debugview в меню file-open он не открывается). Относительно функции PrintDbgStr тоже непонятно: где в коде индикатора я ее должен поместить - в Init, в Oncalculate? В руководстве по Lua для функции PrintDbgStr приведен следующий пример: function main() PrintDbgStr("test1") PrintDbgStr("test2") PrintDbgStr("dbg from " .. getScriptPath()) end Как все это понимать? Третий оператор указывает, где находится индиктор, подлежащий отладке? А зачем первые два оператора? Кроме того, откуда я должен вызвать функцию main, из Oncalculate?
Пользователь
Сообщений: Регистрация: 30.01.2015
20.11.2016 16:19:08
Запустите debugview
в любом месте индикатора вызывайте printdbgstr и выводите нужные вам значения. Вы их увидите в debugview
main в индикаторе не имеет смысла
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 19.11.2016
20.11.2016 18:48:19
Цитата
написал: в любом месте индикатора вызывайте printdbgstr и выводите нужные вам значения. Вы их увидите в debugview
Теперь наконец получилось! Да, затупил немного, но про Lua узнал только вчера и как-то трудно было сразу въехать в тему. Как я понял, если выводить переменную не строкового типа, то надо писать типа PrintDbgStr(x .. " ") . Непонятно только, почему, когда этот оператор ставлю в Oncalculate, то в debugview значение переменной выводится на один раз, а многократно. Пробовал то же самое делать в обычном скрипте (не в индикаторе), и при этом переменная появлялась в debugview только один раз.
Хорошо, что debugview позволяет выявлять и синтаксические ошибки в индикаторе - в случае такой ошибки при открытии окна со списком индикаторов в debugview появляется сообщение о синтаксической ошибке. Правда выдает только самую первую ошибку, а остальные не видит, но и на том спасибо.
Все равно при таком раскладе отладить индикатор вполне реально. Спасибо вам, s-mike, за дельный совет.
Пользователь
Сообщений: Регистрация: 20.04.2016
21.11.2016 01:45:58
Люди добрые, а можете объяснить про debugview что это за зверь? Специально отдельную тему создал, чтобы проще было потом найти нужную информацию
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
21.11.2016 05:20:33
Цитата
Sergey Denegin написал: Люди добрые, а можете объяснить про debugview что это за зверь? Специально отдельную тему создал, чтобы проще было потом найти нужную информацию
Пользователь
Сообщений: Регистрация: 19.11.2016
23.11.2016 19:08:55
Цитата
Виктор Столетов написал: Как я понял, если выводить переменную не строкового типа, то надо писать типа PrintDbgStr(x .. " ") . Непонятно только, почему, когда этот оператор ставлю в Oncalculate, то в debugview значение переменной выводится на один раз, а многократно.
function Init() c=0 return 1 end function OnCalculate(Index) x=<числовое выражение> if c==0 then PrintDbgStr("x=" .. x) end c=c+1 end
Если что не так, то коллеги поправьте - я начинающий.
Пользователь
Сообщений: Регистрация: 20.04.2016
24.11.2016 22:28:04
Какая у вас задача? При открытии квика, или про пересоединении к серверу, индикатор строится заново, и функция OnCalculate запускается столько раз, сколько у вас свечей на этом графике. index при этом номер свечи. от 0 до последней
Задача у меня перевести свои индикаторы с языка MQL4 (MetaTrader4, Forex) на Lua. Пришлось начать изучать Lua. В help по Lua из Quik я вообще не нашел описания основных конструкций языка (типы данных, операторы цикла, if и т.д.). В этом помогла книга Роберто Иерусалимски "Программирование на языке Lua". К сожалению она не описывает биржевую торговлю и индикаторы в том числе. А в help по Lua по индикаторам похоже не полная информация. В частности есть такие вопросы: 1. При выборе штатного индикатора, который накладывается на график, а не в отдельное окно, флаг "поместить график в отдельную область" не активен. А когда я выбираю свой индикатор, то этот флаг всегда активен, и каждый раз приходится его отключать. В языке MQL4 прямо в коде индикатора можно директивой указать, куда кидать индикатор - на график цены или в отдельное окно (#property indicator_chart_window и #property indicator_separate_window) . Вопрос: есть ли похожая директива в Lua? 2. Можно ли из индикатора обращаться к барам любого таймфрэйма, а не только текущего таймфрэйма на графике? Например, имея перед собой часовой график, производить вычисления с минутными барами (L,H,O,C,V)? 3. Как отслеживать появление нового бара? Я ориентируюсь на то, что при этом Size() увеличивается на 1. А что если в какой-то момент самые старые бары будут обрезаны и Size() уменьшится? Тогда в вычислениях надо это предусмотреть, иначе может возникнуть ошибка.
Вы говорите, что индекс свечи начинается c 0 и в руководстве написано то же самое. Но если в OnCalculate(index) написать PrintDbgStr("index=" .. index), то в окне Debugview выведет index от 1 до Size(). Вроде получается, что самая старая свеча имеет индекс 1.
Пользователь
Сообщений: Регистрация: 20.04.2016
28.11.2016 12:22:24
1. На сколько я знаю, из Луа нельзя управлять тем, куда будет выводиться индикатор. Луа только считает значения
2. Обращаться можно, но хлопотно. Для этого есть функция CreateDataSource и дальше придется перебирать все свечи
3. на сколько я знаю Size не может уменьшиться. Обрезание начальных баров происходит только при входе в Квик. (или возможно при смене сессии). Кстати поправьте меня разработчики, если я ошибаюсь.
Задача у меня перевести свои индикаторы с языка MQL4 (MetaTrader4, Forex) на Lua. Пришлось начать изучать Lua. В help по Lua из Quik я вообще не нашел описания основных конструкций языка (типы данных, операторы цикла, if и т.д.). В этом помогла книга Роберто Иерусалимски "Программирование на языке Lua". К сожалению она не описывает биржевую торговлю и индикаторы в том числе. А в help по Lua по индикаторам похоже не полная информация. В частности есть такие вопросы: 1. При выборе штатного индикатора, который накладывается на график, а не в отдельное окно, флаг "поместить график в отдельную область" не активен. А когда я выбираю свой индикатор, то этот флаг всегда активен, и каждый раз приходится его отключать. В языке MQL4 прямо в коде индикатора можно директивой указать, куда кидать индикатор - на график цены или в отдельное окно (#property indicator_chart_window и #property indicator_separate_window) . Вопрос: есть ли похожая директива в Lua? 2. Можно ли из индикатора обращаться к барам любого таймфрэйма, а не только текущего таймфрэйма на графике? Например, имея перед собой часовой график, производить вычисления с минутными барами (L,H,O,C,V)? 3. Как отслеживать появление нового бара? Я ориентируюсь на то, что при этом Size() увеличивается на 1. А что если в какой-то момент самые старые бары будут обрезаны и Size() уменьшится? Тогда в вычислениях надо это предусмотреть, иначе может возникнуть ошибка.
Вы говорите, что индекс свечи начинается c 0 и в руководстве написано то же самое. Но если в OnCalculate(index) написать PrintDbgStr("index=" .. index), то в окне Debugview выведет index от 1 до Size(). Вроде получается, что самая старая свеча имеет индекс 1.
Здравствуйте,
1. К сожалению, такой возможности нет. 2. Здесь больше подойдет функция CreateDataSource 3. Для работы со свечками в lua есть функция getCandlesByIndex Среди свойств свечек есть параметр doesExist, по нему можно определить что свечка сформировалась.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.11.2016 10:56:41
Цитата
Egor Zaytsev написал: 2. Здесь больше подойдет функция CreateDataSource
CreateDataSource не доступна в индикаторах. Поэтому работать с другим таймфреймом можно только через getCandlesByIndex
Цитата
Виктор Столетов написал: 3. Как отслеживать появление нового бара?
При появлении нового бара в OnCalculate(index) будет увеличиваться индекс свечи
Цитата
Виктор Столетов написал: А что если в какой-то момент самые старые бары будут обрезаны и Size() уменьшится?
Тогда OnCalculate начнётся с первого индекса.
Цитата
Виктор Столетов написал: Вы говорите, что индекс свечи начинается c 0 и в руководстве написано то же самое. Но если в OnCalculate(index) написать PrintDbgStr("index=" .. index), то в окне Debugview выведет index от 1 до Size(). Вроде получается, что самая старая свеча имеет индекс 1.
Да, там у них путаница (видимо разные люди писали куски кода): в OnCalculate в индикаторах индекс начинается с единицы, а в getCandlesByIndex - с нуля.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 19.11.2016
30.11.2016 14:59:43
Спасибо вам всем, Сергей, Егор и Старатель, за разъяснения. Со своей задачей перевода индикаторов с Mql4 в Lua мне удалось справиться в том числе благодаря отладке через PrintDbgStr. Вы предлагаете для работы с другим таймфрэймом использовать функцию getCandlesByIndex . Непонятно только, как ей пользоваться В help нет ни одного примера. Там написано : TABLE t, NUMBER n, STRING l getCandlesByIndex (STRING tag, NUMBER line, NUMBER first_candle, NUMBER count)
где tag - это строковый идентификатор графика или индикатора, Но как он выглядит? Я пробовал подставить в качестве tag например "Сбербанк[Price]" , "[Price]", "Price", но ничего не получается. Также не могу понять, как обращаться к элементам таблицы t, содержащей свечки: t["close"] или t["С(i)"] или как-то еще? Зачем здесь параметр line? Ведь свечки не зависят от линии, скорее наоборот. А главный вопрос – где в этой функции указано, какой тайм-фрэйм?
Цитата
Egor Zaytsev написал: Среди свойств свечек есть параметр doesExist, по нему можно определить что свечка сформировалась.
А не могли бы привести какой-нибудь пример использования параметра doesExist?
Есть ли вообще полное руководство по языку Lua, где описаны основные конструкции языка с примерами, включая математические функции, типы данных и и х преобразование, операторы if, for, while и т.п.? Например, на этом форуме видел полезную ссылку от пользователя s_mike@ rambler ru, в которой подробно описана работа с временем в Lua. Почему-то подобного раздела в help по Lua нет.
QUIK clients support
Сообщений: Регистрация: 27.01.2015
02.12.2016 14:38:57
Цитата
Виктор Столетов написал: где tag - это строковый идентификатор графика или индикатора, Но как он выглядит
Добрый день,
Идентификатор задается вручную через окно редактирования настроек графика на вкладке "Дополнительно":
Цитата
Виктор Столетов написал: как обращаться к элементам таблицы t, содержащей свечки: t["close"] или t["С(i)"] или как-то еще?
Данные значения являются получаемыми, то есть вызвав getCandlesByIndex, Вы получите в результате таблицу с t, n и l значениями.
line - это номер линии графика или индикатора, в случае, если у Вас построен график по инструменту в виде свечей то укажите 0.
Цитата
Виктор Столетов написал: где в этой функции указано, какой тайм-фрэйм?
Интервал будет тот, график которого открыт у Вас в QUIK.
Цитата
Виктор Столетов написал: пример использования параметра doesExist
На данный вопрос ответим позднее.
Цитата
Виктор Столетов написал: Есть ли вообще полное руководство по языку Lua, где описаны основные конструкции языка с примерами,
Относительно использования Lua в QUIK инструкции можно скачать с нашего сайта по ссылке:
Полное руководство пользователя содержится на сайте
Пользователь
Сообщений: Регистрация: 20.04.2016
02.12.2016 15:55:43
Лично мне очень помог разобраться в Qlua сайт Там есть и описание синтаксиса и все это подкреплено примерами для квика. Есть даже небольшие готовые роботы.
Пользователь
Сообщений: Регистрация: 19.11.2016
03.12.2016 21:47:08
Цитата
Stanislav Tvorogov написал: Интервал будет тот, график которого открыт у Вас в QUIK.
Это ответ на мой вопрос " где в функции getCandlesByIndex указано, какой тайм-фрэйм?" А до этого три человека утверждали, что функция getCandlesByIndex позволяет из индикатора обращаться к свечам другого тайм-фрэйма. Правда не понятно - каким образом? Ведь в функции getCandlesByIndex нет параметра типа interval. Вроде действительно получается, что можно обращаться только к свечам текущего тайм-фрэйма графика.
Цитата
Sergey Denegin написал: Лично мне очень помог разобраться в Qlua сайт
Спасибо Сергей за ссылку. На этом сайте изложено более понятно, чем в руководстве по использованию Lua в QUIK, главное - есть примеры на все функции. Если из списка тем выбрать "", то там есть пример вызова функции getCandlesByIndex. Короче в жизни это может выглядеть так:
Идентификатор Chart_current надо предварительно задать вручную через окно редактирования настроек графика на вкладке "Дополнительно" (как пишет Станислав из техподдержки). В этом примере получаем первые 10 свечей начиная с нулевой, n=10, l="Сбербанк [Price].", если открыт график акций Сбербанка. Для обращения например к цене закрытия самой старой (нулевой) свечи пишем t[0].close, а к массиву времени этой свечи t[0].datetime
Но все равно я чего-то не понимаю. Ведь к свечам текущего тайм-фрэйма графика я и так имею доступ с помощью функций O(i), C(i), L(i),H(i),V(i),T(i).day и т.д., после отработки Oncalculate. Зачем же мне использовать функцию getCandlesByIndex?
Пользователь
Сообщений: Регистрация: 20.04.2016
04.12.2016 16:20:41
на том сайте есть мой индикатор, который позволяет выводить на графике например 5и минутном, индикатор из любого другого периода, например с часового, или 4х часового. Правда он берет индикатор с линиями, а не свечи.
Пользователь
Сообщений: Регистрация: 23.01.2015
05.12.2016 06:58:27
Цитата
Виктор Столетов написал: Ведь к свечам текущего тайм-фрэйма графика я и так имею доступ с помощью функций O(i), C(i), L(i),H(i),V(i),T(i).day и т.д., после отработки Oncalculate. Зачем же мне использовать функцию getCandlesByIndex?
getCandlesByIndex имеет смысл использовать если требуется получить доступ не к текущему графику. О чем Вы сами говорили выше. При этом другой график может отличаться чем угодно. Таймфреймом, инструментом, или даже быть другим индикатором.
Пользователь
Сообщений: Регистрация: 19.11.2016
05.12.2016 11:02:11
Теперь я понял - надо, чтобы одновременно было открыто оба графика. Например, если индикатор на часовом графике, и в нем выполняются какие-то операции с минутными барами, то сначала открываем минутный график и задаем на нем на вкладке «дополнительно» идентификатор. Затем кидаем индикатор на часовой график.