Конструкция оператора if в QLua может содержать следующие элементы:
if (если),
then (то),
else (иначе),
elseif (иначе если),
end (конец).
Несколько примеров использования:
-- ЕСЛИ значение переменной A больше 1, ТО if A > 1 then B = 10; -- присваиваем переменной B значение 10 end; -- КОНЕЦ -- ЕСЛИ значение переменной A больше 1, ТО if A > 1 then B = 10; -- присваиваем переменной B значение 10 else -- ИНАЧЕ B = 5; -- присваиваем переменной B значение 5 end; -- КОНЕЦ -- ЕСЛИ значение переменной A больше 1, ТО if A > 1 then B = 10; -- присваиваем переменной B значение 10 elseif A == 1 then -- ИНАЧЕ ЕСЛИ A равно 1, ТО B = 5; -- присваиваем переменной B значение 5 else -- ИНАЧЕ B = 1; -- присваиваем переменной B значение 1 end; -- КОНЕЦ -- ЕСЛИ значение переменной A больше 1, ТО if A > 1 then B = 10; -- присваиваем переменной B значение 10 elseif A == 1 then -- ИНАЧЕ ЕСЛИ A равно 1, ТО B = 5; -- присваиваем переменной B значение 5 elseif A < 1 then -- ИНАЧЕ ЕСЛИ A меньше 1, ТО B = 3; -- присваиваем переменной B значение 3 else -- ИНАЧЕ B = 1; -- присваиваем переменной B значение 1 end; -- КОНЕЦ |
При помощи оператора elseif можно вкладывать друг в друга бесконечное количество условий.
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Добрый день! Хочу сделать индикатор, который бы выставлял уровни на безоткатных движениях цены (начало ХАЙ или ЛОУ и конец ХАЙ или ЛОУ предыдущей свечи). Упёрся в незнание способа остановить расчёт свечей после образования необходимого патерна изменений. Помогите добрым советом...?!
делал через установку меток, поэтому код не весь, чтобы не загружать тем, что работает. Вопрос только в том, что у меня начало движения цены рассчитывается правильно, а вот окончание безоткатного движения выходит чёрт знает как! Помогите, если кому не трудно?!
Добрый день! Подскажите пожалуйста как сделать так чтобы после первого превышения значения max_summ_profit, flag_summ_profit остался true даже если значение totalProfit станет после этого меньше
Напишите так:
if (flag_summ_profit ~= true and totalProfit > max_summ_profit) then
flag_summ_profit = true;
end
А что будет с flag_summ_profit если totalProfit станет меньше чем max_summ_profit при следующем расчете?
flag_summ_profit уже не будет true;
У Вас описан кусочек из всего алгоритма и вообще не понятно какая у Вас возникает проблема. Даже код, который Вы описали, будет нормально работать, если он конечно во всем алгоритме верно прописан.
Какой следующий расчет имеется ввиду? Почему значение должно измениться? ...
Множество вопросов возникает.
Вы задали какое то значение max_sum_profit, допустим 125. Как только total_profit превышает значение 125, сразу flag_summ_profit = true Вот и все. И где вообще в этом куске кода написано что бы flag_summ_profit стал не true ?
Может у Вас в алгоритме flag_summ_profit объявлен в какой то изолированной области, что при "следующем расчете" создается новая изолированная область, где flag_summ_profit = nil, так это надо не условие прописывать по другому, а переменную flag_summ_profit объявить так, что бы к ней доступ был везде. Но это все мои догадки...
У Вас в коде все как положено описано. флаг включается и уже не исчезает,как Вам и нужно, по этому проблемы я не увидел.
Код который я предложил, это просто было предположение, может они вовсе не нужен. Смотрите весь алгоритм, может дело не в условиях.
-- после того как totalProfit становится меньше то flag_summ_profit уже не равно true
-- тоесть смысл того что мне надо получить : сумма прибыли колеблется около установленного значения превысив которое флаг становится true и должен оставаться таким и после того как totalProfit упадет ниже. Но он таким не остается, проверил через сообщение. А меняется на nil
Этот кусочек ничего не изменил.
Вы объявили переменную flag_summ_profit, ничего ей не присвоили, значит там nil. Когда totalProfit превысит переменная flag_summ_profit станет true. Все, ни кто переменную уже не переделает в false или в nil, если это не будет указано в самом коде.
Возможно при следующем вычислении выполняется снова строка local flag_summ_profit. В этом случае объявляется переменная и в ней нет значения, значит она nil
Так если это действительно так, то зачем на каждом вычислении Вы опять и опять объявляете переменную и пишите в нее nil ? Вы сами делаете так, что она становится nil и "забывает" предыдущее значение.
Смотрите область видимости переменной. Я могу гадать сколько угодно, где у Вас объявлена переменная, когда это следующее вычисление появляется, кто его вызывает и т. д.
Если у Вас терминал вызывает функцию OnCalculate, так объявите переменную за пределами, и все, при вызове функции НЕ объявляйте постоянно новую переменную, а используйте ранее объявленную. А так получается вызывается функция, сравнивается она становится true, функция завершается и переменная уничтожается в свзязи с тем что она больше не нужна.
Спасибо!
Разобрался..действительно при повторном расчете эта переменная менялась обратно если условие не выполнено потому что находилась в этой же функции. Вынес за пределы майн и сделал ее глобальной и все сработало.. Смысл кода состоит в том чтобы фиксировать момент когда прибыль превысит сигнальную и от этого момента уже делать расчет и закрытие либо в плюсе от этого значения с добавкой к нему либо по откату от него.. поэтому и требовалось значение которое поменялось один раз и осталось таким навсегда тут я и не сообразил что при расчете она поменяется снова если условие не выполняется.. Теперь чтобы ее сбросить обратно надо прописать где нибудь в другой или в этой же функции в конце когда требуемые действия будут выполнены новое условие..я правильно понял это?
Да, все верно, теперь Вам нужно позаботиться что бы значение сбрасывалось в nil или в false. Ставьте условия, а вот какие, это уже Вам виднее.
Спасибо большое, Павел, что помогаете, то вообще времени нет, если честно.
Здравствуйте! Подскажите, пожалуйста, как в lua описать многосоставные логические конструкции, например как в C++: if((a>b && by || y==z)) - выражение истинно если а больше б и б меньше с, либо выражение истинно если х больше у или у равен z.
Здравствуйте!
Дмитрий, спасибо! Оказывается ответ был на поверхности)
Всегда пожалуйста 🙂
https://quikluacsharp.ru/qlua-osnovy/arifmeticheskie-operatsii-operatsii-sravneniya-i-logicheskie-operatsii-v-qlua/
В одной из статей в блоке кода вот такой кусок: if #Array5Min > 5 then . . . Что "#" означает и как это прочитать?
Этот оператор возвращает длину массива. Читается: если количество элементов массива > 5 то...
Конструкция понятна, интересует знак - #. Чем отличается if #Array5Min > 5 then... от if Array5Min > 5 then... .
Простите, нашёл тут: https://quikluacsharp.ru/qlua-osnovy/peremennye-massivy-i-funkcii-v-qlua-lua/
Я уже Вам ответил, знак # возвращает длину массива, если Вы напишите строку if Array5Min > 5 then, то Вам выдаст ошибку, потому что Array5Min это массив (table), а 5 - число, а таблицу с числом сравнивать нельзя.
Есть такая модель.
Не могу разобраться как поставить антиусловия , поясняю:
В условии 3 есть строчка 'and (p_nn~=0 or p_nnn~=0)) then ', надо чтобы если ХОТЬ одно из этих p ==0, то условие не выполнено, в данном же коде программа считает так - p_nn==0 допустим, но p_nnn~=0 (не равно) и все, думает условия выполнены.
Подскажите если ли какие либо способы задать это именно так, условия исключения или антиусловия.
Спасибо!
код в сообщении не закодился)) там где & - знаки > или <
впрочем важно "условие 3"
Так я разобрался)) поставил and просто, запутался малец.
Хорошо 🙂