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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.