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

Smart Session Breakout

smartsessionbreakout_v1.10.mq4
Вы автор или правообладатель?

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

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

О программе

Индикатор Smart Session Breakout рассчитывает и отображает ценовые диапазоны торговых сессий на графиках MetaTrader 4. Он определяет сессию по настраиваемому времени начала и окончания (серверное время брокера), строит прямоугольник между максимумом и минимумом диапазона и отображает уровни сопротивления и поддержки.

При пробое диапазона сессии индикатор строит стрелки сигналов покупки или продажи. Для оценки качества свечи используется фильтр на основе ATR: свеча должна иметь тело не меньше заданного соотношения от значения ATR. Сигналы подтверждаются на закрытии бара и не перерисовываются.

Индикатор включает информационную панель на экране, показывающую фазу текущей сессии, спред, значение ATR и обратный отсчёт до закрытия бара. Поддерживаются уведомления: всплывающие окна, звуковые сигналы, электронная почта и push-уведомления на мобильные устройства.

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

НастройкаОписание
InpAsianStart Время начала торговой сессии в формате серверного времени брокера (ЧЧ:ММ).
InpAsianEnd Время окончания торговой сессии в формате серверного времени брокера (ЧЧ:ММ).
InpMaxDays Максимальное количество дней истории для обработки на графике. При значении 0 обрабатывается вся доступная история.
InpMinBoxPips Минимальная допустимая высота диапазона сессии в пунктах. Диапазоны меньше этого значения игнорируются.
InpMaxBoxPips Максимальная допустимая высота диапазона сессии в пунктах. Диапазоны вне этого диапазона игнорируются.
InpSignalOnClose Подтверждение сигнала на закрытии бара. При включении сигналы не перерисовываются и оцениваются только по закрытым барам.
InpUseATRFilter Включение фильтра расширения на основе ATR для проверки качества пробойной свечи.
InpATRPeriod Период расчёта индикатора ATR, используемого для фильтрации пробоев по качеству свечи.
InpATRCoeff Минимальное соотношение тела пробойной свечи к значению ATR для прохождения фильтра качества свечи.
InpBoxColor Цвет прямоугольника диапазона торговой сессии на графике.
InpFillBox Переключатель заполнения прямоугольника диапазона сессии цветом.
InpUpperLineCol Цвет линии верхнего уровня сопротивления диапазона сессии.
InpLowerLineCol Цвет линии нижнего уровня поддержки диапазона сессии.
InpShowDash Переключатель отображения информационной панели на графике.
InpCorner Угловая позиция информационной панели на графике.
InpBgColor Цвет фона информационной панели.
InpTxtColor Цвет текста на информационной панели.
InpAccentColor Цвет акцентного выделения на информационной панели.
InpPopupAlert Включение всплывающих окон-уведомлений при появлении сигнала.
InpSoundAlert Включение звукового сигнала при появлении торгового сигнала.
InpSendEmail Включение отправки электронной почты при появлении сигнала.
InpSendPush Включение отправки push-уведомлений на мобильные устройства при появлении сигнала.
Получить полный код

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

#property version   "1.10"
#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 clrLimeGreen  // Buy Signal Arrow
#property indicator_color2 clrRed        // Sell Signal Arrow
#property indicator_color3 clrDodgerBlue // Upper Range Level
#property indicator_color4 clrDeepPink   // Lower Range Level
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1
#property indicator_width4 1

double BufferBuy[];
double BufferSell[];
double BufferUpperLevel[];
double BufferLowerLevel[];

input string   InpAsianStart    = "00:00";    // Session Start (Broker Server Time HH:MM)
input string   InpAsianEnd      = "08:00";    // Session End (Broker Server Time HH:MM)
input int      InpMaxDays       = 30;         // Max Days to Process on Chart
input double   InpMinBoxPips    = 8.0;        // Min Range Box Height (Pips)
input double   InpMaxBoxPips    = 70.0;       // Max Range Box Height (Pips)
input bool     InpSignalOnClose = true;       // Confirm Signal on Bar Close (Non-Repainting)

input bool     InpUseATRFilter  = true;       // Enable ATR Expansion Filter
input int      InpATRPeriod     = 14;         // ATR Period
input double   InpATRCoeff      = 0.8;        // Min Breakout Candle Body vs ATR Ratio

input color    InpBoxColor      = C'30,50,90';  // Range Box Color
input bool     InpFillBox       = true;         // Fill Range Box
input color    InpUpperLineCol  = clrDodgerBlue;// Upper Line Color
input color    InpLowerLineCol  = clrDeepPink;  // Lower Line Color

input bool     InpShowDash      = true;         // Show On-Screen Dashboard Panel
input ENUM_BASE_CORNER InpCorner= CORNER_RIGHT_UPPER; // Panel Position Corner
input color    InpBgColor       = C'18,24,38';  // Dashboard Background Color
input color    InpTxtColor      = clrWhite;     // Dashboard Text Color
input color    InpAccentColor   = C'0,195,255'; // Dashboard Accent Highlight

input bool     InpPopupAlert    = true;       // Enable Pop-up Alert
input bool     InpSoundAlert    = true;       // Enable Sound Alert
input bool     InpSendEmail     = false;      // Enable Email Alert
input bool     InpSendPush      = false;      // Enable Push Alert to Mobile

string   g_prefix    = "SSB_";
double   g_pipSize   = 0.0001;
datetime g_lastAlertBar = 0;    // one alert per bar, whatever the mode

int      g_startSec  = 0;       // session start, seconds past midnight
int      g_sessionLen= 0;       // session length in seconds, always > 0

int ParseHHMM(string s)
{
   string parts[];
   if(StringSplit(s, StringGetCharacter(":", 0), parts) != 2) return(-1);

   int h = (int)StringToInteger(parts[0]);
   int m = (int)StringToInteger(parts[1]);
   if(h < 0 || h > 23 || m < 0 || m > 59) return(-1);

   return(h * 3600 + m * 60);
}

datetime MidnightOf(datetime t) { return((datetime)(t - (t % 86400))); }

bool IsRightCorner()
{
   return(InpCorner == CORNER_RIGHT_UPPER || InpCorner == CORNER_RIGHT_LOWER);
}

int PanelX(int panelLeft, int panelWidth, int offsetFromLeft)
{
   return(IsRightCorner() ? (panelLeft + panelWidth - offsetFromLeft)
                          : (panelLeft + offsetFromLeft));
}

int OnInit()
{
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
{
   CleanUpObjects();
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
      // код доступен только после оплаты
   }
   if(rates_total < 50) return(0);

   int limit = rates_total - prev_calculated;
   if(prev_calculated > 0) limit++;
   if(limit > rates_total) limit = rates_total;

   if(InpMaxDays > 0)
   {
      int maxBars = iBarShift(NULL, 0, TimeCurrent() - InpMaxDays * 86400, false);
      if(maxBars > 0 && limit > maxBars) limit = maxBars;
   }

   datetime cachedStart = 0;
   double   cachedHigh  = 0.0;
   double   cachedLow   = 0.0;
   bool     cachedValid = false;

   for(int i = limit - 1; i >= 0; i--)
   {
      BufferBuy[i]        = EMPTY_VALUE;
      BufferSell[i]       = EMPTY_VALUE;
      BufferUpperLevel[i] = EMPTY_VALUE;
      BufferLowerLevel[i] = EMPTY_VALUE;

      datetime barTime = time[i];

      datetime sessStart = MidnightOf(barTime) + g_startSec;
      datetime sessEnd   = sessStart + g_sessionLen;
      if(barTime < sessEnd)
      {
         sessStart -= 86400;
         sessEnd   -= 86400;
      }
      if(barTime < sessEnd) continue;

      if(sessStart != cachedStart)
      {
         cachedStart = sessStart;
         cachedValid = false;

         int barStart = iBarShift(NULL, 0, sessStart, false);
         int barEnd   = iBarShift(NULL, 0, sessEnd,   false);

         if(barStart > 0 && barEnd >= 0 && barStart > barEnd)
         {
            int count = barStart - barEnd + 1;
            int hiShift = iHighest(NULL, 0, MODE_HIGH, count, barEnd);
            int loShift = iLowest (NULL, 0, MODE_LOW,  count, barEnd);

            if(hiShift >= 0 && loShift >= 0)
            {
               double boxHigh = High[hiShift];
               double boxLow  = Low[loShift];
               double boxPips = (boxHigh - boxLow) / g_pipSize;

               if(boxPips >= InpMinBoxPips && boxPips <= InpMaxBoxPips)
               {
                  cachedHigh  = boxHigh;
                  cachedLow   = boxLow;
                  cachedValid = true;
                  DrawSessionBox(sessStart, sessEnd, boxHigh, boxLow);

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

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

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

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

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

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

Стоимость полного кода
1 005,10₽ ≈ $12.28