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

smc order block detector with ai.mq5

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

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

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

О программе

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

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

Система уведомлений включает всплывающие алерты и push-уведомления с возможностью настройки периода охлаждения между повторными оповещениями. Все визуальные элементы — цвет прямоугольников, цвет меток, заливка — настраиваются пользователем independently для бычьих и медвежьих ордер-блоков.

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

НастройкаОписание
InpMitigation Метод проверки митигации ордер-блока: по телу свечи (закрытие цены) или по фитиля (достижение экстремума свечи).
InpMaxOB Максимальное количество ордер-блоков, отображаемых одновременно на графике для каждого направления.
InpFillOB Включает или отключает заливку прямоугольников ордер-блоков на графике.
InpColorOB_Bull Цвет прямоугольника, обозначающего бычий ордер-блок на графике.
InpColorOB_Bear Цвет прямоугольника, обозначающего медвежий ордер-блок на графике.
InpColorOB_TextBull Цвет текстовой метки уровня бычьего ордер-блока.
InpColorOB_TextBear Цвет текстовой метки уровня медвежьего ордер-блока.
InpEnableAlert Включает или отключает систему уведомлений о касании ордер-блоков ценой.
InpAlertPopup Включает или отключает всплывающие уведомления при касании ордер-блока ценой.
InpAlertPush Включает или отключает push-уведомления при касании ордер-блока ценой.
InpAlertCooldownBars Количество баров ожидания после касания ордер-блока перед повторным отправлением уведомления.
Получить полный код

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

#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

enum ENUM_MITIGATION {
    MITIGATION_BODY,
    MITIGATION_WICK
};

input group "--- Order Block Settings ---"
input ENUM_MITIGATION InpMitigation = MITIGATION_BODY;
input int InpMaxOB                  = 3;
input bool InpFillOB                = true;
input color InpColorOB_Bull         = C'10,40,15';
input color InpColorOB_Bear         = C'40,10,10';
input color InpColorOB_TextBull     = clrLime;
input color InpColorOB_TextBear     = clrRed;

input group "--- Alert Settings ---"
input bool   InpEnableAlert         = true;
input bool   InpAlertPopup          = true;
input bool   InpAlertPush           = false;
input int    InpAlertCooldownBars   = 5;

long obj_counter = 0; 
double prev_valid_high = 0;
double prev_valid_low = 0;
double last_tick_price = 0;
datetime prev_live_bar_time = 0;

struct ValidBar {
    double h;
    double l;
    datetime t;
};
ValidBar vb1, vb2, vb3;

struct OrderBlock {
    bool     active;
    datetime ob_time;
    double   top;
    double   bottom;
    long     ticket;
    double   fvg_size;
    bool     visual_deleted;
    bool     touch_alerted;
    bool     has_exited;
    int      bars_since_exit;
};

OrderBlock BullOBs[];
OrderBlock BearOBs[];
long ob_ticket_counter = 0;

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

void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0, "SMC_OB_");
  }

void UpdateOBGraphics(const datetime &time[], int current_bar)
  {
   int active_bull = 0;
   int active_bear = 0;

   int total_bull = ArraySize(BullOBs);
   for(int i = total_bull - 1; i >= 0; i--)
     {
      string obj_name = "SMC_OB_BULL_" + IntegerToString(BullOBs[i].ticket);
      string lbl_name = obj_name + "_lbl";

      if(!BullOBs[i].active || active_bull >= InpMaxOB)
        {
         if(!BullOBs[i].visual_deleted)
           {
            ObjectDelete(0, obj_name);
            ObjectDelete(0, lbl_name);
            BullOBs[i].visual_deleted = true;
           }
         continue;
        }

      if(ObjectFind(0, obj_name) < 0)
        {
         ObjectCreate(0, obj_name, OBJ_RECTANGLE, 0, BullOBs[i].ob_time, BullOBs[i].top, time[current_bar], BullOBs[i].bottom);
         ObjectSetInteger(0, obj_name, OBJPROP_COLOR, InpColorOB_Bull);
         ObjectSetInteger(0, obj_name, OBJPROP_BACK, true);
         ObjectSetInteger(0, obj_name, OBJPROP_FILL, InpFillOB);
        }
      else
        {
         ObjectSetInteger(0, obj_name, OBJPROP_TIME, 1, time[current_bar]);
        }

      if(ObjectFind(0, lbl_name) < 0)
        {
         ObjectCreate(0, lbl_name, OBJ_TEXT, 0, time[current_bar], BullOBs[i].top);
         ObjectSetString(0, lbl_name, OBJPROP_TEXT, " " + DoubleToString(BullOBs[i].top, _Digits)); 
         ObjectSetInteger(0, lbl_name, OBJPROP_COLOR, InpColorOB_TextBull);
         ObjectSetInteger(0, lbl_name, OBJPROP_ANCHOR, ANCHOR_LEFT); 
         ObjectSetInteger(0, lbl_name, OBJPROP_FONTSIZE, 9);
         ObjectSetString(0, lbl_name, OBJPROP_FONT, "Trebuchet MS");
        }
      else
        {
         ObjectSetInteger(0, lbl_name, OBJPROP_TIME, 0, time[current_bar]);
         ObjectSetDouble(0, lbl_name, OBJPROP_PRICE, 0, BullOBs[i].top);
        }

      active_bull++;
     }

   int total_bear = ArraySize(BearOBs);
   for(int i = total_bear - 1; i >= 0; i--)
     {
      string obj_name = "SMC_OB_BEAR_" + IntegerToString(BearOBs[i].ticket);
      string lbl_name = obj_name + "_lbl";

      if(!BearOBs[i].active || active_bear >= InpMaxOB)
        {
         if(!BearOBs[i].visual_deleted)
           {
            ObjectDelete(0, obj_name);
            ObjectDelete(0, lbl_name);
            BearOBs[i].visual_deleted = true;
           }
         continue;
        }

      if(ObjectFind(0, obj_name) < 0)
        {
         ObjectCreate(0, obj_name, OBJ_RECTANGLE, 0, BearOBs[i].ob_time, BearOBs[i].top, time[current_bar], BearOBs[i].bottom);
         ObjectSetInteger(0, obj_name, OBJPROP_COLOR, InpColorOB_Bear);
         ObjectSetInteger(0, obj_name, OBJPROP_BACK, true);
         ObjectSetInteger(0, obj_name, OBJPROP_FILL, InpFillOB);
        }
      else
        {
         ObjectSetInteger(0, obj_name, OBJPROP_TIME, 1, time[current_bar]);
        }

      if(ObjectFind(0, lbl_name) < 0)
        {
         ObjectCreate(0, lbl_name, OBJ_TEXT, 0, time[current_bar], BearOBs[i].bottom);
         ObjectSetString(0, lbl_name, OBJPROP_TEXT, " " + DoubleToString(BearOBs[i].bottom, _Digits));
         ObjectSetInteger(0, lbl_name, OBJPROP_COLOR, InpColorOB_TextBear);
         ObjectSetInteger(0, lbl_name, OBJPROP_ANCHOR, ANCHOR_LEFT); 
         ObjectSetInteger(0, lbl_name, OBJPROP_FONTSIZE, 9);
         ObjectSetString(0, lbl_name, OBJPROP_FONT, "Trebuchet MS");
        }
      else
        {
         ObjectSetInteger(0, lbl_name, OBJPROP_TIME, 0, time[current_bar]);
         ObjectSetDouble(0, lbl_name, OBJPROP_PRICE, 0, BearOBs[i].bottom);
        }

      active_bear++;
     }
  }

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 < 10) return(0);

   int limit;
   if(prev_calculated == 0)
     {
      limit = 1;
      ObjectsDeleteAll(0, "SMC_OB_");
      obj_counter = 0;
      last_tick_price = 0;
      prev_live_bar_time = 0;

      prev_valid_high = high[1];
      prev_valid_low = low[1];

      ArrayResize(BullOBs, 0);
      ArrayResize(BearOBs, 0);

      ob_ticket_counter = 0;
      vb1.t = 0; vb2.t = 0; vb3.t = 0;
     }
   else
     {
      limit = prev_calculated - 1;
     }

   for(int i = limit; i < rates_total - 1; i++)
     {

      int total_bull_obs = ArraySize(BullOBs);
      for(int b = 0; b < total_bull_obs; b++)
        {
         if(!BullOBs[b].active) continue;

         if(InpMitigation == MITIGATION_BODY)
           {
            if(close[i] < BullOBs[b].bottom) BullOBs[b].active = false;
           }
         else 
           {
            if(low[i] <= BullOBs[b].top) BullOBs[b].active = false;
           }
        }

      int total_bear_obs = 

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

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

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

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

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

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

Стоимость полного кода
846,30₽ ≈ $10.34