MarketProfile
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «marketprofile.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
MarketProfile — индикатор для MetaTrader 4, отображающий Market Profile на графике в виде прямоугольников (TPO). Поддерживает ежедневные, недельные, месячные и внутридневные сессии. Рассчитывает зону ценности (Value Area), медиану, а также уровни VAH, VAL и POC.
Индикатор предлагает несколько цветовых схем и возможность раскраски прямоугольников по направлению свечей. Можно отображать лучи медианы и границ зоны ценности, а также печатать ключевые значения на графике. Доступна настройка четырёх внутридневных сессий с отдельными временными интервалами и цветовыми схемами.
Настройки включают сдвиг по времени, множитель точек, задержку перерисовки, обработку выходных дней и отключение предупреждений на неподходящих таймфреймах. Индикатор работает на графиках с разными периодами, с рекомендуемыми таймфреймами для каждого типа сессии.
Настройки программы
| Настройка | Описание |
|---|---|
| Session | Тип сессии — Тип сессии: Daily, Weekly, Monthly или Intraday. |
| StartFromDate: lower priority. (StartFromDate) | Дата начала — Дата начала расчёта (имеет меньший приоритет, чем StartFromCurrentSession). |
| StartFromCurrentSession: higher priority. (StartFromCurrentSession) | Начать с текущей сессии — Если true, расчёт начинается с текущей сессии (имеет приоритет над StartFromDate). |
| SessionsToCount: Number of sessions to count Market Profile. (SessionsToCount) | Количество сессий — Количество сессий, для которых рассчитывается Market Profile. |
| ColorScheme | Цветовая схема — Цветовая схема градиента прямоугольников: Blue_to_Red, Red_to_Green, Green_to_Blue, Yellow_to_Cyan, Magenta_to_Yellow, Cyan_to_Magenta или Single_Color. |
| SingleColor: if ColorScheme is set to Single_Color. (SingleColor) | Цвет одинарной схемы — Цвет для прямоугольников при выбранной схеме Single_Color. |
| ColorBullBear: If true, colors are from bars' direction. (ColorBullBear) | Раскраска по направлению свечей — Если true, цвета прямоугольников определяются направлением свечей (бычья/медвежья/нейтральная). |
| MedianColor | Цвет медианы — Цвет линии медианы. |
| ValueAreaColor | Цвет зоны ценности — Цвет зоны ценности (Value Area). |
| ShowValueAreaRays: draw previous value area high/low rays. (ShowValueAreaRays) | Лучи зоны ценности — Отображение лучей зоны ценности: None, Previous, Current, PreviousCurrent, AllPrevious или All. |
| ShowMedianRays: draw previous median rays. (ShowMedianRays) | Лучи медианы — Отображение лучей медианы: None, Previous, Current, PreviousCurrent, AllPrevious или All. |
| RaysUntilIntersection: rays stop when hit another MP. (RaysUntilIntersection) | Лучи до пересечения — Если true, лучи останавливаются при пересечении с другим Market Profile. |
| 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) | Задержка перерисовки — Задержка в секундах для обновления Market Profile (для повышения производительности). |
| EnableIntradaySession1 | Включить внутридневную сессию 1 — Включает или отключает первую внутридневную сессию. |
| IntradaySession1StartTime | Время начала сессии 1 — Время начала первой внутридневной сессии в формате HH:MM. |
| IntradaySession1EndTime | Время окончания сессии 1 — Время окончания первой внутридневной сессии в формате HH:MM. |
| IntradaySession1ColorScheme | Цветовая схема сессии 1 — Цветовая схема для первой внутридневной сессии. |
| EnableIntradaySession2 | Включить внутридневную сессию 2 — Включает или отключает вторую внутридневную сессию. |
| IntradaySession2StartTime | Время начала сессии 2 — Время начала второй внутридневной сессии в формате HH:MM. |
| IntradaySession2EndTime | Время окончания сессии 2 — Время окончания второй внутридневной сессии в формате HH:MM. |
| IntradaySession2ColorScheme | Цветовая схема сессии 2 — Цветовая схема для второй внутридневной сессии. |
| EnableIntradaySession3 | Включить внутридневную сессию 3 — Включает или отключает третью внутридневную сессию. |
| IntradaySession3StartTime | Время начала сессии 3 — Время начала третьей внутридневной сессии в формате HH:MM. |
| IntradaySession3EndTime | Время окончания сессии 3 — Время окончания третьей внутридневной сессии в формате HH:MM. |
| IntradaySession3ColorScheme | Цветовая схема сессии 3 — Цветовая схема для третьей внутридневной сессии. |
| EnableIntradaySession4 | Включить внутридневную сессию 4 — Включает или отключает четвёртую внутридневную сессию. |
| IntradaySession4StartTime | Время начала сессии 4 — Время начала четвёртой внутридневной сессии в формате HH:MM. |
| IntradaySession4EndTime | Время окончания сессии 4 — Время окончания четвёртой внутридневной сессии в формате HH:MM. |
| IntradaySession4ColorScheme | Цветовая схема сессии 4 — Цветовая схема для четвёртой внутридневной сессии. |
| SaturdaySunday | Обработка выходных дней — Обработка субботы и воскресенья: Normal_Days, Ignore или Append. |
| Disable alerts on wrong timeframes. (DisableAlertsOnWrongTimeframes) | Отключить предупреждения на неподходящих таймфреймах — Если true, предупреждения о неподходящих таймфреймах не отображаются, а выводятся в журнал. |
Поиск по коду файла
#property version "1.13"
#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
};
enum bar_direction
{
Bullish,
Bearish,
Neutral
};
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 color SingleColor = clrBlue; // SingleColor: if ColorScheme is set to Single_Color.
input bool ColorBullBear = false; // ColorBullBear: If true, colors are from bars' direction.
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 bool RaysUntilIntersection = false; // RaysUntilIntersection: rays stop when hit another MP.
input int TimeShiftMinutes = 0; // TimeShiftMinutes: shift session + to the left, - to the right.
input bool ShowKeyValues = true; // ShowKeyValues: print out VAH, VAL, POC on chart.
input color KeyValuesColor = clrWhite; // KeyValuesColor: color for VAH, VAL, POC printout.
input int KeyValuesSize = 8; // KeyValuesSize: font size for VAH, VAL, POC printout.
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;
input sat_sun_solution SaturdaySunday = Saturday_Sunday_Normal_Days;
input bool DisableAlertsOnWrongTimeframes = false; // Disable alerts on wrong timeframes.
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.
bar_direction CurrentBarDirection = Neutral;
bar_direction PreviousBarDirection = Neutral;
bool NeedToReviewColors = false;
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.
double RememberSessionMax[], RememberSessionMin[];
datetime RememberSessionStart[];
string RememberSessionSuffix[];
int SessionsNumber = 0; // Different from _SessionsToCount when working with Intraday sessions and for RaysUntilIntersection == true.
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;
int colour = -1;
string LastNameStart = " " + TimeToString(Time[bar + start_bar]) + " ";
string LastName = LastNameStart + DoubleToString(price, _Digits);
if (ColorBullBear) colour = CalculateProperColor();
if (NeedToReviewColors)
{
int obj_total = ObjectsTotal(0, -1, -1);
for (int i = obj_total - 1; i >= 0; i--)
{
string obj = ObjectName(i);
if (ObjectGetInteger(0, obj, OBJPROP_TYPE) != OBJ_RECTANGLE) continue;
if (StringSubstr(obj, 0, StringLen("MP" + Suffix)) != "MP" + Suffix) continue;
if (StringSubstr(obj, 0, StringLen("MP" + Suffix + LastNameStart)) != "MP" + Suffix + LastNameStart) break;
ObjectSetInteger(0, obj, OBJPROP_COLOR, colour);
}
}
if (ObjectFind(0, "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);
if (!ColorBullBear) // Otherwise, colour is already calculated.
{
int 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);
}
if (ShowKeyValues)
{
ObjectsDeleteAll(0, "VAH" + Suffix, EMPTY, OBJ_TEXT);
ObjectsDeleteAll(0, "VAL" + Suffix, EMPTY, OBJ_TEXT);
ObjectsDeleteAll(0, "POC" + Suffix, EMPTY, OBJ_TEXT);
}
}
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[4] < '0') || (time_string[4] > '9'))
)
{
Print("Wrong time string: ", time_string, ". Please use HH:MM format.");
return(false);
}
string result[];
int number_of_substrings = StringSplit(time_string, ':', result);
hours = (int)StringToInteger(result[0]);
minutes = (int)StringToInteger(result[1]);
time = hours * 60 + minutes;
return(true);
}
bool CheckIntradaySession(const bool enable, const string start_time, const string end_time, const color_scheme cs)
{
if (enable)
{
if (!GetHoursAndMinutes(start_time, IDStartHours[IntradaySessionCount], IDStartMinutes[IntradaySessionCount], IDStartTime[IntradaySessionCount]))
{
Alert("Wrong time string format: ", start_time, ".");
return(false);
}
if (!GetHoursAndMinutes(end_time, IDEndHours[IntradaySessionCount], IDEndMinutes[IntradaySessionCount], IDEndTime[IntradaySessionCount]))
{
Alert("Wrong time string format: ", end_time, ".");
return(false);
}
if (IDEndTime[IntradaySessionCount] == 0)
{
IDEndHours[IntradaySessionCount] = 24;
IDEndMinutes[IntradaySessionCount] = 0;
IDEndTime[IntradaySessionCount] = 24 * 60;
}
IDColorScheme[IntradaySessionCount] = cs;
if (IDEndTime[IntradaySessionCount] < IDStartTime[IntradaySessionCount]) IntradayCrossSessionDefined = IntradaySessionCount;
IntradaySessionCount++;
}
return(true);
}
bool ProcessSession(const int sessionstart, const int sessionend, const int i)
{
if (sessionstart >= Bars) return(false); // Data not yet ready.
double SessionMax = DBL_MIN, SessionMin = DBL_MAX;
for (int bar = sessionstart; bar >= sessionend; bar--)
{
if (High[bar] > SessionMax) SessionMax = High[bar];
if (Low[bar] < SessionMin) SessionMin = Low[bar];
}
SessionMax = NormalizeDouble(SessionMax, DigitsM);
SessionMin = NormalizeDouble(SessionMin, DigitsM);
int session_counter = i;
bool need_to_increment = true;
for (int j = 0; j < SessionsNumber; j++)
{
if (RememberSessionStart[j] == Time[sessionstart])
{
need_to_increment = false;
session_counter = j; // Real number of the session.
break;
}
}
if (need_to_increment)
{
SessionsNumber++;
session_counter = SessionsNumber - 1; // Newest session.
ArrayResize(RememberSessionMax, SessionsNumber);
ArrayResize(RememberSessionMin, SessionsNumber);
ArrayResize(RememberSessionStart, SessionsNumber);
ArrayResize(Показано первые 50% кода (символов: 41349)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.