Вопросы Новичка

Страницы: 1 2 След.
RSS
Вопросы Новичка
 
Начинаю изучать 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, доступным в индикаторах.
 
Цитата
Anton написал:
Очевидно, писали универсальную функцию для скриптов и индикаторов.
А ларчик вот как открывается. Неожиданно !!!

Антон, большое Вам спасибо.
 
Цитата
Афонькин написал:
Начинаю изучать 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 ? !
они по умолчанию как то привязаны к источнику данных ?

Спасибо заранее.
вы привели лишь кусок кода, поэтому объяснить его нельзя. Можно лишь гадать, как это и делает предыдущий оратор.
 
Цитата
nikolz написал:
предыдущий оратор
открыл оригинал и посмотрел, уот так уот неожиданно.
 
Цитата
Anton написал:
Цитата
nikolz написал:
предыдущий оратор
открыл оригинал и посмотрел, уот так уот неожиданно.
Да Вы батенька не только QLUA не знаете
Вы начинаете изучать, а  я должен гадать какую версию  программы Вы взяли и откуда?
Оно мне надо?   Можете не отвечать. Вопрос риторический.
 
Цитата
nikolz написал:
а  я должен гадать
Нет, вы не должны гадать. Было бы здорово не пихать свое чрезвычайно важное мнение в каждую ветку, не заморачиваясь ее чтением.
 
Продолжу задавать вопросы :

Пытаюсь поработать с данными стакана, а именно сложить объем спроса до достижения суммы при которой полностью можно закрыть позицию, НО вот ну ни как не выходит

Код:
Код
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 — ругается вот на эту строку:
Код
lag = lag + tonumber(z.bid[i].guantity)

Спасибо!
 
lag = 0  -- лучше поставить перед циклом

for i=1, z1 do (это для оферов)  --для бидов надо написать for i=z1,1, -1 do т.к. счет начинается с края(снизу)

posicia -- надеюсь, что это инициализировано где то выше

message("Full close :  " .. z3 .. " lag - ".. ( tonumber(z3-z4)))  --странно lag - это объем , а z3-z4  - это разница цен

Ну и конечно все это надо перенести из OnQuote(class, sec )  в другое место
 
Цитата
Игорь Б написал:
for i=1, z1 do (это для оферов)  --для бидов надо написать for i=z1,1, -1 do т.к. счет начинается с края(снизу)
Да Вы тут правы.

Цитата
Игорь Б написал:
Ну и конечно все это надо перенести из OnQuote(class, sec )  в другое место
Почему ? Ведь если я убераю сложение а просто вывожу данные мессаджем -то всё ОК - данные есть, никаких nil !?!?!?!




Меня вот возмущает, что проверка на nil есть, а она не срабатывает.
Код
if z.bid[i].quantity ~= nil then
            lag = lag + tonumber(z.bid[i].guantity)
 
Цитата
Афонькин написал:
Меня вот возмущает, что проверка на nil есть, а она не срабатывает.
Внимательно смотрим, а чего ж это она не срабатывает-то...
Код
if z.bid[i].quantity ~= nil then
            lag = lag + tonumber(z.bid[i].guantity)
...во второй строке как-как поле называется? Точно-точно?
 
Цитата
Anton написал:
...во второй строке как-как поле называется? Точно-точно?
Ё-моё !!! Блииин. Антон - спасибо. Извините - со слепу! Чёртова латиница.
Ура эту строку прошли на ура.
Спасибо Антон !

Но вот теперь уперлось в
Код
z4 = tonumber(z.bid[z1].price)

пишет  atempt index nil value
 

Код
z4 = tonumber(z.bid[z1].price)
ПараметрТипОписание
bid_countSTRINGКоличество котировок покупки. При отсутствии спроса возвращается значение  «0»
offer_countSTRINGКоличество котировок продажи. При отсутствии предложения возвращается  значение «0»
bidTABLEКотировки спроса (покупки). При отсутствии спроса возвращается пустая  строка
offerTABLEКотировки предложений (продажи). При отсутствии предложения возвращается  пустая строка
Код
if z.bid[i].quantity ~= nil then
Попробуй  if z.bid[i].quantity ~= ' ' then (пока в цикле дойдет до z1  этой строки может уже не быть)
 
К предыдущему посту.

При отсутствии спроса возвращается пустая строка
 
Цитата
Игорь Б написал:
Попробуй  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 ... - а изменил только направление перебора цикла.
 
z1 = tonumber(string.format("%d", tonumber(z.bid_count)))
 
Ну вот кто мне объяснит, почему
Код
z1 = z.bid_count
z4 = tonumber(z.bid[z1].price)
- НЕ работает !!!!!

А ТАК
Код
z4 = tonumber(z.bid[z.bid_count+0].price)
сразу заработало
 
z1 = z.bid_count  -- тип возвращаемое значение string
z1 = z.bid_count  + 0 --тип number
 
Игорь Б,  Ага, ЩАЗ!
Если даже
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)))
 
Игорь Б, Так целочисленные типы вообще спи... украли!  :smile: Мало того: у интерпретатора и на целочисленных типах крыша съезжает, поскольку для прямого обращения к элементу в нормальных языках требуется индекс, а здесь это ключ!
 
Я сегодня уже написал разработчикам, что это гнилой язык. Читаю посты людей, у многих не получается кодить на этом языке. Поддержка очень сухо отвечает! Короче,лично я совсем не доволен данным языком. Синтаксис вообще убожеский!! Наверно не буду его изучать,лучше буду кодить на MQL4-5. Достало этот непонятное подобие языка программирования!!
 
Maksimus, Поддержка здесь как раз отвечает прекрасно! И "кодить" на этом языке проще простого. Недостатки есть, как и в любом другом языке, некоторые сильно раздражают, но для торговли вполне потянет!

Беглый взгляд на Вики про MQL сразу же упёрся в: "Платформа всё так же ориентирована исключительно для маржинальной торговли на рынках Forex, Futures и CFD, но не ориентирована на фондовый рынок или для проведения операций без маржинальных условий" - это в морг!

Ну или: "MQL4 основан на концепции широко распространенного языка программирования С++. Синтаксис языка MQL4 подобен синтаксису С++". То есть не стали выдрипываться с "--" для строчных комментариев и тому подобной белиберде, а взяли классический синтаксис. Но, в конце концов, какая разница, какой там синтаксис? Была бы функциональность, и у Lua она есть!
 
Владимир, Лично для меня, я никакой прелести кодить на Lua не увидел. Абсолютно непонятный синтаксис,и справочник ни очем!
 
можно ли делать заявки когда не работает мос биржа?
 
Maksimus, Я про прелесть" не сказал ни звука. Абсолютно понятный синтаксис, (хоть и придурковатый местами) - настолько, что справочник практически и не нужен. Плюс полностью обеспечена необходимая [мне] функциональность. Что ещё от языка требовать? Разве что убрать некоторые глюки, но и это претензия не к языку, а к реализации.
 
Цитата
agrevbethh написал:
можно ли делать заявки когда не работает мос биржа?

На мос биржу - конечно нет.

Для тестов можно использовать т.н. "игровой сервер". Движение цен там нереальное, да еще и зацикленное, зато работает 24 часа в сутки, отработать механику собственно выставления заявок вполне можно.
 
Цитата
Maksimus написал:
Я сегодня уже написал разработчикам, что это гнилой язык. Читаю посты людей, у многих не получается кодить на этом языке. Поддержка очень сухо отвечает! Короче,лично я совсем не доволен данным языком. Синтаксис вообще убожеский!! Наверно не буду его изучать,лучше буду кодить на MQL4-5. Достало этот непонятное подобие языка программирования!!
Lua нормальный язык, у которого очень приятное api. Разработчикам квика лучше прикрутить jit и была бы бомба.
А вот MQL4-5 явно не до язык: нормально кол-беки не вызвать или интерфейсы. Приходится вариться внутри MT экосистемы,
которая до сих пор находится в каком-то зачаточном состоянии с 2000 годов. И в MQL и MT  своих заморочек хватает.
Такое ощущение, что вам все должны. Документации по Lua много, исходники есть (что не скажешь об MQL).
На вопросы отвечают.
 
swerg, А где этот " "игровой сервер"? Первый раз слышу о таком. Я бы потестировал подачу заявок и контроль их исполнения (особенно частичного) именно "на кошках".  :smile:  
 
https://arqatech.com/ru/support/demo/

Ну и у брокеров тоже есть, обратитесь к вашему брокеру
 
swerg, Спасибо, посмотрю. Если я правильно понимаю, для этого мне нужно запустить третий Квик (два моих Квика настроены на двух моих брокеров, и менять эти настройки я не хочу - тем более, что оба брокера дают доступ к Московской бирже в "боевом" режиме).

О, Господи, какая громоздкая регистрация! Нет, пожалуй, я буду отлаживать это дело прямо в боевом режиме, на малых суммах.  :smile:  
 
Можно из одного терминала подключаться к разным брокерам (не одновременно, конечно). Ну если это вдруг удобно будет.
https://iquik.info/2012/03/20/iquik-how-to-connect-to-different-brokers-account/
Информация для обычного терминала тоже полностью подходит.
 
swerg, Нет, мне нужен именно одновременный доступ. Причём у одного брокера у меня несколько счетов, у другого несколько валют, а тикеры у них иногда частично пересекаются. Я просто не подумал раньше - никакая "левая" отладка не заменит настоящую...
 
Цитата
swerg написал:
Цитата
agrevbethh написал:
можно ли делать заявки когда не работает мос биржа?

На мос биржу - конечно нет.

Для тестов можно использовать т.н. "игровой сервер". Движение цен там нереальное, да еще и зацикленное, зато работает 24 часа в сутки, отработать механику собственно выставления заявок вполне можно.
тогда в чём заключаются условные заявки с включенной опцией до отмены? Когда они ставятся, при закрытой бирже можно выставить? Смысл торговли пропадает, если всю рабочую сессию находишься вне терминала.
 
Цитата
agrevbethh написал:
тогда в чём заключаются условные заявки с включенной опцией до отмены? Когда они ставятся, при закрытой бирже можно выставить?
Вы смешали заявки (в первом вопросе), условные заявки (теперь), срок действия и момент выставления. Получилась, ожидаемо, каша. Разгребем.
1. Просто заявки попадают сразу на биржу, естественно ставятся только во время торгов, неисполненные автоматически снимаются в момент завершения торговой сессии. Об этом swerg и написал, т.к. вопрос был просто про заявки.
2. Условные заявки хранятся на сервере квика, при активации такой заявки сервер посылает простую заявку (как в п.1) на биржу, откуда следуют такие выводы:
2.1. Выставлять (и снимать) условную заявку можно в любой момент, когда работает сервер, независимо от состояния торговой сессии.
2.2. В отличие от простой заявки, условная может жить на сервере до морковкина заговения, поэтому у них есть и вариант до отмены, и вариант до заданной даты, и вариант до конца сессии.
2.3. Если по какой-то причине выставленная простая заявка будет отклонена биржей (не ведутся торги, превышен лимит, еще что-то), ваш стоп не исполнится. То есть условная заявка-то сработает, а результатом будет пшик.
 
Anton, Я бы ещё одну штуку хотел узнать - недавно столкнулся: частичное исполнение заявок. Дело было так: заявка в выставленные на продажу 50 лотов исполнялась несколько часов. Исполнялась, исполнялась, да так и не исполнилось - на момент закрытия биржи 4 лота остались непроданными, и заявка (по факту почти исполненная) получила статус "снята". Мне показалось (не уверен - там ещё и другие сделки были), что в течение этого времени количество свободных средств у меня увеличивалось после каждой сделки (частичной продажи). Я знаю, что в момент подачи заявки на покупку резервируются деньги на её исполнение, а при продаже - соответствующее количество акций. Но вот что происходит в процессе исполнения - я пока не врубился. Короче, вопрос такой: в какой момент освобождаются блокированные ресурсы?
 
Цитата
Владимир написал:
Мне показалось (не уверен - там ещё и другие сделки были), что в течение этого времени количество свободных средств у меня увеличивалось после каждой сделки (частичной продажи).
Не показалось, после каждой сделки и пересчитывалось. После (автоматического/ручного - неважно) снятия оставшиеся 4 лота вернулись на депо.
 
Anton, Спасибо, понял.
 
просто ставил несколько раз заявку и выскакивало какое то сообщение(не успевал прочитать) пока скиншот не сделал...а там "до морковкина заговения" не прокатит, только до 30 дней условка работает, так что "до отмены" уже не работает
 
продолжаю вопросничать, ну уж извините дилетанта

ВОПРОС № 3

Только начал писать и уже на подключении/получении данных загвоздка

код
Код
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')

что не так ?
 
Код
ds, err = CreatDataSourse ("TQBR", "HYDR", INTERVAL_H1)

поправил на
Код
ds, err = CreateDataSourse ("TQBR", "HYDR", INTERVAL_H1)

все равно ошибка
 
Ошибку нашел !!! извините меня !!!
по рукам мне надавать от души !!!  
 
продолжаем с вопросам (главное что бы мои вопросы не оказались без ответа - а посмотрев на мои вопросы-ответы (типа сам написал сам ответил или напортачил с синтаксисом) никто и не захочет помогать)

Вопрос  № 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 его не видит !
До этого был опыт - и все прошло нормально. Работало норм. Хотя, теперь удалив этот файл - он все равно виден в списке индикаторов
Вообщем, не могу понять логику появления/исчезания индикатора. Может есть хитрость ?
При наличии синтаксических ошибок индикатор в списке виден не будет
А вот чтобы удаленный индикатор оставался виден в списке, такого не встречал.

Как вариант может у вас несколько терминалов и вы не в нужный терминал файл индикатора кладете/удаляете?
 
Цитата
Алексей написал:
При наличии синтаксических ошибок индикатор в списке виден не будет
Да видимо это и есть причина.
Знаю за собой такой грешок - в синтаксисе лажануться ...
Теперь найти бы эту ошибку ! Уже замучился, все глаза просмотрел.
Может поделитесь - как в индикаторе ищите ошибку ?
В простом скрипте при запуске все вылазит, а тут и не запустишь ... прям круговая зависимость
 
Добавляете индикатор в доступные скрипты lua и запускаете. Будет ошибка.
А лучше пользоваться линтерами, чтобы легче было.
 
Цитата
Nikolay написал:
Добавляете индикатор в доступные скрипты lua и запускаете. Будет ошибка.
Сорри, но не работает Ваш вариант. Этож Индикатор ...

С синтаксисом без запуска в Квике я разобрался добавив в VisualStudio  lua дебугеры. Уже радует.
И теперь Индикатор виден Квиком - НО ... при запуске ошибка типа "арифметика с nil" приводит к закрытию Квика, если резко не закроешь окно с ошибкой :-(
вот в такой строке
Код
TR[i] = math.max( math.max (H(x) - L(x), H(x) - L(x - 1)), math.abs(L(x)-C(x -1)) )
какой то аргумент = nil и всё валится, причем с закрытием терминала, как поймать что? если всё улетает бесследно?
Мучаюсь дальше.
 
Цитата
Афонькин написал:
вот в такой строке
Скорей всего в L(x-1). Смотрите, на каком индексе рассчитываете первое значение, если на 0, то тут получится -1 и будет нил.
 
Цитата
Афонькин написал:
всё валится, причем с закрытием терминала, как поймать что? если всё улетает бесследно?
Отвечаю сам себе : в данном конкретном случае лечимся добавлением функции - CandleExist
НО всё таки:  может кто-то имеет опыт отладки именно Индикаторов? Так что бы не методом проб (с вылетов Квика) и ошибок.
 
Если у Вас не синтаксическая ошибка, а логическая, то, конечно, ошибки не будет при компиляции.
Такие ошибки ловятся дебагом. Но для индикатора, лучше делать print-debug. Т.е. выводить значения в некий поток (файл лога) и смотреть на данные.

Типовая ошибка в индикаторах связана с дырявыми массивами данных. Т.е. не заполнены данные для каждого индекса.
Если индекса нет, т.е. дырка на графике, это не повод пропустить данные в массиве.

А чтобы Квик не умирал от бесконечного потока сообщений об ошибке, лучше завернуть критическую секцию в pcall и перехватывать текст ошибки, выводя его все один раз для одного и того же сообщения.
Страницы: 1 2 След.
Читают тему
Наверх