Формула стохастика для произвольных источников данных
Сегодня понадобилось рассчитать стохастик не для котировок инструмента (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 (с последующим восстановлением) на нужный массив и расчет стохастика по нему.
Никак не могу перевести логику этого индикатора на Си. Не поможете?
Предположим:
Pk = 50, Sk = 3;
1. Найти минимум среди Pk свечей
2. Найти максимум среди Pk свечей.
А дальше у меня ступпор...
======
Допустим у нас 50 свечей(Pk) и сглаживание = 3.
Берем:
1. Максимум среди 50 свечей - минимум среди 50 свечей
2. Максимум среди 49 свеч - минимум среди 49 свеч
3. Максимум среди 48 свеч - минимум среди 48 свеч
Итог: теперь значения получившиеся в этих трех пунктах нужно сложить и разделить на 3?
Отсчет свечей идет справа налево же?
Для каждой свечи считаем минимум и максимум за 50 предыдущих свечей (включая текущую). Создаем массив размерностью, равной количеству свечей и запоминаем в нем результаты расчета для каждой свечи.
Потом для каждой свечи рассчитываем
сумму слагаемых CLOSE - MIN (LOW, Pk) за период Sk, то есть создаем еще один массив, в котором для каждой свечи рассчитываем эту формулу. Min(Low,Pk) у нас уже рассчитан. Таким образом, для каждой свечи суммируем разницу за пред. Sk свечей между close и Min(Low,Pk) и записываем в этот новый массив
И так далее.
Вычислений много, рассчитывать на С на каждом тике надо только те значения,которы е изменились. Перерасчитывать всю историю не нужно..
Моя цифра совпадает с цифрой индикатора стохастик в квике, а с цифрой стохастика в ами - нет, разница на 0.24.
Значит я все правильно сделал?
Тогда почему в Ами расхождение?
Basil, проверьте идентичность свечей в ами и квике.
Если есть различия - то расчет индикатора по определению не может совпадать.
RSS лента комментариев этой записи