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

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

Стоимость полного кода
3 328₽ ≈ $40.67