Нормирования объема, цены и ст. девиации

 

Предлагаю три индикатора, вернее, «три в одном»:

- нормирование объема по фиксированной длине выборки нормирования;

- нормирование стандартной девиации по фиксированной длине выборки нормирования;

- нормирование цены по плавающей длине выборки нормирования (Стохастик с плавающим %K);


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

В общем случае, длина выборки при таком подходе всегда м.б. динамической, но в случаях с объемом и ст.девиацией можно обойтись более простым алгоритмом и сэкономить на времени расчетов.

Пользуюсь этими индикаторами уже лет пять (правда, на др. платформах), с год назад перевел их на МТ4, и вот – хочу поделиться ими и показать возможности использования в ТС.

Общая схема нормирования такая:


Здесь N – длина выборки нормирования. В динамическом своем варианте она будет увеличиваться до тех пор, пока в ней не будут найдены такие максимум и минимум, чтобы их разница была больше порога чувствительности. Или пока не будет достигнуто ограничение по длине выборки.

Для несинфазных с ценой индикаторов, таких как ст.девиация или объем (максимумы м.б. как на пиках, так и на впадинах цены) можно упростить алгоритм, оставив выборку фиксированной. Нормирование тогда будет выглядеть так:

Norm = (Ind - min) / MathMax(чувствительность, max - min).

В случае же стохастика такой номер не пройдет – загрубление чувствительности приведет к сползанию показаний в область перепроданности. Поэтому в стохастике применятся динамическая длина выборки (%K).

Окно параметров нормировщика.


Indicator – чего нормировать: 0 – МА по объему (VolumeMA), 1 – МА по ценам закрытия (стохастик) (CloseMA), 2 – ст.девиация по цене (CloseStDev). Если задать -1, то будет выведена гистограмма динамической длины нормирования, т.е. как меняется %K стохастика. Не забудьте только снять галочку во вкладке Общие окна параметров, ограничивающую диапазон сверху. Или поставить значение 10*Norm.

IndPeriod – для объема и цены - предварительное сглаживание, для девиации – длина выборки для расчета девиации (период).

По умолчанию используется EMA. Если задать отрицательное значение – будет считаться SMA. Вообще, для быстродействия, конечно, лучше EMA, где скорость вычисления не зависит от периода (коего в EMA и нет) и приблизительно равна по времени вычислению 2-х периодной SMA. Время же расчета SMA прямо пропорционально периоду.

Я не стал загромождать индюк и использую только эксп. и простую МАшки, внедренные в индюк. Кто хочет, кому просто позарез нужен, скажем, цифровик, то код открыт – добавить не проблема.

Norm – длина выборки для определения в ней (выборке) максимального и минимального значений. В случае с динамической длиной – это значение стартовой длины выборки. Ограничение сверху по длине равно 10*Norm.

Sensitivity – чувствительность. Для девиации и стохастика задается в п.п. Отсекает шум. Можно не задавать – поймает все движущееся в выборке. Для объема – в количестве сделок. В случае объема чувствительность я обычно не задаю. Но пусть будет. Для однообразия.

Smooth – сглаживание/сигнальная. По умолчание EMA. Если поставить «-» перед значением – SMA.

History – 0 – все имеющиеся бары в терминале. В случае расчета стохастика с ненулевой чувствительностью возможно имеет смысл ограничить кол-во баров. При большой начальной длине выборки и высоким порогом чувствительности может тормозить.


Буферы индикаторов:

При вызовах индюка используется, как правило, 0-й буфер, но для полноты вот описание остальных.

0 – Smooth. Т.е. на 0-й буфер выдается результат после всех издевательств.

1 – значение до нормирования. Т.е. для девиации – это сама девиация, а для объема и цены – их МАшки. Если IndPeriod=1, то просто объем и цена. 1 для девиации – нонсенс.)))

2 – значение сразу после нормирования и до сглаживания сигнальной.

3 – служебный для расчета МА.

4 – служебный. Используются для выбора входного потока – объем или цена.

5 – текущая длина выборки нормирования для стохастика с ненулевым порогом чувствительности. Используется при Indicator=1( или -1).


Имя индикатора (ShortName) на графике в подокне имеет следующую структуру:

Чего нормируется (IndPeriod) [Norm/Sensitivity Smooth]

Например:

CloseStDev(20) [77/12 9] – ст.девиация по цене закрытия с параметром 20, длина выборки нормирования 77 при чувствительности 12, сигнальная 9-ти барная эксп. МАшка.


(продолжение в сл.посте)

Файлы:
 

Картинки и примеры использования.

Нормированный объем (Indicator=0).

Пример 1. Нормированный объем и стохастик.

Сопоставляя Стохастик с нормированным объемом, видно, какое показание Стохастика oversold/overbought относится к движению, а какое к коррекции. Можно построить индикатор тренда. Т.е. когда норм. объем = 1, значения стохастика 0 или 100 являются трендовыми. Эти моменты отмечены вертикальными линиями соотв. цвета.

Индюк под ценами – нормированный несглаженный объем (IndPeriod=1).

Два нижних индюка – это нормированная цена закрытия и стандартный стохастик MT4 по Close/Close

. Как видите, они совпадают, т.к. порог чувствительности не задан.


Вообще, я сомневался, что нормирование объема будет адекватно работать на тиковом объеме. Раньше я его юзал на споте. Но ничего – работает.))) Другое дело, что некоторые ДЦ – не будем показывать пальцем, хотя одно из них является чуть ли не самым крупным биржевым брокером, - показывают объемы некоторых инструментов неадекватно. Например, ограничивают в показе тиковый объем сверху. Максимум 20 сделок на бар и все. Или вдруг меняют масштаб – то шло в среднем 200 тиков в минуту, то вдруг стало 20. В то же время суток. Через пару дней возвращают прежний масштаб. У других ДЦ в это же время – все по-прежнему. Короче, надо обращать на это внимание – такая проблема может встретиться.

Пример 2. Нормирование объема по суточной выборке.

Многие ТС хорошо работают только на «адекватном» рынке, т.е. на ликвидных его участках. Для интрадея я использую нормированный объем, чтобы отсечь участки с низкой активностью. На них ТС на пробое канала дает, как правило, ложные сигналы.

Т.е. задаем длину выборки равной кол-ву баров за сутки и не открываем позы, если значение индюка ниже, скажем 0.2. Существующие позы режем. Или переключаемся на др. стратегию.

Необязательно задавать точное значение выборки. Для минуток можно задать 1111, для пятиминуток – 222 и т.д. (Можно 1000 и 200 – мне просто искать нолик было лень)))


Здесь также прозрачна возможность использования сигнальной линии.

Пример 3. Можно использовать нормированный объем как регулятор ширины канала. Или отступа от границ канала.

Т.е., чем больше активность, тем ближе границы канала. Логично, что на коррекции (активность ниже) границу лучше отодвинуть, чтоб не было ложного пробоя.

В эксперт или в польз. индюк нужно прописать нормированный объем, значение которого потом использовать в качестве регулятора:

double k=iCustom(NULL,0,"_IndicatorNorm",0,IndPeriod,Norm,0,1,0, 0,i);
double Border=BorderFrom+k*(BorderTo-BorderFrom);

В этом случае начальный отступ (BorderFrom) нужно задать больше конечного (BorderTo). Тогда, чем больше активность, тем меньше будет отступ.

Естественно, нужно добавить входные параметры:

extern int IndPeriod;
extern int Norm;
extern double BorderFrom;
extern double BorderTo;

Можно изменить передаточную функцию просто возведя k в степень. Экстремальные точки k ноль и единица никуда не денутся, а характер изменится.

Степень может как больше, так и меньше 1.

k=MathPow(k,pwr);

Далее отступ (Border) прибавляется к верхней границе канала и вычитается от нижней.


Нормированная МА цен закрытия (Indicator=1).

По-другому, это можно назвать стохастиком с динамическим периодом %K, где %K или длина выборки зависит от текущей волатильности.

Длина выборки будет увеличиваться до тех пор, пока разница между макс. и мин. значениями в ней не будет больше заданного порога чувствительности. Т.е. при низкой волатильности %К будет увеличиваться, при высокой уменьшаться. Иными словами, на флэтовых участках устраняются ложные сигналы. Можно сказать, что индюк как бы сжимает эти участки, растягивая длину выборки нормирования.

На рисунке показаны: нормирование по цене без задания порога чувствительности; оно же с порогом и гистограммой как изменялся %К в процессе.


Как использовать стохастик рассказывать не буду. Его вариант с порогом просто более, на мой взгляд, адекватен – меньше шума. А так… все то же …)))

Хотя… можно, например, определяться с его помощью с трендом. Посмотрите на снимок – разжевывать не буду. С построенным каналом (например, по Параболику) может дать весьма достоверные результаты.

Можно еще, к примеру, сделать порог чувствительности функцией от нормированного объема, чтоб порог был адекватен текущей активности. Да мало ли…)))


Нормированная стандартная девиация (Indicator=2).

Усе на сегодня. В следующем посте напишу. И так уже часа три убил.)))

 
Спасибо!
 

Нормированная стандартная девиация (Indicator=2).

Вот картинка, где под ценами подокно с нормированной ст. девиацией с заданным порогом чувствительности, ниже то же, но без порога (Sensitivity=0).

Картинка напоминает иллюстрацию к поиску «священного баара» – без каментов. ))) Если без шуток, то определитель тренда, построенный на этом индюке, работает довольно достоверно. Особенно, если порог чувствительности сделать функцией от текущей активности (объема), используя этот же нормировщик в соответствующем режиме.



При длинных выборках (например, суточных) можно определиться с экстремумами текущего тренда.

Также, можно использовать нормирование девиации также как и объема для динамического отступа.

__________________________

Вообще, применений этих индикаторов можно найти много. Привел лишь часть из них. Можно там использовать индюки как регуляторы для других – менять, скажем, период MA в зависимости от активности. Или порог срабатывания ЗигЗага. Да мало ли…

Некоторые замечания по коду.

У нормированного объема есть одна особенность, которую необходимо отметить. Т.к. объем в баре является накопительным, то, чтобы не сбить значение минимума в выборке (бар начинается всегда с единичного объема) минимум ищется только на сформированной выборке, т.е. начиная с предпоследнего (полностью сформированного) бара. Сам текущий бар, если он ниже минимума, приравнивается минимуму. Если выше – максимуму.

Можно, конечно, было сделать только по посчитанным барам, но тогда теряется текущая информация о новом максимуме активности – ведь объем даже на несформированном баре м.б. уже рекордным! Неразумно было бы не принимать такую инфу! )))

По поводу быстродействия. Если заменить ArrayMaximum и ArrayMinimum на более быстрые алгоритмы, то динамическую длину выборки можно использовать во всех случаях. Это реально, так как нет необходимости искать на каждом тике и баре экстремумы по всей выборке, как это происходит сейчас. Но руки не доходят.


 

Еще замечания по коду.

Простая скользящая средняя в выложенном индюке сделана не оптимально по быстродействию. В скором времени исправлю. Кстати, код SMA, что в стандартной поставке, тоже не оптимален. Почему-то, если у вас скажем, 200-барная МА, то на каждом тике просчитываются все 200 баров. Предыстория при этом считается нормально - оптимизированно. Но на кой ляд персчитывать что-то, кроме того, что необходимо???))) Достаточно пересчитывать всего два бара - текущий и предыдущий (согласно принятой парадигме пересчета). Ведь если представить SMA как класс. фильтр с КИХ с одинаковыми коэфф., то все становится проще.


Еще соображения по стандартной девиации. В класс. варианте это преобразование с КИХ. Т.е. если считать разницы между элементами выборки и и ср. значением по выборке. Если же считать ср. значение, скажем, как эксп. СС, то это уже БИХ. Не очень понимаю тут смысл с точки зрения мат. статистики. Тогда можно вычитать из членов выборки любую среднюю, необязательно по длине выборки. Бред, кроче. Но, тем не менее, в поставке МТ4 так и есть. Тока чего дальше-то не пошли? Ну в смысле считать сумму квадратов разниц по одной выборке, а среднюю(чего вычитается) по произвольной. Я, кста, экспериментировал - рез-т неоднозначный, но интересный.

 

Новая версия нормировщика.

Изменения:

- Добавлен 4-й нормируемый индюк - ATR. (Indicator=3)

- Оптимизирован расчет простых МА - скорость увеличена на порядок. (Расчет более оптимален, чем в ст.поставке МТ4 - Moving Averages.mq4)

- Оптимизировано динамическое нормирование - тоже где-то раз в 20 быстрее (it depends))

- Добавлена префильтрация (PrePeriod) - возможность дополнительной фильтрации индикатора до нормирования. В случае ст.девиации - это сглаживание, в остальных - MACD. Т.е. параметр префильтра выступает как медленная МА MACD, что позволяет дополнительно убрать низкочастотную составляющую. Естественно, что ее период должен быть больше, чем период индикатора. Если PrePeriod=1, префильтрации до нормирования нет. При PrePeriod большем IndPeriod - нормируется MACD, т.е общее число входных индюков для нормировщика - 5.

- Добавлены каменты в код.

Файлы:
_indnorm.mq4  9 kb
 

Что бы не создавать новую тему размещу свой вопрос здесь.

Возникла необходимость нормировать цену "около 0" у разных инструментов, в одном подокне.

На данный момент, цену нормирую через МА: FastMA-SlowMA, т.е. по принципу MACD. У этого подхода есть один существенный недостаток - когда цена во флете, то индикатор показывает уменьшение значений. Это даёт ложную информацию.

Что бы не изобретать велосипед, вопрос к вам: как лучше нормировать цену разных инструментов, что бы её можно было адекватно сравнивать? Если не затруднит, приведите + и - своих вариантов.

p.s. для простоты, возьмём пары со знаменателем USD.

 
Cmu4:

Что бы не создавать новую тему размещу свой вопрос здесь.

Возникла необходимость нормировать цену "около 0" у разных инструментов, в одном подокне.

На данный момент, цену нормирую через МА: FastMA-SlowMA, т.е. по принципу MACD. У этого подхода есть один существенный недостаток - когда цена во флете, то индикатор показывает уменьшение значений. Это даёт ложную информацию.

Что бы не изобретать велосипед, вопрос к вам: как лучше нормировать цену разных инструментов, что бы её можно было адекватно сравнивать? Если не затруднит, приведите + и - своих вариантов.

p.s. для простоты, возьмём пары со знаменателем USD.

Не поверите индикатор wpr как раз это и делает - нормирует цену.
 
Вот читаешь такие древние ветки и будто тебе рассказывают, как ты, будучи маленьким, обделался при большом скоплении гостей...
 
Svinozavr:
Вот читаешь такие древние ветки и будто тебе рассказывают, как ты, будучи маленьким, обделался при большом скоплении гостей...
Да ладно. Мне о своих новичковых ветках вообще вспоминать не хоцца. Как и многим вообще-то. Чтоб я так обделывался )
 
excelf:
Не поверите индикатор wpr как раз это и делает - нормирует цену.

И в правду. ;)

Он рассчитывается по этой формуле? И без изъянов ли она?

%R = -(MAX (HIGH (i - n)) - CLOSE (i)) / (MAX (HIGH (i - n)) - MIN (LOW (i - n))) * 100


Где:
CLOSE (i) — сегодняшняя цена закрытия;
MAX (HIGH (i - n)) — наибольший максимум за n предыдущих периодов;

MIN (LOW (i - n)) — наименьший минимум за n предыдущих периодов.

Причина обращения: