Индикатор Elliot Wave Oscillator (EWO) - осциллятор, который отображает разницу двух скользящих средних. Расширенная реализация индикатора
http://alfadirect4.ru/viewtopic.php?f=4&t=569.
Подсмотрено здесь:
https://www.mql5.com/ru/code/17191Цвета линий меняются при изменении следующих условий:
- пересечении внешнего уровня;
- пересечении среднего уровня;
- изменении наклона линии.
Линии уровней - нестандартные. Они вычисляются с использованием ЕМА на основе прерванных временных рядов. Средняя линия вычисляется как среднее между двумя внешними уровнями. Такой тип средней "нулевой" линии дает более ранние сигналы, чем обычное пересечение нулевой линии.
Входные параметры:FastPeriod - период быстрой SMA (значение по умолчанию = 5);
SlowPeriod - период медленной SMA (значение по умолчанию = 34).
Скриншот индикатора:Код индикатора:► Показать
Код: Выделить всё
function Initialize()
{
//SRR_ELLIOT_WAVE_OSCILLATOR_INDICATOR_V1.01
//Coded for AD 4.0 by SRR (aka Indigo-On), 2017-2018
//Индикатор Осциллятор Эллиота - обычная 34-периодная простая скользящая
//средняя, взятая от 5-периодной SMA, отображаемая как гистограмма выше
//или ниже линии нуля (обычно он называется "5/34 oscillator).
//Уровни не являются ни одним из стандартных уровней. Они вычисляются с
//использованием ЕМА на основе прерванных временных рядов. Затем средняя
//линия вычисляется как среднее между двумя внешними уровнями. Такой тип
//средней "нулевой" линии дает более ранние сигналы, чем обычное
//пересечение нулевой линии.
//Подсмотрено здесь: https://www.mql5.com/ru/code/17191
//
//С 4 рядами данных
//
//v1.01 - версия подготовленная для публикации.
//v1.00 - первая тестовая версия.
//Параметры основного индикатора #1
//Обязательные параметры:
IndicatorName = "SRR_ELLIOT_V1"; //название индикатора
PriceStudy = false; //рисовать в отдельной области
//Дополнительные параметры:
AddParameter("FastPeriod", 5, 2); //период быстрой SMA (значение по умолчанию = 5)
AddParameter("SlowPeriod", 34, 2); //период медленной SMA (значение по умолчанию = 34)
AddGlobalVariable("dK_UP", Types.Double, 0.0); //переменная для хранения значения коэффициента для EMA
AddGlobalVariable("dK_DOWN", Types.Double, 0.0); //переменная для хранения значения коэффициента для EMA
//Входной ряд типа Candle
AddInput("Input1", Inputs.Candle);
//Инициализация линии #1 индикатора - формируем ряд данных EWO
AddSeries("EWO", DrawAs.Custom, Color.Silver, AxisType.ZeroBased, true);
//Инициализация линии #2 индикатора - формируем ряд данных UP
AddSeries("UP", DrawAs.Custom, Color.LimeGreen, true);
//Инициализация линии #3 индикатора - формируем ряд данных DOWN
AddSeries("DOWN", DrawAs.Custom, Color.Orange, true);
//Инициализация линии #4 индикатора - формируем ряд данных MIDDLE
AddSeries("MIDDLE", DrawAs.Custom, Color.Silver, true);
//Рисуем линии уровня индикатора
AddLevel(0.0, Color.Silver, LineStyles.Solid, 1, "EWO");
}
function Evaluate()
{
///////////////////////////////////////////////////////////
/// Расчет значений индикатора
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/// Индикатор ELLIOT WAVE OSCILLATOR
/// Расчет значений ряда данных EWO
///////////////////////////////////////////////////////////
//Инициализация пременных
//рассчитать период для линий уровня UP и DOWN
int iLevelsPeriod = (int)(SlowPeriod + Math.Ceiling(FastPeriod / 2.0));
//
//Расчет осциллятора волн Эллиота
//проверить на достаточность исходных данных
if (CurrentIndex > 0)
EWO = SMA(LIB.MID(Input1), FastPeriod)[0] - SMA(LIB.MID(Input1), SlowPeriod)[0];
else
EWO = 0.0;
//
//Расчет ряда сигнальной линии UP
//рассчитать EMA
if (CurrentIndex > iLevelsPeriod * 2)
UP = (1.0 - dK_UP) * UP[-1] + dK_UP * EWO[0];
else
{
UP = EWO[0];
dK_UP = 2.0 / (iLevelsPeriod + 1.0);
}
//проверить положение линии UP (UP всегда выше уровня "0")
if (EWO[0] <= 0)
UP = UP[-1];
//
//Расчет ряда сигнальной линии DOWN
//рассчитать EMA
if (CurrentIndex > iLevelsPeriod * 2)
DOWN = (1.0 - dK_DOWN) * DOWN[-1] + dK_DOWN * EWO[0];
else
{
DOWN = EWO[0];
dK_DOWN = 2.0 / (iLevelsPeriod + 1.0);
}
//проверить положение линии DOWN (DOWN всегда ниже уровня "0")
if (EWO[0] >= 0)
DOWN = DOWN[-1];
//
//Расчет ряда сигнальной линии MIDDLE
MIDDLE = (UP[0] + DOWN[0]) * 0.5;
///////////////////////////////////////////////////////////
/// Вывод значений индикатора UP на экран
///////////////////////////////////////////////////////////
UP.DrawLine(Color.LimeGreen, LineStyles.DashSmall, 1);
///////////////////////////////////////////////////////////
/// Вывод значений индикатора DOWN на экран
///////////////////////////////////////////////////////////
DOWN.DrawLine(Color.Orange, LineStyles.DashSmall, 1);
///////////////////////////////////////////////////////////
/// Вывод значений индикатора MIDDLE на экран
///////////////////////////////////////////////////////////
MIDDLE.DrawLine(Color.Silver, LineStyles.DashSmall, 1);
///////////////////////////////////////////////////////////
/// Вывод значений индикатора EWO на экран
///////////////////////////////////////////////////////////
if (EWO[0] >= UP[0])
{
EWO.DrawLine(Color.LimeGreen, LineStyles.Solid, 2);
UP.DrawChannel(EWO, Color.LimeGreen, 50);
}
else
if (EWO[0] < DOWN[0])
{
EWO.DrawLine(Color.Orange, LineStyles.Solid, 2);
DOWN.DrawChannel(EWO, Color.Orange, 50);
}
else
EWO.DrawLine(Color.Silver, LineStyles.Solid, 2);
}
Скачать архив с кодом индикатора:Выкладываю как есть.
Прошу Вас не просить доделать, переделать, написать новый, выслать подробное описание и такое прочее.