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

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 и перейдите к оплате.

Стоимость полного кода
4 134,90₽ ≈ $50.54