Navigation:Home > Content >

AllFramesTrend_v4.mq4

Time: 2018-02-05 | Download file:AllFramesTrend_v4.mq4

#property link              "mailto:rainal@mail.ru"
#property copyright         "rainal - Смирнов Александр Михайлович"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1  Blue
#property indicator_color2  Red
#property indicator_color3  Blue
#property indicator_color4  Red
#property indicator_width1  2
#property indicator_width2  2
#property indicator_width3  0
#property indicator_width4  0

extern string remark1 = "Параметры МА";
extern int method =     3;              // метод усреднения МА для всех таймфреймов
extern int price =      5;              // цена для расчета МА для всех таймфреймов
extern string remark2 = "Выбор таймфереймов";
extern int M1_use =     0;              // использование таймфрема М1
extern int M5_use =     0;              // 0 - нет, любая другая цифра - да
extern int M15_use =    0;              // аналогично для остальных таймрефмов
extern int M30_use =    0;
extern int H1_use =     1;
extern int H4_use =     0;
extern int D1_use =     0;
extern string remark3 = "Выбор периодов МА";
extern int M1_period =  5;              // период усреднения МА для таймфрейма М1
extern int M5_period =  5;              // аналогично для остальных таймрефмов
extern int M15_period = 5;
extern int M30_period = 5;
extern int H1_period =  5;
extern int H4_period =  5;
extern int D1_period =  5;
extern string remark4 = "Режим расчета данных";
extern bool on_next_bar = true;         // true - использование для расчета индикатора цены Close предпоследнего расчетного бара
                                        // на минимальном выбранном таймрейме, т.е. ожидание полного формирования бара,
                                        // отрисовка открытия и закрытия позиции будет осуществляться по цене Open
                                        // последнего (текущего) расчетного бара на минимальном выбранном таймрейме
                                        // false - использование текущей цены (Close) последнего расчетного бара на минимальном 
                                        // выбранном таймрейме, т.е. расчет в реальном времени, не дожидаясь полного формирования
                                        // бара, отрисовка открытия и закрытия позиции будет осуществляться по текущей цене (Close)
                                        // последнего (текущего) расчетного бара на минимальном выбранном таймрейме

int bars_history = 5000;                // ограничение на количество обрабатываемых индикатором баров
string sound_up = "up.wav";             // звук, обозначающий начало движения вверх
string sound_down = "down.wav";         // звук, обозначающий начало движения вниз
string sound_end = "end.wav";           // звук, обозначающий окончание движения                                        
                                        // звуковые файлы должны находиться в папке "каталог_терминала\sounds"

double line_up[], line_down[], arrow_up[], arrow_down[];
int mode, flag_alert, flag_sound_up, flag_sound_down, flag_end_up, flag_end_down, pos_up, pos_down;
datetime time_last, time_up, time_down;

int init()
{
  IndicatorShortName("AllFramesTrend_4");
  SetIndexStyle(0, DRAW_LINE);
  SetIndexStyle(1, DRAW_LINE);
  SetIndexStyle(2, DRAW_ARROW);
  SetIndexStyle(3, DRAW_ARROW);
  SetIndexArrow(2, 108);
  SetIndexArrow(3, 108);
  SetIndexDrawBegin(0, 1);
  SetIndexDrawBegin(1, 1);
  SetIndexDrawBegin(2, 1);
  SetIndexDrawBegin(3, 1);
  SetIndexBuffer(0, line_up);
  SetIndexBuffer(1, line_down);
  SetIndexBuffer(2, arrow_up);
  SetIndexBuffer(3, arrow_down);
  return(0);
}

int start()
{
  // проверка соответствия таймфрема текущго графика входным данным
  int min_frame = 0;
  if(D1_use == 1) min_frame = 1440;
  if(H4_use == 1) min_frame = 240;
  if(H1_use == 1) min_frame = 60;
  if(M30_use == 1) min_frame = 30;
  if(M15_use == 1) min_frame = 15;
  if(M5_use == 1) min_frame = 5;
  if(M1_use == 1) min_frame = 1;
  if(min_frame == 0 && flag_alert != 1)
  {
    flag_alert = 1;
    Alert("Ни один таймфрейм не выбран! Выберите хотя бы один!");
    return(0);
  }
  if(Period() > min_frame && flag_alert != 1)
  {
    flag_alert = 1;
    Alert("Таймфрейм текущего графика должен быть не больше минимального выбранноого таймфрейма!");
    return(0);
  }
    
  int pos = 0, shift, i;
  double d, M1_cur, M1_prev, M5_cur, M5_prev, M15_cur, M15_prev, M30_cur, M30_prev, H1_cur, H1_prev, H4_cur, H4_prev, D1_cur, D1_prev;
  int counted_bars = IndicatorCounted();
  if(counted_bars < bars_history) pos = bars_history - counted_bars;
  if(on_next_bar) mode = 1;
  else mode = 0;
  
  while(pos >= 0)
  {
    // проверка условия полного формирования предпоследнего расчетного бара на минимальном выбранном таймфрейме
    if(mode == 1 && counted_bars > bars_history)
    {
      shift = iBarShift(NULL, min_frame, Time[pos]);
      if(iTime(NULL, min_frame, shift) == time_last) return(0);
      else time_last = iTime(NULL, min_frame, shift);
    }
        
    // собираем информацию по разным таймфремам
    if(M1_use == 1)
    {
      M1_cur = iMA(NULL, PERIOD_M1, M1_period, 0, method, price, pos + mode);
      M1_prev = iMA(NULL, PERIOD_M1, M1_period, 0, method, price, pos + mode + 1);
    }
    if(M5_use == 1)
    {
      shift = iBarShift(NULL, PERIOD_M5, Time[pos + (5 / Period()) * mode]);
      M5_cur = iMA(NULL, PERIOD_M5, M5_period, 0, method, price, shift);
      shift = iBarShift(NULL, PERIOD_M5, Time[pos + (5 / Period()) * (mode + 1)]);
      M5_prev = iMA(NULL, PERIOD_M5, M5_period, 0, method, price, shift);
    }
    if(M15_use == 1)
    {
      shift = iBarShift(NULL, PERIOD_M15, Time[pos + (15 / Period()) * mode]);
      M15_cur = iMA(NULL, PERIOD_M15, M15_period, 0, method, price, shift);
      shift = iBarShift(NULL, PERIOD_M15, Time[pos + (15 / Period()) * (mode + 1)]);
      M15_prev = iMA(NULL, PERIOD_M15, M15_period, 0, method, price, shift);
    }
    if(M30_use == 1)
    {
      shift = iBarShift(NULL, PERIOD_M30, Time[pos + (30 / Period()) * mode]);
      M30_cur = iMA(NULL, PERIOD_M30, M30_period, 0, method, price, shift);
      shift = iBarShift(NULL, PERIOD_M30, Time[pos + (30 / Period()) * (mode + 1)]);
      M30_prev = iMA(NULL, PERIOD_M30, M30_period, 0, method, price, shift);
    }
    if(H1_use == 1)
    {
      shift = iBarShift(NULL, PERIOD_H1, Time[pos + (60 / Period()) * mode]);
      H1_cur = iMA(NULL, PERIOD_H1, H1_period, 0, method, price, shift);
      shift = iBarShift(NULL, PERIOD_H1, Time[pos + (60 / Period()) * (mode + 1)]);
      H1_prev = iMA(NULL, PERIOD_H1, H1_period, 0, method, price, shift);
    }
    if(H4_use == 1)
    {
      shift = iBarShift(NULL, PERIOD_H4, Time[pos + (240 / Period()) * mode]);
      H4_cur = iMA(NULL, PERIOD_H4, H4_period, 0, method, price, shift);
      shift = iBarShift(NULL, PERIOD_H4, Time[pos + (240 / Period()) * (mode + 1)]);
      H4_prev = iMA(NULL, PERIOD_H4, H4_period, 0, method, price, shift);
    }
    if(D1_use == 1)
    {
      shift = iBarShift(NULL, PERIOD_D1, Time[pos + (1440 / Period()) * mode]);
      D1_cur = iMA(NULL, PERIOD_D1, D1_period, 0, method, price, shift);
      shift = iBarShift(NULL, PERIOD_D1, Time[pos + (1440 / Period()) * (mode + 1)]);
      D1_prev = iMA(NULL, PERIOD_D1, D1_period, 0, method, price, shift);
    }
    
    // определяем направление движения на всех выбранных таймфреймах
    string direction = "none";
    if(((M1_cur > M1_prev) || M1_use == 0) && ((M5_cur > M5_prev) || M5_use == 0) && ((M15_cur > M15_prev) || M15_use == 0) && ((M30_cur > M30_prev) || M30_use == 0) && ((H1_cur > H1_prev) || H1_use == 0) && ((H4_cur > H4_prev) || H4_use == 0) && ((D1_cur > D1_prev) || D1_use == 0)) direction = "up";
    if(((M1_cur < M1_prev) || M1_use == 0) && ((M5_cur < M5_prev) || M5_use == 0) && ((M15_cur < M15_prev) || M15_use == 0) && ((M30_cur < M30_prev) || M30_use == 0) && ((H1_cur < H1_prev) || H1_use == 0) && ((H4_cur < H4_prev) || H4_use == 0) && ((D1_cur < D1_prev) || D1_use == 0)) direction = "down";
        

    // если направления движений МА на выбранных таймфреймах направлены вверх...
    if(direction == "up")
    {
      
      // идентифицируем начало движения вверх
      if(time_up == EMPTY)
      {
        flag_end_up = 0;
        flag_sound_down = 0;
        time_up = Time[pos];
        if(mode == 1)
        {
          line_up[pos] = Open[pos];
          arrow_up[pos] = Open[pos];
        }
        else
        {
          line_up[pos] = Close[pos];
          arrow_up[pos] = Close[pos];
        }
        
        // играем звук начала движения вверх
        if(counted_bars >= bars_history && flag_sound_up != 1)
        {
          flag_sound_up = 1;
          PlaySound(sound_up);
        }
      }
      
      // рисуем прямую линию от начала движения вверх до текущего значения
      if(counted_bars >= bars_history && time_up != EMPTY && time_up != Time[pos])
      {
        pos_up = iBarShift(NULL, 0, time_up);
        if(mode == 1) d = (Open[pos] - Open[pos_up]) / (pos_up - pos);
        else d = (Close[pos] - Close[pos_up]) / (pos_up - pos);
        for(i = pos_up - 1; i >= pos; i--) line_up[i] = line_up[i + 1] + d;
      }
    }
    
    // идентифицируем окончание движения вверх
    if(direction != "up" && flag_end_up != 1)
    {
      flag_end_up = 1;
      
      // играем звук окончания движения
      if(counted_bars >= bars_history) PlaySound(sound_end);

      // рисуем прямую линию от начала до окончания движения верх
      if(time_up != Time[pos])
      {
        pos_up = iBarShift(NULL, 0, time_up);
        if(mode == 1)
        {
          arrow_up[pos] = Open[pos];
          d = (Open[pos] - Open[pos_up]) / (pos_up - pos);
        }
        else
        {
          arrow_up[pos] = Close[pos];
          d = (Close[pos] - Close[pos_up]) / (pos_up - pos);
        }
        for(i = pos_up - 1; i >= pos; i--) line_up[i] = line_up[i + 1] + d;
      }
      time_up = EMPTY;
    }
    
    // если направления движений МА на выбранных таймфреймах направлены вниз...
    if(direction == "down")
    {
      
      // идентифицируем начало движения вниз
      if(time_down == EMPTY)
      {
        flag_end_down = 0;
        flag_sound_up = 0;
        time_down = Time[pos];
        if(mode == 1)
        {
          line_down[pos] = Open[pos];
          arrow_down[pos] = Open[pos];
        }
        else
        {
          line_down[pos] = Close[pos];
          arrow_down[pos] = Close[pos];
        }
        
        // играем звук начала движения вниз
        if(counted_bars >= bars_history && flag_sound_up != 1)
        {
          flag_sound_down = 1;
          PlaySound(sound_down);
        }
      }
      
      // рисуем прямую линию от начала движения вниз до текущего значения
      if(counted_bars >= bars_history && time_down != EMPTY && time_down != Time[pos])
      {
        pos_down = iBarShift(NULL, 0, time_down);
        if(mode == 1) d = (Open[pos] - Open[pos_down]) / (pos_down - pos);
        else d = (Close[pos] - Close[pos_down]) / (pos_down - pos);
        for(i = pos_down - 1; i >= pos; i--) line_down[i] = line_down[i + 1] + d;
      }
    }
    
    // идентифицируем окончание движения вниз
    if(direction != "down" && flag_end_down != 1)
    {
      flag_end_down = 1;
      
      // играем звук окончания движения
      if(counted_bars >= bars_history) PlaySound(sound_end);
      
      // рисуем прямую линию от начала до окончания движения вниз
      if(time_down != Time[pos])
      {
        pos_down = iBarShift(NULL, 0, time_down);
        if(mode == 1)
        {
          arrow_down[pos] = Open[pos];
          d = (Open[pos] - Open[pos_down]) / (pos_down - pos);
        }
        else
        {
          arrow_down[pos] = Close[pos];
          d = (Close[pos] - Close[pos_down]) / (pos_down - pos);
        }
        for(i = pos_down - 1; i >= pos; i--) line_down[i] = line_down[i + 1] + d;
      }
      time_down = EMPTY;
    }   
    
    pos--;
  }
  return(0);
}

Recommend