Формула стохастика для произвольных источников данных

Опубликовано в AmiBroker

Сегодня понадобилось рассчитать стохастик не для котировок инструмента (Open,High,Low,Close), а для расчетных данных.

Оказалось, что вcтроенная в Амиброкер функция StochK() умеет рассчитывать значение стохастика только для тикера, являющегося основным в окне. Меня это совсем не порадовало, пришлось написать свою. Не бозон Хиггса/бином Ньютона, но на всякий случай сохраню, вдруг когда ещё пригодится. 


Создал этот индикатор George Lane. В тот момент он был президентом корпорации Investment Educators. Stochastic Oscillator представлен двумя линиями. Главная линия - %K. Вторая линия %D - это скользящее среднее линии %K.

Расчет 

Для расчета стохастического осциллятора используются три переменные:

 

  • Период %K (Pk). Это число единичных периодов, используемых для расчета %K. По умолчанию равен 5;

  • Период замедления %K (Sk). Эта величина определяет степень внутренней сглаженности линии %K. 
    Значение 1 дает быстрый стохастический осциллятор, а значение 3 - медленный. По умолчанию равен 3;

  • Период %D (Pd). Это число единичных периодов, используемых для расчета скользящего среднего линии %K. По умолчанию равен 3.

Формула для расчета %K:

%K = 100*SUM (CLOSE - MIN (LOW, Pk), Sk) / SUM (MAX (HIGH, Pk) - MIN (LOW, Pk)), Sk)

Где:

  • CLOSE - цена закрытия;
  • MIN (LOW, Pk) - наименьший минимум за период Pk;
  • MAX (HIGH, Pk) - наибольший максимум за период Pk;
  • SUM (CLOSE - MIN (LOW, Pk), Sk) - сумма слагаемых CLOSE - MIN (LOW, Pk) за период Sk;
  • SUM (MAX (HIGH, Pk) - MIN (LOW, Pk)), Sk) - сумма слагаемых HIGH (Pk)) - MIN (LOW, Pk) за период Sk.


Сигнальная линия %D рассчитывается по формуле:

%D = SMA (%K, Pd)

Где:
Pd - период сглаживания %K;
SMA - простая скользящая средняя.

Для начала расчет %K. Используются 3 расчетных массива (High_Array,Low_Array,Close_Array) и два параметра - период расчета и коэфициент сглаживания.

%D - простая скользящая средняя от %K, просто накладываем MA  с требуемым периодом (%D average) на массив, полученный предыдущей функцией.


High_Array = ParamField("High array",1);
Low_Array = ParamField("Low array",2);
Close_Array = ParamField("Close array",3);

K_Period = Param("%K period",15,3,20,1);
K_Smooth = Param("%K smooth",3, 1, 200, 1 );
D_Period = Param("%D",3, 1, 200, 1 );

function K_Stochastic(High_Array,Low_Array,Close_Array,Period,Smooth)
{ local K_Min;

   K_Min = LLV(Low_Array,Period);
   return Sum(Close_Array - K_Min,Smooth) / Sum(HHV(High_Array,Period) - K_Min,Smooth) * 100;
}

k= K_Stochastic(High_Array,Low_Array,Close_Array,K_Period,K_Smooth);

Plot(K,"",ParamColor( "%K Color", colorCycle ), ParamStyle("%K Style") );
Plot(MA(k,D_Period),"",ParamColor( "%d Color", colorCycle ), ParamStyle("%D Style") );

Сравнил со встроенной. Если на вход подать стандартные OHLC, результаты совпадают.

Если требуется вычислить значение стохастика не по ценам OHLC, а по какому-нибудь индикатору, представляемому 1 массивом, то в качестве всех трёх первых параметров нужно указать этот массив.

Основные плюсы и минусы индикатора 

Stochastic Oscillator, как и любой другой осциллятор резко меняется при получении в расчет новых котировок, сильно отличающихся от текущих цен. Это приводит к нестабильным результатам. Также он дает много ложных сигналов внутри тренда, а именно сигналы на открытие против тренда. 

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

P.S. Другой способ вычисления стохастика - подмена OHLC (с последующим восстановлением) на нужный массив и расчет стохастика по нему.

Комментарии   

# Basil 04.10.2013 10:54
Добрый день.
Никак не могу перевести логику этого индикатора на Си. Не поможете?

Предположим:
Pk = 50, Sk = 3;

1. Найти минимум среди Pk свечей
2. Найти максимум среди Pk свечей.

А дальше у меня ступпор...
# Basil 04.10.2013 11:17
SUM (MAX (HIGH, Pk) - MIN (LOW, Pk)), Sk
======
Допустим у нас 50 свечей(Pk) и сглаживание = 3.
Берем:
1. Максимум среди 50 свечей - минимум среди 50 свечей
2. Максимум среди 49 свеч - минимум среди 49 свеч
3. Максимум среди 48 свеч - минимум среди 48 свеч

Итог: теперь значения получившиеся в этих трех пунктах нужно сложить и разделить на 3?

Отсчет свечей идет справа налево же?
# admin 04.10.2013 11:29
Нет, неправильно.

Для каждой свечи считаем минимум и максимум за 50 предыдущих свечей (включая текущую). Создаем массив размерностью, равной количеству свечей и запоминаем в нем результаты расчета для каждой свечи.

Потом для каждой свечи рассчитываем
сумму слагаемых CLOSE - MIN (LOW, Pk) за период Sk, то есть создаем еще один массив, в котором для каждой свечи рассчитываем эту формулу. Min(Low,Pk) у нас уже рассчитан. Таким образом, для каждой свечи суммируем разницу за пред. Sk свечей между close и Min(Low,Pk) и записываем в этот новый массив

И так далее.

Вычислений много, рассчитывать на С на каждом тике надо только те значения,которы е изменились. Перерасчитывать всю историю не нужно..
# Basil 04.10.2013 12:24
Сделал. Проверил.
Моя цифра совпадает с цифрой индикатора стохастик в квике, а с цифрой стохастика в ами - нет, разница на 0.24.

Значит я все правильно сделал?
Тогда почему в Ами расхождение?
# admin 04.10.2013 12:33
Цитирую Basil:
Тогда почему в Ами расхождение?


Basil, проверьте идентичность свечей в ами и квике.

Если есть различия - то расчет индикатора по определению не может совпадать.
# Basil 04.10.2013 12:47
Перепроверил OHCL... все одинаково :(
# admin 04.10.2013 12:51
Довольно интересно. если есть скайп - позвоните мне (mikemsk)

Недостаточно прав для комментирования