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

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 4, среднее: 5,00 из 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): 26 комментариев

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

    помогите пожалуйста решить маленькую проблему. У меня скрипт который выводит данные в таблицу. Я бы хотел просуммировать последние 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))

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

  2. Дмитрий, добрый день, подскажите, как округлить дробную часть? Например: 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
  3. Я не вижу здесь стандартных арифметических операций, которые ищу, а именно +, -, * и /. Пожалуйста, ответьте или ссылкой на эти операции, или, если статья будет ими дополнена, можете не отвечать.

      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 без опаски получить исключение