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

Premium Discount OTE

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

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

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

О программе

Premium Discount OTE — пользовательский индикатор для MetaTrader 5, реализующий концепции торгового диапазона (dealing range), премиума и дисконта, зоны оптимального входа (OTE), стандартных отклонений и диапазонов данных IPDA. Индикатор определяет подтверждённые свинги (вершины и впадины) на заданном количестве свечек с каждой стороны и строит торговой диапазон от более раннего свинга до текущего момента.

Верхняя и нижняя границы диапазона делятся на зоны премиума и дисконта относительно линии равновесия (50%). Зона OTE охватывает ретрейсмент 62%–79% с линией 70.5%. Дополнительно отображаются проекции стандартных отклонений за пределами диапазона и диапазоны данных IPDA на 20, 40 и 60 завершённых торговых дней. Все расчёты выполняются по закрытым свечкам, что исключает перерисовку.

Индикатор поддерживает уведомления о появлении нового торгового диапазона, входе цены в зону OTE и пересечении равновесия закрытой свечкой. Уведомления могут отправляться как всплывающие окна, push-уведомления или по электронной почте. Для экспертных советников доступны 13 буферов данных, читаемых через iCustom. Индикатор не выполняет торговых операций.

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

НастройкаОписание
InpSwing Сила свинга — количество свечек с каждой стороны для подтверждения свинг-вершины или свинг-впадины.
InpOTE Включает отображение зоны OTE (62%–79%) и линии 70.5%.
InpFibs Включает отображение дополнительных уровней ретрейсмента (23.6%, 38.2%, 61.8%, 78.6%).
InpDeviations Включает отображение проекций стандартных отклонений за пределами торгового диапазона.
InpDevLevels Список значений стандартных отклонений в высотах диапазона (например, -1,-2,-2.5,-4).
InpIPDA20 Включает отображение диапазона данных IPDA за последние 20 завершённых торговых дней.
InpIPDA40 Включает отображение диапазона данных IPDA за последние 40 завершённых торговых дней.
InpIPDA60 Включает отображение диапазона данных IPDA за последние 60 завершённых торговых дней.
InpBars Количество баров для сканирования при расчёте диапазонов и свинг-точек.
InpLabels Отображает названия и цены подписей у правого края графика.
InpStatus Отображает строку состояния в углу графика с текущей зоной цены.
InpPremiumColor Цвет заливки и подписей зоны премиума.
InpDiscountColor Цвет заливки и подписей зоны дисконта.
InpOTEColor Цвет заливки и подписей зоны OTE.
InpLineColor Цвет линии равновесия и линии 70.5%.
InpDevColor Цвет линий и подписей проекций стандартных отклонений.
InpIPDAColor Цвет линий и подписей диапазонов данных IPDA.
InpTextColor Цвет текста подписей и строки состояния.
InpAlertRange Включает уведомление при формировании нового торгового диапазона.
InpAlertOTE Включает уведомление при входе цены в зону OTE.
InpAlertEQ Включает уведомление при закрытии свечкой через линию равновесия.
InpPush Отправляет уведомления также в виде push-уведомлений.
InpEmail Отправляет уведомления также по электронной почте.
Получить полный код

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

#property version     "1.00"
#property description "ICT dealing range: premium and discount zones, equilibrium, the OTE band (62 - 79 %, 70.5 %),"
#property description "standard deviation projections and the IPDA 20 / 40 / 60-day ranges."
#property description "Confirmed swings only (no repaint). Alerts and buffers for EAs. Read-only: never trades."
#property indicator_chart_window
#property indicator_buffers 13
#property indicator_plots   13
#property indicator_type1   DRAW_NONE
#property indicator_label1  "Range top"
#property indicator_type2   DRAW_NONE
#property indicator_label2  "Range bottom"
#property indicator_type3   DRAW_NONE
#property indicator_label3  "Equilibrium"
#property indicator_type4   DRAW_NONE
#property indicator_label4  "OTE 62%"
#property indicator_type5   DRAW_NONE
#property indicator_label5  "OTE 79%"
#property indicator_type6   DRAW_NONE
#property indicator_label6  "Leg (+1 up, -1 down)"
#property indicator_type7   DRAW_NONE
#property indicator_label7  "Zone (+1 premium, -1 discount, 2 OTE)"
#property indicator_type8   DRAW_NONE
#property indicator_label8  "IPDA 20 high"
#property indicator_type9   DRAW_NONE
#property indicator_label9  "IPDA 20 low"
#property indicator_type10  DRAW_NONE
#property indicator_label10 "IPDA 40 high"
#property indicator_type11  DRAW_NONE
#property indicator_label11 "IPDA 40 low"
#property indicator_type12  DRAW_NONE
#property indicator_label12 "IPDA 60 high"
#property indicator_type13  DRAW_NONE
#property indicator_label13 "IPDA 60 low"

input int    InpSwing         = 10;              // Swing strength (candles on each side)
input bool   InpOTE           = true;            // OTE band (62 - 79 %) and the 70.5 % line
input bool   InpFibs          = false;           // More retracements (23.6, 38.2, 61.8, 78.6 %)
input bool   InpDeviations    = true;            // Standard deviation projections
input string InpDevLevels     = "-1,-2,-2.5,-4"; // Deviations (in range heights)
input bool   InpIPDA20        = true;            // IPDA 20-day range
input bool   InpIPDA40        = true;            // IPDA 40-day range
input bool   InpIPDA60        = true;            // IPDA 60-day range
input int    InpBars          = 3000;            // Bars to scan
input bool   InpLabels        = true;            // Names and prices at the right edge
input bool   InpStatus        = true;            // Status line in the chart corner
input color  InpPremiumColor  = C'252,222,222';  // Premium colour
input color  InpDiscountColor = C'214,240,221';  // Discount colour
input color  InpOTEColor      = C'255,236,186';  // OTE colour
input color  InpLineColor     = clrDimGray;      // Equilibrium and 70.5 % colour
input color  InpDevColor      = C'105,105,190';  // Deviation colour
input color  InpIPDAColor     = C'120,140,170';  // IPDA colour
input color  InpTextColor     = clrDimGray;      // Text colour
input bool   InpAlertRange    = false;           // Alert on a new dealing range
input bool   InpAlertOTE      = false;           // Alert when price comes into the OTE band
input bool   InpAlertEQ       = false;           // Alert when a candle closes across equilibrium
input bool   InpPush          = false;           // Alerts also as push notification
input bool   InpEmail         = false;           // Alerts also by e-mail

#define PREFIX    "PDOTE_"
#define MAX_DEVS  8
#define DAYS_KEPT 70

struct Levels
  {
   bool              ok;
   double            top;
   double            bottom;
   int               topIdx;
   int               botIdx;
   int               leg;        // +1 up, -1 down
   double            eq;
   double            o62;
   double            o705;
   double            o79;
  };

double   g_bTop[], g_bBot[], g_bEq[], g_b62[], g_b79[], g_bLeg[], g_bZone[];
double   g_b20h[], g_b20l[], g_b40h[], g_b40l[], g_b60h[], g_b60l[];
double   g_dev[MAX_DEVS];
int      g_devN       = 0;
int      g_lastClosed = -1;
datetime g_closedTime = 0;
bool     g_live       = false;
bool     g_dirty      = true;
datetime g_lastBar    = 0;
uint     g_drawTick   = 0;
string   g_drawn[];

int      g_shIdx = -1, g_slIdx = -1;
int      g_anchor = -1;
double   g_rTop = 0, g_rBot = 0;
int      g_topIdx = -1, g_botIdx = -1;
bool     g_oteTouched = false;
int      g_side = 0;

double   g_dHi[], g_dLo[];
datetime g_dStart[];
int      g_dn = 0;
datetime g_curDay = 0, g_curStart = 0;
double   g_curHi = 0, g_curLo = 0;
bool     g_curEvening = false;
int      g_dayIdx = -1;                    // last candle added to the days
double   g_ipH[3], g_ipL[3];
datetime g_ipT[3];
int      g_ipDays[3] = {20, 40, 60};

Levels   g_shown;
int      g_shownAnchor = -2;
string   g_status = "";
bool     g_draw = true;                   // false in a Strategy Tester run without visualization

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

void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0, PREFIX);
   ChartRedraw();
  }

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
   if(id == CHARTEVENT_CHART_CHANGE)
      g_dirty = true;
  }

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[])
  {
      // код доступен только после оплаты
   }

bool ConfirmSwing(const int k, const double &high[], const double &low[])
  {
   int p = k - InpSwing;
   if(p - InpSwing < 0)
      return false;
   bool isHigh = true, isLow = true;
   for(int j = 1; j <= InpSwing && (isHigh || isLow); j++)
     {

      if(high[p] <= high[p - j] || high[p] < high[p + j])
         isHigh = false;
      if(low[p] >= low[p - j] || low[p] > low[p + j])
         isLow = false;
     }
   if(isHigh)
      g_shIdx = p;
   if(isLow)
      g_slIdx = p;
   if(!(isHigh || isLow) || g_shIdx < 0 || g_slIdx < 0)
      return false;
   int a = MathMin(g_shIdx, g_slIdx);
   if(a == g_anchor)
      return false;

   g_anchor = a;
   g_rTop   = high[a];
   g_rBot   = low[a];
   g_topIdx = a;
   g_botIdx = a;
   for(int i = a + 1; i <= k; i++)
     {
      if(high[i] > g_rTop)
        {
         g_rTop   = high[i];
         g_topIdx = i;
        }
      if(low[i] < g_rBot)
        {
         g_rBot   = low[i];
         g_botIdx = i;
        }
     }
   return true;
  }

void MakeLevels(Levels &v)
  {
   v.ok = false;
   if(g_anchor < 0)
      return;
   v.top    = g_rTop;
   v.bottom = g_rBot;
   v.topIdx = g_topIdx;
   v.botIdx = g_botIdx;
   FillLevels(v);
  }

void FillLevels(Levels &v)
  {
   double r = v.top - v.bottom;
   v.ok = (r > 0);
   if(!v.ok)
      return;
   v.leg  = (v.botIdx <= v.topIdx ? 1 : -1);
   v.eq   = v.bottom + r * 0.5;
   if(v.leg > 0)
     {
      v.o62  = v.top - r * 0.62;
      v.o705 = v.top - r * 0.705;
      v.o79  = v.top - r * 0.79;
     }
   else
     {
      v.o62  = v.bottom + r * 0.62;
      v.o705 = v.bottom + r * 0.705;
      v.o79  = v.bottom + r * 0.79;
     }
  }

int Zone(const Levels &v, const double price)
  {
   double tol  = _Point * 0.005;
   int    zone = (price > v.eq + tol ? 1 : (price < v.eq - tol ? -1 : 0));
   if(price >= MathMin(v.o62, v.o79) - tol && price <= MathMax(v.o62, v.o79) + tol)
      zone *= 2;
   return zone;
  }

bool Same(const Levels &a, const Levels &b)
  {
   if(a.ok != b.ok)
      return false;
   if(!a.ok)
      return true;
   return (a.top == b.top && a.bo

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

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

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

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

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

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

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