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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.