Здравствуйте. Спасибо за оперативность. Для построения скользящей средней с нулевой задержкой. Берётся скользящая средняя с каким то периодом, она усредняется (сглаживается ). Эта разница прибавляется к скользящей средней с меньшим периодом и всё, получается, как бы средняя с "нулевой задержкой". В метастоке реализовать это пустяк, а вот, если не хватает грамотёшки в программировании на Lua для меня это проблема. Спасибо. Если возможно пример рабочего кода скользящей средней на среднюю на Lua.
добрый день, всем участникам форума. Нужна помощь в программировании LUA: кто-нибудь подскажите, как экспоненциальную скользящую среднюю усреднить. Спасибо.
Дмитрий запретил ссылки сторонних ресурсов, дабы не спамили рекламу, но к сожалению он просто не модерирует сайт и его тут нет и его людей, поэтому тут вы вряд-ли чего дождетесь. Ну либо ждите, пока моё сообщение с сылкой будет видно
Привет, Александр, одобрил) Когда не было запрета, в комментах спам-боты постили ссылки на порносайты, я решил, что это не особо уместный контент в данном контексте)))
Как узнать за сколько миллисекунд происходит например три, десять или 100 рыночных ордера. но не внутри одной цены, а когда цена стреляет. То есть к примеру за секунду образуется новый длинный бар по рынку в котором 10 или 100 тиков цены. Какая функция возвратит миллисекунды за которые этот бар вырос?
И тоже интересный вопрос - удар по рынку всегда имеет одну и ту же скорость (если идут только! покупки или продажи) или могут быть более медленные врывы и более быстрые, в миллисекундах? (по логике, если покупатель\продавец выкупает нужное количество шагов цены, то технически скорость должна быт неизменной...)
Судя по комментариям на форуме QUIK, начиная с версии 8.5 терминала выполнено обновление ядра Lua и, как я понял, цена теперь возвращается в другом формате.
Для начала обратите внимание, что запись '[\.]+' не верна ни для Lua 5.1 ни для Lua 5.3
В Lua используются шаблоны, на этом сайте есть список доступных классов, используемых в шаблонах. Для вставки магических символов используется символ '%', но не '\'. Именно по этой причине Вы получаете ошибку.
Используя данную запись
1
price =string.format("%.0f", price)
Вы избавились от ошибки, а проверили что возвращает эта функция?
Выполните следующий код:
1
2
3
local prc =25.78;local price =string.format("%.0f", prc);
message("Цена = ".. price);
В ответ получите сообщение 'Цена = 26'
Если Вас устраивает, что цены округляются до целых значений, то используйте свой вариант.
Но все же правильнее будет заменить символ '\' на '%' и будет работать Ваш первый вариант.
Выполнив такой код:
1
2
3
local prc =25.78;local price =string.gsub(tostring(prc),'[%.]+',',')
message("Цена = ".. price);
можно перебрать все индексы в цикле, получить дату время свечи и если совпадает, то вернуть индекс и нужные значения.
а можно на старте создать таблицу с индексами в формате: ["YYYYMMDD_HHMM"] = index и добавлять в нее новые индексы, тогда поиск сократиться многократно.
1
2
3
4
5
6
7
8
9
10
11
12
13
local hash_tm ={}local oindex =0function OnCalculate(index)if index ==1then
oindex = Size()for i =1, oindex dolocal tm =os.date("%Y%m%d_%H%M",os.time(T(i)))
hash_tm[tm]={i}end
message("index= "..tostring(hash_tm["20201022_2105"]),2)end--какой-то кодend
Если пользуетесь функцией чтения с графика, то принцип тот же
хочу попробовать создать индикатор который берет значения из файла, который был создан скриптом, ранее который обсуждали. Что если определяем дату/время текущего индекса, далее в цикле сравниваем эту дату/время с таблицей из файла и если совпало то возвращаем текущему индексу значение из таблицы и так далее для следующих индексов? Получится так?
файл не потокобезопасный и нужно делать кучу проверок и доступ к данным медленнее, чем через общее пространство имен.
лучше начните сразу со сложного варианта, сэкономите свое время.
--скачать lua_share https://quik2dde.ru/viewtopic.php?id=306--lua_share.dll кладем в корень квик в папку scripts--индикатор не "отпускает" библиотеку lua_share и поддерживает пространство имен, даже при выключенных роботах
package.cpath=package.cpath..";"..getWorkingFolder().."/scripts/?.dll"local sh =require'lua_share'
Settings ={}
Settings.Name ="*sh_intervalEx"function Init()return1endlocal strInt ={[0]="tick",[1]="M1",[2]="M2",[3]="M3",[4]="M4",[5]="M5",[6]="M6",[10]="M10",[15]="M15",[20]="M20",[30]="M30",[60]="M60",[120]="H2",[240]="H4",[-1]="D",[-2]="W",[-3]="MN",}local old_index
local ns --пространство именfunction OnCalculate(index)if index ==1then
old_index = Size()local info = getDataSourceInfo()local ticker=tostring(info.sec_code)local ns_name = ticker:sub(1,2)--для срочного рынка--для акций следует использовать: ns_name = market.."_"..ticker
ns = sh.GetNameSpace(ns_name)
ns.market =tostring(info.class_code)
ns.ticker = ticker
ns.interval= strInt[info.interval]
ns.bar_px =os.time(T(old_index))--считываем из пространства имен
message(tostring(ns.ticker).."\n"..tostring(os.date("%H:%M:%S", ns.bar_px)).."\ninterval= "..tostring(ns.interval),2)endif index > old_index then
old_index = index
ns.bar_px =os.time(T(index))endif index == Size()then ns.last = C(index)endend
и бот:
1
2
3
4
5
6
7
8
9
package.cpath=package.cpath..";"..getWorkingFolder().."/scripts/?.dll"local sh =require'lua_share'function main()local ns_name ="Si"--у меня индикатор sh_intervalEx добавлен на график "SiZ0"local ns = sh.GetNameSpace(ns_name)
message(tostring(ns.ticker).." "..tostring(ns.last),2)end
Привет коллеги!
Подскажите пожалуйста можно как то отменить окно сообщения VCL.MessageDlg по условию. Ситуация такая: при наступлении условия из майн выводим окно диалога с подтверждением да..нет, окно висит и ждет... далее по другому условию появляется другое окно с диалогом... как убрать предыдущее если выбор не сделан..то есть кнопки остались не нажаты
Добрый день kalikazandr. Попробовал проверить ваш ответ не идет - attempt to call a nil value (global 'all_trades_bs') . Сам скрипт прост, но не понятно какую переменную передовать в функцию local function all_trades_bs(flags)
попробовал переменную f не правильно, попробовал (all_trades.flags) тоже нет. Что передовать в ф-ю ???
Run = true
function main()
local p,f = nil,nil
while Run do
for i=1,getNumberOf("all_trades") - 1 do
if 10 == getItem("all_trades",i).datetime.hour and 0 == getItem("all_trades",i).datetime.min and 1 == getItem("all_trades",i).datetime.sec then
p = getItem("all_trades",i).price; f = getItem("all_trades",i).flags
if all_trades_bs(f) == "S" then message("SHELL p="..p)
else message("BUY p="..p)
end
elseif i==10 then Run = false message(" I=20")
end
end
end
end
local function all_trades_bs(flags)
-- направление обезличенной сделки
if bit.band(flags, 0x1) ~= 0 then
return "S", -1
else
return "B", 1
end
end
Конечно, вы функцию all_trades_bs объявили локально, а точку ее вызова выше ее области видимости
И честно, перестаньте баловаться вот таким способом получить данные: getItem("all_trades",i).datetime.hour
функция getItemищет хранилище квик по ключу "all_trades" и нужную строку по "i", хранилище это в Пекине.
поэтому один раз получаете строку:
Local item = getItem("all_trades",i)
и дальше работаете уже с ней:
local price = item.price
local hour = item.datetime.hour
Уважаемые знатоки подскажите как узнать битовый флаг в таблице обезличенных сделок. Как в функции bit.band указывают необходимую строку ?
if bit.band ( all_trades.flags и как указать необходимую строчку ....?
Добрый день kalikazandr. Попробовал проверить ваш ответ не идет - attempt to call a nil value (global 'all_trades_bs') . Сам скрипт прост, но не понятно какую переменную передовать в функцию local function all_trades_bs(flags)
попробовал переменную f не правильно, попробовал (all_trades.flags) тоже нет. Что передовать в ф-ю ???
Run = true
function main()
local p,f = nil,nil
while Run do
for i=1,getNumberOf("all_trades") - 1 do
if 10 == getItem("all_trades",i).datetime.hour and 0 == getItem("all_trades",i).datetime.min and 1 == getItem("all_trades",i).datetime.sec then
p = getItem("all_trades",i).price; f = getItem("all_trades",i).flags
if all_trades_bs(f) == "S" then message("SHELL p="..p)
else message("BUY p="..p)
end
elseif i==10 then Run = false message(" I=20")
end
end
end
end
local function all_trades_bs(flags)
-- направление обезличенной сделки
if bit.band(flags, 0x1) ~= 0 then
return "S", -1
else
return "B", 1
end
end
Здравствуйте. Спасибо за оперативность. Для построения скользящей средней с нулевой задержкой. Берётся скользящая средняя с каким то периодом, она усредняется (сглаживается ). Эта разница прибавляется к скользящей средней с меньшим периодом и всё, получается, как бы средняя с "нулевой задержкой". В метастоке реализовать это пустяк, а вот, если не хватает грамотёшки в программировании на Lua для меня это проблема. Спасибо. Если возможно пример рабочего кода скользящей средней на среднюю на Lua.
добрый день, к сожалению, готового примера нет
добрый день, всем участникам форума. Нужна помощь в программировании LUA: кто-нибудь подскажите, как экспоненциальную скользящую среднюю усреднить. Спасибо.
здравствуйте, не совсем понятно, зачем вам усреднять среднюю.
https://quikluacsharp.ru/wp-content/uploads/2016/04/Sozdanie-indikatorov-tehnicheskogo-analiza-s-pomoshhyu-skriptov-Lua.pdf
Подскажите, есть ли возможность, чтобы окно скрипта было всегда поверх всех окон, не горячими клавишами, а командой или функцией
а если несколько терминалов, то какой именно поверх всех окон?
Поверх окон не терминал, а скрипт lua.
просмотрел 😉 еще не спал со вчера,
https://quik2dde.ru/viewtopic.php?id=78&p=3
Дмитрий запретил ссылки сторонних ресурсов, дабы не спамили рекламу, но к сожалению он просто не модерирует сайт и его тут нет и его людей, поэтому тут вы вряд-ли чего дождетесь. Ну либо ждите, пока моё сообщение с сылкой будет видно
Привет, Александр, одобрил) Когда не было запрета, в комментах спам-боты постили ссылки на порносайты, я решил, что это не особо уместный контент в данном контексте)))
Привет, Дмитрий! Хорошо, что не пропал)
Спасибо огромное, попробую.
Как узнать за сколько миллисекунд происходит например три, десять или 100 рыночных ордера. но не внутри одной цены, а когда цена стреляет. То есть к примеру за секунду образуется новый длинный бар по рынку в котором 10 или 100 тиков цены. Какая функция возвратит миллисекунды за которые этот бар вырос?
И тоже интересный вопрос - удар по рынку всегда имеет одну и ту же скорость (если идут только! покупки или продажи) или могут быть более медленные врывы и более быстрые, в миллисекундах? (по логике, если покупатель\продавец выкупает нужное количество шагов цены, то технически скорость должна быт неизменной...)
Вам никто не расскажет, это сравни - дайте денег
даже, если вы разберетесь, то хочу вас огорчить в 30% случаев цена продолжает движение без откатов и гораздо больше, чем первоначальный толчек
как именно вам поможет заработать деньги знание этих миллисекунд?
я не смотрю миллисекунды и это мне помогает зарабатывать
Можете подсказать, как в Qlua определить, какая тема оформления Quikа при запуске скрипта.
isDarkTheme()
Спасибо, попробую
После обновления QUIK не запускает скрипт, пишет ошибку "invalid escape sequence near" на строку
в блоке, который приводит переданную цену к требуемому для транзакции по инструменту виду. Кто-нибудь сталкивался с таким же?
Судя по комментариям на форуме QUIK, начиная с версии 8.5 терминала выполнено обновление ядра Lua и, как я понял, цена теперь возвращается в другом формате.
Я, кажется, сам починил. Заменил
на
ошибка пропала
Для начала обратите внимание, что запись '[\.]+' не верна ни для Lua 5.1 ни для Lua 5.3
В Lua используются шаблоны, на этом сайте есть список доступных классов, используемых в шаблонах. Для вставки магических символов используется символ '%', но не '\'. Именно по этой причине Вы получаете ошибку.
Используя данную запись
Вы избавились от ошибки, а проверили что возвращает эта функция?
Выполните следующий код:
В ответ получите сообщение 'Цена = 26'
Если Вас устраивает, что цены округляются до целых значений, то используйте свой вариант.
Но все же правильнее будет заменить символ '\' на '%' и будет работать Ваш первый вариант.
Выполнив такой код:
в ответ увидите сообщение 'Цена = 25,78'
Благодарю за совет.
Запись с '[\.]+' я брал как раз таки с этого сайта и она успешно работала с 17го года, пока QUIK не обновился до 8.5
Округление цены до целого значения меня полностью устраивает, т.к. работаю только с RI, а у неё дробных цен не бывает.
У кого-нибудь есть функция которая возвращает номер индекса свечи текущего таймфрейма заданной даты/времени?
можно перебрать все индексы в цикле, получить дату время свечи и если совпадает, то вернуть индекс и нужные значения.
а можно на старте создать таблицу с индексами в формате: ["YYYYMMDD_HHMM"] = index и добавлять в нее новые индексы, тогда поиск сократиться многократно.
Если пользуетесь функцией чтения с графика, то принцип тот же
хочу попробовать создать индикатор который берет значения из файла, который был создан скриптом, ранее который обсуждали. Что если определяем дату/время текущего индекса, далее в цикле сравниваем эту дату/время с таблицей из файла и если совпало то возвращаем текущему индексу значение из таблицы и так далее для следующих индексов? Получится так?
Получится, только файл не есть хорошо. Лучше использовать общее пространство имен
https://quik2dde.ru/viewtopic.php?id=306
Хотя бы попробовать с файлом, а потом на более сложный вариант переходить. Почему с файлом не есть хорошо?
файл не потокобезопасный и нужно делать кучу проверок и доступ к данным медленнее, чем через общее пространство имен.
лучше начните сразу со сложного варианта, сэкономите свое время.
и бот:
Спасибо, буду пробовать)
Пожалуйста, успехов вам!
Привет коллеги!
Подскажите пожалуйста можно как то отменить окно сообщения VCL.MessageDlg по условию. Ситуация такая: при наступлении условия из майн выводим окно диалога с подтверждением да..нет, окно висит и ждет... далее по другому условию появляется другое окно с диалогом... как убрать предыдущее если выбор не сделан..то есть кнопки остались не нажаты
Вопрос решен
окно висит и ждет) и робот тоже курит) так себе решение.
проще сделать форму для сообщений и при нажатии кнопок сбрасывать флаг: Visible = false
Делал для подтверждения сигнала вручную.. к сожалению полный автомат пока не получается
Добрый день kalikazandr. Попробовал проверить ваш ответ не идет - attempt to call a nil value (global 'all_trades_bs') . Сам скрипт прост, но не понятно какую переменную передовать в функцию local function all_trades_bs(flags)
попробовал переменную f не правильно, попробовал (all_trades.flags) тоже нет. Что передовать в ф-ю ???
Run = true
function main()
local p,f = nil,nil
while Run do
for i=1,getNumberOf("all_trades") - 1 do
if 10 == getItem("all_trades",i).datetime.hour and 0 == getItem("all_trades",i).datetime.min and 1 == getItem("all_trades",i).datetime.sec then
p = getItem("all_trades",i).price; f = getItem("all_trades",i).flags
if all_trades_bs(f) == "S" then message("SHELL p="..p)
else message("BUY p="..p)
end
elseif i==10 then Run = false message(" I=20")
end
end
end
end
local function all_trades_bs(flags)
-- направление обезличенной сделки
if bit.band(flags, 0x1) ~= 0 then
return "S", -1
else
return "B", 1
end
end
Конечно, вы функцию all_trades_bs объявили локально, а точку ее вызова выше ее области видимости
И честно, перестаньте баловаться вот таким способом получить данные: getItem("all_trades",i).datetime.hour
функция getItemищет хранилище квик по ключу "all_trades" и нужную строку по "i", хранилище это в Пекине.
поэтому один раз получаете строку:
Local item = getItem("all_trades",i)
и дальше работаете уже с ней:
local price = item.price
local hour = item.datetime.hour
попробуйте так:
Спасибо за ответ - буду пробовать и отдельно спасибо за Local item = getItem("all_trades",i) - будем "посмотреть" .
Уважаемые знатоки подскажите как узнать битовый флаг в таблице обезличенных сделок. Как в функции bit.band указывают необходимую строку ?
if bit.band ( all_trades.flags и как указать необходимую строчку ....?
Попробуйте так.
Добрый день kalikazandr. Попробовал проверить ваш ответ не идет - attempt to call a nil value (global 'all_trades_bs') . Сам скрипт прост, но не понятно какую переменную передовать в функцию local function all_trades_bs(flags)
попробовал переменную f не правильно, попробовал (all_trades.flags) тоже нет. Что передовать в ф-ю ???
Run = true
function main()
local p,f = nil,nil
while Run do
for i=1,getNumberOf("all_trades") - 1 do
if 10 == getItem("all_trades",i).datetime.hour and 0 == getItem("all_trades",i).datetime.min and 1 == getItem("all_trades",i).datetime.sec then
p = getItem("all_trades",i).price; f = getItem("all_trades",i).flags
if all_trades_bs(f) == "S" then message("SHELL p="..p)
else message("BUY p="..p)
end
elseif i==10 then Run = false message(" I=20")
end
end
end
end
local function all_trades_bs(flags)
-- направление обезличенной сделки
if bit.band(flags, 0x1) ~= 0 then
return "S", -1
else
return "B", 1
end
end