В скриптовом языке QLua есть 3 вида циклов (for, while и repeat):
1. FOR - DO - END имеет 2 типа:
-- 1-й тип: -- Цикл сделает 10 итераций, увеличивая каждый раз переменную i на 1, т.е. i будет меняться от 0 до 9, -- переменная i является локальной для цикла, т.е. видна только внутри него for i = 0, 9, 1 do A = A*2; end; -- Данный цикл можно было записать и без 3-го аргумента, потому что по умолчанию он равен 1 for i = 0, 9 do A = A*2; end; -- Но вместо 1 можно использовать любое другое число, или выражение, результат которого является числом -- Например так, цикл сделает только 5 итераций и остановится, потому что в 6-й итерации i будет равна 10 (0,2,4,6,8,10), а 10 > 9 for i = 0, 9, 2 do A = A*2; end; -- Здесь используется выражение, т.е. каждая итерация увеличивает переменную i на 2 for i = 0, 9, 1+1 do A = A*2; end; -- Можно сделать цикл на убывание for i = 9, 0, -1 do A = A*2; end; -- 2-й тип: -- Такой вариант при каждой итерации записывает в i индекс, а в value значение элемента из массива Array, -- перебирая, таким образом, все элементы в массиве типа {[1] = 10, [2] = "Текст", [3] = 50} for i,value in ipairs(Array) do -- здесь какой-то блок кода end; -- Такой вариант при каждой итерации записывает в key ключ, а в value значение элемента из массива Array, -- перебирая, таким образом, все элементы в массиве типа {red = "Красный", green = "Зеленый", blue = "синий"} for key,value in pairs(Array) do -- здесь какой-то блок кода end; |
2.WHILE - DO - END
while A < 10 do -- здесь какой-то блок кода end; -- Читается так: ПОКА выполняется условие A меньше 10 ВЫПОЛНЯТЬ(делать) блок кода КОНЕЦ |
3.REPEAT - UNTIL
repeat -- здесь какой-то блок код until A < 10 -- Читается так: ПОВТОРЯТЬ блок кода ДО ТОГО, пока не выполняется условие A меньше 10 |
Для того, чтобы досрочно выйти из любого, вышеописанного, цикла служит оператор break.
Пример использования:
for i = 0, 9, 1 do if i >= 2 then break; end; -- цикл завершится на 3-й итерации (0,1,2) end; |
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Здраствуйте, решил создавать игры на луа, вообще не получается. Можете мне помочь написать? мне нужно сделать так, что бы скрипт выполнялся один раз и не повторялся, или какой цикл надо удалить? local msgs = {
"Welcome In Ohio!",
"But...",
"How did you get here??",
"Ok you have to get out here.",
"I will help you",
"I advise you to always be ready for danger",
"Like this.",
}
while true do
for i = 1, #msgs do
Spawn(function()
while script.Parent.TextTransparency >= 0 and wait() do
script.Parent.TextTransparency = script.Parent.TextTransparency - 0.1
end
end)
for j = 1, #msgs[i] do
script.Parent.Text = string.sub(msgs[i], 1, j)
wait()
end
wait(3)
while script.Parent.TextTransparency <= 1 and wait() do
script.Parent.TextTransparency = script.Parent.TextTransparency + 0.1
end
end
end
Добрый день, уважаемые языковеды! Прошу не кидать в меня тапками, я только начал изучать язык.
Помогите пожалуйста с созданием бесконечного цикла функции. Двое суток читал и пробовал, ничего не вышло. Вот, к примеру есть функция:
Я хотел сделать ее бесконечной, с паузой в 30 секунд. Пробовал разные циклы (for, while и repeat)
Не выходит каменный цветок :\ Помогите, прошу!
Здравствуйте. Шорткоды lua-lua лучше не использовать.
Добрый день коллеги! Подскажите пожалуйста в чем дело почему функция загрузки не подгружает таблицу из файла.. если она многоуровневая типа a ={b={},c={},d={}}? Если одиночная то нормально грузит, вывод по той же функции SaveTable(Table, FilePath), размер около 35 кб, но как только добавляю вторую таблицу перестает подгружать в локальную переменную и выдает ошибку local params nil
Добрый,
а чем вас не устроили table.save и table.load?
https://quikluacsharp.ru/qlua-osnovy/tsikly-for-while-repeat-v-qlua-lua/comment-page-2/#comment-28206
хочется сделать читабельный файл? переделайте функцию table.save
Решил проблему разнесением таблиц в разные файлы, по другому не знаю как
это не решение проблемы, у вас есть table.save и table.load для сохранения и чтения таблиц любой вложенности в одном файле.
единственная проблема это функция io.read, отчего-то она не читает большие файлы и действительно есть смысл большую таблицу хранить в нескольких файлах, например: SBER_03_M5.log, где 03 это месяц, а M5 - таймфрейм
А как сделать в один файл, все уже перепробовал что знаю все равно не грузится как только добавляю вложенную таблицу и размер не имеет значения, подгружается только одна таблица
сохраняется и считывается в лучшем виде.
Спасибо!
Господа! Всем доброго..! Подскажите, есть ли способ через For нарисовать наклонную линию (например, от Н(indx) текущей свечки до, скажем , кокой-то свечки из таблички фракталов до этого). После этого продолжать такую линию с тем же наклоном. При этом такую линию перерисовывать каждый раз, когда H(indx) новой текущей свечи будет больше ? Хочется получить ровную линию под углом.
только так и нужно, через for, а потом при добавлении нового индекса на графике продлевать
А как же тогда будет выглядеть такой цикл, чтобы получилась прямая линия (в Квике, наверно только точками получится) под наклоном? И чтобы она перерисовывалась только, когда цена коснулась или пересекла эту прямую?
я же вам дал функции, в другой ветке? зачем вы прыгаете с места на место?
Спасибо коллеги! Есть два отличных сайта где профессионалы всегда помогут, ))
а первый-то какой? 🙂
quik2dde это первый который я нашел))
Таблица имеет вид:
Может выводить ее в файл а потом читать ?
это вопрос? если да, то вот так:
сохранить:
table.save(yourtable, "table.dat")
загрузить:
res, yourtable = table.load("table.dat")
Подскажите пожалуйста есть какой то способ посмотреть таблицу один раз за один проход расчета скрипта и сравнить значения всех нужных полей 100 свечей с одним значением?
-- получаем таблицу параметров 100 свечей
Скрипт тормозит и расчитывает очень долго
Не совсем понятно, что делает функция getCandles.
Если используете не документированные функции, то нужно ее представить на обозрение. А то вопрос у вас ни о чем.
Если подумать, что tab имеет ту структуру, которая в первом посте, (хотя она какая-то рваная) то цикл для обхода tab будет таким:
А на счет медленно это сколько? час, минута?
Все зависит от размера tab, которую возвращает getCandles, может там 1 мио вложенных свечных графиков по 100 баров?
или "-- что то делаем" содержит ожидающие циклы?
С вашими 3-мя строками кода, послать бы вас лесом по хорошему.
Здравствуйте, спасибо за функцию, попробую прикрутить, Нет не час но в момент прохода примерно сек 20 и скрипт в это время зависает в этом месте, да эта функция получения данных по идентефикатору 100 последних свеч, ничего особенного, а если таких циклов будет несколько то все конец, таблица да кусок, нет смысла размещать остальные такие же
Привет, это ни о чем не говорит, я не оракул, и мысли тоже не читаю.
Если поставить условие if (indx == Size()) then end , то ошибка attempt to compare number with nil пропадает, но расчёт тогда производится только в указанное время, а надо, чтобы при загрузке или смене инструмента в любое время
Всем привет! Подскажите причину происхождения ошибки в теле цикла for "attempt to compare number with nil" при осуществлении индикатором расчётов .
LUA
if tt.hour == h and tt.min == m then
t_table = tt
HIGH = H(indx)
LOW = L(indx)
for i = 0, inter-1 do
if H(indx-i) > HIGH then
HIGH = H(indx-i);
end
if L(indx-i) < LOW then
LOW = L(indx-i);
end
end
/LUA
В данном куске кода многие переменные не описаны, так что буду догадываться.
Когда indx = 1 Запускается цикл for
В первой итерации переменная i = 0, значит indx-i ( где 1-0 ) Дает в условии H(1) то есть high первого бара.
Во второй итерации переменная i уже равна 1, а значит indx-i ( где 1-1 ) дает в условии H(0), то есть high нулевого бара, такого бара на графике нет, вот тут то и появляется nil
Далее во всех итерациях запрашивается high не существующих баров -1 -2 -3 ... Сколько итераций в цикле не известно, потому что в этом коде не указано значение переменной inter
Добрый день, Павел! Тогда скажите, как же тогда индикатор работает, если баров не существует, ведь рассчитывается значение правильно Если же добавить условие if (indx == Size()) then end , то ошибка пропадает. Период для М5 для нахождение экстремумов вчерашнего дня и созерцания их в дне сегодняшнем от начала времён.
Предыдущий не работает всё время,а только в указанное, а вот этот работает всегда, но выдаёт ошибку
Вот Вы и отвечаете на свой вопрос. Потому что он работает не все время.
В варианте где есть if (indx == Size()) then вычисления идут только тогда, когда indx = Size(), а это значит что indx равен количеству баров на графике. У Вас график содержит 1 бар или тысячи? скорее всего тысячи.
Предположим что на графике 3000 баров, значит когда indx равен 3000, только в этом случае выполняется вычисления, а дальше...
Запускается цикл for
первая итерация, переменная i = 0 переменная indx = 3000 Вы запрашиваете H(3000-0)
вторая итерация, переменная i = 1 переменная indx = 3000 Вы запрашиваете H(3000-1)
третья итерация, переменная i = 2 переменная indx = 3000 Вы запрашиваете H(3000-2)
Вот и работает Ваш код нормально, потому что бары с индексами 3000, 2999, 2998 реально существуют на графике, по этому и ошибки нет.
Но у Вас еще условие стоит что вычисления нужно выполнять только тогда, когда последний бар имеет время 23:45, в остальное время вычисления не выполняются.
Тогда какое же условие необходимо во втором варианте, когда if (indx == Size()) then нет?
Да, но только на отрисовку, поиск high и low можно производить раньше.