Управляющая конструкция "if - then - elseif - then - else - end" в QLua (lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 4, среднее: 5,00 из 5)
Загрузка...

Qlua-основы
Конструкция оператора 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 можно вкладывать друг в друга бесконечное количество условий.

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Управляющая конструкция "if - then - elseif - then - else - end" в QLua (lua): 24 комментария

  1. Добрый день! Хочу сделать индикатор, который бы выставлял уровни на безоткатных движениях цены (начало ХАЙ или ЛОУ и конец ХАЙ или ЛОУ предыдущей свечи). Упёрся в незнание способа остановить расчёт свечей после образования необходимого патерна изменений. Помогите добрым советом...?!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    
    function OnCalculate(indx)
     
    		local labelId
    		local label
    		local v_up
    		local v_down
    		local up
    		local down
     
    		if indx==1 then
    			DelAllLabels( Settings.chart );
    			return nil
    		end
    		local dt = T(indx)
    		if dt.hour == 10 and dt.min == 00 then -- время начала отсчёта
    			high = H(indx)
    			low = L(indx) -- группа значений первой свечи
    			open = O(indx)
    			close = C(indx)
    		end
    		if high ~= nil --если есть точка отсчёта
    			and low ~= nil
    			and open ~= nil
    			and close ~= nil
    			then
     
    			--ОДИН ВАРИАНТ
    			--Для растущего рынка
     
    				if close > open then -- если первая свеча растущая
    					if dt.hour > 10 and dt.min > 00 then -- если время больше 10.00
    						if C(indx) < O(indx) then -- если следующая текущая свеча падающая
    							if up == nil and down == nil then
    								up = H(indx-1)
    								down = low
    							end
    						else
    							if up == nil and down == nil then
    								up = H(indx)
    								down = low
    							end
    						end
    					end
    				end
     
    			--ДРУГОЙ ВАРИАНТ
    			--Для падающего рынка
     
    				if close  10 and dt.min > 00 then -- если время больше 10.00
    						if C(indx) > O(indx) then -- если следующая текущая свеча растущая
    							if up == nil and down == nil then
    								v_up = high
    								v_down = L(indx-1)
    								up = v_up
    								down = v_down
    							end
    						else
    							if up == nil and down == nil then
    								up = high
    								down = L(indx)
    							end
     
    						end
    					end
    				end

    делал через установку меток, поэтому код не весь, чтобы не загружать тем, что работает. Вопрос только в том, что у меня начало движения цены рассчитывается правильно, а вот окончание безоткатного движения выходит чёрт знает как! Помогите, если кому не трудно?!

  2. Добрый день! Подскажите пожалуйста как сделать так чтобы после первого превышения значения max_summ_profit, flag_summ_profit остался true даже если значение totalProfit станет после этого меньше

    1
    2
    3
    4
    5
    
     if totalProfit >= max_summ_profit  then
    			flag_summ_profit = true	-- флаг включаем (нужно что бы он был включен даже если totalProfit станет < max_summ_profit )
    		end
    		Дальше  условие
    		if  flag_summ_profit == true and totalProfit <= max_summ_profit - offset_loss then
        1. У Вас описан кусочек из всего алгоритма и вообще не понятно какая у Вас возникает проблема. Даже код, который Вы описали, будет нормально работать, если он конечно во всем алгоритме верно прописан.
          Какой следующий расчет имеется ввиду? Почему значение должно измениться? ...
          Множество вопросов возникает.
          Вы задали какое то значение 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 объявить так, что бы к ней доступ был везде. Но это все мои догадки...
          У Вас в коде все как положено описано. флаг включается и уже не исчезает,как Вам и нужно, по этому проблемы я не увидел.
          Код который я предложил, это просто было предположение, может они вовсе не нужен. Смотрите весь алгоритм, может дело не в условиях.

          1. 1
            2
            3
            4
            5
            6
            
            local flag_summ_profit    -- флаг достижения плановой  прибыли
             
             
            		-- -- if totalProfit >= max_summ_profit  then
            			-- -- flag_summ_profit = true	-- флаг включаем (нужно что бы он был включен даже если totalProfit станет < max_summ_profit )
            		-- -- end

            -- после того как totalProfit становится меньше то flag_summ_profit уже не равно true
            -- тоесть смысл того что мне надо получить : сумма прибыли колеблется около установленного значения превысив которое флаг становится true и должен оставаться таким и после того как totalProfit упадет ниже. Но он таким не остается, проверил через сообщение. А меняется на nil

            1. Этот кусочек ничего не изменил.
              Вы объявили переменную flag_summ_profit, ничего ей не присвоили, значит там nil. Когда totalProfit превысит переменная flag_summ_profit станет true. Все, ни кто переменную уже не переделает в false или в nil, если это не будет указано в самом коде.
              Возможно при следующем вычислении выполняется снова строка local flag_summ_profit. В этом случае объявляется переменная и в ней нет значения, значит она nil
              Так если это действительно так, то зачем на каждом вычислении Вы опять и опять объявляете переменную и пишите в нее nil ? Вы сами делаете так, что она становится nil и "забывает" предыдущее значение.
              Смотрите область видимости переменной. Я могу гадать сколько угодно, где у Вас объявлена переменная, когда это следующее вычисление появляется, кто его вызывает и т. д.
              Если у Вас терминал вызывает функцию OnCalculate, так объявите переменную за пределами, и все, при вызове функции НЕ объявляйте постоянно новую переменную, а используйте ранее объявленную. А так получается вызывается функция, сравнивается она становится true, функция завершается и переменная уничтожается в свзязи с тем что она больше не нужна.

              1. Спасибо!
                Разобрался..действительно при повторном расчете эта переменная менялась обратно если условие не выполнено потому что находилась в этой же функции. Вынес за пределы майн и сделал ее глобальной и все сработало.. Смысл кода состоит в том чтобы фиксировать момент когда прибыль превысит сигнальную и от этого момента уже делать расчет и закрытие либо в плюсе от этого значения с добавкой к нему либо по откату от него.. поэтому и требовалось значение которое поменялось один раз и осталось таким навсегда тут я и не сообразил что при расчете она поменяется снова если условие не выполняется.. Теперь чтобы ее сбросить обратно надо прописать где нибудь в другой или в этой же функции в конце когда требуемые действия будут выполнены новое условие..я правильно понял это?

                1. Да, все верно, теперь Вам нужно позаботиться что бы значение сбрасывалось в nil или в false. Ставьте условия, а вот какие, это уже Вам виднее.

  3. Здравствуйте! Подскажите, пожалуйста, как в lua описать многосоставные логические конструкции, например как в C++: if((a>b && by || y==z)) - выражение истинно если а больше б и б меньше с, либо выражение истинно если х больше у или у равен z.

        1. Я уже Вам ответил, знак # возвращает длину массива, если Вы напишите строку if Array5Min > 5 then, то Вам выдаст ошибку, потому что Array5Min это массив (table), а 5 - число, а таблицу с числом сравнивать нельзя.

          1
          2
          3
          4
          5
          
          Array5Min = {}
          Array5Min[1] = 10
          Array5Min[2] = 20
          Array5Min[3] = 30
          message('Длина массива Array5Min = '..#Array5Min) -- Выведет "Длина массива Array5Min = 3"
          1. 1
            2
            3
            4
            5
            6
            7
            
            --Условие 1, для свечей типа "пин-бар"
            if  (p_aa > p_bb
            --Условие 2, для остальных свечей, которые по случайности прошли первое условие	
            and (math.abs(p_cc)) < p_dd
            --Условие 3, чтобы исключить свечи без теней, они не подходят в мат.модель условий выше
            and (p_nn~=0 or p_nnn~=0)) then 
            Trade('B',p_count-count,t[0].close+p_spread)

            Есть такая модель.
            Не могу разобраться как поставить антиусловия , поясняю:
            В условии 3 есть строчка 'and (p_nn~=0 or p_nnn~=0)) then ', надо чтобы если ХОТЬ одно из этих p ==0, то условие не выполнено, в данном же коде программа считает так - p_nn==0 допустим, но p_nnn~=0 (не равно) и все, думает условия выполнены.

            Подскажите если ли какие либо способы задать это именно так, условия исключения или антиусловия.
            Спасибо!