//+------------------------------------------------------------------+
//|                                                         OsMA.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Averages of Oscillator"
#property strict

#include <MovingAverages.mqh>

//--- indicator settings
#property  indicator_separate_window  // индюк в подвале
#property  indicator_buffers 2        // буфер на выходе один 
#property  indicator_color1  Silver   // цвет первой линии серебро
#property  indicator_width1  2        // толщина первой линии 2
#property  indicator_color2  Red   // цвет первой линии  
#property  indicator_width2  2        // толщина первой линии 2


//--- indicator parameters
input int InpFastEMA=12;   // Fast EMA Period
input int InpSlowEMA=26;   // Slow EMA Period
input int InpSignalSMA=9;  // Signal SMA Period
input int MAPeriod=5;
input int MAMethod=1;
input int MAShift =0;




//--- indicator buffers
double ExtOsmaBuffer[];    // задаём буфер 
double ExtMacdBuffer[];
double ExtSignalBuffer[];
double MA[];
//--- right input parameters flag
bool   ExtParameters=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- 2 additional buffers are used for counting.
   IndicatorBuffers(4);                          // задаётся 3 буфера уже в коде
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);                   // устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора ( номер линии, в виде линии)
   SetIndexDrawBegin(0,InpSignalSMA);         // устанавиливает порядковый номер бара от начала данных, с которого длжна отрисовываться указанная линия (номер лини, с периода сигнал. SMA)
   SetIndexStyle(3,DRAW_LINE);                   // устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора ( номер линии, в виде линии)
   SetIndexDrawBegin(3,0);
   
   IndicatorDigits(Digits+2);
//--- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtOsmaBuffer);     // связывает индикаторный буфер с массивом  ( номер инди буфера, массив который прикрепляется)
   SetIndexBuffer(1,ExtMacdBuffer);
   SetIndexBuffer(2,ExtSignalBuffer);
   SetIndexBuffer(3,MA);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("OsMA("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+") MA("+IntegerToString(MAPeriod)+","+IntegerToString(MAMethod)+","+IntegerToString(MAShift)+")");
//--- check for input parameters
   if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA)
     {
      Print("Wrong input parameters");
      ExtParameters=false;
      return(INIT_FAILED);
     }
   else
      ExtParameters=true;
//--- initialization done
   return(INIT_SUCCEEDED);
  }
  
  
  
  
//+------------------------------------------------------------------+
//| Moving Average of Oscillator                                     |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const datetime& time[],
                 const double& open[],
                 const double& high[],
                 const double& low[],
                 const double& close[],
                 const long& tick_volume[],
                 const long& volume[],
                 const int& spread[])
  {
   int i,limit;
//---
   if(rates_total<=InpSignalSMA || !ExtParameters)  // если "количество баров, доступных индикатору для расчета" меньше или равно периода сигнальной SMA ИЛИ ExtParam - ложь
      return(0);                                    // тогда возврат 0
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;               // "количество баров, доступных индикатору для расчета" минус "значение, которое вернула функция OnCalculate() на предыдущем вызове"
   if(prev_calculated>0)
      limit++;
//--- macd counted in the 1-st buffer
   for(i=0; i<limit; i++)
      ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i) - iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);

//--- signal line counted in the 2-nd buffer
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);

//--- main loop
   for(i=0; i<limit; i++)
      ExtOsmaBuffer[i]=ExtMacdBuffer[i]-ExtSignalBuffer[i];
//--- done


for (i = limit; i >= 0; i--)                    // Проходим по графику слева направо
      MA[i] = iMAOnArray(ExtOsmaBuffer, 0, MAPeriod, MAShift, MAMethod, i);// Рассчитываем среднее
   
   
   return(0);
  }
//+------------------------------------------------------------------+
