При создании индикатора или стратегии в TradingView нам зачастую необходимо округлить число, прежде чем выполнять с ним дальнейшие действия. Сделать это можно разными способами, о них сегодня и поговорим.
Немного теории:
- вещественное или действительное число — это любое число, которое можно представить в виде десятичной дроби или в виде точки на числовой прямой (6,14616546; 5 1/2; число ПИ и пр.).
- целое число — это любое число, которое не содержит дробной части, но может быть с отрицательным знаком (0; -3; 8; 28; 02).
Существует три способа округления значений в Pine Script:
- Функция math.round округляет число по законам математики до ближайшего целого или дробного числа (если после запятой стоит число >=5 то округляем в большую сторону).
- Функция math.floor округляет до ближайшего целого числа в меньшую сторону. Если дробной части нет, то она возвращает то же самое число.
- Функция math.ceil округляет до ближайшего целого числа в большую сторону (не зависимо от того, какие цифры идут в дробной части). Но если дробной части нет, то она возвращает то же самое число.
Давайте применим знания из предыдущей статьи о функции str.tostring и выведем на графике цену закрытия, а под ней округленные цены при помощи каждой из трех функций, чтобы наглядно увидеть разницу между ними:
Рассмотрим как происходит округление с помощью функции math.round
Обратите внимание на последнюю строчку. Функция math.round округляет -4,5 до целого числа -4, а не -5. Потому что она округляет в большую сторону, если после запятой стоит число >=5, а -4 больше , чем -5.
Пример, построим скользящую среднюю по округленным значениям
1 2 3 4 |
indicator("round", overlay=true) roundEMA = math.round(ta.ema(close, 50)) plot(roundEMA, color=color.lime) |
Мы размещаем функцию ta.ema внутри функции round. Каждое значение, которое вычисляет ta.ema, округляется в большую или меньшую сторону до ближайшего целого числа. Затем при помощи функции plot отображаем на графике округленную ema 50:
У функции math.round есть 2 аргумента:
- number — обязательный аргумент, значение или серия значений для округлений.
- precision — необязательный аргумент. Число десятичных знаков, до которых number будет округлено. Если он отсутствует, то округление производится до ближайшего целого числа!
Округляем значения в меньшую сторону при помощи функции math.floor
С помощью функции math.floor в TradingView можно округлять числа до целого значения в меньшую сторону. Эта функция принимает один числовой аргумент и возвращает целое число, которое меньше или равно аргументу. Так при округлении 55,894 мы получим целое число 55, а не 56.
- Положительное значение, которое возвращает math.floor, становится меньше: 9,75 преобразуется в 9.
- Отрицательное значение, которое возвращает math.floor, также становится меньше (то есть более отрицательным): -2,3 преобразуется в -3.
Рассмотрим как происходит округление с помощью функции math.floor
Пример: округление размеров позиции в меньшую сторону с помощью math.floor
Допустим, мы хотим инвестировать не более 10 000 в позицию. Сколько акций мы можем купить на эту сумму?
Давайте посчитаем:
1 2 3 4 |
indicator("floor", overlay=false) posSize = math.floor(10000 / close) // 10000 делим на цену закрытия и при помощи функции math.floor округляем значение в меньшую сторону plot(series=posSize, color=color.maroon) // рисуем график по полученным значениям при помощи plot |
Из этого примера мы также можем определить разницу между math.floor и math.round.
11 октября 2022 года акции Самолет стоили 2042 руб, наш депозит 10 000. Мы могли купить 10 000/2040 = 4,9 акций. math.round вернула бы нам значение 5, но 5 акций на свой депозит мы купить бы не смогли. А функция math.floor округлила бы значение 4,9 в меньшую сторону — до 4. И тогда мы купили бы нужное количество акций.
Округляем значения в большую сторону при помощи функции math.ceil
Функция math.ceil принимает один числовой аргумент и возвращает наименьшее целое число, которое больше или равно аргументу функции.
Итак, вместо 15,34 math.ceil вернет 16, а не 15.
- Положительное значение, которое возвращает math.ceil становится больше: 10,4 преобразуется 11, а 5,02 в 6.
- Отрицательное значение, которое возвращает math.ceil тоже становится больше: -5,3 преобразуется в -5, а -6,65 в -6.
Рассмотрим как происходит округление с помощью функции math.ceil
Приведем пример использования функции math.ceil
Допустим, мы хотим диаграмму объема какой-либо бумаги в тысячах. Нам не нужны точные данные, поэтому мы будем округлять полученные значения при помощи функции math.ceil:
1 2 3 4 |
indicator("ceil", overlay=false) volC = math.ceil(volume / 1000) // делим объем каждого бара на 1000 и округляем полученные значение при помощи функции math.ceil plot(volC, color=color.navy, style=plot.style_columns) // выводим диаграмму полученных данных |
По итогу работы индикатора объем 20 417 преобразовался в 21, а 3 163 в 4.
Подведем итоги
В Pine Script TradingView есть три способа округления значений.
С помощью функции math.round мы округляем до ближайшего целого числа в большую или меньшую сторону по законам математики (от 0,5 округляем в большую сторону). У этой функции есть второй аргумент — precision, который позволят указать сколько цифр после запятой нужно оставить. Т.е. функция возвращает не только целые, но и дробные значения.
Округлять значения до целого числа можно в меньшую сторону при помощи функции math.floor. Таким образом 4,34 и 4,87 становятся, а -10,6 и -10,01 превращаются в -11.
Округлять значения в большую сторону до целого числа можно при помощи функции math.ceil. Это функция возвращает 6 для 5,6 и 5,12, а -8,31 и -8,75 функция возвращает -8.
Итак, math.round округляет значения в большую или меньшую сторону. С помощью math.floor мы получаем значение, меньшее или равное аргументу, переданному в функцию. И math.ceil возвращает значения, которые больше или равны значению аргумента.