_AllFramesTrend_4

Download script
Author: rainal - ������� ��������� ����������
_AllFramesTrend_4

This script is designed as a multi-timeframe trend analysis tool for the MetaTrader platform. Its primary purpose is to monitor the direction of moving averages (MA) across several different timeframes simultaneously to identify consistent market trends.

Core Logic and Functionality

1. Multi-Timeframe Coordination Unlike standard indicators that only look at the current chart, this script allows you to select multiple timeframes (e.g., M1, M5, M15, M30, H1, H4, D1) to analyze at once. It checks the price movement on each of these selected frames to determine if the overall market trend is aligned.

2. Trend Detection Mechanism The logic works by comparing the current value of a moving average against its previous value across all active timeframes:

  • Upward Trend: If the moving averages on all selected timeframes are currently pointing upward (current value is higher than the previous value), the script identifies an "Up" trend.
  • Downward Trend: If the moving averages on all selected timeframes are pointing downward (current value is lower than the previous value), the script identifies a "Down" trend.

3. Visual Mapping and Dynamic Drawing When a trend change is detected, the script performs several visual actions:

  • Lines: It draws straight lines connecting the start of an upward or downward movement to its current point. This helps visualize the trajectory of the price move.
  • Arrows: It places specific markers (arrows) at the exact moment a new trend begins.
  • Price Selection: Users can choose whether the calculations should be based on the "Close" price (real-time fluctuating data) or the "Open" price (waiting for a bar to fully complete) to provide more stable or more reactive signals.

4. Alert System The script includes an integrated audio notification system:

  • It plays a specific sound file when a new upward trend begins.
  • It plays a different sound file when a new downward trend begins.
  • It triggers a closing sound when a movement phase ends or changes.

5. Safety and Validation Checks To ensure the data remains accurate, the script includes built-in validation:

  • It alerts the user if no timeframes are selected.
  • It ensures that the timeframe of your current chart is not larger than the smallest timeframe selected by the user (preventing calculation errors caused by missing data).
  • It limits the amount of historical data processed to keep the platform running smoothly.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt plays sound alerts
8 Views
0 Downloads
0 Favorites
_AllFramesTrend_4
#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);
}

Comments