Начинаю изучать Qlua. Для освоения рассматривал код индикаторов, который опубликован поддержкой (поэтому сам код приводить полностью нет смысла). Конкретно Momentum. Жалко что в тексте нет ремарок. При штудировании кода возник вопрос, который приводит меня в тупик :
Код
function Init()
func = MOMENTUM()
return #Settings.line
end
function OnCalculate(Index)
return tonumber(Settings.Horizontal_line), ConvertValue(Settings, func(Index, Settings))
end
function MOMENTUM()
local it = {[1]=0, l=0}
return function (I, Fsettings, ds)
Логически я читаю так в Init() инициализируется/запускается экземпляр функции MOMENTUM() ; в OnCalculate(Index) в неё передаются вводные func(Index, Settings)
откуда во внутренней функции function (I, Fsettings, ds) берутся данные в ds ? ! они по умолчанию как то привязаны к источнику данных ?
Афонькин написал: Логически я читаю так в Init() инициализируется/запускается экземпляр функции MOMENTUM()
Неа, в func сохраняется анонимная функция, которую возвращает MOMENTUM. Вот эта самая, про которую ниже.
Цитата
Афонькин написал: откуда во внутренней функции function (I, Fsettings, ds) берутся данные в ds ? !
А ниоткуда не берутся, в коде примера там всегда будет nil. Очевидно, писали универсальную функцию для скриптов и индикаторов. Передан датасорец - строит по датасорцу, не передан (как в коде примера) - строит по глобальным OHLCV, доступным в индикаторах.
Афонькин написал: Начинаю изучать Qlua. Для освоения рассматривал код индикаторов, который опубликован поддержкой (поэтому сам код приводить полностью нет смысла). Конкретно Momentum. Жалко что в тексте нет ремарок. При штудировании кода возник вопрос, который приводит меня в тупик :
Код
function Init ()
func = MOMENTUM()
return # Settings.line
end
function OnCalculate (Index)
return tonumber(Settings.Horizontal_line), ConvertValue(Settings, func(Index, Settings))
end
function MOMENTUM ()
local it = {[ 1 ] = 0 , l = 0 }
return function (I, Fsettings, ds)
Логически я читаю так в Init() инициализируется/запускается экземпляр функции MOMENTUM() ; в OnCalculate(Index) в неё передаются вводные func(Index, Settings)
откуда во внутренней функции function (I, Fsettings, ds) берутся данные в ds ? ! они по умолчанию как то привязаны к источнику данных ?
Спасибо заранее.
вы привели лишь кусок кода, поэтому объяснить его нельзя. Можно лишь гадать, как это и делает предыдущий оратор.
открыл оригинал и посмотрел, уот так уот неожиданно.
Да Вы батенька не только QLUA не знаете Вы начинаете изучать, а я должен гадать какую версию программы Вы взяли и откуда? Оно мне надо? Можете не отвечать. Вопрос риторический.
Пытаюсь поработать с данными стакана, а именно сложить объем спроса до достижения суммы при которой полностью можно закрыть позицию, НО вот ну ни как не выходит
Код:
Код
function OnQuote(class, sec )
if class == "SPBFUT" and sec == "HYZ0" then
z = getQuoteLevel2 (class, sec)
z1 = z.bid_count
for i=1, z1 do
if z.bid[i].quantity ~= nil then
lag = lag + tonumber(z.bid[i].guantity)
if lag > posicia then
z3 = tonumber(z.bid[i].price)
z4 = tonumber(z.bid[z1].price)
message("Full close : " .. z3 .. " lag - ".. ( tonumber(z3-z4)))
end
end
end
lag = 0
end
end
Ошибка : attempt to perform arithmetic on a nil value — ругается вот на эту строку:
Игорь Б написал: Попробуй if z.bid.quantity ~= ' ' then (пока в цикле дойдет до z1 этой строки может уже не быть)
Сделал как Вы и говорили:
Цитата
Игорь Б написал: for i=1, z1 do (это для оферов) --для бидов надо написать for i=z1,1, -1 do т.к. счет начинается с края(снизу)
т.е. цикл начинается с этой z1 -й строки - значит точно должна существовать.
Кстати после изменения направления цикла на обратный перестала работать вся логика :( !!!! Рррр - закипает мозг .....
Теперь при проверочном выводе месседжем данных цикла - если раньше №п/п - переменная i отображалась как 1 2 3 4 ..., а теперь 1.0 2.0 3.0 ... - а изменил только направление перебора цикла.
Игорь Б, Ага, ЩАЗ! Если даже SP[tonumber(a[i][1][1])]=tonumber(SP[tonumber(a[i][1][1])])+tonumber(a[i][1][6]); не всегда помогает, то поможет SP[a[i][1][1]+0]=SP[a[i][1][1]+0]+a[i][1][6]+0;
Так, что ли? Свежо предание, да верится с трудом!(С) Это не язык - это... как это в нормативной лексике... это ГОВНО!
Владимир, Вопрос не только в string или number. Вопрос в том, что индекс должен быть помимо number еще и целочисленным. Поэтому выше я предложил z1 = tonumber(string.format("%d", tonumber(z.bid_count)))
Игорь Б, Так целочисленные типы вообще спи... украли! Мало того: у интерпретатора и на целочисленных типах крыша съезжает, поскольку для прямого обращения к элементу в нормальных языках требуется индекс, а здесь это ключ!
Я сегодня уже написал разработчикам, что это гнилой язык. Читаю посты людей, у многих не получается кодить на этом языке. Поддержка очень сухо отвечает! Короче,лично я совсем не доволен данным языком. Синтаксис вообще убожеский!! Наверно не буду его изучать,лучше буду кодить на MQL4-5. Достало этот непонятное подобие языка программирования!!
Maksimus, Поддержка здесь как раз отвечает прекрасно! И "кодить" на этом языке проще простого. Недостатки есть, как и в любом другом языке, некоторые сильно раздражают, но для торговли вполне потянет!
Беглый взгляд на Вики про MQL сразу же упёрся в: "Платформа всё так же ориентирована исключительно для маржинальной торговли на рынках Forex, Futures и CFD, но не ориентирована на фондовый рынок или для проведения операций без маржинальных условий" - это в морг!
Ну или: "MQL4 основан на концепции широко распространенного языка программирования С++. Синтаксис языка MQL4 подобен синтаксису С++". То есть не стали выдрипываться с "--" для строчных комментариев и тому подобной белиберде, а взяли классический синтаксис. Но, в конце концов, какая разница, какой там синтаксис? Была бы функциональность, и у Lua она есть!
Maksimus, Я про прелесть" не сказал ни звука. Абсолютно понятный синтаксис, (хоть и придурковатый местами) - настолько, что справочник практически и не нужен. Плюс полностью обеспечена необходимая [мне] функциональность. Что ещё от языка требовать? Разве что убрать некоторые глюки, но и это претензия не к языку, а к реализации.
agrevbethh написал: можно ли делать заявки когда не работает мос биржа?
На мос биржу - конечно нет.
Для тестов можно использовать т.н. "игровой сервер". Движение цен там нереальное, да еще и зацикленное, зато работает 24 часа в сутки, отработать механику собственно выставления заявок вполне можно.
Maksimus написал: Я сегодня уже написал разработчикам, что это гнилой язык. Читаю посты людей, у многих не получается кодить на этом языке. Поддержка очень сухо отвечает! Короче,лично я совсем не доволен данным языком. Синтаксис вообще убожеский!! Наверно не буду его изучать,лучше буду кодить на MQL4-5. Достало этот непонятное подобие языка программирования!!
Lua нормальный язык, у которого очень приятное api. Разработчикам квика лучше прикрутить jit и была бы бомба. А вот MQL4-5 явно не до язык: нормально кол-беки не вызвать или интерфейсы. Приходится вариться внутри MT экосистемы, которая до сих пор находится в каком-то зачаточном состоянии с 2000 годов. И в MQL и MT своих заморочек хватает. Такое ощущение, что вам все должны. Документации по Lua много, исходники есть (что не скажешь об MQL). На вопросы отвечают.
swerg, А где этот " "игровой сервер"? Первый раз слышу о таком. Я бы потестировал подачу заявок и контроль их исполнения (особенно частичного) именно "на кошках".
swerg, Спасибо, посмотрю. Если я правильно понимаю, для этого мне нужно запустить третий Квик (два моих Квика настроены на двух моих брокеров, и менять эти настройки я не хочу - тем более, что оба брокера дают доступ к Московской бирже в "боевом" режиме).
О, Господи, какая громоздкая регистрация! Нет, пожалуй, я буду отлаживать это дело прямо в боевом режиме, на малых суммах.
swerg, Нет, мне нужен именно одновременный доступ. Причём у одного брокера у меня несколько счетов, у другого несколько валют, а тикеры у них иногда частично пересекаются. Я просто не подумал раньше - никакая "левая" отладка не заменит настоящую...
agrevbethh написал: можно ли делать заявки когда не работает мос биржа?
На мос биржу - конечно нет.
Для тестов можно использовать т.н. "игровой сервер". Движение цен там нереальное, да еще и зацикленное, зато работает 24 часа в сутки, отработать механику собственно выставления заявок вполне можно.
тогда в чём заключаются условные заявки с включенной опцией до отмены? Когда они ставятся, при закрытой бирже можно выставить? Смысл торговли пропадает, если всю рабочую сессию находишься вне терминала.
agrevbethh написал: тогда в чём заключаются условные заявки с включенной опцией до отмены? Когда они ставятся, при закрытой бирже можно выставить?
Вы смешали заявки (в первом вопросе), условные заявки (теперь), срок действия и момент выставления. Получилась, ожидаемо, каша. Разгребем. 1. Просто заявки попадают сразу на биржу, естественно ставятся только во время торгов, неисполненные автоматически снимаются в момент завершения торговой сессии. Об этом swerg и написал, т.к. вопрос был просто про заявки. 2. Условные заявки хранятся на сервере квика, при активации такой заявки сервер посылает простую заявку (как в п.1) на биржу, откуда следуют такие выводы: 2.1. Выставлять (и снимать) условную заявку можно в любой момент, когда работает сервер, независимо от состояния торговой сессии. 2.2. В отличие от простой заявки, условная может жить на сервере до морковкина заговения, поэтому у них есть и вариант до отмены, и вариант до заданной даты, и вариант до конца сессии. 2.3. Если по какой-то причине выставленная простая заявка будет отклонена биржей (не ведутся торги, превышен лимит, еще что-то), ваш стоп не исполнится. То есть условная заявка-то сработает, а результатом будет пшик.
Anton, Я бы ещё одну штуку хотел узнать - недавно столкнулся: частичное исполнение заявок. Дело было так: заявка в выставленные на продажу 50 лотов исполнялась несколько часов. Исполнялась, исполнялась, да так и не исполнилось - на момент закрытия биржи 4 лота остались непроданными, и заявка (по факту почти исполненная) получила статус "снята". Мне показалось (не уверен - там ещё и другие сделки были), что в течение этого времени количество свободных средств у меня увеличивалось после каждой сделки (частичной продажи). Я знаю, что в момент подачи заявки на покупку резервируются деньги на её исполнение, а при продаже - соответствующее количество акций. Но вот что происходит в процессе исполнения - я пока не врубился. Короче, вопрос такой: в какой момент освобождаются блокированные ресурсы?
Владимир написал: Мне показалось (не уверен - там ещё и другие сделки были), что в течение этого времени количество свободных средств у меня увеличивалось после каждой сделки (частичной продажи).
Не показалось, после каждой сделки и пересчитывалось. После (автоматического/ручного - неважно) снятия оставшиеся 4 лота вернулись на депо.
просто ставил несколько раз заявку и выскакивало какое то сообщение(не успевал прочитать) пока скиншот не сделал...а там "до морковкина заговения" не прокатит, только до 30 дней условка работает, так что "до отмены" уже не работает
Только начал писать и уже на подключении/получении данных загвоздка
код
Код
ds, err = CreatDataSourse ("TQBR", "HYDR", INTERVAL_H1)
ds:SetEmptyCallback()
sleep(100)
while (err == "" or err == nil) and ds:Size() == 0 do sleep(1) end
if err ~= "" and err ~= nil then message("Ошибка подключения к графику: "..err) end
плюется ошибкой
attempt to call a nil value (global 'CreatDataSourse')
продолжаем с вопросам (главное что бы мои вопросы не оказались без ответа - а посмотрев на мои вопросы-ответы (типа сам написал сам ответил или напортачил с синтаксисом) никто и не захочет помогать) Вопрос № 4
Ситуация : сделан индикатор, расширенте файла . lua . в файле есть и Settings и Init() и function OnCalculate(Index) файл находиться в папке - C:\GPB-i-Trade QUIK_x64\LuaIndicators всё по книге - а Quik его не видит ! До этого был опыт - и все прошло нормально. Работало норм. Хотя, теперь удалив этот файл - он все равно виден в списке индикаторов Вообщем, не могу понять логику появления/исчезания индикатора. Может есть хитрость ?
Афонькин написал: продолжаем с вопросам (главное что бы мои вопросы не оказались без ответа - а посмотрев на мои вопросы-ответы ( типа сам написал сам ответил или напортачил с синтаксисом ) никто и не захочет помогать)
Вопрос № 4
Ситуация : сделан индикатор, расширенте файла . lua . в файле есть и Settings и Init() и function OnCalculate(Index) файл находиться в папке - C:\GPB-i-Trade QUIK_x64\LuaIndicators всё по книге - а Quik его не видит ! До этого был опыт - и все прошло нормально. Работало норм. Хотя, теперь удалив этот файл - он все равно виден в списке индикаторов Вообщем, не могу понять логику появления/исчезания индикатора. Может есть хитрость ?
При наличии синтаксических ошибок индикатор в списке виден не будет А вот чтобы удаленный индикатор оставался виден в списке, такого не встречал.
Как вариант может у вас несколько терминалов и вы не в нужный терминал файл индикатора кладете/удаляете?
Алексей написал: При наличии синтаксических ошибок индикатор в списке виден не будет
Да видимо это и есть причина. Знаю за собой такой грешок - в синтаксисе лажануться ... Теперь найти бы эту ошибку ! Уже замучился, все глаза просмотрел. Может поделитесь - как в индикаторе ищите ошибку ? В простом скрипте при запуске все вылазит, а тут и не запустишь ... прям круговая зависимость
Nikolay написал: Добавляете индикатор в доступные скрипты lua и запускаете. Будет ошибка.
Сорри, но не работает Ваш вариант. Этож Индикатор ...
С синтаксисом без запуска в Квике я разобрался добавив в VisualStudio lua дебугеры. Уже радует. И теперь Индикатор виден Квиком - НО ... при запуске ошибка типа "арифметика с nil" приводит к закрытию Квика, если резко не закроешь окно с ошибкой :-( вот в такой строке
Афонькин написал: всё валится, причем с закрытием терминала, как поймать что? если всё улетает бесследно?
Отвечаю сам себе : в данном конкретном случае лечимся добавлением функции - CandleExist НО всё таки: может кто-то имеет опыт отладки именно Индикаторов? Так что бы не методом проб (с вылетов Квика) и ошибок.
Если у Вас не синтаксическая ошибка, а логическая, то, конечно, ошибки не будет при компиляции. Такие ошибки ловятся дебагом. Но для индикатора, лучше делать print-debug. Т.е. выводить значения в некий поток (файл лога) и смотреть на данные.
Типовая ошибка в индикаторах связана с дырявыми массивами данных. Т.е. не заполнены данные для каждого индекса. Если индекса нет, т.е. дырка на графике, это не повод пропустить данные в массиве.
А чтобы Квик не умирал от бесконечного потока сообщений об ошибке, лучше завернуть критическую секцию в pcall и перехватывать текст ошибки, выводя его все один раз для одного и того же сообщения.