Market Profile
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «donforex laserfork.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Исходный код представляет собой индикатор Market Profile для платформы MetaTrader. Он отображает профиль рынка для внутридневных, дневных, недельных или месячных торговых сессий, используя прямоугольники с цветовой градацией для визуализации распределения ценовых уровней.
Индикатор рассчитывает зону стоимости (Value Area), охватывающую 70% от общего числа точек объёма, а также медианную цену сессии. Поддерживаются различные цветовые схемы, настройки отображения лучей медианы и зоны стоимости, а также сдвиг сессий по времени.
Внутридневный режим позволяет задавать до четырёх отдельных сессий с собственными временами начала и окончания и цветовыми схемами. Доступна настройка обработки субботы и воскресенья, а также задержка перерисовки для медленных систем.
Настройки программы
| Настройка | Описание |
|---|---|
| Session | Тип сессии — Тип торговой сессии: дневная, недельная, месячная или внутридневная. |
| StartFromDate: lower priority. (StartFromDate) | Начальная дата — Дата и время начала расчёта профиля (имеет более низкий приоритет по сравнению с началом с текущей сессии). |
| StartFromCurrentSession: higher priority. (StartFromCurrentSession) | Начать с текущей сессии — Переключатель: при активации расчёт начинается с текущей сессии (имеет более высокий приоритет). |
| SessionsToCount: Number of sessions to count Market Profile. (SessionsToCount) | Количество сессий — Количество сессий, для которых рассчитывается профиль рынка. |
| ColorScheme | Цветовая схема — Цветовая схема для отображения прямоугольников профиля рынка. Доступны варианты: переход синего к красному, красного к зелёному, зелёного к синему, жёлтого к циановому, пурпурного к жёлтому, цианового к пурпурному, а также единый цвет. |
| SaturdaySunday | Суббота и воскресенье — Настройка обработки субботы и воскресенья: нормальные сессии, игнорирование или добавление выходных дней. |
| SingleColor: if ColorScheme is set to Single_Color. (SingleColor) | Единый цвет — Единый цвет для отображения всех прямоугольников, если цветовая схема установлена на единый цвет. |
| MedianColor | Цвет медианы — Цвет для отображения медианной линии сессии. |
| ValueAreaColor | Цвет зоны стоимости — Цвет для отображения прямоугольника зоны стоимости. |
| ShowValueAreaRays: draw previous value area high/low rays. (ShowValueAreaRays) | Показать лучи зоны стоимости — Настройка отображения лучей верхнего и нижнего уровней зоны стоимости предыдущей сессии. |
| ShowMedianRays: draw previous median rays. (ShowMedianRays) | Показать лучи медианы — Настройка отображения лучей медианы: без лучей, предыдущая, текущая, предыдущая и текущая, все предыдущие или все. |
| TimeShiftMinutes: shift session + to the left, - to the right. (TimeShiftMinutes) | Сдвиг в минутах — Сдвиг сессии в минутах: положительное значение сдвигает влево, отрицательное — вправо. |
| PointMultiplier: the higher it is, the fewer chart objects. (PointMultiplier) | Множитель точки — Множитель точки. Чем выше значение, тем меньше графических объектов создаётся на графике. |
| ThrottleRedraw: delay (in seconds) for updating Market Profile. (ThrottleRedraw) | Задержка перерисовки — Задержка в секундах для обновления профиля рынка, что снижает нагрузку на медленных системах. |
| EnableIntradaySession1 | Включить внутридневную сессию 1 — Переключатель для включения первой внутридневной торговой сессии. |
| IntradaySession1StartTime | Время начала сессии 1 — Время начала первой внутридневной сессии в формате ЧЧ:ММ. |
| IntradaySession1EndTime | Время окончания сессии 1 — Время окончания первой внутридневной сессии в формате ЧЧ:ММ. |
| IntradaySession1ColorScheme | Цветовая схема сессии 1 — Цветовая схема для отображения первой внутридневной сессии. |
| EnableIntradaySession2 | Включить внутридневную сессию 2 — Переключатель для включения второй внутридневной торговой сессии. |
| IntradaySession2StartTime | Время начала сессии 2 — Время начала второй внутридневной сессии в формате ЧЧ:ММ. |
| IntradaySession2EndTime | Время окончания сессии 2 — Время окончания второй внутридневной сессии в формате ЧЧ:ММ. |
| IntradaySession2ColorScheme | Цветовая схема сессии 2 — Цветовая схема для отображения второй внутридневной сессии. |
| EnableIntradaySession3 | Включить внутридневную сессию 3 — Переключатель для включения третьей внутридневной торговой сессии. |
| IntradaySession3StartTime | Время начала сессии 3 — Время начала третьей внутридневной сессии в формате ЧЧ:ММ. |
| IntradaySession3EndTime | Время окончания сессии 3 — Время окончания третьей внутридневной сессии в формате ЧЧ:ММ. |
| IntradaySession3ColorScheme | Цветовая схема сессии 3 — Цветовая схема для отображения третьей внутридневной сессии. |
| EnableIntradaySession4 | Включить внутридневную сессию 4 — Переключатель для включения четвёртой внутридневной торговой сессии. |
| IntradaySession4StartTime | Время начала сессии 4 — Время начала четвёртой внутридневной сессии в формате ЧЧ:ММ. |
| IntradaySession4EndTime | Время окончания сессии 4 — Время окончания четвёртой внутридневной сессии в формате ЧЧ:ММ. |
| IntradaySession4ColorScheme | Цветовая схема сессии 4 — Цветовая схема для отображения четвёртой внутридневной сессии. |
Поиск по коду файла
#property version "1.11"
#property strict
#property description "Displays the Market Profile indicator for intraday, daily, weekly, or monthly trading sessions."
#property description "Daily - should be attached to M5-M30 timeframes. M30 is recommended."
#property description "Weekly - should be attached to M30-H4 timeframes. H1 is recommended."
#property description "Weeks start on Sunday."
#property description "Monthly - should be attached to H1-D1 timeframes. H4 is recommended."
#property description "Intraday - should be attached to M1-M15 timeframes. M5 is recommended.\r\n"
#property description "Designed for major currency pairs, but should work also with exotic pairs, CFDs, or commodities."
#property indicator_chart_window
#property indicator_plots 0
enum color_scheme
{
Blue_to_Red, // Blue to Red
Red_to_Green, // Red to Green
Green_to_Blue, // Green to Blue
Yellow_to_Cyan, // Yellow to Cyan
Magenta_to_Yellow, // Magenta to Yellow
Cyan_to_Magenta, // Cyan to Magenta
Single_Color // Single Color
};
enum session_period
{
Daily,
Weekly,
Monthly,
Intraday
};
enum sat_sun_solution
{
Saturday_Sunday_Normal_Days, // Normal sessions
Ignore_Saturday_Sunday, // Ignore Saturday and Sunday
Append_Saturday_Sunday // Append Saturday and Sunday
};
enum sessions_to_draw_rays
{
None,
Previous,
Current,
PreviousCurrent, // Previous & Current
AllPrevious, // All Previous
All
};
input session_period Session = Daily;
input datetime StartFromDate = __DATE__; // StartFromDate: lower priority.
input bool StartFromCurrentSession = true; // StartFromCurrentSession: higher priority.
input int SessionsToCount = 2; // SessionsToCount: Number of sessions to count Market Profile.
input color_scheme ColorScheme = Blue_to_Red;
input sat_sun_solution SaturdaySunday = Saturday_Sunday_Normal_Days;
input color SingleColor = clrBlue; // SingleColor: if ColorScheme is set to Single_Color.
input color MedianColor = clrWhite;
input color ValueAreaColor = clrWhite;
input sessions_to_draw_rays ShowValueAreaRays= None; // ShowValueAreaRays: draw previous value area high/low rays.
input sessions_to_draw_rays ShowMedianRays = None; // ShowMedianRays: draw previous median rays.
input int TimeShiftMinutes = 0; // TimeShiftMinutes: shift session + to the left, - to the right.
input int PointMultiplier = 1; // PointMultiplier: the higher it is, the fewer chart objects.
input int ThrottleRedraw = 0; // ThrottleRedraw: delay (in seconds) for updating Market Profile.
input bool EnableIntradaySession1 = true;
input string IntradaySession1StartTime = "00:00";
input string IntradaySession1EndTime = "06:00";
input color_scheme IntradaySession1ColorScheme = Blue_to_Red;
input bool EnableIntradaySession2 = true;
input string IntradaySession2StartTime = "06:00";
input string IntradaySession2EndTime = "12:00";
input color_scheme IntradaySession2ColorScheme = Red_to_Green;
input bool EnableIntradaySession3 = true;
input string IntradaySession3StartTime = "12:00";
input string IntradaySession3EndTime = "18:00";
input color_scheme IntradaySession3ColorScheme = Green_to_Blue;
input bool EnableIntradaySession4 = true;
input string IntradaySession4StartTime = "18:00";
input string IntradaySession4EndTime = "00:00";
input color_scheme IntradaySession4ColorScheme = Yellow_to_Cyan;
int DigitsM; // Number of digits normalized based on TickMultiplier.
bool InitFailed; // Used for soft INIT_FAILED. Hard INIT_FAILED resets input parameters.
datetime StartDate; // Will hold either StartFromDate or Time[0].
double onetick; // One normalized pip.
bool FirstRunDone = false; // If true - OnCalculate() was already executed once.
string Suffix = ""; // Will store object name suffix depending on timeframe.
color_scheme CurrentColorScheme; // Required due to intraday sessions.
int Max_number_of_bars_in_a_session = 1;
int Timer = 0; // For throttling updates of market profiles in slow systems.
int IDStartHours[4];
int IDStartMinutes[4];
int IDStartTime[4]; // Stores IDStartHours x 60 + IDStartMinutes for comparison purposes.
int IDEndHours[4];
int IDEndMinutes[4];
int IDEndTime[4]; // Stores IDEndHours x 60 + IDEndMinutes for comparison purposes.
color_scheme IDColorScheme[4];
bool IntradayCheckPassed = false;
int IntradaySessionCount = 0;
int _SessionsToCount;
int IntradayCrossSessionDefined = -1; // For special case used only with Ignore_Saturday_Sunday on Monday.
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
ObjectCleanup();
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime& time_timeseries[],
const double& open[],
const double& high[],
const double& low[],
const double& close[],
const long& tick_volume[],
const long& volume[],
const int& spread[]
)
{
// код доступен только после оплаты
}
int FindSessionStart(const int n)
{
if (Session == Daily) return(FindDayStart(n));
else if (Session == Weekly) return(FindWeekStart(n));
else if (Session == Monthly) return(FindMonthStart(n));
else if (Session == Intraday)
{
if ((SaturdaySunday == Append_Saturday_Sunday) && (TimeDayOfWeek(Time[n] + TimeShiftMinutes * 60) == 1))
{
for (int intraday_i = 0; intraday_i < IntradaySessionCount; intraday_i++)
{
if ((IDStartTime[intraday_i] == 0) || (IDStartTime[intraday_i] > IDEndTime[intraday_i]))
{
if ((TimeHour(Time[n]) * 60 + TimeMinute(Time[n]) >= IDEndTime[intraday_i]) && (IDStartTime[intraday_i] > IDEndTime[intraday_i]))
{
int x = n;
while ((x < Bars) && (TimeHour(Time[x]) * 60 + TimeMinute(Time[x]) >= IDEndTime[intraday_i]))
{
x++;
if (TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60) > 1) return(FindDayStart(n));
}
return(x - 1);
}
else
{
int x = n;
while ((x < Bars) && ((TimeDayOfYear(Time[n] + TimeShiftMinutes * 60) == TimeDayOfYear(Time[x] + TimeShiftMinutes * 60)) || (TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60) == 0)))
{
x++;
}
_SessionsToCount++;
return(x - 1);
}
}
}
}
return(FindDayStart(n));
}
return(-1);
}
int FindDayStart(const int n)
{
if (n >= Bars) return(-1);
int x = n;
int time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
int time_n_day_of_week = time_x_day_of_week;
while ((TimeDayOfYear(Time[n] + TimeShiftMinutes * 60) == TimeDayOfYear(Time[x] + TimeShiftMinutes * 60)) || ((SaturdaySunday == Append_Saturday_Sunday) && ((time_x_day_of_week == 0) || ((time_x_day_of_week == 5) && (time_n_day_of_week == 6)))))
{
x++;
if (x >= Bars) break;
time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
}
return(x - 1);
}
int FindWeekStart(const int n)
{
if (n >= Bars) return(-1);
int x = n;
int time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
while ((SameWeek(Time[n] + TimeShiftMinutes * 60, Time[x] + TimeShiftMinutes * 60)) || ((SaturdaySunday == Append_Saturday_Sunday) && (time_x_day_of_week == 0)))
{
if ((SaturdaySunday == Ignore_Saturday_Sunday) && (time_x_day_of_week == 0)) break;
x++;
if (x >= Bars) break;
time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
}
return(x - 1);
}
int FindMonthStart(const int n)
{
if (n >= Bars) return(-1);
int x = n;
int time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
int time_n_day_of_week = TimeDayOfWeek(Time[n] + TimeShiftMinutes * 60);
int time_n_day = TimeDay(Time[n] + TimeShiftMinutes * 60);
int time_n_month = TimeMonth(Time[n] + TimeShiftMinutes * 60);
while ((time_n_month == TimeMonth(Time[x] + TimeShiftMinutes * 60)) || ((SaturdaySunday == Append_Saturday_Sunday) && ((time_x_day_of_week == 0) || ((time_n_day_of_week == 6) && (time_n_day == 1)))))
{
int month_distance = time_n_month - TimeMonth(Time[x] + TimeShiftMinutes * 60);
if (month_distance < 0) month_distance = 12 - month_distance;
if (month_distance > 1) break;
if (SaturdaySunday == Append_Saturday_Sunday)
{
if ((time_x_day_of_week == 6) && (TimeDay(Time[x] + TimeShiftMinutes * 60) == 1) && (time_n_day != TimeDay(Time[x] + TimeShiftMinutes * 60))) break;
}
if (SaturdaySunday == Ignore_Saturday_Sunday)
{
if (((time_x_day_of_week == 0) || (time_x_day_of_week == 6)) && ((TimeDay(Time[x] + TimeShiftMinutes * 60) == 1) || (TimeDay(Time[x] + TimeShiftMinutes * 60) == 2))) break;
}
x++;
if (x >= Bars) break;
time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
}
return(x - 1);
}
int FindSessionEndByDate(const datetime date)
{
if (Session == Daily) return(FindDayEndByDate(date));
else if (Session == Weekly) return(FindWeekEndByDate(date));
else if (Session == Monthly) return(FindMonthEndByDate(date));
else if (Session == Intraday)
{
if ((SaturdaySunday == Append_Saturday_Sunday) && (TimeDayOfWeek(date + TimeShiftMinutes * 60) == 0))
{
for (int intraday_i = 0; intraday_i < IntradaySessionCount; intraday_i++)
{
if ((IDStartTime[intraday_i] == 0) || (IDStartTime[intraday_i] > IDEndTime[intraday_i]))
{
int x = 0;
int abs_day = TimeAbsoluteDay(date + TimeShiftMinutes * 60);
while ((x < Bars) && (abs_day < TimeAbsoluteDay(Time[x] + TimeShiftMinutes * 60))) // It's Sunday.
{
if (TimeAbsoluteDay(Time[x] + TimeShiftMinutes * 60) == abs_day + 1)
{
if (TimeHour(Time[x]) * 60 + TimeMinute(Time[x]) < IDEndTime[intraday_i]) break;
if (IDStartTime[intraday_i] == 0) break;
}
x++;
}
return(x);
}
}
}
return(FindDayEndByDate(date));
}
return(-1);
}
int FindDayEndByDate(const datetime date)
{
int x = 0;
while ((x < Bars) && (TimeAbsoluteDay(date + TimeShiftMinutes * 60) < TimeAbsoluteDay(Time[x] + TimeShiftMinutes * 60)))
{
if (SaturdaySunday == Append_Saturday_Sunday)
{
if (((TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60) == 6) || (TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60) == 1)) && (TimeAbsoluteDay(Time[x] + TimeShiftMinutes * 60) - TimeAbsoluteDay(date + TimeShiftMinutes * 60) == 1)) break;
}
x++;
}
return(x);
}
int FindWeekEndByDate(const datetime date)
{
int x = 0;
int time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
while ((SameWeek(date + TimeShiftMinutes * 60, Time[x] + TimeShiftMinutes * 60) != true) || ((SaturdaySunday == Append_Saturday_Sunday) && (time_x_day_of_week == 0)) || ((SaturdaySunday == Ignore_Saturday_Sunday) && ((time_x_day_of_week == 0) || (time_x_day_of_week == 6))))
{
x++;
if (x >= Bars) break;
time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
}
return(x);
}
int FindMonthEndByDate(const datetime date)
{
int x = 0;
int time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
while ((SameMonth(date + TimeShiftMinutes * 60, Time[x] + TimeShiftMinutes * 60) != true) || ((SaturdaySunday == Append_Saturday_Sunday) && (time_x_day_of_week == 0)) || ((SaturdaySunday == Ignore_Saturday_Sunday) && ((time_x_day_of_week == 0) || (time_x_day_of_week == 6))))
{
if (SaturdaySunday == Append_Saturday_Sunday)
{
if ((time_x_day_of_week == 6) && (TimeDay(Time[x] + TimeShiftMinutes * 60) == 1) && (TimeYear(Time[x] + TimeShiftMinutes * 60) * 12 + TimeMonth(Time[x] + TimeShiftMinutes * 60) - TimeYear(date + TimeShiftMinutes * 60) * 12 - TimeMonth(date + TimeShiftMinutes * 60) == 1)) break;
if ((TimeDayOfWeek(date + TimeShiftMinutes * 60) == 0) && (TimeYear(Time[x] + TimeShiftMinutes * 60) * 12 + TimeMonth(Time[x] + TimeShiftMinutes * 60) - TimeYear(date + TimeShiftMinutes * 60) * 12 - TimeMonth(date + TimeShiftMinutes * 60) == 1)) break;
}
x++;
if (x >= Bars) break;
time_x_day_of_week = TimeDayOfWeek(Time[x] + TimeShiftMinutes * 60);
}
return(x);
}
int SameWeek(const datetime date1, const datetime date2)
{
int seconds_from_start = TimeDayOfWeek(date1) * 24 * 3600 + TimeHour(date1) * 3600 + TimeMinute(date1) * 60 + TimeSeconds(date1);
if (date1 == date2) return(true);
else if (date2 < date1)
{
if (date1 - date2 <= seconds_from_start) return(true);
}
else if (date2 - date1 < 604800 - seconds_from_start) return(true);
return(false);
}
int SameMonth(const datetime date1, const datetime date2)
{
if ((TimeMonth(date1) == TimeMonth(date2)) && (TimeYear(date1) == TimeYear(date2))) return(true);
return(false);
}
void PutDot(const double price, const int start_bar, const int range, const int bar)
{
double divisor, color_shift;
string LastName = " " + TimeToString(Time[start_bar - range]) + " " + DoubleToString(price, _Digits);
if (ObjectFind("MP" + Suffix + LastName) >= 0) return;
datetime time_end;
if (start_bar - (range + 1) < 0) time_end = Time[0] + PeriodSeconds();
else time_end = Time[start_bar - (range + 1)];
ObjectCreate("MP" + Suffix + LastName, OBJ_RECTANGLE, 0, Time[start_bar - range], price, time_end, price - onetick);
int colour, offset1, offset2;
switch(CurrentColorScheme)
{
case Blue_to_Red:
colour = 0x00FF0000; // clrBlue;
offset1 = 0x00010000;
offset2 = 0x00000001;
break;
case Red_to_Green:
colour = 0x000000FF; // clrDarkRed;
offset1 = 0x00000001;
offset2 = 0x00000100;
break;
case Green_to_Blue:
colour = 0x0000FF00; // clrDarkGreen;
offset1 = 0x00000100;
offset2 = 0x00010000;
break;
case Yellow_to_Cyan:
colour = 0x0000FFFF; // clrYellow;
offset1 = 0x00000001;
offset2 = 0x00010000;
break;
case Magenta_to_Yellow:
colour = 0x00FF00FF; // clrMagenta;
offset1 = 0x00010000;
offset2 = 0x00000100;
break;
case Cyan_to_Magenta:
colour = 0x00FFFF00; // clrCyan;
offset1 = 0x00000100;
offset2 = 0x00000001;
break;
case Single_Color:
colour = SingleColor;
offset1 = 0;
offset2 = 0;
break;
default:
colour = SingleColor;
offset1 = 0;
offset2 = 0;
break;
}
if (CurrentColorScheme != Single_Color)
{
divisor = 1.0 / 0xFF * (double)Max_number_of_bars_in_a_session;
color_shift = MathFloor((double)bar / divisor);
if ((int)color_shift < -0xFF) color_shift = -0xFF;
colour += (int)color_shift * offset1;
colour -= (int)color_shift * offset2;
}
ObjectSet("MP" + Suffix + LastName, OBJPROP_COLOR, colour);
ObjectSet("MP" + Suffix + LastName, OBJPROP_BACK, true);
ObjectSet("MP" + Suffix + LastName, OBJPROP_SELECTABLE, false);
ObjectSet("MP" + Suffix + LastName, OBJPROP_HIDDEN, true);
}
void ObjectCleanup()
{
ObjectsDeleteAll(0, "MP" + Suffix, EMPTY, OBJ_RECTANGLE);
ObjectsDeleteAll(0, "Median" + Suffix, EMPTY, OBJ_TREND);
ObjectsDeleteAll(0, "Value Area" + Suffix, EMPTY, OBJ_RECTANGLE);
if (ShowValueAreaRays != None)
{
ObjectsDeleteAll(0, "Value Area HighRay" + Suffix, EMPTY, OBJ_TREND);
ObjectsDeleteAll(0, "Value Area LowRay" + Suffix, EMPTY, OBJ_TREND);
}
if (ShowMedianRays != None)
{
ObjectsDeleteAll(0, "Median Ray" + Suffix, EMPTY, OBJ_TREND);
}
}
bool GetHoursAndMinutes(string time_string, int& hours, int& minutes, int& time)
{
if (StringLen(time_string) == 4) time_string = "0" + time_string;
if (
(StringLen(time_string) != 5) ||
(time_string[2] != ':') ||
((time_string[0] < '0') || (time_string[0] > '2')) ||
(((time_string[0] == '0') || (time_string[0] == '1')) && ((time_string[1] < '0') || (time_string[1] > '9'))) ||
((time_string[0] == '2') && ((time_string[1] < '0') || (time_string[1] > '3'))) ||
((time_string[3] < '0') || (time_string[3] > '5')) ||
((time_stringПоказано первые 50% кода (символов: 33280)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.