UP Decoda (https://www.quik2dde.ru/viewtopic.php?id=32) часто отключается и возобновляет работу только перезагрузки. Требует введения имени переменной. Неудобно. Мне вполне по душе реализация QPILE, где вбиваешь волшебный breakpoint() в заветном месте и видишь сразу все свои переменные в формате НАЗВАНИЕ_ПЕРЕМЕННОЙ;ЗНАЧЕНИЕ. Там, правда, очень не хватало сортировки по имени переменной. Может быть кто готов поделиться своими наработками (пивом угощаю)? Хотелось бы аналог описанный выше. Ну, и конечно, хотелось бы увидеть реализацию по умолчанию от Вас, уважаемые разработчики. Спасибо!
Скачал Decoder, но запустить его не получилось - выдает ошибку 0хс000007b (ошибка при запуске приложения). Раньше я программировал на MQL4 в MetaTrader 4 (Forex), там есть встроенный отладчик и вопросов не было. Теперь хочу перенести свои индикаторы c MQL4 в Lua. Но прежде чем изучать язык Lua, хотелось бы понять - как отладить индикатор в Lua? А для начала - как найти, где ошибка в синтаксисе индикатора? Обязательно ли для этого нужен Decoder? Надеюсь на вашу помощь коллеги.
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?
s_mike@rambler.ru написал: в любом месте индикатора вызывайте printdbgstr и выводите нужные вам значения. Вы их увидите в debugview
Теперь наконец получилось! Да, затупил немного, но про Lua узнал только вчера и как-то трудно было сразу въехать в тему. Как я понял, если выводить переменную не строкового типа, то надо писать типа PrintDbgStr(x .. " ") . Непонятно только, почему, когда этот оператор ставлю в Oncalculate, то в debugview значение переменной выводится на один раз, а многократно. Пробовал то же самое делать в обычном скрипте (не в индикаторе), и при этом переменная появлялась в debugview только один раз.
Хорошо, что debugview позволяет выявлять и синтаксические ошибки в индикаторе - в случае такой ошибки при открытии окна со списком индикаторов в debugview появляется сообщение о синтаксической ошибке. Правда выдает только самую первую ошибку, а остальные не видит, но и на том спасибо.
Все равно при таком раскладе отладить индикатор вполне реально. Спасибо вам, s-mike, за дельный совет.
Люди добрые, а можете объяснить про debugview что это за зверь? Специально отдельную тему создал, чтобы проще было потом найти нужную информацию https://forum.quik.ru/forum10/topic2290/
Виктор Столетов написал: Как я понял, если выводить переменную не строкового типа, то надо писать типа PrintDbgStr(x .. " ") . Непонятно только, почему, когда этот оператор ставлю в Oncalculate, то в debugview значение переменной выводится на один раз, а многократно.
Какая у вас задача? При открытии квика, или про пересоединении к серверу, индикатор строится заново, и функция 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.
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, по нему можно определить что свечка сформировалась.
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 нет.
Лично мне очень помог разобраться в Qlua сайт http://quikluacsharp.ru/karta-sajta/ Там есть и описание синтаксиса и все это подкреплено примерами для квика. Есть даже небольшие готовые роботы.
Stanislav Tvorogov написал: Интервал будет тот, график которого открыт у Вас в QUIK.
Это ответ на мой вопрос " где в функции getCandlesByIndex указано, какой тайм-фрэйм?" А до этого три человека утверждали, что функция getCandlesByIndex позволяет из индикатора обращаться к свечам другого тайм-фрэйма. Правда не понятно - каким образом? Ведь в функции getCandlesByIndex нет параметра типа interval. Вроде действительно получается, что можно обращаться только к свечам текущего тайм-фрэйма графика.
Спасибо Сергей за ссылку. На этом сайте изложено более понятно, чем в руководстве по использованию Lua в QUIK, главное - есть примеры на все функции. Если из списка тем выбрать "Получение в QLua(Lua) данных из графиков и индикаторов", то там есть пример вызова функции 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?
Виктор Столетов написал: Ведь к свечам текущего тайм-фрэйма графика я и так имею доступ с помощью функций O(i), C(i), L(i),H(i),V(i),T(i).day и т.д., после отработки Oncalculate. Зачем же мне использовать функцию getCandlesByIndex?
getCandlesByIndex имеет смысл использовать если требуется получить доступ не к текущему графику. О чем Вы сами говорили выше. При этом другой график может отличаться чем угодно. Таймфреймом, инструментом, или даже быть другим индикатором.
Теперь я понял - надо, чтобы одновременно было открыто оба графика. Например, если индикатор на часовом графике, и в нем выполняются какие-то операции с минутными барами, то сначала открываем минутный график и задаем на нем на вкладке «дополнительно» идентификатор. Затем кидаем индикатор на часовой график.