Индикатор 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);
}
Выкладываю как есть.
Прошу Вас не просить доделать, переделать, написать новый, выслать подробное описание и такое прочее.