theorist (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2
Снятие всех заявок в Lua, Какой брать параметр trans_id?
 
Цитата
Sergey Gorokhov написал:
Что именно не понятно?
Спасибо, теперь после объяснения все понятно. Разобрался, как вставлять jpg-файлы и привожу функцию снятия всех заявок для данного класса по всем инструментам в более читаемом  виде:



Еще не могу разобраться, почему функция  getMoney выдает одни и же значения до выставления  заявок  и после превращения одной из них в сделку:  money_current_balance, money_limit_available и money_limit_locked не меняются.  Хотя в таблице лимитов по денежным средствам Квика они ("текущий остаток", "заблокировано" и "доступно") меняются .  
Снятие всех заявок в Lua, Какой брать параметр trans_id?
 
Цитата
Sergey Gorokhov написал:
Команды «KILL_ALL_ORDERS», «KILL_ALL_STOP_ORDERS», «KILL_ALL_NEG_DEALS» не поддерживаются в QLUA.
Нашел, что на этом форуме данная тема уже обсуждалась – см. ссылку https://forum.quik.ru/forum10/topic996/
Я взят оттуда за образец функцию снятия всех заявок и немного ее упростил.  
Она снимает все заявки для данного класса по всем инструментам – код см. ниже /не знаю как вставить скрин кода (jpg-файл), поэтому вставил просто текст программы/.
Судя по всему функция myFind ищет все активные заявки, а SearchItems выбирает их из таблицы заявок.  И все же я не совсем понимаю, как  работает  функция снятия всех заявок . Почему например в операторе local ord = "orders" стоит "orders", а не "order"? Ведь по идее таблица заявок  называется "order"  (см. описание функции OnOrder).  Но если написать local ord = "order" , то не работает.

function Close_all_order()
function myFind(F)
 return (bit.band(F, 0x1) ~= 0)
end
local ord = "orders"
local orders = SearchItems(ord, 0, getNumberOf(ord)-1, myFind, "flags")
if (orders ~= nil) and (#orders > 0) then
 for i=1,#orders do
  local transaction={
  TRANS_ID=tostring(1000*os.clock()),
  ACTION="KILL_ORDER",
  CLASSCODE=c_code,
  SECCODE=getItem(ord,orders[i]).sec_code,
  ORDER_KEY=tostring(getItem(ord,orders[i]).order_num)
  }
  local res=sendTransaction(transaction)
 end
end
end
Снятие всех заявок в Lua, Какой брать параметр trans_id?
 
В руководстве пользователя QUIK в разделе «Формат .tri-файла с параметрами транзакций» написано, что для снятия всех заявок обязательные параметры - «CLASSCODE», «TRANS_ID», «ACTION»,  «ACCOUNT».
Непонятно, как задавать TRANS_ID. Брать его для любой активной заявки? А если TRANS_ID будет соответствовать заявке, которая превратилась в сделку, то тогда функция снятия  всех заявок  не сработает? Правильно ли вообще написана у меня  эта функция?

function Close_all_order()
local Transaction={
ACCOUNT="L01-00000F00",
TRANS_ID=tostring(trans_id),
CLASSCODE="EQOB",
ACTION="KILL_ALL_ORDERS"}
local Res = sendTransaction(Transaction)
end

Идентификатор транзакции  trans_id  задается в основной программе и при открытии каждой заявки  увеличивается на 1:  trans_id=trans_id+1.
Откkючение маржинального кредитования в Quik
 
Цитата
s_mike@rambler.ru написал:
Придется написать небольшой робот, который после исполнения каждой заявки смотрит на ситуацию с деньгами и при необходимости снимает остальные заявки.

Только возникает проблема с отладкой робота. На демо-счете в таблице «Клиентский портфель» кредитное плечо 1,00 и я могу выставить заявку только в пределах собственных средств. К тому же на демо-счете интересующих меня облигаций ВТБ Б-1-1 и  ВТБ Б-1-2 просто нет (хотя  это не проблема, можно отладить на других облигациях ). Но не отлаживать же робот, который выставляет заявки,  на реальном счете!  Брокер – ВТБ24. Может у других брокеров демо-счета с плечом?  
Откkючение маржинального кредитования в Quik
 
Цитата
Alexandr Shumilin написал:
Данный вопрос можно адресовать Вашему брокеру, в его силах отключить Вам возможность маржинального кредитования. Но тогда и не получиться выставить сразу несколько заявок, т.к. покупательная способность будет ограничена размером собственных средств.
Понятно. Я думал, что объем средств на еще не исполненные заявки не ограничивается собственными и заемными средствами и заявок можно выставлять сколько угодно.

Цитата
s_mike@rambler.ru написал:
Придется написать небольшой робот, который после исполнения каждой заявки смотрит на ситуацию с деньгами и при необходимости снимает остальные заявки. Отключением маржинального кредитования ваш вопрос не решается.
Спасибо за совет.   Например, если на счете 1 млн. руб., то выставляю 2 заявки по 1 млн. руб. на разные облигации, при кредитном плече 1:2. Точнее, чуть меньше, чем на 1 млн. руб., чтобы не войти в маржу из-за комиссии при открытии.  Если одна заявка исполнится, то вторую робот должен снять. Если одна заявка исполнится частично, например на 300 тыс. руб., то объем второй заявки робот должен уменьшить до 700 тыс. руб.  
Откkючение маржинального кредитования в Quik
 
При покупке облигаций встает вопрос: можно ли отключить маржинальное кредитование в Quik?

Вопрос связан вот с чем: После отмены налога на доход с корпоративных облигаций доход по ним стал больше, чем по ОФЗ.  Однако корпоративные облигации неликвидны, спред между ценами покупки  продажи порядка 0,5 %. Пример – ВТБ Б-1-2.  Если для покупки этой облигации выставить лимитную заявку даже по  лучшей цене покупки в стакане, то не факт, что заявка в течение дня исполнится.  Поэтому неплохо бы выставлять сразу 2 или несколько заявок на разные облигации, для увеличения шансов на сделку. Но тогда может исполниться больше одной заявки  и войдешь в  маржу. Чтобы выйти из маржи, придется срочно продавать лишние облигации, а из-за большого спреда получишь значительный убыток. Если бы можно было отключить маржинальное кредитование, то данная проблема была бы решена, т.к. тогда после исчерпания собственных средств ненужные заявки не будут исполняться.
не отображаются данные на графике
 
Цитата
Egor Zaytsev написал:
Виктор, если на графике в истории вы видите пробелы, то помочь может перезаказ архива графиков.
Да, вы потеряете архив, который накопился локально, но к сожалению, по другому в текущей реализации никак.
Добавим, что возможно и перезаказ не поможет, все зависит от того, какие графики на стороне брокера на сервере, возможно там тоже некорректные, с пробелами.

Спасибо за разъяснение. Значит в моем случае данные лучше не перезаказывать, а то больше потеряешь, чем найдешь. Возможно дыры истории связаны с тем, насколько часто запускаю терминал и в какое время. Так  вчера на одном компе, где терминал запускаю часто и во время торгов, дыры на минутных графиках исчезли, а на другом компе, где запускаю терминал почти всегда после сессии, дыры остались.

Но есть еще одна более серьезная  проблема.  У меня якорем к таблице текущих торгов привязаны 2 графика с разным таймфреймом. Когда перехожу с одной акции на другую, то бывает  графики загружаются с большой задержкой (10-30 сек),  но это происходит недолго и потом   все нормализуется. Но сегодня 16.11.2017 графики загружались с задержкой по нескольку минут всю вторую половину дня! Даже если переключался между 2-мя одними и теми же акциями (казалось бы в этом случае графики должны храниться в памяти). При этом связь была и котировки менялись.  Интересно, кто в этом случае неправ -  брокер или  интернет?
не отображаются данные на графике
 
Вот 2 примера дыр истории на минутном графике акций Лукойла: дыры 20.06.-06-07, 27-07-07.08, 28.08, 06.09-11.09 и 27.10 и  ГМКНорНик: дыры 20.06-22.06, 28.07.-07.08, 25.08-11.09 и 20.09-25.10.  Брокер - ВТБ 24.




 
не отображаются данные на графике
 
У меня тоже вопрос по этой теме. Речь идет о торговле на реальном счете.
На минутных  графиках акций постоянно присутствует  несколько дыр истории. Дыры проявляются визуально как  гэпы, которые реально не существуют.  Например, сейчас на графике Лукойла дыры в периоды 27.07-16.08, 25.08-06.10 и 18.10-31.10. На графиках разных акций периоды дыр отличаются. На других таймфреймах, например  5-минутных, часовых  и дневных,   дыр нет. В help  в разделе "перезаказ данных" написано, что для перезаказа данных можно  выбрать флаг «Архив данных для построения графиков». Но дальше такое предупреждение:
"ВАЖНО! На Рабочем месте QUIK хранится до 65000 свечей. При перезаказе архива графиков с сервера QUIK загружается не более 3000 свечей, остальные свечи, хранившиеся на Рабочем месте QUIK, удаляются."
Получается, что если я перезакажу данные, то наоборот  потеряю большую часть истории?
Можно ли как-то убрать дыры на минутных графиках акций?  
Подскажите как создать папку, переименовать папку или файл, удалить файл?
 
Цитата
s_mike@rambler.ru написал:
закрыть файл и использовать os.remove()
Спасибо за помощь.  При этом аргумент функции надо брать в кавычки, а путь указывать с двумя // типа
os.remove("d:\\files\\filename.txt")
Подскажите как создать папку, переименовать папку или файл, удалить файл?
 
Можно ли  программно удалить текстовый файл, созданный оператором  f = io.open(getScriptPath().."\\file.txt","w") ?  А то приходится каждый раз удалять ненужные файлы вручную.
Информация из таблицы текущих торгов
 
Цитата
Sergey Gorokhov написал:
Есть функция getClassSecurities которая вернет список инструментов в классе.
Еще есть getClassesList которая вернет список классов
Спасибо за рекомендацию.  
Можно еще вывести таблицу текущих торгов через DDE-сервер в файл excel. (в меню «действия» выбрать «вывод через DDE-сервер).   Затем в файле  удалить лишние столбцы, оставить только столбцы кодов бумаги и кодов класса (если код класса один, то столбец кодов класса тоже удалить).  Дальше сохранить файл как текстовый с расширением .txt.  Теперь просто считать столбец кодов бумаги в массив, предварительно открыв файл:
i=1
for line in f:lines() do
 sec_code[i]=tostring(line)
 i=i+1
end  
Информация из таблицы текущих торгов
 
При использовании функции getParamEx (class_code,  sec_code,  param_name) для получения параметров param_name из таблицы текущих торгов надо задавать class_code и  sec_code.  Приходится для sec_code  создавать массив километровой длины типа  sec_code  ={"ALRS","AFLT", ...,"FEES"}. А если список акций в таблице текущих торгов меняется то этот массив приходится  тоже менять.

Вопрос: можно ли просто прочитать все строки таблицы текущих торгов подряд без задания  class_code и  sec_code и определить параметры param_name?  
Сделки совершённые по рынку
 
В предыдущем моем  сообщении ошибка:
Цитата
Виктор Столетов написал:
На демо-счете я делал так: в окне ввода заявок ставлю флаг "рыночная" и задаю цену на несколько пунктов выше текущей цены плюс опции  "по одной цене" и "полностью или отклонить".  
Правильно будет  так (без слов "ставлю флаг "рыночная" ):
"На демо-счете я делал так: в окне ввода заявок выбираю "покупка" и задаю цену на несколько пунктов выше текущей цены плюс опции "по одной цене" и полностью или отклонить".  
Сделки совершённые по рынку
 
Цитата
swerg написал:
Вот бы автор потрудился написать что он подразумевает под "сделками по рынку"
Сделка по рынку в моем понимании выполняется по рыночной заявке,  когда в окне ввода заявок активирую флаг "рыночная".

По рыночным заявкам  у меня тоже есть вопрос,  и если сможете, то помогите коллеги.  Мне надо, чтобы рыночные заявки  исполнялись  полностью без дробления. Если в окне ввода заявки выбрать опции "по одной цене" и "полностью или отклонить", то рыночная заявка не проходит.  На демо-счете я делал так: в окне ввода заявок ставлю флаг "рыночная" и задаю цену на несколько пунктов выше текущей цены плюс опции  "по одной цене" и "полностью или отклонить".  Тогда заявка исполнялась полностью по текущей цене. Однако на реале такой трюк почему-то не проходит, т.е. сделка не совершается. Причем не выдает никаких сообщений об ошибке.  Чтобы как-то быть уверенным, что рыночная заявка выполнится полностью, я смотрю на стакан, и если у лучшей цены на продажу достаточный объем, то открываю на покупку (при этом оставляю опции по умолчанию "по разным ценам" и "поставить в очередь").  Но прежде чем успею в окне ввода заявки нажать "Да",  этот объем  ведь может измениться, и тогда моя сделка может быть выполнена частично.  
Поэтому  хотелось бы понять, можно ли законно отправить рыночную заявку  полностью по одной цене?  
Сделки совершённые по рынку
 
Цитата
Антон Нету написал:
Подскажите пожалуйста возможно ли как-нибудь узнать какие сделки были совершены по рынку у того или иного эмитента?
К примеру есть таблица обезличенных сделок, которая показывает все сделки. И по рынку и нет.

А возможно ли как-нибудь вытаскивать информацию именно по сделкам, которые прошли по рыночным ценам?

Может быть нужно написать скрипт какой-нибудь?
Чисто теоретически могу предложить такой подход:
Написать скрипт, который параллельно анализирует таблицу обезличенных сделок и стакан. Если  в стакане изменилось количество лотов только для лучшей цены покупки (продажи) на величину N и одновременно в таблице обезличенных сделок появилась сделка с количеством лотов  N на продажу (покупку), то это рыночная сделка.  Остальные сделки лимитные. При совершении  лимитной  сделки в стакане должно меняться одновременно количество лотов для лучшей цены покупки и продажи. Исключение составляет случай, когда для второй после лучшей цены покупки или продажи стоит такое же количество лотов, этот случай надо отслеживать.
Возможно, что сделка в таблице обезличенных сделок появляется с  некоторой небольшой задержкой после изменения данных в стакане, и эту задержку надо учесть в скрипте, а предварительно определить ее экспериментально.
Так можно оценить, какая доля всех сделок приходится на рыночные и лимитные.
Обезличенные сделки за прошлые торговые сессии
 
Цитата
Сергей Николаев написал:
Насчет МаркетМейкера напишу пару слов.
МаркетМейкер устанавливает цену открытия торговой сессии.
МаркетМейкер может "придержать" движение цены в определённую сторону.
"Придержать" это значит, что он может размещать очень крупные ордера на покупку и/или на продажу с целью остановить мелких трейдеров и/или скальперов. Позиционщиков это не сильно остановит или испугает, если они увидят очень крупные объёмы против их позиции.
А что, такое  объяснение выглядит  правдоподобно. Если ММ выставил такой большой фиктивный ордер например на покупку, то это психологически может не только остановить внутридневных трейдеров от продажи, а наоборот подтолкнет их к покупке. Парни смотрят на стакан и думают: раз толстосумы покупают, значит время покупать, а не продавать.
Спасибо вам Сергей за подробные разъяснения.

Насчет стакана интересно узнать мнение бывалых:  кого больше -  тех, кто открывается по рынку или тех, кто выставляет лимитные ордера?  
У меня опыта по акциям нет, а есть некоторый опыт на  форексе. Там  имеется 4 типа отложенных ордеров  - buy stop, sell stop, buy limit и sell limit.  Аналогов первых двух в Quik нет. Смысл например  buy stop в том, чтобы установить цену покупки выше текущей, и когда цена  развернется  вверх, ордер сработает.  Это разумно и даже в help по Metatrader4 написано, что чаще всего выставляют именно ордера buy stop и sell stop.  Однако если в Quik выставить заявку  типа buy stop на покупку по цене выше рыночной, то она сработает сразу же по текущей цене!  
На мой взгляд выставлять ордера типа buy limit и sell limit или лимитные ордера по акциям – не очень умная стратегия. Потому что например при лимитном ордере на покупку цена боле вероятно опустится  еще ниже установленной в ордере цены, чем пойдет  вверх. Еще как то может быть оправдано  установить цену на покупку ниже рыночной цены у уровня поддержки, но все равно рискованно.   Так что стакан похоже не лучший показатель общей картины по акции.
Обезличенные сделки за прошлые торговые сессии
 
Цитата
Stanislav Tvorogov написал:
При работе с демо-версией QUIK Junior графики и цены действительно не соответствуют тем, что транслируются биржей, а эмулируются программно.
Я так и думал.  В Quik на демо-счете  похоже   много сюрпризов. Например,  если в конце торговой сессии  записать цену закрытия, то на следующий день на дневной свече того предыдущего дня будет уже другая цена закрытия.  Поэтому соответствие  котировок на демо-счете и реале вызывает сомнение, хотя внешне графики выглядят похоже.   Из-за того, что сделки на следующий день почему-то исчезают, их  приходится записывать в Excel. В общем отработать  долгосрочную стратегию на демо-счете в Quik  сложно.
К слову,   на Forex в Metatader4 таких проблем нет, а   графики на демо-счете   в выходные дни не исчезают (хотя торговли на Forex  в выходные дни тоже нет, как и по акциям).

Цитата
Denis написал:
прямой коррелляции между ценой и объемами нет. Можно нарисовать умопомрачительное падение или рост на малых объемах и наоборот. Какая цена нужна ММ такая и будет.
Это заметно. Например, на дневном графике акций «Башнефть» с 16 ноября и по сей день свечи как расплющенные, при довольно больших объемах. На Forex  такого паттерна не встречал.  Возможно многие мелкие держатели  продают эти акции, а компания «Башнефть» пытается  поддержать свои акции и выкупает их, вот цена и меняется мало.
Обезличенные сделки за прошлые торговые сессии
 
Пользуясь данной темой,  задам тоже  вопрос по таблице обезличенных сделок:

Сегодня 21 декабря если посмотреть таблицу обезличенных сделок по акциям М.Видео, то там почти одни продажи, причем крупные лоты исключительно продажи. Несмотря на это акция падает не сильно, а временами даже поднимается. Как же так может быть?  Кроме того,  ведь  на каждого продавца должен быть покупатель, так что сумма продаж за любой интервал, например минутный,   по идее должна быть уравновешена суммой покупок. А этого нет.

Реального счета у меня пока нет, и  все это вижу  на демо-счете? Может причина в этом?
Подскажите как создать папку, переименовать папку или файл, удалить файл?
 
Цитата
Constantin написал:
А если "," использовать?
Это я вчера немного заработался, видно устал. На самом деле метод с разделителями работает, причем с любыми, в т. ч. и с запятой. В моем случае надо было при вызове excel  после запроса, какой разделитель, установить флаг “точка с запятой”.   Расширение .csv присваивать нет необходимости.  На практике для вывода данных в таблицу для просмотра  в excel  надо написать что-то типа такого (предварительно открыть файл  .txt оператором io.open):

for i=1,3 do
f:write(i .. ";" ..i+1 .. ";” i+2 .. “\n")
end  
Подскажите как создать папку, переименовать папку или файл, удалить файл?
 
Здравствуйте уважаемые программеры!
У меня тоже вопрос по файлам и чтобы не создавать новую тему, решил написать здесь..  
Файловые операторы типа  f= io.open(...),   f:write(...)  выводят данные в обычный текстовый файл .txt. Если  данные разной длины, то они  "едут" и плохо читаются.  
Можно ли каким-то способом вывести данные в  файл  .csv, чтобы потом открыть его в excel, где данные разделены  нормально по столбцам?

P.S. пробовал вставить разделители ";"  в конце выводимых полей  типа f:write("fild1;" .. "fild2;" .. "fild1"), а потом присвоить файлу расширение .csv, но так обмануть программу конкретно не получилось (т.е .excel этого не понял)..
QLUA, вопросы начинающих.
 
Цитата
Sergey Denegin написал:
я тоже пользуюсь notepad++. Иногда при открытии даже ранее редактируемого в нем скрипта, он почему-то считает, что у него какая-то другая кодировка. Чтобы быть уверенным, идете в меню "Кодировки => кодировки => кирилица => windwos-1251.
После этого проверяете, что в тексте скрипта все по русски. Если нет, придется исправить на русский текст.
Спасибо, Сергей.  Все получилось.  Когда из Notepad++ выбрал кодировку win1251, то действительно все русские слова в тексте скрипта стали  иероглифами. После того, как перебил их снова на русский,  стал выводиться нормальный  русский текст.  
QLUA, вопросы начинающих.
 
Вот  это за пределами моего понимания . Как же убедится, что кодировка win1251?     Скрипт  был написан в редакторе Notepade. Он что, кодирует по другому, чем стандартная кодировка Windows?  
QLUA, вопросы начинающих.
 
Приветствую коллеги. Столкнулся вот с какой проблемой:
Когда в скрипте Lua  в операторах message и  PrintDbgStr  пишу русский текст, то выдает иероглифы.  Пробовал перезагружаться   и еще на другом компьютере, но это не помогло.  С латынью проблем нет.  В индикаторах эти  операторы выводят русский текст нормально.  Может кто знает, как  заставить скрипт говорить по-русски?  
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Теперь я понял -  надо, чтобы одновременно было открыто оба графика.  Например, если индикатор  на часовом графике, и  в нем  выполняются  какие-то операции с минутными барами, то сначала открываем  минутный график и  задаем на нем на вкладке «дополнительно» идентификатор.  Затем кидаем индикатор на часовой график.  
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Цитата
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?
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Спасибо вам  всем, Сергей, Егор и Старатель, за разъяснения.  Со своей задачей перевода индикаторов с 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 нет.
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Цитата
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.  
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Цитата
Виктор Столетов написал:
Как я понял, если  выводить переменную не строкового типа, то надо писать типа  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

Если что не так, то коллеги поправьте - я начинающий.
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Цитата
s_mike@rambler.ru написал:
в любом месте индикатора вызывайте   printdbgstr и выводите нужные вам значения. Вы их увидите в debugview
Теперь наконец получилось! Да,  затупил немного, но про Lua узнал только вчера и как-то трудно было сразу въехать в тему.
Как я понял, если  выводить переменную не строкового типа, то надо писать типа  PrintDbgStr(x .. " ") .  Непонятно только,  почему, когда этот оператор ставлю в  Oncalculate, то  в debugview значение переменной выводится на один раз, а многократно.  Пробовал  то же самое делать в обычном скрипте (не в индикаторе),  и при этом   переменная появлялась в debugview  только один раз.

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

Все равно при таком раскладе отладить индикатор вполне реально. Спасибо вам,  s-mike, за дельный совет.
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Цитата
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?
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Скачал Decoder, но запустить его не получилось - выдает ошибку 0хс000007b (ошибка при запуске приложения).  
Раньше  я программировал на MQL4 в MetaTrader 4 (Forex),  там есть встроенный отладчик и вопросов не было. Теперь хочу перенести  свои индикаторы c MQL4 в Lua.
Но прежде чем изучать язык Lua, хотелось бы понять  - как  отладить индикатор в Lua?  А для начала  - как найти,  где ошибка в синтаксисе   индикатора?  Обязательно ли для этого нужен  Decoder?
Надеюсь на вашу помощь коллеги.
Страницы: Пред. 1 2
Наверх