Особенности
- Использование на ТФ ниже 1 минуты возможно, но не рекомендуется, т.к. для формирования потребуется длинная история.
Если потребуется отображение менее чем на 1 минутных таймфреймах, необходимо увеличить значение 60 параметра "nK". - На текущем часе текущего таймфрейма рисуются данные SO H1 предыдущего часа
Стохастический осциллятор – является еще одним ярким представителем нормированных осцилляторов, т.е. его значения колеблются в диапазоне от 0 до 100. Индикатор показывает положение и направление движения текущей цены относительно максимума и минимума за выбранный период.
Сигнальная линия строится как простое среднее от основной линии стохастика.
Signal = SMA(SO, N3).
N1 – период поиска максимального и минимального значения, N2 – период сглаживания быстрого стохастика, N3 – период сигнальной линии
Сигналы
Лонг – индикатор пересекает вниз уровень «80»; шорт – индикатор пересекает вверх уровень «20».
SO пересекает сигнальную линию вверх или вниз.
Анализ дивергенций между экстремумами индикатора MFI и ценой.
Автор: Джордж Лэйн (George Lane).
Источник: Стивен Б. Акелис, Технический анализ от А до Я.
Параметры
Все параметры задаются актуальными для таймфрейма H1
nK - период поиска максимального и минимального значения
nD - период сглаживания быстрого стохастика
Signal - период сигнальной линии
Примеры
Для сравнения значений SOH ТФ = M10 и обычный SO ТФ = 1H
Код: Выделить всё
function Initialize()
{
IndicatorName = "SOH"; //SOH (Stochastic Oscillator Hour)
AddInput("Input", Inputs.Candle);
PriceStudy = false;
AddSeries("sD", DrawAs.Line, Color.Green);
AddSeries("Signal", DrawAs.Line, Color.Red);
AddParameter("nK", 5, 60);
AddParameter("nD", 3);
AddParameter("nSignal", 3);
AddLevel(20.0 , Color.Gray, "sD");
AddLevel(80.0 , Color.Gray, "sD");
// для сохранения списков значений OHLC часовых баров
AddGlobalVariable("O", Types.DoubleList);
AddGlobalVariable("H", Types.DoubleList);
AddGlobalVariable("L", Types.DoubleList);
AddGlobalVariable("C", Types.DoubleList);
// для хранения минимальной и максимальной цены текущего часа
AddGlobalVariable("Min", Types.Double, 999999999);
AddGlobalVariable("Max", Types.Double, 0.0);
// для хранения цены открытия текущего часа
AddGlobalVariable("Open", Types.Double, 0.0);
AddGlobalVariable("sDH", Types.DoubleList);
AddGlobalVariable("sKH", Types.DoubleList);
}
function Evaluate()
{
// evge 10.12.2016 http://alfadirect4.ru
// модификация: SO от H1 для нижестоящих таймфреймов
// закончился часовой бар и начался новый
// сохраняем часовые данные в списках
if (BarTime(0).Hours != BarTime(1).Hours)
{
// сохраняем данные часового бара
O.Insert(0, Open);
H.Insert(0, Max);
L.Insert(0, Min);
C.Insert(0, Input.Close[1]);
// лишнее удаляем
var CN = O.Count;
if (CN > nK)
{
O.RemoveAt(CN - 1);
H.RemoveAt(CN - 1);
L.RemoveAt(CN - 1);
C.RemoveAt(CN - 1);
}
// новый бар
Min = Double.MaxValue;
Max = 0.0;
Open = Input.Open[0];
}
if (Input.Low[0] < Min) Min = Input.Low[0];
if (Input.High[0] > Max) Max = Input.High[0];
var i = 0;
var eMax = 0.0;
var eMin = Double.MaxValue;
var sK = 100.0;
if (O.Count < nK)
{
Signal = 0.0;
sDH.Insert(0, 0.0);
sKH.Insert(0, 0.0);
}
else
{
if (BarTime(0).Hours != BarTime(1).Hours)
{
for (i=0; i < nK; i++)
{
if (H[i] > eMax) eMax = H[i];
if (L[i] < eMin) eMin = L[i];
}
var a = (eMax - eMin);
if (a > 0.0) sK = (C[0] - eMin) / (eMax - eMin) * 100.0;
sKH.Insert(0, sK);
if (sKH.Count > nK) sKH.RemoveAt(sKH.Count - 1);
sD = sD[1] - (sKH[0 + nD] - sKH[0]) / nD;
sDH.Insert(0, sD[0]);
if (sDH.Count > nK) sDH.RemoveAt(sDH.Count - 1);
Signal = Signal[1] - (sDH[0 + nSignal] - sDH[0]) / nSignal;
}
else
{
sD = sD[1];
Signal = Signal[1];
}
} //O.Count >= nK
}
Скачать исходный код (скрипт)