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

!!orderblocks 1.04 (mtf).mq5

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

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

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

О программе

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

Индикатор работает в многотаймфреймном режиме, рассчитывая уровни на выбранном таймфрейме и отображая их на текущем графике. Доступны параметры фильтрации по типу поглощения свечей для уточнения отображаемых уровней.

Предусмотрена система уведомлений со звуковыми, всплывающими, push-уведомлениями и email-оповещениями. Имеется функция автоматической очистки устаревших графических объектов на графике.

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

НастройкаОписание
TimeFrame Таймфрейм, на котором рассчитываются уровни ордер-блоков для многотаймфреймного отображения.
PREFIX Префикс для имён графических объектов, создаваемых индикатором.
FractalPeriod Период фрактала, определяющий глубину поиска экстремумов ценовых данных.
OBLineDraw Включает или отключает отрисовку линий ордер-блоков на графике.
OBLineEngulfing Включает отрисовку линий только для свечей поглощения рядом с ордер-блоками.
OBLineEngulfingType Тип поглощения для фильтрации: тело свечи или фитиль.
OBLineType Тип линии ордер-блока: тело свечи или фитиль.
AlertHeader Заголовок текста для всплывающих уведомлений.
soundAlert Включает или отключает звуковое оповещение.
popupAlert Включает или отключает всплывающие уведомления на графике.
pushAlert Включает или отключает push-уведомления на мобильные устройства.
emailAlert Включает или отключает отправку email-оповещений.
VisualizationHeader Заголовок текста для визуальных подписей на графике.
OBLineLength Длина линий ордер-блоков в барах.
OBLineColorBull Цвет линий ордер-блоков для бычьих уровней.
OBLineColorBear Цвет линий ордер-блоков для медвежьих уровней.
OBLineWidth Толщина линий ордер-блоков в пикселях.
OBLineStyle Стиль линий ордер-блоков на графике.
EngulfingHighlight Включает или отключает подсветку свечей поглощения рядом с ордер-блоками.
EngulfingHighlightColorBull Цвет подсветки поглощения для бычьих ордер-блоков.
EngulfingHighlightColorBear Цвет подсветки поглощения для медвежьих ордер-блоков.
Получить полный код

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

#property version   "1.03"
#property strict

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrRed
#property indicator_width1 2
#property indicator_width2 2

enum ENG_TYPE
{
   engBody=0,//Candle's body
   engWick=1,//Candle's wick
};

enum enTimeFrames
{
   tf_cu  = PERIOD_CURRENT, // Current time frame
   tf_m1  = PERIOD_M1,      // 1 minute
   tf_m5  = PERIOD_M5,      // 5 minutes
   tf_m15 = PERIOD_M15,     // 15 minutes
   tf_m30 = PERIOD_M30,     // 30 minutes
   tf_h1  = PERIOD_H1,      // 1 hour
   tf_h4  = PERIOD_H4,      // 4 hours
   tf_d1  = PERIOD_D1,      // Daily
   tf_w1  = PERIOD_W1,      // Weekly
   tf_mn1 = PERIOD_MN1,     // Monthly
   tf_n1  = -1,             // First higher time frame
   tf_n2  = -2,             // Second higher time frame
   tf_n3  = -3              // Third higher time frame
};

extern enTimeFrames   TimeFrame                   = tf_cu;  
input string          PREFIX                      = "JBOB_";
input int             FractalPeriod               = 42;  //Fractals period
input bool            OBLineDraw                  = true;//Line on OB Candle
input bool            OBLineEngulfing             = false;//Line only on engulfing OB Candle
input ENG_TYPE        OBLineEngulfingType         = engBody;//Engulfing type
input ENG_TYPE        OBLineType                  = engWick;//OB Line type
input string          AlertHeader                 = "=== Alerts ===";//-------
input bool            soundAlert                  = true;
input bool            popupAlert                  = true;
input bool            pushAlert                   = true;
input bool            emailAlert                  = true;
input string          VisualizationHeader         = "=== Visualization ===";//-------
input int             OBLineLength                = 45;//OB Line length, bars
input color           OBLineColorBull             = clrDodgerBlue;//BULL OB Line color
input color           OBLineColorBear             = clrRed;//BEAR OB Line color
input int             OBLineWidth                 = 1;//OB Line width
input ENUM_LINE_STYLE OBLineStyle                 = STYLE_SOLID;//OB Line style
input bool            EngulfingHighlight          = false;//Engulfing Highlight
input color           EngulfingHighlightColorBull = clrSkyBlue;//Bull engulfing Highlight color
input color           EngulfingHighlightColorBear = clrTomato;//Bear engulfing Highlight color

const int MAX_LINES=25;
const string NameUpper=PREFIX+"Upper_";
const string NameLower=PREFIX+"Lower_";
const string NameEngulfing=PREFIX+"Engulfing_";

double buffUp[],buffDown[],count[],m_level=0.0;
datetime m_level_updated=0;
int m_ind_upper=0,m_ind_lower=0;
string indicatorFileName,short_name="";
#define _mtfCall(_buff,_ind) iCustom(NULL,TimeFrame,indicatorFileName,0,PREFIX,FractalPeriod,OBLineDraw,OBLineEngulfing,OBLineEngulfingType,OBLineType,"",soundAlert,popupAlert,pushAlert,emailAlert,VisualizationHeader,OBLineLength,OBLineColorBull,OBLineColorBear,OBLineWidth,OBLineStyle,EngulfingHighlight,EngulfingHighlightColorBull,EngulfingHighlightColorBear,_buff,_ind)

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

void OnDeinit(const int reason)
{
   DeleteObjectsByPrefix(PREFIX);
}

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[])
{
      // код доступен только после оплаты
   }
   int limit=fmin(fmax(rates_total-prev_calculated,FractalPeriod),rates_total-2); count[0]=limit; 
   if (TimeFrame != _Period)
   {
      limit = (int)fmax(limit,fmin(Bars-1,_mtfCall(2,0)*TimeFrame/_Period));
      for (int i=limit;i>=0 && !_StopFlag; i--)
      {
          int y = iBarShift(NULL,TimeFrame,time[i]);
          int x = iBarShift(NULL,TimeFrame,time[i-1]); 
          if (x!=y)
          {
             buffUp[i]   = _mtfCall(0,y);
             buffDown[i] = _mtfCall(1,y);
          }
          else
          {
             buffUp[i]   = EMPTY_VALUE;
             buffDown[i] = EMPTY_VALUE; 
          } 
    }   
   return(rates_total);
   }

   if(rates_total<=FractalPeriod) return 0;

   limit=rates_total;
   if(prev_calculated>0)
   {
      limit=rates_total-prev_calculated+FractalPeriod+1;
   }
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(buffUp,true);
   ArraySetAsSeries(buffDown,true);

   for(int i=limit-1;i>0;i--)
   {
      bool found_up=true;
      for(int j=i+1;((j<rates_total) && ((j-i)<=FractalPeriod));j++)
      {
         if(low[j]<low[i])
         {
            found_up=false;
            break;  
         }
      }
      if(found_up)
      {
         for(int j=i-1;(j>0 && ((i-j)<=FractalPeriod));j--)
         {
            if(low[j]<low[i])
            {
               found_up=false;
               break;  
            }
         }
      }
      if(found_up)
      {
         buffUp[i]=low[i];
         if(time[i]>m_level_updated && i!=0)
         {
            bool engulfing_ok=false;
            if(OBLineEngulfingType==engBody)
            {
               double L=close[i]<open[i] ? close[i] : open[i];
               double H=close[i]<open[i] ? open[i] : close[i];
               engulfing_ok=close[i-1]>open[i-1] && open[i-1]<=L && close[i-1]>H;
            }
            else if(OBLineEngulfingType==engWick)
            {
               engulfing_ok=low[i-1]<=low[i] && high[i-1]>high[i];
            }

            if(EngulfingHighlight && engulfing_ok)
            {
               DrawRectangle(0,NameEngulfing,time[i+1],MathMin(low[i],low[i-1]),time[i-1]+PeriodSeconds(),MathMax(high[i],high[i-1]),EngulfingHighlightColorBull,1,STYLE_SOLID);
            }

            if(!OBLineEngulfing) engulfing_ok=true;

            if(engulfing_ok)
            {
               m_level_updated=time[i];
               if(OBLineDraw)
               {
                  m_ind_lower++;
                  if(m_ind_lower>MAX_LINES) m_ind_lower=1;

                  if(OBLineType==engBody)
                  {
                     if(close[i]>open[i])
                     {
                        m_level=close[i];
                        if(close[1]>open[i])
                        {
                           DrawTL(0,NameUpper+IntegerToString(m_ind_lower)/*+TimeToString(time[i])*/,time[i],close[i],time[i]+PeriodSeconds()*OBLineLength,close[i],OBLineColorBull,OBLineWidth,OBLineStyle);
                           DrawTL(0,NameLower+IntegerToString(m_ind_lower)/*TimeToString(time[i])*/,time[i],open[i],time[i]+PeriodSeconds()*OBLineLength,open[i],OBLineColorBull,OBLineWidth,OBLineStyle);
                        }
                     }
                     else
                     {
                        m_level=open[i];
                        if(close[1]>close[i])
                        {
                           DrawTL(0,NameUpper+IntegerToString(m_ind_lower)/*TimeToString(time[i])*/,time[i],open[i],time[i]+PeriodSeconds()*OBLineLength,open[i],OBLineColorBull,OBLineWidth,OBLineStyle);
                           DrawTL(0,NameLower+IntegerToString(m_ind_lower)/*TimeToString(time[i])*/,time[i],close[i],time[i]+PeriodSeconds()*OBLineLength,close[i],OBLineColorBull,OBLineWidth,OBLineStyle);
                        }
                     }
                  }
                  else if(OBLineType==engWick)
                  {
                     m_level=high[i];
                     if(close[1]>low[i])
                     {
                        DrawTL(0,NameUpper+IntegerToString(m_ind_lower)/*+TimeToString(time[i])*/,time[i],high[i],time[i]+PeriodSeconds()*OBLineLength,high[i],OBLineColorBull,OBLineWidth,OBLineStyle);
                        DrawTL(0,NameLower+IntegerToString(m_ind_lower)/*+TimeToString(time[i])*/,time[i],low[i],time[i]+PeriodSeconds()*OBLineLength,low[i],OBLineColorBull,OBLineWidth,OBLineStyle);
                     }
                  }
               }
            }
         }
      }
      else 
      {
         buffUp[i]=EMPTY_VALUE;
         string nm=NameUpper+TimeToString(time[i]);
         if(ObjectFind(0,nm)>=0)
         {
            color col=(color)ObjectGetInteger(0,nm,OBJPROP_COLOR);
            if(col==OBLineColorBull) ObjectDelete(0,nm);
         }
         nm=NameLower+TimeToString(time[i]);
         if(ObjectFind(0,nm)>=0)
         {
            color col=(color)ObjectGetInteger(0,nm,OBJPROP_COLOR);
            if(col==OBLineColorBull) ObjectDelete(0,nm);
         }
      }

      bool found_down=true;
      for(int j=i+1;((j<rates_total) && ((j-i)<=FractalPeriod));j++)
      {
         if(high[j]>high[i])
         {
            found_down=false;
            break;  
         }
      }
      if(found_down)
      {
         for(int j=i-1;(j>0 && ((i-j)<=FractalPeriod));j--)
         {
            if(high[j]>high[i])
            {
               found_down=false;
               break;  
            }
         }
      }
      if(found_down)
      {
         buffDown[i]=high[i];
         if(time[i]>m_level_updated && i!=0)
         {
            bool engulfing_ok=false;
            if(OBLineEngulfingType==engBody)
            {
               double L=close[i]<open[i] ? close[i] : open[i];
               double H=close[i]<open[i] ? open[i] : close[i];
               engulfing_ok=close[i-1]<open[i-1] && open[i-1]>=H && close[i-1]<L;
            }
            else if(OBLineEngulfingType==engWick)
            {
               engulfing_ok=low[i-1]<low[i] && high[i-1]>=high[i];
            }
            if(EngulfingHighlight && engulfing_ok)
            {
               DrawRectangle(0,NameEngulfing,time[i+1],MathMin(low[i],low[i-1]),time[i-1]

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

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

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

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

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

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

Стоимость полного кода
1 393,20₽ ≈ $17.03