Добрый день, уважаемые языковеды! Прошу не кидать в меня тапками, я только начал изучать язык. Помогите пожалуйста с созданием бесконечного цикла функции. Двое суток читал и пробовал, ничего не вышло. Вот, к примеру есть функция:
Скрытый текст
function main() kol_vo = getNumCandles ('SRH15MIN') SRH15MIN, SiN, SiName = getCandlesByIndex ('SRH15MIN',0 ,0 ,kol_vo) for i = 100, SiN -100, 10 do H = SRH15MIN .high L = SRH15MIN .low O = SRH15MIN .open C = SRH15MIN .close if O C then RED = RED + 1 end end message('GREEN = '..GREEN.. ' \nDOJE = '..DOJE.. ' \nRED = '..RED) end
Я хотел сделать ее бесконечной, с паузой в 30 секунд. Пробовал разные циклы (for, while и repeat) Не выходит каменный цветок Не по уму пока. Помогите, прошу!
Благодарю! Но оно тоже не работает. Либо я не правильно применяю данное решение к функции. Как оно применяется к функции? Я свою функцию ко всем местам этого кода приложил.. И внутрь ее положил, и снаружи..
shtur2005 написал: Добрый день, уважаемые языковеды! Прошу не кидать в меня тапками, я только начал изучать язык. Помогите пожалуйста с созданием бесконечного цикла функции. Двое суток читал и пробовал, ничего не вышло.
Я вам пример набросал: скрипт в цикле выводит сообщения со значениями даты/времени и high/low последних 5 свечей (CNT_CANDLES = 5). Работает.
Код
local CHART_TAG_PRICE = "SRH15MIN" -- идентификатор графика цены
local CNT_CANDLES = 5 -- значение количества свечей для обработки
local is_run = true
local processed -- количество обработанных свечей графика
local function timeCandle (hour, min) -- функция формирования времени свечи (number)
return 10000 * hour + 100 * min
end
local function dateCandle (year, month, day) -- функция формирования даты свечи (number)
return 10000 * year + 100 * month + day
end
local function singleCandleProcessing (t) -- функция обработки одиночной свечи
local time = timeCandle(t.datetime.hour, t.datetime.min) -- вызов функции формирования времени свечи
local date = dateCandle(t.datetime.year, t.datetime.month, t.datetime.day) -- вызов функции формирования даты свечи
message(tostring(date) .. " " .. tostring(time) .. ". High: " .. tostring(t.high) .. ", low: " .. tostring(t.low))
end
local function candlesProcessing () -- функция обработки последней свечи/свечей
local number = getNumCandles(CHART_TAG_PRICE) -- количество свечей графика
if number > processed then
local t = getCandlesByIndex(CHART_TAG_PRICE, 0, processed, number - processed) -- получение таблицы последней свечи/свечей
if t then
for i = 0, number - processed - 1 do
if t[i] then
singleCandleProcessing(t[i]) -- вызов функции обработки одиночной свечи
end
end
processed = number
end
end
end
function main ()
processed = getNumCandles(CHART_TAG_PRICE) - CNT_CANDLES
while is_run do
candlesProcessing () -- вызов функции обработки последней свечи/свечей
sleep (30000)
end
end
function OnStop ()
is_run = false
return 2000
end
Написал для Вас такой пример. Позволяет исполнять различные участки кода через различные интервалы.
Код
print(os.date())
tstart = os.clock()
t={0,0,0,0} -- массив таймеров
t1={1,2,3,5} --массив интервалов
tm=0; -- время в минутах
while true do
local x=os.clock()
if x-tstart>=60 then tstart=x; tm=tm+1
=1; if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end
j=2; if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end
j=3; if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end
j=4; if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end
end
end
результат : 02/19/22 18:07:37 02/19/22 18:08:37, исполняется код интервал 1 мин 02/19/22 18:09:37, исполняется код интервал 1 мин 02/19/22 18:09:37, исполняется код интервал 2 мин 02/19/22 18:10:37, исполняется код интервал 1 мин 02/19/22 18:10:37, исполняется код интервал 3 мин 02/19/22 18:11:37, исполняется код интервал 1 мин 02/19/22 18:11:37, исполняется код интервал 2 мин 02/19/22 18:12:37, исполняется код интервал 1 мин 02/19/22 18:12:37, исполняется код интервал 5 мин --------------------------------- Все понятно?
print(os.date())
tstart = os.clock()
t={0,0,0,0} -- массив таймеров
t1={1,2,3,5} --массив интервалов
tm=0; -- время в минутах
while true do
local x=os.clock()
if x-tstart>=60 then tstart=x; tm=tm+1
j=1; if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end
j=2; if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end
j=3; if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end
j=4; if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end
end
end
shtur2005, Любой бесконечный цикл формулируется на Lua как while true do... end; Любая пауза формулируется на Lua как sleep (Nms); А, ну да - s_mike всё это уже описал. А со свечами здесь полная жопа, причём даже нет надежды, что положение когда-нибудь улучшится.
Владимир написал: shtur2005, Любой бесконечный цикл формулируется на Lua как while true do... end; Любая пауза формулируется на Lua как sleep (Nms); А, ну да - s_mike всё это уже описал. А со свечами здесь полная жопа, причём даже нет надежды, что положение когда-нибудь улучшится
Благодарю, Владимир. Если отбросить в сторону свечи, и взять за пример функцию состоящую из одной строчки. Как ее зациклить?
--тынц function main() message ('GOOD MORNING') end
Благодарю всех за ответы, и ваше потраченное время! Если отбросить вычисления свечей, и зациклить функцию из одной строчки через 30 сек, как это будет выглядеть?
--тынц function main() message ('GOOD MORNING') end
shtur2005 написал: Благодарю всех за ответы, и ваше потраченное время! :: Если отбросить вычисления свечей, и зациклить функцию из одной строчки через 30 сек, как это будет выглядеть?
--тынц function main() message ('GOOD MORNING') end
К примеру, можно сделать вот так:
Скрытый текст
function HI() message ('GOOD MORNING') end --тынц function main() --тынц HI() sleep (30000) --тынц HI() sleep (30000) --тынц HI() sleep (30000) end
и так дальше, до слез в глазах. Но это не совсем корректно.
stopped = false function OnStop() stopped = true return 5000 end
function candle() kol_vo = getNumCandles ('SRH15MIN') SRH15MIN, SiN, SiName = getCandlesByIndex ('SRH15MIN',0 ,0 ,kol_vo) for i = 100, SiN -100, 10 do H = SRH15MIN [i].high L = SRH15MIN [i].low O = SRH15MIN [i].open C = SRH15MIN [i].close if O < C then GREEN = GREEN + 1 end if O == C then DOJE = DOJE + 1 end if O > C then RED = RED + 1 end end message('GREEN = '..GREEN.. ' \nDOJE = '..DOJE.. ' \nRED = '..RED) end
GREEN = 0 DOJE = 0 RED = 0
function main() while true do candle() sleep (30000) end end
shtur2005 написал: stopped = false function OnStop() stopped = true return 5000 end
function candle() kol_vo = getNumCandles ('SRH15MIN') SRH15MIN, SiN, SiName = getCandlesByIndex ('SRH15MIN',0 ,0 ,kol_vo) for i = 100, SiN -100, 10 do H = SRH15MIN .high L = SRH15MIN .low O = SRH15MIN .open C = SRH15MIN .close if O < C then GREEN = GREEN + 1 end if O == C then DOJE = DOJE + 1 end if O > C then RED = RED + 1 end end message('GREEN = '..GREEN.. ' \nDOJE = '..DOJE.. ' \nRED = '..RED) end
GREEN = 0 DOJE = 0 RED = 0
function main() while true do candle() sleep (30000) end end
это плохое решение. У Вас поток main, который работает параллельно основному ничего не делает 30 секунд. т е у Вас скрипт фактически простаивает это время, а если работает, то простаивает основной поток квика.
shtur2005 написал: stopped = false function OnStop() stopped = true return 5000 end
function candle() kol_vo = getNumCandles ('SRH15MIN') SRH15MIN, SiN, SiName = getCandlesByIndex ('SRH15MIN',0 ,0 ,kol_vo) for i = 100, SiN -100, 10 do H = SRH15MIN .high L = SRH15MIN .low O = SRH15MIN .open C = SRH15MIN .close if O < C then GREEN = GREEN + 1 end if O == C then DOJE = DOJE + 1 end if O > C then RED = RED + 1 end end message('GREEN = '..GREEN.. ' \nDOJE = '..DOJE.. ' \nRED = '..RED) end
GREEN = 0 DOJE = 0 RED = 0
function main() while true do candle() sleep (30000) end end
это плохое решение. У Вас поток main, который работает параллельно основному ничего не делает 30 секунд. т е у Вас скрипт фактически простаивает это время, а если работает, то простаивает основной поток квика.
Как все сложно Два дня матчасть курил. и не то сделал.
Да никак не делать! ВАМ, ЛИЧНО ВАМ нужно что-то делать в эти 30 секунд? Нет? Так какое Вам дело, что кто-то там что-то "простаивает"? И вообще, разделение по потокам - это одна из главных глупостей Lua (после этой долбаной "динамической типизации" и убийства типа integer).
Да никак не делать! ВАМ, ЛИЧНО ВАМ нужно что-то делать в эти 30 секунд? Нет? Так какое Вам дело, что кто-то там что-то "простаивает"? И вообще, разделение по потокам - это одна из главных глупостей Lua (после этой долбаной "динамической типизации" и убийства типа integer).
это плохое решение. У Вас поток main, который работает параллельно основному ничего не делает 30 секунд. т е у Вас скрипт фактически простаивает это время, а если работает, то простаивает основной поток квика.
Как все сложно Два дня матчасть курил. и не то сделал.
А как сделать так, что бы одно другому не мешало?
Я Вам дал пример, в котором показано как реализовать запуск множества участков кода(функций ) через любые интервалы от 1 секунды . Изучите его и на его основе попробуйте сделать свое. ---------------------------------------- Поясняю, Относительно того, что делать потоку main в эти 30 секунд. ------------------------ Дела в том, что виртуальная машина LUA встроена в терминал КВИК таким образом, что все колбеки исполняются последовательно в основном потоке терминала. ---------------------- Полагаю, Вы видели множество этих колбеков в документации QLUA. -------------------- Поэтому даже если у Вас супер компьютер, то все колбеки функции будут работать на одном ядре и выполнятся последовательно. ------------------------------------ При этом основной поток терминала КВИК будет ждать завершение их работы. ---------------------------------- Скорее всего Вы поместите всю свою обработку в эти колбеки и таким образом Ваш робот превратится из кареты в тыкву. ------------------- Так вот, чтобы этого не произошло, разработчик QLUA и создал новый поток main, который исполняется на другом ядре в компе и работает параллельно с основным потоком КВИК. -------------------- Полагаю, Вы уже поняли чем может заниматься main в эти 30 секунд? --------------- Если нет, поясняю. Поток main в это время может исполнять всю программу робота, которую Вы собираетесь поместить в функции колбеков. -------------------------- В итоге в правильном роботе, работающему максимально быстро, этому потоку будет много работы и у него просто не будет свободного времени. ---------------------------- Успехов в учебе.
и еще... Если есть желание совершенствовать своего робота, то рекомендую изучить механизмы синхронизации потков - таймеры, события, симофоры, мьютексы, а также сопоставленные в памяти файлы. ------------------ будут вопросы, спрашивайте.
nikolz, Сударь, Ваш "пример" иллюстрирует разве что как не надо программировать - нигде и никогда. Во-первых, в цикле нет задержки, идёт с безумной скоростью опрос системных часов, при этом время задано В МИНУТАХ! А уж набор "ифов" - это позор даже для начинающего программиста. Самого-то не тошнит от Вашего примера? Уж если корчите из себя учителя, хотя бы пишите примерно так:
Код
f=true;
t1={4,17,35,60} --массив интервалов в секундах
function main()
local i,x,y;
y=os.time();
while f==true do
x=os.time()-y;
for i=1,4 do
if x%t1[i]==0 then
message(x.." истёк интервал "..t1[i].." сек");
end;
end;
sleep(1000);
end;
end;
function OnStop()
f=false;
end;
Кроме того, только клинический дебил "поместит всю свою обработку в эти колбеки": это аналог прерываний, и потому любой нормальный программист будет из них уматывать как можно скорее. Наконец, вся та хрень, которую Вы здесь "рекомендуете изучить" относится к области ОС, в которую прикладника нельзя пускать ни при каких обстоятельствах - особенно "деятельных", вроде Вас, у которых ручонки чешутся что-то такое запрограммировать, а задача организации торговли прикладная до мозга костей.
swerg, Это я, штоле, "Володя"? Так я и привёл свой пример, лапуль - очки купите. Могу даже модифицировать его, если отслеживать надо не 4 интервала, а, скажем, 24. В моём примере для этого нужно поменять две строчки, примерно вот так: 1. t1={4,17,35,60,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71} 2. for i=1,24 do А этот долбаный "гуру" что будет делать со своим долбаным "примером", который здесь предлагает "изучить и на его основе (!!!) попробовать сделать свое"? Такую "основу" засуньте себе в задницу, умники хреновы, а не пудрите мозги новичкам вашими позорными кодами!
А по поводу "дебилов" что не так? Единственная моя фраза про дебилов в этой ветке заучит так: только клинический дебил "поместит всю свою обработку в эти колбеки": это аналог прерываний, и потому любой нормальный программист будет из них уматывать как можно скорее. Что-то не так, лапуль? Есть возражения?
tstart = os.clock()
t={0,0,0,0} -- массив таймеров
t1={1,2,3,5} --массив интервалов
tm=0; -- время в минутах
while true do
local x=os.clock()
if x-tstart>=60 then tstart=x; tm=tm+1
for j=1,#t do if tm-t[j]>=t1[j] then t[j]=tm; print(os.date()..", исполняется код интервал "..t1[j].." мин"); end end
end
end
Владимир написал: nikolz, Сударь, Ваш "пример" иллюстрирует разве что как не надо программировать - нигде и никогда. Во-первых, в цикле нет задержки, идёт с безумной скоростью опрос системных часов, при этом время задано В МИНУТАХ! А уж набор "ифов" - это позор даже для начинающего программиста. Самого-то не тошнит от Вашего примера? Уж если корчите из себя учителя, хотя бы пишите примерно так:
Код
f = true ;
t1 = { 4 , 17 , 35 , 60 } --массив интервалов в секундах
function main ()
local i,x,y;
y = os.time ();
while f = = true do
x = os.time () - y;
for i = 1 , 4 do
if x%t1[i] = = 0 then
message (x .. " истёк интервал "..t1[i].." сек");
end ;
end ;
sleep ( 1000 );
end ;
end ;
function OnStop ()
f = false ;
end ;
Кроме того, только клинический дебил "поместит всю свою обработку в эти колбеки": это аналог прерываний, и потому любой нормальный программист будет из них уматывать как можно скорее. Наконец, вся та хрень, которую Вы здесь "рекомендуете изучить" относится к области ОС, в которую прикладника нельзя пускать ни при каких обстоятельствах - особенно "деятельных", вроде Вас, у которых ручонки чешутся что-то такое запрограммировать, а задача организации торговли прикладная до мозга костей.
для тех, кто не понял, почему в моем примере первом нет циакла а есть множество if объясняю. ---------------- пример предназначен для исполнения нескольких фрагментов кода(функций) - по числу if через различные интервалы --------------------- если поставить цикл, то различить интервалы для запуска различных функций без if не получится --------------------- Вот и выходит что для задачи данной темы нужны if а не цикл.
Владимир написал: nikolz, Сударь, Ваш "пример" иллюстрирует разве что как не надо программировать - нигде и никогда. Во-первых, в цикле нет задержки, идёт с безумной скоростью опрос системных часов, при этом время задано В МИНУТАХ! А уж набор "ифов" - это позор даже для начинающего программиста. Самого-то не тошнит от Вашего примера? Уж если корчите из себя учителя, хотя бы пишите примерно так:
Код
f = true ;
t1 = { 4 , 17 , 35 , 60 } --массив интервалов в секундах
function main ()
local i,x,y;
y = os.time ();
while f = = true do
x = os.time () - y;
for i = 1 , 4 do
if x%t1[i] = = 0 then
message (x .. " истёк интервал "..t1[i].." сек");
end ;
end ;
sleep ( 1000 );
end ;
end ;
function OnStop ()
f = false ;
end ;
Кроме того, только клинический дебил "поместит всю свою обработку в эти колбеки": это аналог прерываний, и потому любой нормальный программист будет из них уматывать как можно скорее. Наконец, вся та хрень, которую Вы здесь "рекомендуете изучить" относится к области ОС, в которую прикладника нельзя пускать ни при каких обстоятельствах - особенно "деятельных", вроде Вас, у которых ручонки чешутся что-то такое запрограммировать, а задача организации торговли прикладная до мозга костей.
Владимир, теперь поясните предыдущее свое высказывание
Да никак не делать! ВАМ, ЛИЧНО ВАМ нужно что-то делать в эти 30 секунд? Нет? Так какое Вам дело, что кто-то там что-то "простаивает"? И вообще, разделение по потокам - это одна из главных глупостей Lua (после этой долбаной "динамической типизации" и убийства типа integer).
ну и куда ты лапуль будешь " потому любой нормальный программист будет из них уматывать как можно скорее" если в main у тебя sleep на 30 секунд. Придурок, ты наш.
nikolz, Лапуль, для особо тупых я ещё прошлый "пример" прокомментировал. А для клинически тупых любые комментарии бесполезны. Ладно, попробую...
1. Время задано В МИНУТАХ, а придурошный "гуру" опрашивает часы функцией, которая выдаёт результат В МИЛЛИСЕКУНДАХ! Дебил? Двух мнений быть не может!
2. В диагностике у придурка указано: ИСПОЛНЯЕТСЯ интервал, а не ЗАКОНЧИЛСЯ интервал, и мне тупо лень смотреть дальше на эту ахинею - за каким хером ему понадобился "массив таймеров", например, и, самое главное, почему он больше не рекомендует изучать его предыдущую бредятину и писать что-то "на её основе", а пишет какую-то очередную херню.
3. Ах, Оно ещё что-то вякает про "моё гениальное творение"?! Ну, и о чём гласит эта длиннющая простыня? Лапуль, мне абсолютно пох, что такой криворукий бездарь, как Вы "добавили в мой пример" что бы то ни было - это уже НЕ МОЙ пример, а изуродованный ВАМИ код. Только что проверил: МОЙ код срабатывает именно так, как и должен срабатывать, а что там натворил такой криворукий бездарь, как Вы, мне изначально было насрать.
Цитата
если поставить цикл, то различить интервалы для запуска различных функций без if не получится
Вы дурак или как? Я не знаю, есть ли в этом долбаном Lua вызов функций по указателю (в JS точно есть), но если это интерпретатор, то он просто ОБЯЗАН быть! Разве что его реализовывали ещё более криворукие бездари, чем Вы.
А что Вам, простите, "пояснить в предыдущем моём высказывании"? По-моему, всё предельно ясно даже для уровня младшей ясельной группы.
nikolz, Лапуль, я вчера зацепился глазом за очередной кретинизм "гуру" насчёт "пример предназначен для исполнения нескольких фрагментов кода (функций)" и, естественно, возмутился, а сегодня вдруг подумал: ну откуда нынешнему стаду так называемых "программистов" знать про указатели на функции? Тем более, что я даже не проверял, работает ли эта техника в Lua - уверен, что не может не работать, но вдруг и здесь я грешу излишним оптимизмом? Но сегодня я зацепился глазом за ещё более смешную фразу: "для тех, кто не понял, почему в моем примере первом нет цикла а есть множество if объясняю" и далее до "если поставить цикл, то различить интервалы для запуска различных функций без if не получится". Лапуль, ну хотя бы ОДНУ функцию из того места вызвать можно? А передать ей аргументом значение интервала из массива или индекс этого массива тоже нельзя? Ну, тады базара нет: "без if не получится! Вот и выходит что для задачи данной темы нужны if а не цикл".
rd.isTradingAllowed() учитывает баг `isConnected() == 1`, разрыв связи, клиринг и выходные!
Код
local rd = require("roffild")
function main()
ISRUN = true
while ISRUN and rd.isTradingAllowed() ~= true do
sleep(1000)
end
message("started")
while ISRUN do
if rd.isTradingAllowed() then
-- здесь основной код
end
sleep(100) -- 0.1сек
end
end
function OnStop(flag)
ISRUN = false
return 3000 -- Timeout
end
Я callback'и не использую ВООБЩЕ! (кроме этого OnStop)
Roffild написал: Я тоже хочу всех "лапуль" поучить :D
rd.isTradingAllowed() учитывает баг `isConnected() == 1`, разрыв связи, клиринг и выходные!
Код
local rd = require ( "roffild" )
function main ()
ISRUN = true
while ISRUN and rd.isTradingAllowed () ~ = true do
sleep ( 1000 )
end
message ( "started" )
while ISRUN do
if rd.isTradingAllowed () then
-- здесь основной код
end
sleep ( 100 ) -- 0.1сек
end
end
function OnStop (flag)
ISRUN = false
return 3000 -- Timeout
end
Я callback'и не использую ВООБЩЕ! (кроме этого OnStop)
это как смотреть гланды через жопу. -------------------- В терминале колбеки вызываются там же , где вызываются функции помещения данных в архив (таблицы) --------------------- Вы вместо того, чтобы получить данные до архива, ждете, когда их загонят в архив, а потом оттуда выковыриваете. ---------------------- Разработчик QLUA , предупредил пользователей, что из архива получать очень долго и специально сделал для этого SearchItems - Функция позволяет реализовать быструю выборку элементов из хранилища терминала и возвращает таблицу с индексами элементов, удовлетворяющих условию поиска.
---------------
Но Вы изобрели свой самовар. всегда проще сделать свою телегу, чем изучить, как работает современный автомобиль.
--------------------------------
На то оно и аля-кулибины. Все у них через одно место.
Владимир написал: nikolz, Лапуль, я вчера зацепился глазом за очередной кретинизм "гуру" насчёт "пример предназначен для исполнения нескольких фрагментов кода (функций)" и, естественно, возмутился, а сегодня вдруг подумал: ну откуда нынешнему стаду так называемых "программистов" знать про указатели на функции? Тем более, что я даже не проверял, работает ли эта техника в Lua - уверен, что не может не работать, но вдруг и здесь я грешу излишним оптимизмом? Но сегодня я зацепился глазом за ещё более смешную фразу: "для тех, кто не понял, почему в моем примере первом нет цикла а есть множество if объясняю" и далее до "если поставить цикл, то различить интервалы для запуска различных функций без if не получится". Лапуль, ну хотя бы ОДНУ функцию из того места вызвать можно? А передать ей аргументом значение интервала из массива или индекс этого массива тоже нельзя? Ну, тады базара нет: "без if не получится! Вот и выходит что для задачи данной темы нужны if а не цикл". Скрытый текст Господи, как же затрахало это безголовое стадо...
Можно и по ссылке в таблице, но проще не будет. ---------------------- Оператор if наиболее быстрый. ---------------- У вас уже есть оператор if и еще цикл for ---------------- т е Ваш вариант работает по определению медленнее моего. --------------- То что цикл сокращает длину программы на несколько строк - при современном объеме памяти это как дробина слону -------------------- Если Вы для выбора функций еще и таблицу с указателями добавите, то у Вас будет монстр. ------------ Причем вам потребуется упаковывать параметры функций чтобы было одинаковое число а потом распаковывать --------------- В итогу у Вас и код будет больше и программа будет работать дольше. ---------------- Кроме того Ваша программа не работает без sleep А это потеря быстродействия. -------------------- короче, засуньте свой пример обратно в то место, откуда вы его достали. -------------------- и не смешите мои тапочки.
nikolz, Лапуль, во-первых, где Вы нахватались этого бреда? Во-вторых, я модифицировал код, который стал отслеживать не 4 интервала, а 24, поменяв две строчки в коде - проделайте ту же операцию со своим идиотским набором ифов - "и не надо никаких доказательств"!
Лапуль, кто Вам сказал, что "оператор if наиболее быстрый"? По сравнению с чем? В ассемблере и оператор if и цикл for программируются, как правило, одними и теми же командами (ну, иногда встречается что-то типа JCXZ, но в этом случае как раз for быстрее if). А самое главное - говорить о скорости выполнения операторов интерпретируемого языка есть Бред Сивой Кобылы. И работает мой вариант по определению быстрее Вашего. Разжевать почему или сами догадаетесь?
Мой цикл сокращает не "длину программы на несколько строк", а объём кода, повышает наглядность - СОПРОВОЖДАТЬ Ваш клинический бред с кучей ифов Вы вообще собираетесь? Или написали, и хер с ним?
Лапуль, какой, в жопу, "монстр"? Таблица указателей стоит ровно столько же, сколько и любая другая. У нас в шахматной программе генератор ходов фигур запускался по коду фигуры, то есть по значению клетки на доске - положительному (белые) или отрицательному (чёрные). Так вот: размер этой "таблицы" составлял ровно 28 байт - по два байта на функцию + пустышка на поле без фигур. И, простите, ЗА КАКИМ ХЕРОМ мне "потребуется упаковывать параметры функций чтобы было одинаковое число а потом распаковывать"? Вы же АБСЛЮТНО ни черта не понимаете в программировании!
Лапуль, моя программа РАБОТАЕТ без sleep, и это не "потеря быстродействия", а, наоборот, его резкое усиление, поскольку sleep есть фактически информация исполнительному механизму: здесь целую секунду ничего не будет происходить, можешь заняться своими делами. А вот в Вашем случае он такую информацию НЕ получит, и будет вынужден крутить Ваш идиотский цикл while и интерпретировать Вашу дурацкую колоду ифов. У меня же даже при таком идиотском организации цикла достаточно запоминать предыдущее значение счётчика секунд и ничего не делать, пока он не сменится.
Лапуль, ну куда Вы в очередной раз лезете с голой жопой против танка? Всем и так давно понятно, что Ваш уровень в программировании болтается возле абсолютного нуля.
Я уверен, что создатель QLua уже уволился из конторы, потому что часть новых функций добавляет уже абы кто, путая названия и порядок аргументов функций. Ну... не составили code-style для QLua...
QLua - попытка ответить на MQL, быстро составленное на коленке.
Колбеки выполняются в основном потоке терминала! - За такое уже надо увольнять!
Ну... поймал ты в колбеке момент отправки заявки... будешь в колбеке ждать сделку блокируя поток терминала, чтоб не спамить заявками? А еще инфа о портфеле может обновиться ДО инфы по сделки! Асинхронная модель Квика!
Проблема в синхронизации последовательности заявка-сделка-портфель, чтоб не отправить лишнею заявку. Моё решение на Гитхабе.
И где гарантия, что в колбек поступает ВСЯ информация БЕЗ потерь? Можно и сделку не поймать...
В момент выполнения колбека пришли еще 5. Какая судьба у этих 5? Вызовутся последовательно все 5 или (вероятнее всего) только последний (или ничто)???
nikolz, Вот, лапуль, проверил вариант с указателями - всё прекрасно работает. Далее, чтобы ни по одному поводу мявкнуть не посмели, разжёвываю код. 1. Интервалов у меня в массиве 24, но отслеживаю я только три - для проверки я написал именно столько функций. 2. sleep теперь стоит на 0.1 секунды, но срабатывает обработка, как и раньше, раз в секунду. 3. Код "монстра" ваапще не потребовался - я генерю имена функций из того же самого массива, и даже аргументы им передаю. Их код слегка варьировал, чтобы не было сомнений, что вызываются именно они.
Учите матчасть, лапуль! Впрочем, Вам лучше заняться чем-то другим, а не программированием.
Код
f=true;
t={4,17,35,60,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71}
function main()
local i,x,y,z;
y=os.time();
z=0;
while f==true do
x=os.time()-y;
if x~=z then
for i=1,3 do
if x%t[i]==0 then
loadstring("f"..t[i].."("..i..")")();
end;
end;
end;
z=x;
sleep(100);
end;
end;
function OnStop()
f=false;
end;
function f4(i)
message("Истёк интервал "..t[i].." сек");
end;
function f17(i)
message("Интервал "..t[i].." сек");
end;
function f35(i)
message("Обрабатываем интервал "..t[i].." сек");
end;
Владимир написал: Далее, чтобы ни по одному поводу мявкнуть не посмели, разжёвываю код.
Мявкну ---- Несколько замечаний по выложенному вами скрипту. 1. loadstring в версиях QLua > 5.1 не существует. В этих версиях надо использовать load (это все QUIK версии >= 8.5). 2. Фрагмент: if x%t[i]==0 then loadstring("f"..t[i].."("..i..")")(); end; работоспособен только в предположении того, что х непрерывная последовательность секунд. Кто гарантирует, что x=os.time() в приведенном коде всегда выдаст x+1 сек.? Даже если реакция на таймерные события message (……), то в операционной системе ПК могут возникнуть работы, требующие > 1 сек. и, тогда в последовательности x возникнут пропуски, потенциально приводящие к пропуску таймерных событий (возможно, важных для торговли). 3. Зачем в цикле используется loadstring (load в версиях QUIK >= 8.5)? Эта функция вызова программы Lua для трансляции строки в байт-код и хоть она выполняется быстро, зачем это делать? Конечно, если скрипт пишется только для себя, то его производительностью надо заниматься в последнюю очередь. Но, если есть понимание, то почему бы не реализовать более эффективный скрипт? 4. Для эффективности выполнения скриптов Lua везде, где это возможно, следует использовать переменные со спецификацией local. Переменные со спецификацией local хранятся в стеке блоков Lua (обращении к ним – прямой, быстрый доступ). Переменные без спецификации local, это поля таблицы, которая хранится в служебной переменной _ENV (для версий Lua > 5.1) и обращение к ним, это обращение к полям таблицы с использованием ее индексов. Это же относится и к спецификации создании функций Lua. ----- С учетом выше приведенных замечаний, выкладываю модифицированный код вашего скрипта:
Код
local function OnStop()
f=false;
end;
local function f4(i)
message("Истёк интервал "..i.." сек");
end;
local function f17(i)
message("Интервал "..i.." сек");
end;
local function f35(i)
message("Обрабатываем интервал "..i.." сек");
end;
f=true;
function main()
local x
---- Таймеры задаются в порядке увеличения их интервалов, в виде {<Интервал таймера>, <Функция обработки таймера>, <Вычисляемое время запуска функции>}
t={{4, f4, 0}, {17, f17, 0},{35, f35, 0} } -- Начальное состояние (можно задать и другое в третьей записи таймера). Можно добавлять таймеров (с разрешением 1 сек.) сколько надо --
x=os.time()
for i=1,#t do t[i][3] = x + t[i][1] end
message("Начало");
while f==true do
x=os.time();
for i=1,#t do
if x >= t[i][3] then
t[i][3] = x + t[i][1] --- !! Если существенна обработка пропущенных интервалов, то:t [i][3] = t[i][3] + t[i][1]
t[i][2]( t[i][1] )
end
end
sleep(1000);
end;
end;
Да? Ну, это в русле: как и в JS единственную приличную функцию eval, выполняющую аналогичные функции, фактически угробили, так и эту добьют - её и так в документации нет. Кстати, у меня как раз QUIK версии >= 8.5, но пока что работает.
Цитата
Фрагмент работоспособен только в предположении того, что х непрерывная последовательность секунд.
Ну, во-первых, там действительно непрерывная последовательность секунд, а во-вторых, что случится, если она не будет таковой (допустим, будем пропускать некоторые события) - будут разве что пропуски этой самой обработки, но работать должна.
Я гарантирую, что x=os.time() в приведенном коде всегда выдаст x+1 сек. В последней-то версии проверка идёт вообще через 0.1 сек - неужели пропустит? И потом, зачем здесь особая точность? Это же не работа системных часов.
Как это "зачем в цикле используется loadstring"? Это фактически вызов функции по указателю, т.е. программирование данными. Производительностью здесь а любом случае надо заниматься в последнюю очередь - это новая функциональность. Я чуть ли не со своего первого появления на форуме её запросил, техподдержка подсказала, с тех пор пользуюсь, и не нарадуюсь.
Вот уж что-что, а эффективность выполнения скриптов Lua меня никогда не волновала - скрипт преспокойно обслуживает сотни и тысячи тикеров, а у меня денег хватает дай Бог на десятки. Локальные переменные я использую, но не для скорости, а для удобства - это обычно i, j, k и тому подобные. В Си они хранятся в стеке программы, а где и как здесь - совершенно по барабану.
Насчёт моего кода: "я его слепила из того, что было" - просто потому, что nikolz тут нёс такую ахинею, что уши вяли, имена функций слепил из того же самого массива, поскольку тот же nikolz утверждал, что "получится монстр" - мог ли я отказать себе в удовольствии получить монстра размером в 0.00 байт? В каком там порядке таймеры задаются, мне тоже было пофиг: первые 4 цифры забил от фонаря, а когда расширил до 24, добил простыми числами - действительно "в порядке увеличения", но только потому, что в таком порядке их было легче вспоминать. Здесь можно много чего и делать и так, и сяк, но моя цель была просто заткнуть пасть воинствующему неучу, и только.
Владимир написал: nikolz, Вот, лапуль, проверил вариант с указателями - всё прекрасно работает. Далее, чтобы ни по одному поводу мявкнуть не посмели, разжёвываю код. 1. Интервалов у меня в массиве 24, но отслеживаю я только три - для проверки я написал именно столько функций. 2. sleep теперь стоит на 0.1 секунды, но срабатывает обработка, как и раньше, раз в секунду. 3. Код "монстра" ваапще не потребовался - я генерю имена функций из того же самого массива, и даже аргументы им передаю. Их код слегка варьировал, чтобы не было сомнений, что вызываются именно они.
Учите матчасть, лапуль! Впрочем, Вам лучше заняться чем-то другим, а не программированием.
Код
f = true ;
t = { 4 , 17 , 35 , 60 , 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 }
function main ()
local i,x,y,z;
y = os.time ();
z = 0 ;
while f = = true do
x = os.time () - y;
if x~ = z then
for i = 1 , 3 do
if x%t[i] = = 0 then
loadstring( "f" .. t[i] .. "( "..i.." )")();
end ;
end ;
end ;
z = x;
sleep ( 100 );
end ;
end ;
function OnStop ()
f = false ;
end ;
function f4 (i)
message ( "Истёк интервал " .. t[i] .. " сек");
end ;
function f17 (i)
message ( "Интервал " .. t[i] .. " сек");
end ;
function f35 (i)
message ( "Обрабатываем интервал " .. t[i] .. " сек");
end ;
Владимир, Вы что пытаетесь доказать? Что ваш вариант хуже моего? ---------------------- Я Вам указал проблемы В вашем варианте . --------------------------------- Вы ничего не сказали в чем у Вас лучше. Попробуйте без словесного поноса проанализировать достоинства Вашего решения и недостатки моего -------------------- относительно приведенного Вами нового "шедевра" ------------------ Ранее я Вам написал, но Вы невнимательно читаете, так как ничего не исправили и все проблемы Вашего эссе остались. -------------------- Повторю для особо тупых. ----------------------- 1) Ваше решение на работает без sleep. Это указывает на низкий уровень разработчика. ---------------------------- 2) ваше решение loadstring( "f" .. t[i] .. "( "..i.." )")(); Это не полноценное решение, а костыли. Это не указатель на функцию, а загрузка строки скрипта , ее компиляция в байт код и исполнение с вызовом функции из массива. При этом число формальных параметров у таких функций сложно сделать различным. Т е Вы нагородили кучу бессмысленного кода лишь бы показать что Вы что-то знаете? Ваш пример стал еще монстрее и медленнее. Ну и нахрена это? 3) Все ваши костыли просто усложняют решение и следовательно замедляют исполнение. ------------------ Изучайте мат часть .
Немногого поправлю свое мнение, ---------------------- Ба, да Вы показывается поняли как у меня сделано без Sleep? ------------------------------- Но забыли сказать спасибо , а просто стащили из моего решения. ------------------------------- Поэтому теперь у Вас sleep не надо. Но это ценой воровства чужих решений. ================= Но попытка Ваших костылей с указателями все равно не тянет. Да, своровать неоткуда, а знания у Вас лишь из прошлого века, да и то какие искаженные временем и пространством. --------------------- Признаться что мое решение работает быстрее, Вам жаба не позволяет. --------------------- Успехов в присвоении чужих решений.
чем больше смотрю на ваше новое эссе, тем сильнее веселюсь. ---------------- чего стоит этот шедевр: ------------------- for i = 1 , 3 do if x%t[i] = = 0 then loadstring( "f" .. t[i] .. "( "..i.." )")(); end ; end ; -------------- Т е вместо простейшего вызова if t[i]==x then func(x1,x2,x3,.....x 1019284) end Вы городите функцию луа, которая собирает указатель функции в глобальной таблице из содержимого таблицы t и затем вызываете эту функцию. --------------- Ну что же могу лишь "восхищаться" таким извращенным способом.
Владимир, скажите сколько времени Вы будете собирать функцию у которой 100 параметров и честь из них функции у которых 10 параметров, а часть - двумерные таблицы из которых надо передать в нашу функцию выборку из строк и столбцов. -------------------- Напишите пример. Поразите публику Вашем стилем извращенного программирования.
nikolz, Лапуль, я Вам НИЧЕГО не пытаюсь доказать! Вы абсолютно нихрена не понимаете в программировании и порете здесь клиническую херню, да ещё и корчите здесь из себя "учителя". Я Вас поторкал носом по Вашей ахинее, которая есть Бред Сивой Кобылы от первого до последнего слова. Я сказал в первом же сообщении, что Ваша колода ифов есть позор даже для начинающего программиста, я посоветовал Вам расширить до 24 количество обслуживающих интервалов, чтобы любой дебил, включая лично Вас, мог самостоятельно убедиться, что Ваше решение есть полное говно. Я показал, что "монстр", про который Вы тут кукарекали, не потребовал вообще НИ ОДНОГО БАЙТА, что Вы есть невменяемый дурак и полуграмотный неуч. Хрен ли там "анализировать" в Вашей бредятине?
1) Кто Вам сказал, придурок, что "моё решение не работает без sleep"? Отключите sleep (надеюсь, хоть это Вы умеете?) и запустите мой скрипт - всё прекрасно работает. sleep у меня введён потому, что решение без sleep идиотское, и я вчера пытался вдолбить невменяемому идиоту - почему.
2) Моё решение loadstring( "f" .. t[i] .. "( "..i.." )")(); - это не просто полноценное решение, а единственная возможность на этом дурацком языке программирования данными - судя по всему, Вы вообще не знаете, что это такое. А я, как оказалось вообще В САМОМ ПЕРВОМ своём сообщении на этом форуме 25.09.2020 09:50:33 спросил: "Есть ли возможность динамически создавать строку аргументов (что-то типа функции eval в JavaScript)"? На что мне Roman Azarov 28.09.2020 08:04:24 ответил: "В Lua действительно есть функция идентичная eval в JS - loadstring". А я ему 28.09.2020 09:20:15 написал: "УХ ТЫ! А в описании языка (руководство пользователя) нет ни звука ни про unpack, ни про loadstring! А эти вещи, как я предполагаю, должны бы расширять функциональные возможности совершенно диким образом"!
Алгоритмически это есть именно указатель на функцию, что бы там ни вякали по этому поводу неграмотные бараны.
Ха-ха-ха! Лапуль, ЭТО КАК РАЗ ВЫ "нагородили кучу бессмысленного кода лишь бы показать что Вы что-то знаете". Я же решил эту задачу НОРМАЛЬНЫМ способом - так, как это должен делать программист, а не безграмотный маразматик.
Господи, что за дебил? Вы всерьёз считаете, что кто-то что-то может почерпнуть из Вашего решения, в чём бы оно ни выражалось? Всем им место на помойке, не читая! Моё первое решение тоже прекрасно работало - просто оно не было рассчитано на то, что какой-то мудак спи&дит из моего кода sleep. А последнее решение не боится даже этого! Но, повторяю, решение БЕЗ sleep - ИДИОТСКОЕ! И утверждать, что Ваше решение работает быстрее, может только клинический дебил. И только клинический дебил может "собирать функцию у которой 100 параметров" - ни того, ни другого нельзя и на километр подпускать к компьютеру.
local t0 = os.clock()
local t1,t2,t3,t4,t5,t6,t7=t0,t0,t0,t0,t0,t0,t0 -- таймеры
-- функции исполняемого кода
function f1(x1) print(x1..", f1"); end
function f2(x1,x2) print(x1..", f2"); end
function f3(x1,x2,x3) print(x1..", f3"); end
function f4(x1,x2,x3,x4) print(x1..", f4"); end
function f5(x1,x2,x3,x4,x5) print(x1..", f5"); end
function f6(x1,x2,x3,x4,x5,x6) print(x1..", f6"); end
function f7(x1,x2,x3,x4,x5,x6,x7) print(x1..", f7"); end
while true do --бесконечный цикл
local x=os.clock()
if x-t1>1 then f1(x) t1=x end
if x-t2>2 then f2(x,x2) t2=x end
if x-t3>3 then f3(x,x2,x3) t3=x end
if x-t4>4 then f4(x,x2,x3,x4) t4=x end
if x-t5>5 then f5(x,x2,x3,x4,x5) t5=x end
if x-t6>6 then f6(x,x2,x3,x4,x5,x6) t6=x end
if x-t7>7 then f7(x,x2,x3,x4,x4,x6,x7) t7=x end
end
--- накладные расходы на вызов функции - оператор if, одно вычитание, одно сравнение и одно присвоение.
это результат теста:
Скрытый текст
1.031, f1 2.031, f1 2.031, f2 3.031, f3 3.046, f1 4.031, f4 4.046, f1 4.046, f2 5.03, f5 5.062, f1 6.03, f6 6.046, f3 6.062, f2 6.077, f1 7.03, f7 7.093, f1 8.046, f4 8.077, f2 8.108, f1 9.061, f3 9.124, f1 10.046, f5 10.093, f2 10.139, f1 11.155, f1 12.046, f6 12.061, f4 12.077, f3 12.108, f2 12.171, f1 13.186, f1 14.045, f7 14.124, f2 14.202, f1 15.061, f5
nikolz, Лапуль, Ваше "самое простое и быстрое решение" можете смело засунуть себе в задницу - оно столь же идиотское, что и Ваше предыдущее. За каким-то хером в функции передаётся туева хуча аргументов, а используется один. Накладные расходы бешеные: мудацкий цикл крутится с безумной скоростью, процессор не имеет ни малейшей возможности заняться чем-то другим. КЛИНИЧЕСКИЙ бред!
local timers = {
[1] = function(...)
for key, value in pairs({...}) do
print("arg num=", key, " val=", value)
end
end
}
-- Заполнение таймеров одной функцией (влом копи-пастить)
for key, value in pairs({3, 5, 8, 9, 16}) do
timers[value] = timers[1]
end
-- Цикл
local tmlast = 0
while true do
local tm = os.clock()
local fun = timers[math.tointeger(tm - tmlast)]
if fun then
fun(tm, tmlast, "Любое количество", "аргументов!")
end
tmlast = tm
end