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

HTF Candles

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

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

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

О программе

HTF Candles — индикатор для MetaTrader 5, отображающий свечи более высоких таймфреймов справа от графика по реальным ценам. Поддерживает один или два верхних таймфрейма с автоматической парой (например, M1 → M15 + H1, D1 → MN). Свечи строятся на основе данных текущего графика, без загрузки сторонних данных.

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

Встроена система уведомлений: всплывающие окна, push-уведомления и e-mail. Индикатор предоставляет шесть буферов для использования в советниках (открытие, максимум, минимум текущей и предыдущей свечей). Продукт является только для чтения и не совершает торговых операций.

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

НастройкаОписание
InpTF1 Первый отображаемый таймфрейм более высокого порядка. При значении current выбирается автоматически на основе текущего графика.
InpCount1 Число завершённых свечей первого верхнего таймфрейма, отображаемых рядом с графиком.
InpUseTF2 Включает отображение второго верхнего таймфрейма.
InpTF2 Второй отображаемый таймфрейм более высокого порядка. При значении current выбирается автоматически.
InpCount2 Число завершённых свечей второго верхнего таймфрейма, отображаемых рядом с графиком.
InpCandlePx Ширина отображаемой свечи в пикселях. Сохраняется при изменении масштаба графика.
InpGapPx Расстояние в пикселях между соседними свечами.
InpOffsetPx Отступ от последней свечи основного графика в пикселях.
InpOrigin Отображает пунктирные линии от живой свечи к местам её открытия, максимума и минимума на графике.
InpTimeLabels Показывает метки времени под каждой отображаемой свечой верхнего таймфрейма.
InpPrevHL Отображает линии максимума и минимума предыдущей свечи первого верхнего таймфрейма на основном графике.
InpShift Активирует сдвиг графика вправо для размещения свечей верхнего таймфрейма. При удалении индикатора исходное значение восстанавливается.
InpBars Количество баров, используемых для расчёта буферов индикатора.
InpBullColor Цвет заливки свечи, закрывающейся выше открытия.
InpBearColor Цвет заливки свечи, закрывающейся ниже открытия.
InpWickColor Цвет линий фитиля (тени) свечи.
InpLineColor Цвет вспомогательных линий, соединяющих уровни живой свечи с графиком.
InpTextColor Цвет текстовых меток времени и заголовков.
InpAlertNew Отправляет всплывающее уведомление при начале формирования новой свечи первого верхнего таймфрейма.
InpAlertOpen Отправляет уведомление при закрытии свечи первого верхнего таймфрейма по другую сторону от её открытия.
InpPush Дополнительно отправляет уведомления в виде push-сообщений.
InpEmail Дополнительно отправляет уведомления по электронной почте.
Получить полный код

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

#property version     "1.00"
#property description "Higher timeframe candles next to your chart (ICT Power of Three): one or two timeframes,"
#property description "auto pairs (M15 -> H4 + D1 ...), live candle with lines to where its open, high and low were"
#property description "made, countdown, above / below open. Built from the chart's own candles. Alerts and buffers"
#property description "for EAs. Read-only: never trades."
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots   6
#property indicator_type1   DRAW_NONE
#property indicator_label1  "HTF open"
#property indicator_type2   DRAW_NONE
#property indicator_label2  "HTF high so far"
#property indicator_type3   DRAW_NONE
#property indicator_label3  "HTF low so far"
#property indicator_type4   DRAW_NONE
#property indicator_label4  "Previous HTF high"
#property indicator_type5   DRAW_NONE
#property indicator_label5  "Previous HTF low"
#property indicator_type6   DRAW_NONE
#property indicator_label6  "Previous HTF close"

input ENUM_TIMEFRAMES InpTF1        = PERIOD_CURRENT;  // Higher timeframe 1 (current = auto)
input int             InpCount1     = 4;               // Finished candles of timeframe 1
input bool            InpUseTF2     = true;            // Show a second higher timeframe
input ENUM_TIMEFRAMES InpTF2        = PERIOD_CURRENT;  // Higher timeframe 2 (current = auto)
input int             InpCount2     = 3;               // Finished candles of timeframe 2
input int             InpCandlePx   = 14;              // Candle width (pixels, kept at every zoom)
input int             InpGapPx      = 6;               // Gap between candles (pixels)
input int             InpOffsetPx   = 24;              // Distance from the last chart candle (pixels)
input bool            InpOrigin     = true;            // Live candle: lines to its open / high / low
input bool            InpTimeLabels = true;            // Time under each candle
input bool            InpPrevHL     = false;           // Previous candle high / low on the chart (timeframe 1)
input bool            InpShift      = true;            // Turn chart shift on for room (restored on removal)
input int             InpBars       = 5000;            // Bars for the buffers
input color           InpBullColor  = C'38,166,154';   // Bullish candle colour
input color           InpBearColor  = C'239,83,80';    // Bearish candle colour
input color           InpWickColor  = clrDimGray;      // Wick colour
input color           InpLineColor  = clrDarkGray;     // Lines colour
input color           InpTextColor  = clrDimGray;      // Text colour
input bool            InpAlertNew   = false;           // Alert when a timeframe 1 candle opens
input bool            InpAlertOpen  = false;           // Alert when a candle closes across the timeframe 1 open
input bool            InpPush       = false;           // Alerts also as push notification
input bool            InpEmail      = false;           // Alerts also by e-mail

#define PREFIX    "HTFC_"
#define MAX_CNDL  12

struct HCandle
  {
   datetime          start;      // bucket start (server time)
   double            o;
   double            h;
   double            l;
   double            c;
   int               firstIdx;   // chart candles of the open, high and low
   int               hiIdx;
   int               loIdx;
  };

struct HSet
  {
   bool              on;
   ENUM_TIMEFRAMES   tf;
   int               count;      // finished candles to show
   int               n;          // candles found (finished + live)
   HCandle           c[MAX_CNDL];
  };

double   g_bOpen[], g_bHigh[], g_bLow[], g_bPrevH[], g_bPrevL[], g_bPrevC[];
HSet     g_set[2];

int      g_lastClosed = -1;
datetime g_closedTime = 0;
HCandle  g_cur, g_prev;
bool     g_hasCur = false, g_hasPrev = false;
bool     g_live = false;
datetime g_lastBar = 0;
uint     g_drawTick = 0;
bool     g_dirty = true;
string   g_drawn[];

bool     g_shiftSet = false;
long     g_oldShift = 0;
double   g_oldShiftSize = 0;

datetime g_alertNew = 0;
int      g_openSide = 0;

datetime g_mFrom = 0, g_mTo = 0;
bool     g_draw = true;               // false in a Strategy Tester run without visualization

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

void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0, PREFIX);
   if(g_shiftSet)
     {
      ChartSetInteger(0, CHART_SHIFT, g_oldShift);
      ChartSetDouble(0, CHART_SHIFT_SIZE, g_oldShiftSize);
     }
   ChartRedraw();
  }

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

void AddCandle(const int k, const datetime t, const double o, const double h, const double l, const double c)
  {
   datetime bs = BucketStart(t, g_set[0].tf);
   if(!g_hasCur || bs != g_cur.start)
     {
      if(g_hasCur)
        {
         g_prev    = g_cur;
         g_hasPrev = true;
        }
      StartCandle(g_cur, bs, k, o, h, l, c);
      g_hasCur   = true;
      g_openSide = 0;
      return;
     }
   GrowCandle(g_cur, k, h, l, c);
  }

void StartCandle(HCandle &x, const datetime bs, const int k, const double o, const double h, const double l, const double c)
  {
   x.start    = bs;
   x.o        = o;
   x.h        = h;
   x.l        = l;
   x.c        = c;
   x.firstIdx = k;
   x.hiIdx    = k;
   x.loIdx    = k;
  }

void GrowCandle(HCandle &x, const int k, const double h, const double l, const double c)
  {
   if(h > x.h)
     {
      x.h     = h;
      x.hiIdx = k;
     }
   if(l < x.l)
     {
      x.l     = l;
      x.loIdx = k;
     }
   x.c = c;
  }

void SetBuffers(const int k, const HCandle &x, const bool prev)
  {
   g_bOpen[k]  = x.o;
   g_bHigh[k]  = x.h;
   g_bLow[k]   = x.l;
   g_bPrevH[k] = (prev ? g_prev.h : EMPTY_VALUE);
   g_bPrevL[k] = (prev ? g_prev.l : EMPTY_VALUE);
   g_bPrevC[k] = (prev ? g_prev.c : EMPTY_VALUE);
  }

void Collect(HSet &s, const datetime &time[], const double &open[], const double &high[], const double &low[],
             const double &close[], const int rates_total)
  {
   int      want = s.count + 1;
   HCandle  tmp[MAX_CNDL];
   int      n = 0;
   datetime bs = 0;
   bool     complete = false;
   for(int k = rates_total - 1; k >= 0; k--)
     {
      datetime b = BucketStart(time[k], s.tf);
      if(n == 0 || b != bs)
        {
         if(n == want)
           {
            complete = true;           // the oldest candle we keep has its first chart candle
            break;
           }
         bs = b;
         StartCandle(tmp[n], b, k, open[k], high[k], low[k], close[k]);
         n++;
         continue;
        }

      HCandle x = tmp[n - 1];
      if(high[k] >= x.h)
        {
         x.h     = high[k];
         x.hiIdx = k;
        }
      if(low[k] <= x.l)
        {
         x.l     = low[k];
         x.loIdx = k;
        }
      x.o        = open[k];
      x.firstIdx = k;
      tmp[n - 1] = x;
     }

   if(!

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

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

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

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

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

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

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