← К каталогу
Исходный код · ID 4305

BhanuCodeLab SMMA Levels MTF

smmalevelsmtfbhanucodelabs.mq5
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

BhanuCodeLab SMMA Levels MTF — это индикатор для MetaTrader 5, который рассчитывает и отображает три настраиваемых уровня сглаженной скользящей средней (SMMA) на различных таймфреймах. Каждый уровень имеет собственный таймфрейм, период и визуальное оформление, что позволяет трейдеру отслеживать динамику SMMA с нескольких временных горизонтов одновременно на графике текущего инструмента.

Индикатор также выводит информационную панель с актуальными данными: для каждого уровня отображается его таймфрейм, текущее значение SMMA, положение цены относительно уровня (выше, на уровне или ниже) и расстояние в пунктах. Панель автоматически подстраивается под размер графика и поддерживает настройку расположения, цветов и видимости.

Поддерживается многотаймфреймная привязка: значения SMMA берутся из соответствующих таймфреймов и проецируются на бары текущего графика. Доступен режим использования только завершённых MTF-свечей, а также ограничение глубины расчётной истории для оптимизации производительности.

Настройки программы

НастройкаОписание
InpAppliedPrice Применяемая цена для расчёта SMMA (например, закрытие, открытие, медиана и т. д.).
InpUseClosedMTFBar При включении использует только завершённые свечи таймфрейма MTF, исключая формирующуюся свечу.
InpMaximumHistoryBars Максимальное количество баров графика, участвующих в расчёте индикатора.
InpEnableLevel1 Включает или отключает отображение первого уровня SMMA.
InpTimeframe1 Таймфрейм, с которого берётся значение SMMA для первого уровня.
InpPeriod1 Период сглаживания SMMA для первого уровня.
InpLineColor1 Цвет линии первого уровня SMMA на графике.
InpLineStyle1 Стиль линии первого уровня SMMA (сплошная, пунктирная и т. д.).
InpLineWidth1 Толщина линии первого уровня SMMA в пикселях.
InpEnableLevel2 Включает или отключает отображение второго уровня SMMA.
InpTimeframe2 Таймфрейм, с которого берётся значение SMMA для второго уровня.
InpPeriod2 Период сглаживания SMMA для второго уровня.
InpLineColor2 Цвет линии второго уровня SMMA на графике.
InpLineStyle2 Стиль линии второго уровня SMMA.
InpLineWidth2 Толщина линии второго уровня SMMA в пикселях.
InpEnableLevel3 Включает или отключает отображение третьего уровня SMMA.
InpTimeframe3 Таймфрейм, с которого берётся значение SMMA для третьего уровня.
InpPeriod3 Период сглаживания SMMA для третьего уровня.
InpLineColor3 Цвет линии третьего уровня SMMA на графике.
InpLineStyle3 Стиль линии третьего уровня SMMA.
InpLineWidth3 Толщина линии третьего уровня SMMA в пикселях.
InpShowTable Включает или отключает отображение панели с данными о положении цены относительно уровней SMMA.
InpTableCorner Угол графика, к которому привязана панель статуса.
InpTableX Горизонтальное смещение панели статуса от выбранного угла в пикселях.
InpTableY Вертикальное смещение панели статуса от выбранного угла в пикселях.
InpTableBackground Цвет фона панели статуса.
InpTableBorder Цвет границы панели статуса.
InpTableText Основной цвет текста в панели статуса.
InpAboveColor Цвет индикации, когда цена находится выше уровня SMMA.
InpBelowColor Цвет индикации, когда цена находится ниже уровня SMMA.
InpAtLevelColor Цвет индикации, когда цена находится непосредственно на уровне SMMA.
Получить полный код

Поиск по коду файла

#property version   "1.0"
#property description "Plots three configurable multi-timeframe SMMA levels and displays a live price-position dashboard."
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3

#property indicator_label1  "SMMA MTF Level 1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDeepSkyBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "SMMA MTF Level 2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrOrange
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

#property indicator_label3  "SMMA MTF Level 3"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrMediumPurple
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2

input group "1. General Settings"
input ENUM_APPLIED_PRICE InpAppliedPrice       = PRICE_CLOSE;  // SMMA applied price
input bool               InpUseClosedMTFBar    = false;        // Use completed MTF candle only
input int                InpMaximumHistoryBars = 2500;         // Maximum chart bars to calculate

input group "2. SMMA Level 1"
input bool               InpEnableLevel1       = true;         // Enable level 1
input ENUM_TIMEFRAMES    InpTimeframe1         = PERIOD_M15;   // Level 1 timeframe
input int                InpPeriod1            = 50;           // Level 1 SMMA period
input color              InpLineColor1         = clrDeepSkyBlue; // Level 1 line color
input ENUM_LINE_STYLE    InpLineStyle1         = STYLE_SOLID;    // Level 1 line style
input int                InpLineWidth1         = 2;              // Level 1 line width

input group "3. SMMA Level 2"
input bool               InpEnableLevel2       = true;         // Enable level 2
input ENUM_TIMEFRAMES    InpTimeframe2         = PERIOD_H1;    // Level 2 timeframe
input int                InpPeriod2            = 50;           // Level 2 SMMA period
input color              InpLineColor2         = clrOrange;     // Level 2 line color
input ENUM_LINE_STYLE    InpLineStyle2         = STYLE_SOLID;    // Level 2 line style
input int                InpLineWidth2         = 2;              // Level 2 line width

input group "4. SMMA Level 3"
input bool               InpEnableLevel3       = true;         // Enable level 3
input ENUM_TIMEFRAMES    InpTimeframe3         = PERIOD_H4;    // Level 3 timeframe
input int                InpPeriod3            = 50;           // Level 3 SMMA period
input color              InpLineColor3         = clrMediumPurple; // Level 3 line color
input ENUM_LINE_STYLE    InpLineStyle3         = STYLE_SOLID;      // Level 3 line style
input int                InpLineWidth3         = 2;                // Level 3 line width

input group "5. Status Table"
input bool               InpShowTable          = true;                 // Show status table
input ENUM_BASE_CORNER   InpTableCorner        = CORNER_RIGHT_UPPER;   // Table corner
input int                InpTableX             = 12;                   // Horizontal offset
input int                InpTableY             = 24;                   // Vertical offset
input color              InpTableBackground    = C'20,24,32';          // Background color
input color              InpTableBorder        = C'82,91,108';         // Border color
input color              InpTableText          = clrWhiteSmoke;        // Main text color
input color              InpAboveColor         = clrLimeGreen;         // Above SMMA color
input color              InpBelowColor         = clrTomato;            // Below SMMA color
input color              InpAtLevelColor       = clrGold;              // At-level color

double LevelBuffer1[];
double LevelBuffer2[];
double LevelBuffer3[];

int HandleSMMA1 = INVALID_HANDLE;
int HandleSMMA2 = INVALID_HANDLE;
int HandleSMMA3 = INVALID_HANDLE;

string ObjectPrefix = "";
int RuntimePeriod1 = 50;
int RuntimePeriod2 = 50;
int RuntimePeriod3 = 50;
int RuntimeHistoryBars = 2500;
ENUM_APPLIED_PRICE RuntimeAppliedPrice = PRICE_CLOSE;
ENUM_TIMEFRAMES RuntimeTimeframe1 = PERIOD_M15;
ENUM_TIMEFRAMES RuntimeTimeframe2 = PERIOD_H1;
ENUM_TIMEFRAMES RuntimeTimeframe3 = PERIOD_H4;
bool RuntimeEnableLevel1 = true;
bool RuntimeEnableLevel2 = true;
bool RuntimeEnableLevel3 = true;

const int PANEL_MIN_WIDTH      = 400;
const int PANEL_ROW_COUNT      = 3;
const int PANEL_ROW_START      = 51;
const int PANEL_ROW_GAP        = 23;
const int PANEL_BOTTOM_PADDING = 16;

int PanelLeft   = 0;
int PanelTop    = 0;
int PanelWidth  = PANEL_MIN_WIDTH;
int PanelHeight = 124;

string TimeframeText(const ENUM_TIMEFRAMES timeframe)
  {
   string text = EnumToString(timeframe);
   StringReplace(text,"PERIOD_","");
   return text;
  }

int SafePeriod(const int requested_period)
  {
   return MathMax(1,MathMin(1000,requested_period));
  }

int SafeHistoryBars(const int requested_bars)
  {
   return MathMax(10,MathMin(10000,requested_bars));
  }

ENUM_APPLIED_PRICE SafeAppliedPrice(const ENUM_APPLIED_PRICE requested_price)
  {
   switch(requested_price)
     {
      case PRICE_CLOSE:
      case PRICE_OPEN:
      case PRICE_HIGH:
      case PRICE_LOW:
      case PRICE_MEDIAN:
      case PRICE_TYPICAL:
      case PRICE_WEIGHTED:
         return requested_price;
     }

   return PRICE_CLOSE;
  }

ENUM_TIMEFRAMES SafeTimeframe(const ENUM_TIMEFRAMES requested_timeframe,
                              const ENUM_TIMEFRAMES fallback_timeframe)
  {
   switch(requested_timeframe)
     {
      case PERIOD_CURRENT:
      case PERIOD_M1:
      case PERIOD_M2:
      case PERIOD_M3:
      case PERIOD_M4:
      case PERIOD_M5:
      case PERIOD_M6:
      case PERIOD_M10:
      case PERIOD_M12:
      case PERIOD_M15:
      case PERIOD_M20:
      case PERIOD_M30:
      case PERIOD_H1:
      case PERIOD_H2:
      case PERIOD_H3:
      case PERIOD_H4:
      case PERIOD_H6:
      case PERIOD_H8:
      case PERIOD_H12:
      case PERIOD_D1:
      case PERIOD_W1:
      case PERIOD_MN1:
         return requested_timeframe;
     }

   return fallback_timeframe;
  }

int EstimatedTextWidth(const string text,const int font_size)
  {
   const double average_character_width = (double)font_size * 0.62;
   return (int)MathCeil(StringLen(text) * average_character_width);
  }

void CalculatePanelGeometry(const string title)
  {
   const int chart_width =
      (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);

   const int chart_height =
      (int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);

   const int horizontal_margin = MathMax(0,InpTableX);
   const int vertical_margin = MathMax(0,InpTableY);

   const int title_width = EstimatedTextWidth(title,10) + 30;
   const int required_width = MathMax(PANEL_MIN_WIDTH,title_width);
   const int available_width =
      MathMax(120,chart_width - (2 * horizontal_margin));

   PanelWidth = MathMin(required_width,available_width);

   const int required_height =
      PANEL_ROW_START +
      ((PANEL_ROW_COUNT - 1) * PANEL_ROW_GAP) +
      12 +
      PANEL_BOTTOM_PADDING;

   PanelHeight = MathMin(required_height,MathMax(80,chart_height));

   const bool right_side =
      (InpTableCorner == CORNER_RIGHT_UPPER ||
       InpTableCorner == CORNER_RIGHT_LOWER);

   const bool lower_side =
      (InpTableCorner == CORNER_LEFT_LOWER ||
       InpTableCorner == CORNER_RIGHT_LOWER);

   PanelLeft = right_side
               ? chart_width - PanelWidth - horizontal_margin
               : horizontal_margin;

   PanelTop = lower_side
              ? chart_height - PanelHeight - vertical_margin
              : vertical_margin;

   const int maximum_left = MathMax(0,chart_width - PanelWidth);
   const int maximum_top  = MathMax(0,chart_height - PanelHeight);

   PanelLeft = MathMax(0,MathMin(maximum_left,PanelLeft));
   PanelTop  = MathMax(0,MathMin(maximum_top,PanelTop));
  }

void CreateTableBackground()
  {
   const string name = ObjectPrefix + "BACKGROUND";

   if(ObjectFind(0,name) < 0)
      ObjectCreate(0,name,OBJ_RECTANGLE_LABEL,0,0,0);

   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,PanelLeft);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,PanelTop);
   ObjectSetInteger(0,name,OBJPROP_XSIZE,PanelWidth);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,PanelHeight);
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,InpTableBackground);
   ObjectSetInteger(0,name,OBJPROP_COLOR,InpTableBorder);
   ObjectSetInteger(0,name,OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
  }

void SetTableLabel(const string suffix,
                   const string text,
                   const int local_x,
                   const int local_y,
                   const color text_color,
                   const int font_size = 9,
                   const ENUM_ANCHOR_POINT anchor = ANCHOR_LEFT_UPPER)
  {
   const string name = ObjectPrefix + suffix;

   if(ObjectFind(0,name) < 0)
      ObjectCreate(0,name,OBJ_LABEL,0,0,0);

   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,anchor);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,PanelLeft + local_x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,PanelTop + local_y);
   ObjectSetInteger(0,name,OBJPROP_COLOR,text_color);
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,font_size);
   ObjectSetString(0,name,OBJPROP_FONT,"Segoe UI");
   ObjectSetString(0,name,OBJPROP_TEXT,text);
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
  }

void DeleteTableObjects()
  {
   if(ObjectPrefix != "")
      ObjectsDeleteAll(0,ObjectPrefix,0,-1);
  }

bool ReadMappedSMMA(const int handle,
                    const ENUM_TIMEFRAMES timeframe,
                    const datetime chart_bar_time,
                    double &smma_value)
  {
   if(handle == INVALID_HANDLE)
      return false;

   int source_shift = iBarShift(_Symbol,timeframe,chart_bar_time,false);
   if(source_shift < 0)
      return false;

   if(InpUseClosedMTFBar)
      source_shift++;

   double copied_value[1];
   if(CopyBuffer(handle,0,source_shift,1,copied_value) != 1)
      return false;

   if(copied_value[0] == EMPTY_VALUE || !MathIsValidNumber(copied_value[0]))
      return false;

   smma_value = copied_value[0];
   return true;
  }

bool ReadCurrentSMMA(const int handle,double &smma_value)
  {
   if(handle == INVALID_HANDLE)
      return false;

   const int source_shift = InpUseClosedMTFBar ? 1 : 0;
   double copied_value[1];

   if(CopyBuffer(handle,0,source_shift,1,copied_value) != 1)
      return false;

   if(copied_value[0] == EMPTY_VALUE || !MathIsValidNumber(copied_value[0]))
      return false;

   smma_value = copied_value[0];
   return true;
  }

string DistanceText(const double distance_points)
  {
   string sign = "";
   if(distance_points > 0.0)
      sign = "+";

   return StringFormat("%s%.1f pts",sign,distance_points);
  }

void UpdateTableRow(const int row_number,
                    const bool enabled,
                    const ENUM_TIMEFRAMES timeframe,
                    const int handle,
                    const color level_color,
                    const double current_p

Показано первые 50% кода (символов: 16107)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 610,70₽ ≈ $19.69