//+----------------------------------------------------------------------------+
//|                                                             i-StochMA.mq4  |
//|                                                                            |
//|  Идея            : http://www.onix-trade.net/forum/index.php?showtopic=8269|
//|  Программирование: Ким Игорь В. aka KimIV,  http://www.kimiv.ru            |
//|                                                                            |
//|  08.09.2008  Индикатор торговых сигналов на основе                         |
//|              смены направления стохастика с фильтром на двух МА.           |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LightBlue
#property indicator_color2 Salmon
#property indicator_width1 0
#property indicator_width2 0

//------- Внешние параметры индикатора ----------------------------------------+
extern int NumberOfBars = 1000;        // Количество баров обсчёта (0-все)
extern int KPeriod     = 5;  // Период (количество баров) для вычисления линии %K.
extern int DPeriod     = 3;  // Период усреднения для вычисления линии %D.
extern int Slowing     = 3;  // Значение замедления.
extern int Method      = 1;  // Метод усреднения:
                             //  0 - MODE_SMA - Простое скользящее среднее
                             //  1 - MODE_EMA - Экспоненциальное скользящее среднее
                             //  2 - MODE_SMMA - Сглаженное скользящее среднее
                             //  3 - MODE_LWMA - Линейно-взвешенное скользящее среднее
extern int Price_Field = 0;  // Параметр выбора цен для расчета:
                             //  0 - Low/High
                             //  1 - Close/Close
extern int MA1.Period = 34;  // Период усреднения для вычисления скользящего среднего.
extern int MA1.Method = 1;   // Метод усреднения:
                             //  0 - MODE_SMA - Простое скользящее среднее
                             //  1 - MODE_EMA - Экспоненциальное скользящее среднее
                             //  2 - MODE_SMMA - Сглаженное скользящее среднее
                             //  3 - MODE_LWMA - Линейно-взвешенное скользящее среднее
extern int MA1.APrice = 0;   // Используемая цена:
                             //  0 - PRICE_CLOSE - Цена закрытия
                             //  1 - PRICE_OPEN - Цена открытия
                             //  2 - PRICE_HIGH - Максимальная цена
                             //  3 - PRICE_LOW - Минимальная цена
                             //  4 - PRICE_MEDIAN - Средняя цена, (high+low)/2
                             //  5 - PRICE_TYPICAL - Типичная цена, (high+low+close)/3
                             //  6 - PRICE_WEIGHTED - Взвешенная цена закрытия, (high+low+close+close)/4
extern int MA2.Period = 13;  // Период усреднения для вычисления скользящего среднего.
extern int MA2.Method = 1;   // Метод усреднения:
                             //  0 - MODE_SMA - Простое скользящее среднее
                             //  1 - MODE_EMA - Экспоненциальное скользящее среднее
                             //  2 - MODE_SMMA - Сглаженное скользящее среднее
                             //  3 - MODE_LWMA - Линейно-взвешенное скользящее среднее
extern int MA2.APrice = 0;   // Используемая цена:
                             //  0 - PRICE_CLOSE - Цена закрытия
                             //  1 - PRICE_OPEN - Цена открытия
                             //  2 - PRICE_HIGH - Максимальная цена
                             //  3 - PRICE_LOW - Минимальная цена
                             //  4 - PRICE_MEDIAN - Средняя цена, (high+low)/2
                             //  5 - PRICE_TYPICAL - Типичная цена, (high+low+close)/3
                             //  6 - PRICE_WEIGHTED - Взвешенная цена закрытия, (high+low+close+close)/4

//------- Глобальные переменные -----------------------------------------------+

//------- Буферы индикатора ---------------------------------------------------+
double dBuf0[], dBuf1[];

//------- Поключение внешних модулей ------------------------------------------+


//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
void init() {
  SetIndexArrow     (0, 233);
  SetIndexBuffer    (0, dBuf0);
  SetIndexEmptyValue(0, EMPTY_VALUE);
  SetIndexStyle     (0, DRAW_ARROW);

  SetIndexArrow     (1, 234);
  SetIndexBuffer    (1, dBuf1);
  SetIndexEmptyValue(1, EMPTY_VALUE);
  SetIndexStyle     (1, DRAW_ARROW);

  Comment("");
}

//+----------------------------------------------------------------------------+
//|  Custom indicator deinitialization function                                |
//+----------------------------------------------------------------------------+
void deinit() { Comment(""); }

//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
void start() {
  double offSet=(WindowPriceMax()-WindowPriceMin())/100*5;
  double ms[2];
  int    LoopBegin, sh;

 	if (NumberOfBars==0) LoopBegin=Bars-50;
  else LoopBegin=NumberOfBars;
  LoopBegin=MathMin(Bars-50, LoopBegin);

  for (sh=LoopBegin; sh>=0; sh--) {
    ArrayInitialize(ms, EMPTY_VALUE);
    GetTradeSignals(ms, "", 0, sh);
    dBuf0[sh]=ms[0];
    dBuf1[sh]=ms[1];
    if (dBuf0[sh]!=EMPTY_VALUE) dBuf0[sh]-=offSet;
    if (dBuf1[sh]!=EMPTY_VALUE) dBuf1[sh]+=offSet;
  }
}

//+----------------------------------------------------------------------------+
//|  Формирует и возвращает торговые сигналы                                   |
//|  Параметры:                                                                |
//|    ms - массив торговых сигналов                                           |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий бар)             |
//+----------------------------------------------------------------------------+
void GetTradeSignals(double& ms[], string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double ma1=iMA(sy, tf, MA1.Period, 0, MA1.Method, MA1.APrice, nb+1);
  double ma2=iMA(sy, tf, MA2.Period, 0, MA2.Method, MA2.APrice, nb+1);
  double st0=iStochastic(sy, tf, KPeriod, DPeriod, Slowing, Method, Price_Field, MODE_SIGNAL, nb+1);
  double st1=iStochastic(sy, tf, KPeriod, DPeriod, Slowing, Method, Price_Field, MODE_SIGNAL, nb+2);
  double st2=iStochastic(sy, tf, KPeriod, DPeriod, Slowing, Method, Price_Field, MODE_SIGNAL, nb+3);

  if (ma1<ma2 && st2>=st1 && st1<st0) ms[0]=Low[nb];
  if (ma1>ma2 && st2<=st1 && st1>st0) ms[1]=High[nb];
}
//+----------------------------------------------------------------------------+

