Оценка процентного изменения на основе логарифмического масштаба

Метод описывает быстрое определение процентного изменения индикатора с некоторыми ограниченями - значения индикатора должны быть положительными и не сильно меняться (на единицы процентов) за интересующие промежутки времени.


Уточнение.
Приведённые в пример индикаторы Chart и Index, имеющие возможность использовать этот метод, со временем изменились и теперь либо не имеют отдельного параметра для логарифмирования, либо не делают умножения на 100. Однако сам метод вполне рабочий.

Описание задачи

В MetaTrader есть инструмент для определения расстояния - в режиме Перекрестие нажать кнопку мыши в начальной точке и провести до конечной. Так можно узнать разницу между значениями в этих точках.


Но нам нужно получить процентное изменение. Это можно сделать такими способами:
  • разделить разницу на начальное значение и умножить на 100
  • разделить конечное значение на начальное, вычесть 1 и умножить на 100
Оба варианта сложны или медленны для расчетов в уме. Для примера выше изменение в процентах будет равно (-0,0355 / 2,1240) * 100 = -1,67.

Решение

Решение проблемы заключается в логарифмировании по основанию e значений индикатора и умножении на 100. После этого в режиме Перекрестие разница будет показываться сразу в процентах. Существует математическое обоснование тому, что нужно применять именно натуральный логарифм, никак не зависящее от того, что мы работаем с рынком, а не с любым другим рядом чисел.

Полученное значение не абсолютно точно, но достаточно точно для приближенной оценки. Чем больше изменение, тем больше погрешность.

График показывает зависимость ошибки оценки от разницы в процентах между конечным и начальным значениями.


Цены, индексы и подобные индикаторы редко колеблются больше, чем на 10% за достаточно большой период времени (дни, недели), что дает хорошую погрешность (менее 5%) для быстрой оценки.

На сайте есть пара индикаторов, поддерживающих функцию логарифмирования результата, рассмотрим, как это работает. Для примера выше включим у индикатора Index параметр LogScale.


Получили примерно то же самое, как если бы считали по формулам в описании задачи. С учетом погрешности позиционирования курсора такие значения можно смело округлять до десятых частей.

Для определения процентного изменения кросса можно воспользоваться тем же индикатором Index.

Реализация в коде

Пример кода:

// Расчет значения value индикатора для бара bar
double value = ...;
//TODO: проверить, чтобы value было больше 0
// Логарифмирование
if (LogScale)
    IndicatorBuffer[bar] = MathLog(value) * 100.0;
else
    IndicatorBuffer[bar] = value;

См. также