Математические функции в QLua(Lua)

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

Qlua-основы
Стандартные арифметические операции:
"+" - сложение,
"-" - вычитание,
"/" - деление,
"*" - умножение,
"%" - остаток от деления (5%2 == 1).

   math.abs (x) -- Модуль x.

   math.acos(x) -- Возвращает арккосинус x

   math.asin(x) -- Возвращает арксинус x (в радианах).

   math.atan(x) -- Возвращает арктангенс x (в радианах).

   math.atan2(x, y) -- Возвращает арктангенс x/y (в радианах), но использует знаки обоих параметров для вычисления «четверти» на плоскости. (Также корректно обрабатывает случай когда y равен нулю.)

   math.ceil(x) -- Возвращает наименьшее целое число, большее или равное x. (Округление «вверх»).

   math.cos(x) -- Возвращает косинус x (Угол – в радианах).

   math.cosh(x) -- Возвращает гиперболический косинус x.

   math.deg(x) -- Переводит угол, заданный в радианах (x) в градусы.

   math.exp(x) -- Возвращает e^x.

   math.floor(x) -- Возвращает наибольшее целое число, меньшее или равное x. (Округление «вниз»)

   math.fmod(x, y) -- Возвращает остаток от деления x на y.

   math.frexp(x) -- Возвращает m и e такие, что x = m*2^e, e – целое, а модуль m находится в интервале [0.5, 1], либо ноль, если x равен нулю (разложение числа с фиксированной запятой).

   math.huge -- Значение HUGE_VAL, значение большее, либо равное любому числовому значению.

   math.ldexp(m, e) -- Возвращает m^2e (e должно быть целым). (Восстановление значения по мантиссе и показателю).

   math.log(x) -- Возвращает натуральный логарифм x.

   math.log10(x) -- Возвращает логарифм x по основанию 10.

   math.max(x,...) -- Возвращает максимальный из аргументов.

   math.min(x,...) -- Возвращает минимальный из аргументов.

   math.modf(x) -- Возвращает два числа: целую часть x и дробную часть x.

   math.pi -- Значение pi.

   math.pow(x, y) -- Возвращает x^y

   math.rad(x) -- Конвертирует угол x, заданный в градусах, в радианы.

   math.random() -- Возвращает псевдослучайное число, из генератора

Примеры:

math.random(); -- Вернет случайное число от 0 до 1 с точностью до 16 знаков после запятой
math.random(10); -- Вернет случайное целое число от 1(включительно) до 10(включительно)
math.random(3,5); -- Вернет случайное целое число от 3(включительно) до 5(включительно)

   math.randomseed(x) -- Инициализирует генератор псевдослучайных чисел параметром, каждый параметр порождает соответствующую (но одну и ту же) последовательность псевдослучайных чисел.

   math.sin(x) -- Возвращает синус x (аргумент – в радианах).

   math.sinh(x) -- Возвращает гиперболический синус x.

   math.sqrt(x) -- Возвращает квадратный корень x

   math.tan(x) -- Возвращает тангенс угла x (аргумент – в радианах)

   math.tanh(x) -- Возвращает гиперболический тангенс x

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

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

Математические функции в QLua(Lua): 43 комментария

  1. Доброго дня! Интересуют такие возможности в lua:
    Хочу произвести арифметическую операцию такого порядка - собрать данные последних 50 свечей скажем, и указать условие что последняя свече пробила максимум, если пробила то условие true, с условиями понятно как действовать но можно ли как то изложить это лаконичнее чем:

    1
    2
    3
    
     if t[50].close > t[0].high
    t[50].close > t[1].high
    t[50].close > t[2].high

    и т. д. 100% есть более простой способ наведите, пожалуйста на мысль как это сделать в lua.

    1. Создаете 4 переменные: min, max, index_min, index_max, перебираете в цикле свечи и сравниваете значения с переменными min/max, если нашли новый минимум, или максимум, меняете значение переменной на новое и запоминаете индекс в соответствующей переменной
      https://quikluacsharp.ru/?p=145

            1. Опять криво скопировался)) вышлю текстом
              for i=51,51,-1 do
              if t[i].high > p_max then
              p_max = index_max
              to_log("index_max"..index_max)
              end
              if t[i].low < p_min then
              p_min = index_min
              to_log("index_min"..index_min)
              end
              end

            2. Если хотите научиться программировать, то в первую очередь учитесь искать ошибки, квик в тексте ошибки указывает что именно и в какой строке имеет значение nil, поднимайтесь "вверх" по коду и ищите причину, по которой данная переменная имеет значение nil.

              1. for i=51,51,-1 do
                проблема в этой строчке, если верить статье, то эта i локальная в цикле, что есть очень не в тему, из- за того что я имею ввиду свою i отсюда
                local N=getNumCandles("Price")
                t,n,i(именно эта )=getCandlesByIndex("Price", 0, N-51, 51) как мне это связать в цикле, если переменная в нем локальная.

                1. if t[i].high > p_max then
                  понял что ошибка тут, пишет что пытаюсь сравнить строку с номером, если tonumber ставить перед i, тогда пишет что пытаюсь сравнить нуль, такое ощущение что он эту i в t[i].high не подставляет.

                  1. Я РАЗОБРАЛСЯ! Простите за спам снова!((
                    for i=0,50,1 do
                    if tostring(t[i].high) > tostring(p_max) then to_log("t[i].high"..t[i].high)
                    p_max = index_max
                    to_log("index_max"..index_max)
                    end
                    if tostring(t[i].low) < tostring(p_min) then to_log("t[i].low"..t[i].low)
                    p_min = index_min
                    to_log("index_min"..index_min)
                    end
                    end
                    Вот правильная версия)
                    Спасибо за поддержку!))

  2. Дмитрий добрый день!

    помогите пожалуйста решить маленькую проблему. У меня скрипт который выводит данные в таблицу. Я бы хотел просуммировать последние 10 значений в определенном столбце этой таблицы, и вывести эту сумму в новую ячейку, не могу грамотно написать цикл.

    у меня есть такой вариант: ( здесь, L - номер последней строки, этот скрипт считает сумму нарастающим итогом по всем
    ячейкам столбца начиная с 10 строки до последней, но мне нужно считать последние 10 строк, допустим в VBA там есть функция суммы которая все решает, в LUA не могу сообразить как это сделать)

    V = 0
    for i=9, rows  do
       for j = 10, L do
          V = tonumber(GetCell(TABLE_ID, j-1, 7).image) + tonumber(GetCell(TABLE_ID, j, 6).image)
       end
       SetCell(TABLE_ID, num, 7, tostring(V));
    end
    1. Здравствуйте! Не совсем понял какие колонки Вы считаете и в какие ячейки записываете, но вот пример того, как посчитать сумму последних 10-ти значений в колонке с индексом 7 и потом вывести значение в той же колонке в строку под номером num:

      1
      2
      3
      4
      5
      6
      7
      
      local Sum = 0
      local ColNum = 7 -- индекс колонки (начинаются с 0)
      for j = L-9, L do
         -- Считает сумму
         Sum  = Sum + tonumber(GetCell(TABLE_ID, j, ColNum).image) 
      end
      SetCell(TABLE_ID, num, ColNum, tostring(Sum))

      Это то, что Вам нужно?

  3. Дмитрий, добрый день, подскажите, как округлить дробную часть? Например: 3.27893 -> 3.28
    Либо просто обрезать дробную часть до 2-х цифр.
    Заранее благодарю.

    1. Выбирайте на вкус:
      math.ceil(x) -- Возвращает наименьшее целое число, большее или равное x. (Округление «вверх»).
      math.floor(x) -- Возвращает наибольшее целое число, меньшее или равное x. (Округление «вниз»)

      Соответственно если хотите до 2 знаков, тогда например: math.floor(x*100)/100

    2. Добрый день!
      Можно так:

      1
      2
      3
      4
      5
      6
      7
      
      -- (дополняет библиотеку math) ОКРУГЛЯЕТ ЧИСЛО ДО УКАЗАННОЙ ТОЧНОСТИ
      math.round = function(num, idp)
        local mult = 10^(idp or 0)
        return math.floor(num * mult + 0.5) / mult
      end
       
      math.round(3.27893, 2) -- должно вернуть 3.28
      1. Что я делаю не так?
        local price1 = math.round(price, 2)
        луа просто не видет такой математической функции, floor работает, но тот до целых чисел округляет

  4. Я не вижу здесь стандартных арифметических операций, которые ищу, а именно +, -, * и /. Пожалуйста, ответьте или ссылкой на эти операции, или, если статья будет ими дополнена, можете не отвечать.

      1. if a_direction=="B" then
        			l_oper="S"
        			l_count=a_count
        			dir=-1
        			t_dir=1
        			p_take_profit_level=t[0].high-t[0].low
        			p_stop_loss_level=(t[0].low-t[0].high)*2
        			to_log("уровень тейк профита="..tostring(p_take_profit_level))
        			to_log("уровень стоп-лосса="..tostring(p_stop_loss_level))
        Такой вот код для рассчета тэйк(скинул разумеется малую часть), выдает всегда что то вроде 1.9999999999962  и тому подобное,
        Не могу понять как так, если на графике разность цен 1.20 , а не эти иррациональные числа.
        Встает уже вопрос об округлении, чтобы он там не высчитал. Не совсем разобрался как это правильно можно сделать. Необходимо округление до сотых, помогите. пожалуйста.
              1. Спасибо за ответ выше! новая сложность))

                function robot()
                	local N=getNumCandles("Price")
                	t,n,i=getCandlesByIndex("Price", 0, N-2, 2) 
                		if not(in_trade) then
                		--сигнал на покупку
                			if  (t[0].close-t[0].low)>((t[0].high-t[0].open)*2+p_sensitivity_plus) then -- на этой строке очень часто вылетает ошибка nill value,  то работает, то нет, зависит от высших сил.  p_sensitivity_plus=0.01 в шапке проги. Price помечено в QUIK как идентификатор
                  Trade("B",p_count-count,t[0].close+p_spread)
                			sleep(2000)
                И потом обратный ИФ на продажу. и т. д.
                Возможно Вы сможете мне с этим помочь!
                Спасибо!
                    1. Простите за спам)
                      Ошибку разрешил, в разных функциях t[0].close и остальные необходимо разными переменными задавать, иначе они путаются.

                1. Здравствуйте.
                  При сравнениях условий не плохо бы делать проверку - вдруг еще нет данных по текущему бару.
                  Или структура бара уже есть, а данных еще нет или уже есть, но равны "0"
                  t[0].close-t[0].low - вот такое выражение - зло.

                  if not t[0] then return end
                  local O, H, L, C = t[0].open, t[0].high, t[0].low, t[0].close
                  if O ==0 or H == 0 or L == 0 or C == 0 then return end -- если структура бара есть, то значения могут быть равны "0" в моменте.
                  Вот дальше можно делать сравнения и математику с переменными O, H, L, C без опаски получить исключение