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

Session Volume Profile

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

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

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

О программе

Session Volume Profile — это индикатор для MetaTrader 5, который отображает профиль объёма в рамках пользовательской торговой сессии на графике цены. Индикатор рассчитывает распределение объёма по ценовым корзинам между заданными границами сессии (начало и конец) и отображает горизонтальные столбики, ширина которых пропорциональна объёму на соответствующем ценовом уровне. Границы сессии представлены перетаскиваемыми вертикальными линиями, что позволяет оперативно менять временные рамки анализа.

Индикатор поддерживает автоматический или ручной выбор размера ценовых корзин, настраиваемые цвета столбиков и границ, а также отображение линии POC (Point of Control) — ценового уровня с максимальным объёмом. Обновление данных происходит по таймеру с заданной частотой, при этом перерисовка может выполняться как полностью, так и для изменённых корзин, что обеспечивает эффективную работу на графике.

Технически индикатор использует исторические тики, полученные через CopyTicksRange, для построения профиля объёма. Обработка событий графика реализована через OnChartEvent (перетаскивание границ сессии), а периодическое обновление — через OnTimer. Индикатор работает в окне графика и не использует стандартные буферы, размещая все визуальные объекты непосредственно на графике.

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

НастройкаОписание
InpIndicatorId Уникальный идентификатор экземпляра индикатора для предотвращения столкновений объектов на графике.
InpDefaultBars Количество баров от текущего момента назад для определения начальной границы сессии. Должно быть больше нуля.
InpBoundsColor Цвет вертикальных линий, обозначающих начало и конец торговой сессии.
InpBucketChoice Выбор размера ценовых корзин: автоматический (на основе ATR) или пользовательский.
InpCustomBucketSize Пользовательский размер ценовой корзины, применяемый при выборе ручного режима. Должен быть больше нуля.
InpMaxBarWidth Максимальная ширина столбика объёма как доля ширины графика (от 0.1 до 1.0), используется при выключенном пользовательском режиме.
InpIsCustomMaxBarWidth Переключатель, определяющий использование пользовательской максимальной ширины столбика вместо предустановленных значений.
InpCustomMaxBarWidth Максимальная ширина столбика объёма в долях от ширины графика (от 0 до 1), используемая при включённом пользовательском режиме.
InpLineDisplay Расположение отображения профиля объёма: от линии начала сессии или от левого видимого бара графика.
InpBarColor Цвет столбиков объёма профиля, задаваемый стандартным цветом MetaTrader.
InpBorderColor Цвет обводки (рамки) столбиков объёма. Значение clrNONE означает отсутствие обводки.
InpShowPoc Переключатель отображения линии POC — ценового уровня с наибольшим объёмом в профиле.
InpPocLineStyle Стиль линии POC (сплошная, пунктирная и т. д.) согласно перечислению ENUM_LINE_STYLE.
InpPocColor Цвет линии POC (Point of Control), обозначающей ценовой уровень с максимальным объёмом.
InpMillisRefresh Частота обновления данных индикатора в миллисекундах. Задаёт интервал работы внутреннего таймера. Должно быть больше нуля.
Получить полный код

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

#property version   "1.00"

#property indicator_chart_window
#property indicator_buffers   0
#property indicator_plots     0

#include <Generic\HashMap.mqh>
#include <Generic\HashSet.mqh>

enum LineDisplayType
  {
   display_line_start,        //Session start
   display_line_left_bar      //Leftmost bar
  };

enum BarWidthType
  {
   width_1,          //0.1
   width_2,          //0.2
   width_3,          //0.3
   width_4,          //0.4
   width_5,          //0.5 (Half screen width)
   width_6,          //0.6
   width_7,          //0.7
   width_8,          //0.8
   width_9,          //0.9
   width_10          //1 (Full screen width)
  };

enum BucketSizeType
  {
   bucket_size_auto,            //Auto
   bucket_size_custom           //Custom
  };

struct XYCoord
  {
   int x;
   int y;

   XYCoord(int X=0, int Y=0):
      x(X),
      y(Y) {}
  };

struct PriceTimeCoord
  {
   datetime time;
   double   price;

   PriceTimeCoord(datetime Time=0, double Price=0):
      time(Time),
      price(Price) {}

   bool operator!=(const PriceTimeCoord &other) const
     {
      return (time != other.time) || (price != other.price);
     }
  };

struct VolumeProfile
  {
   CHashMap<long, long>  buckets;
   CHashSet<long>        updateList;
   long                  pocIdx;
   double                max;
   double                min;
   long                  maxVolumeCount;
   bool                  isNewMaxCount;
   double                bucketSize;

   VolumeProfile(double BucketSize=0, double Min=DBL_MAX, double Max=0, long MaxVolumeCount=0, bool IsNewMaxCount=false, long PocIdx=0):
      bucketSize(BucketSize),
      min(Min),
      max(Max),
      maxVolumeCount(MaxVolumeCount),
      pocIdx(PocIdx),
      isNewMaxCount(IsNewMaxCount)
     {
      buckets.Clear();
      updateList.Clear();
     }

   void Reset()
     {
      min = DBL_MAX;
      max = 0;
      maxVolumeCount = 0;
      isNewMaxCount = false;
      pocIdx = 0;
      buckets.Clear();
      updateList.Clear();
     }

   void ClearUpdates()
     {
      isNewMaxCount = false;
      updateList.Clear();
     }
  };

input group             "Indicator Identification"
input uint              InpIndicatorId             = 1;                    //Unique ID
input group             "Session Bounds Settings (draggable)"
input int               InpDefaultBars             = 5;                    //Default Bars For Initial Session Bounds
input color             InpBoundsColor             = clrMediumBlue;        //Session Bounds Color
input group             "Bucket Size Settings"
input BucketSizeType    InpBucketChoice            = bucket_size_auto;     //Bucket Size
input double            InpCustomBucketSize        = 0.0;                  //Custom Size (if chosen)
input group             "Max Width Settings"
input BarWidthType      InpMaxBarWidth             = width_1;              //Max Width
input bool              InpIsCustomMaxBarWidth     = false;                //Custom Width
input double            InpCustomMaxBarWidth       = 0.0;                  //Custom Width (if chosen)
input group             "Volume Profile Settings"
input LineDisplayType   InpLineDisplay             = display_line_start;   //Profile Display Location
input color             InpBarColor                = clrGold;              //Volume Profile Color
input color             InpBorderColor             = clrNONE;              //Border Color
input group             "POC settings"
input bool              InpShowPoc                 = true;                 //Show POC
input ENUM_LINE_STYLE   InpPocLineStyle            = STYLE_DASH;           //POC Line Style
input color             InpPocColor                = clrOrangeRed;         //POC Color
input group             "Refresh Rate Settings"
input int               InpMillisRefresh           = 1000;                 //Refresh Rate (in milliseconds)

string ProfilePrefix       = "volume_profile_";
string StartLineSuffix     = "_start";
string EndLineSuffix       = "_end";
string PocLineSuffix       = "_poc";
string BarPrefix           = "_bar_";
string StartLineLabel      = "Session Start";
string EndLineLabel        = "Session End";
string PocLabel            = "POC";
string ObjPrefix;
string StartLineName;
string EndLineName;

int EndShift = 0;

int      AtrPeriod = 14;
double   NumBucketsPerAtr = 4;

bool LastChartDescProp;
long gblLastTick;

datetime gblStart;
datetime gblEnd;

bool gblShouldRecalc = false;
VolumeProfile gblVolumeProfile;
PriceTimeCoord gblOrigin;

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

void  OnDeinit(const int  reason)
  {

   ObjectsDeleteAll(ChartID(), ObjPrefix);

   ChartSetInteger(ChartID(), CHART_SHOW_OBJECT_DESCR, LastChartDescProp);

   EventKillTimer();
  }

void OnChartEvent(const int32_t id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {

   if(id != CHARTEVENT_OBJECT_DRAG)
      return;

   if(sparam == StartLineName)
     {
      datetime start = (datetime) ObjectGetInteger(ChartID(), StartLineName, OBJPROP_TIME);
      if(start >= gblEnd)
        {
         ObjectSetInteger(ChartID(), StartLineName, OBJPROP_TIME, gblStart);
        }
      else
        {
         gblStart = start;
         gblShouldRecalc = true;
        }
      return;
     }

   if(sparam == EndLineName)
     {
      datetime end = (datetime) ObjectGetInteger(ChartID(), EndLineName, OBJPROP_TIME);
      if(end <= gblStart)
        {
         ObjectSetInteger(ChartID(), EndLineName, OBJPROP_TIME, gblEnd);
        }
      else
        {
         gblEnd   = end;
         gblShouldRecalc = true;
        }
      return;
     }
  }

int OnCalculate(const int32_t rates_total,
                const int32_t 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 int32_t &spread[])
  {
      // код доступен только после оплаты
   }

void OnTimer()
  {

   if(gblShouldRecalc)
     {
      InitVolumeProfile(gblVolumeProfile, gblStart, gblEnd);
      gblShouldRecalc = false;
     }

   e

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

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

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

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

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

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

Стоимость полного кода
1 355₽ ≈ $16.88