Отладка скриптов Lua для Quik.

Страницы: 1
RSS
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Здравствуйте. Подскажите пожалуйста, как осуществлять отладку скриптов на Lua?  Возможно ли подключиться к работе скрипта в Quik?  
 
Здравствуйте,
Существуют сторонние отладчики, например decode
 
Спасибо!
 
UP
Decoda (https://www.quik2dde.ru/viewtopic.php?id=32) часто отключается и возобновляет работу только перезагрузки. Требует введения имени переменной. Неудобно.
Мне вполне по душе реализация QPILE, где вбиваешь волшебный breakpoint() в заветном месте и видишь сразу все свои переменные в формате НАЗВАНИЕ_ПЕРЕМЕННОЙ;ЗНАЧЕНИЕ. Там, правда, очень не хватало сортировки по имени переменной.
Может быть кто готов поделиться своими наработками (пивом угощаю)? Хотелось бы аналог описанный выше.
Ну, и конечно, хотелось бы увидеть реализацию по умолчанию от Вас, уважаемые разработчики.
Спасибо!
 
Цитата
Михаил Понамаренко (pmntrade.ru) написал:
НАЗВАНИЕ_ПЕРЕМЕННОЙ;ЗНАЧЕНИЕ
а еще крупнее шрифта небыло?
 
Цитата
Imersio Arrigo написал:
Цитата
Михаил Понамаренко (pmntrade.ru)   написал:
НАЗВАНИЕ_ПЕРЕМЕННОЙ;ЗНАЧЕНИЕ
а еще крупнее шрифта небыло?
Копировал из Notepade++. Не знал, что он поддерживает форматирование.
 
Скачал Decoder, но запустить его не получилось - выдает ошибку 0хс000007b (ошибка при запуске приложения).  
Раньше  я программировал на MQL4 в MetaTrader 4 (Forex),  там есть встроенный отладчик и вопросов не было. Теперь хочу перенести  свои индикаторы c MQL4 в Lua.
Но прежде чем изучать язык Lua, хотелось бы понять  - как  отладить индикатор в Lua?  А для начала  - как найти,  где ошибка в синтаксисе   индикатора?  Обязательно ли для этого нужен  Decoder?
Надеюсь на вашу помощь коллеги.
 
Не мучайтесь. Отладочнaя печать в файл или printdbgstr в  debugview. все остальное - трата времени.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Не мучайтесь. Отладочн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?
 
Запустите debugview

в любом месте индикатора вызывайте   printdbgstr и выводите нужные вам значения. Вы их увидите в debugview

main в индикаторе не имеет смысла
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
в любом месте индикатора вызывайте   printdbgstr и выводите нужные вам значения. Вы их увидите в debugview
Теперь наконец получилось! Да,  затупил немного, но про Lua узнал только вчера и как-то трудно было сразу въехать в тему.
Как я понял, если  выводить переменную не строкового типа, то надо писать типа  PrintDbgStr(x .. " ") .  Непонятно только,  почему, когда этот оператор ставлю в  Oncalculate, то  в debugview значение переменной выводится на один раз, а многократно.  Пробовал  то же самое делать в обычном скрипте (не в индикаторе),  и при этом   переменная появлялась в debugview  только один раз.

Хорошо, что debugview  позволяет выявлять и синтаксические ошибки в индикаторе - в случае такой ошибки при   открытии окна со списком индикаторов в  debugview появляется сообщение о синтаксической ошибке.  Правда выдает только самую первую ошибку, а остальные не видит, но и на том спасибо.

Все равно при таком раскладе отладить индикатор вполне реально. Спасибо вам,  s-mike, за дельный совет.
 
Люди добрые, а можете объяснить про debugview что это за зверь?
Специально отдельную тему создал, чтобы проще было потом найти нужную информацию
https://forum.quik.ru/forum10/topic2290/
 
Цитата
Sergey Denegin написал:
Люди добрые, а можете объяснить про debugview что это за зверь?
Специально отдельную тему создал, чтобы проще было потом найти нужную информацию
https://forum.quik.ru/forum10/topic2290/
https://quik2dde.ru/viewtopic.php?id=108
 
Цитата
Виктор Столетов написал:
Как я понял, если  выводить переменную не строкового типа, то надо писать типа  PrintDbgStr(x .. " ") .  Непонятно только,  почему, когда этот оператор ставлю в  Oncalculate, то  в debugview значение переменной выводится на один раз, а многократно.
Сам же на этот вопрос и отвечаю.  При запуске индикатора OnCalculate вызывается столько раз, сколько свечей на графике. Чтобы DebugView выводил переменную 1 раз, просто надо ввести счетчик ©:

function Init()
c=0
return 1
end
function OnCalculate(Index)
x=<числовое выражение>
if c==0 then PrintDbgStr("x=" .. x) end
c=c+1
end

Если что не так, то коллеги поправьте - я начинающий.
 
Какая у вас задача?
При открытии квика, или про пересоединении к серверу, индикатор строится заново,
и функция OnCalculate запускается столько раз, сколько у вас свечей на этом графике.
index при этом номер свечи. от 0 до последней
 
Цитата
Sergey Denegin написал:
Какая у вас задача?
Задача у меня перевести свои индикаторы с языка 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. на сколько я знаю Size не может уменьшиться. Обрезание начальных баров происходит только при входе в Квик. (или возможно при смене сессии). Кстати поправьте меня разработчики, если я ошибаюсь.
 
Цитата
Виктор Столетов написал:
Цитата
Sergey Denegin   написал:
Какая у вас задача?
Задача у меня перевести свои индикаторы с языка 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, по нему можно определить что свечка сформировалась.
 
Цитата
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 - с нуля.
Надо делать так, как надо. А как не надо - делать не надо.
 
Спасибо вам  всем, Сергей, Егор и Старатель, за разъяснения.  Со своей задачей перевода индикаторов с 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 и т.п.? Например,  на этом форуме видел полезную ссылку http://www.bot4sale.ru/blog-menu/qlua/spisok-statej/368-lua-time.html  от пользователя s_mike@ rambler ru,  в которой подробно описана работа с временем в Lua.  Почему-то подобного  раздела  в help по Lua нет.
 
Цитата
Виктор Столетов написал:
где tag  - это строковый идентификатор графика или индикатора, Но как он выглядит
Добрый день,

Идентификатор задается вручную через окно редактирования настроек графика на вкладке "Дополнительно":


Цитата
Виктор Столетов написал:
как обращаться к элементам таблицы t, содержащей свечки:  t["close"] или t["С(i)"] или как-то еще?
Данные значения являются получаемыми, то есть вызвав getCandlesByIndex, Вы получите в результате таблицу с t, n и l значениями.
Цитата
Виктор Столетов написал:
Зачем здесь параметр line?
line - это номер линии графика или индикатора, в случае, если у Вас построен график по инструменту в виде свечей то укажите 0.
Цитата
Виктор Столетов написал:
где в этой функции указано, какой тайм-фрэйм?
Интервал будет тот, график которого открыт у Вас в QUIK.
Цитата
Виктор Столетов написал:
пример использования параметра doesExist
На данный вопрос ответим позднее.
Цитата
Виктор Столетов написал:
Есть ли  вообще полное руководство по языку Lua, где описаны основные конструкции языка с примерами,
Относительно использования Lua в QUIK инструкции можно скачать с нашего сайта по ссылке:
http://arqatech.com/upload/iblock/022/quik_lua.zip
Полное руководство пользователя содержится на сайте www.lua.org
 
Лично мне очень помог разобраться в Qlua сайт http://quikluacsharp.ru/karta-sajta/
Там есть и описание синтаксиса и все это подкреплено примерами для квика.
Есть даже небольшие готовые роботы.  
 
Цитата
Stanislav Tvorogov написал:
Интервал будет тот, график которого открыт у Вас в QUIK.
Это ответ на мой вопрос " где в  функции getCandlesByIndex указано, какой тайм-фрэйм?"
А до этого три человека утверждали, что функция getCandlesByIndex позволяет из индикатора обращаться к свечам другого тайм-фрэйма. Правда не понятно - каким образом? Ведь в  функции getCandlesByIndex нет параметра типа interval. Вроде действительно получается, что можно обращаться  только  к свечам текущего тайм-фрэйма графика.
Цитата
Sergey Denegin написал:
Лично мне очень помог разобраться в Qlua сайт http://quikluacsharp.ru/karta-sajta/
Спасибо Сергей за ссылку. На этом сайте изложено более понятно, чем в руководстве по использованию Lua в QUIK, главное - есть примеры на все функции. Если из списка тем выбрать "Получение в QLua(Lua) данных из графиков и индикаторов", то там есть пример вызова функции getCandlesByIndex. Короче в жизни это может выглядеть так:

t,n,l=getCandlesByIndex ("Chart_current", 0, 0, 10)

Идентификатор  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?
 
на том сайте есть мой индикатор, который позволяет выводить на графике например 5и минутном, индикатор из любого другого периода, например с часового, или 4х часового.
Правда он берет индикатор с линиями, а не свечи.
https://quikluacsharp.ru/stati-uchastnikov/otobrazhenie-na-grafike-indikatora-iz-drugogo-grafika/
 
Цитата
Виктор Столетов написал:
Ведь к свечам текущего тайм-фрэйма графика я и так имею доступ с помощью  функций O(i), C(i), L(i),H(i),V(i),T(i).day и т.д., после отработки Oncalculate.   Зачем же мне  использовать функцию getCandlesByIndex?
getCandlesByIndex имеет смысл использовать если требуется получить доступ не к текущему графику. О чем Вы сами говорили выше.
При этом другой график может отличаться чем угодно. Таймфреймом, инструментом, или даже быть другим индикатором.
 
Теперь я понял -  надо, чтобы одновременно было открыто оба графика.  Например, если индикатор  на часовом графике, и  в нем  выполняются  какие-то операции с минутными барами, то сначала открываем  минутный график и  задаем на нем на вкладке «дополнительно» идентификатор.  Затем кидаем индикатор на часовой график.  
Страницы: 1
Читают тему
Наверх