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

ccfp 3.2.mq5

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный продукт представляет собой пользовательский индикатор для MetaTrader 4, отображаемый в отдельном окне с 8-ю буферами. Он рассчитывает относительную силу восьми основных валют (USD, EUR, GBP, CHF, JPY, AUD, CAD, NZD) на основе сравнения быстрых и медленных скользящих средних их перекрёстных пар.

Индикатор поддерживает работу на различных таймфреймах с настраиваемыми параметрами скользящих для каждого таймфрейма. Включает интерполяцию значений между барами, а также панель отображения текущих значений для каждой валюты.

Предусмотрена система уведомлений с поддержкой всплывающих сообщений, звуковых сигналов и email-оповещений при пересечении уровней, изменении тренда и смене направления наклона линий.

Настройки программы

НастройкаОписание
TimeFrame Таймфрейм — Таймфрейм для расчёта индикатора (например, M1, H1, D1 или Current time frame).
SymbolsPrefix Префикс символов — Префикс символов валютных пар.
SymbolsSuffix Суффикс символов — Суффикс символов валютных пар.
MaMethod Метод скользящей — Метод расчёта скользящей средней (числовой код метода).
MaFast Быстрая скользящая — Период быстрой скользящей средней.
MaSlow Медленная скользящая — Период медленной скользящей средней.
Price Тип цены — Тип цены для расчёта скользящих средних (числовой код).
USD USD — Включение/отключение отображения и расчёта для валютной пары USD.
EUR EUR — Включение/отключение отображения и расчёта для валютной пары EUR.
GBP GBP — Включение/отключение отображения и расчёта для валютной пары GBP.
CHF CHF — Включение/отключение отображения и расчёта для валютной пары CHF.
JPY JPY — Включение/отключение отображения и расчёта для валютной пары JPY.
AUD AUD — Включение/отключение отображения и расчёта для валютной пары AUD.
CAD CAD — Включение/отключение отображения и расчёта для валютной пары CAD.
NZD NZD — Включение/отключение отображения и расчёта для валютной пары NZD.
showOnlySymbolOnChart Только символ на графике — Отображение только тех валют, которые присутствуют на текущем графике.
Color_USD Цвет USD — Цвет линии для валютной пары USD.
Color_EUR Цвет EUR — Цвет линии для валютной пары EUR.
Color_GBP Цвет GBP — Цвет линии для валютной пары GBP.
Color_CHF Цвет CHF — Цвет линии для валютной пары CHF.
Color_JPY Цвет JPY — Цвет линии для валютной пары JPY.
Color_AUD Цвет AUD — Цвет линии для валютной пары AUD.
Color_CAD Цвет CAD — Цвет линии для валютной пары CAD.
Color_NZD Цвет NZD — Цвет линии для валютной пары NZD.
LevelUp2 Уровень роста 2 — Верхний уровень 2 для определения направления тренда.
LevelUp1 Уровень роста 1 — Верхний уровень 1 для определения направления тренда.
LevelDn1 Уровень снижения 1 — Нижний уровень 1 для определения направления тренда.
LevelDn2 Уровень снижения 2 — Нижний уровень 2 для определения направления тренда.
Line_Thickness Толщина линии — Толщина линий индикатора.
alertsOn Уведомления включены — Общее включение/отключение системы уведомлений.
alertsOnCurrent На текущем баре — Определяет, на каком баре отслеживать события: текущий или предыдущий.
alertsOnLevelCross Уведомления при пересечении уровня — Включение уведомлений при пересечении уровня.
alertsOnLevelRevert Уведомления при возврате от уровня — Включение уведомлений при возврате от уровня.
alertsOnSlopeChange Уведомления при смене наклона — Включение уведомлений при изменении направления наклона.
alertsMessage Всплывающие сообщения — Включение/отключение всплывающих сообщений.
alertsSound Звуковые уведомления — Включение/отключение звуковых уведомлений.
alertsEmail Email-уведомления — Включение/отключение email-уведомлений.
Indicator_Name Название индикатора — Название индикатора, используемое для короткого имени и идентификации объектов на графике.
StartPos Начальная позиция — Начальная позиция отрисовки индикатора на графике.
yy Смещение YY — Смещение по барам для сравнения значений при отображении.
xx Смещение XX — Смещение по барам для сравнения значений при отображении.
Panel Панель — Параметр, определяющий позицию панели отображения.
showpanel Панель отображения — Включение/отключение панели отображения текущих значений.
xd Смещение X — Горизонтальное смещение панели отображения.
yd Смещение Y — Вертикальное смещение панели отображения.
mn_per Медленная MN — Период медленной скользящей для месячного таймфрейма.
mn_fast Быстрая MN — Период быстрой скользящей для месячного таймфрейма.
w_per Медленная W1 — Период медленной скользящей для недельного таймфрейма.
w_fast Быстрая W1 — Период быстрой скользящей для недельного таймфрейма.
d_per Медленная D1 — Период медленной скользящей для дневного таймфрейма.
d_fast Быстрая D1 — Период быстрой скользящей для дневного таймфрейма.
h4_per Медленная H4 — Период медленной скользящей для таймфрейма H4.
h4_fast Быстрая H4 — Период быстрой скользящей для таймфрейма H4.
H1parameters Параметры H1 — Параметры скользящих средних для таймфрейма H1 (быстрая, средняя, медленная, очень медленная).
h1_per Медленная H1 — Период медленной скользящей для таймфрейма H1.
h1_fast Быстрая H1 — Период быстрой скользящей для таймфрейма H1.
m30_per Медленная M30 — Период медленной скользящей для таймфрейма M30.
m30_fast Быстрая M30 — Период быстрой скользящей для таймфрейма M30.
m15_per Медленная M15 — Период медленной скользящей для таймфрейма M15.
m15_fast Быстрая M15 — Период быстрой скользящей для таймфрейма M15.
m5_per Медленная M5 — Период медленной скользящей для таймфрейма M5.
m5_fast Быстрая M5 — Период быстрой скользящей для таймфрейма M5.
m1_per Медленная M1 — Период медленной скользящей для таймфрейма M1.
m1_fast Быстрая M1 — Период быстрой скользящей для таймфрейма M1.
Interpolate Интерполяция — Включение/отключение интерполяции значений между барами.
Получить полный код

Поиск по коду файла

???//+------------------------------------------------------------------+

#property indicator_separate_window
#property indicator_buffers 8

extern string TimeFrame = "Current time frame";
extern string SymbolsPrefix = "";
extern string SymbolsSuffix = "";
extern int    MaMethod  = 3;
extern int    MaFast    = 3;
extern int    MaSlow    = 5;
extern int    Price     = 6;
extern bool   USD       = true;
extern bool   EUR       = true;
extern bool   GBP       = true;
extern bool   CHF       = true;
extern bool   JPY       = true;
extern bool   AUD       = true;
extern bool   CAD       = true;
extern bool   NZD       = true;
extern bool   showOnlySymbolOnChart = false;
extern color  Color_USD = White;
extern color  Color_EUR = Red;
extern color  Color_GBP = Gold;
extern color  Color_CHF = GreenYellow;
extern color  Color_JPY = DarkOrange;
extern color  Color_AUD = PaleVioletRed  ;
extern color  Color_CAD = DeepSkyBlue;
extern color  Color_NZD = Olive;
extern double LevelUp2  =  0.015;
extern double LevelUp1  =  0.007;
extern double LevelDn1  = -0.007;
extern double LevelDn2  = -0.015;
extern int    Line_Thickness = 2;
extern bool   alertsOn        = false;
extern bool   alertsOnCurrent = false;
extern bool   alertsOnLevelCross  = false;
extern bool   alertsOnLevelRevert = false;
extern bool   alertsOnSlopeChange = false;
extern bool   alertsMessage   = false;
extern bool   alertsSound     = false;
extern bool   alertsEmail     = false;
extern string Indicator_Name  = "CCFp: ";
extern int    StartPos        = 12;
extern int yy = 1;
extern int xx = 0;
extern string Panel = "position";
extern bool showpanel=true;
extern int xd=0;
extern int yd=0;

extern int mn_per   = 12;
extern int mn_fast  = 3;
extern int w_per    = 9;
extern int w_fast   = 3;
extern int d_per    = 5;
extern int d_fast   = 3;
extern int h4_per   = 18;
extern int h4_fast  = 6;
extern string H1parameters = "fast:24,8 middle:48,16 slow:72,24 veryslow:120,40";
extern int h1_per   = 24;
extern int h1_fast  = 8;
extern int m30_per  = 16;
extern int m30_fast = 2;
extern int m15_per  = 16;
extern int m15_fast = 4;
extern int m5_per   = 12;
extern int m5_fast  = 3;
extern int m1_per   = 30;
extern int m1_fast  = 10;

extern bool Interpolate=true;

double arrUSD[];
double arrEUR[];
double arrGBP[];
double arrCHF[];
double arrJPY[];
double arrAUD[];
double arrCAD[];
double arrNZD[];

string symbol[] = {"","","","","","","","","GBPJPY"};
string indicatorFileName;
bool   returnBars;
bool   calculateValue;
int    timeFrame = 0;

string names[8];
int    colors[8];

int init()
{
      // код доступен только после оплаты
   }

string symbols[];
void addSymbol(string tsymbol)
{
   ArrayResize(symbols,ArraySize(symbols)+1); symbols[ArraySize(symbols)-1] = SymbolsPrefix+tsymbol+SymbolsSuffix;
}

int getLimit(int limit, string tsymbol)
{
   if (tsymbol!=Symbol())
          limit = MathMax(MathMin(Bars-1,iCustom(tsymbol,timeFrame,indicatorFileName,"returnBars",0,0)*timeFrame/Period()),limit);
   return(limit);
}

int deinit()
{
   for(int i = 0; i < 8; i++) ObjectDelete(Indicator_Name+i);
   for(    i = 0; i < 8; i++) ObjectDelete(Indicator_Name+":"+i);
   for(    i = 0; i < 8; i++) ObjectDelete(Indicator_Name+":n"+i);
   ObjectDelete("Spread");

   ObjectDelete ("usd");
   ObjectDelete ("usd2");
   ObjectDelete ("eur");
   ObjectDelete ("eur2");
   ObjectDelete ("gbp");
   ObjectDelete ("gbp2");
   ObjectDelete ("chf");
   ObjectDelete ("chf2");
   ObjectDelete ("cad");
   ObjectDelete ("cad2");
   ObjectDelete ("jpy");
   ObjectDelete ("jpy2");
   ObjectDelete ("nzd");
   ObjectDelete ("nzd2");
   ObjectDelete ("aud");
   ObjectDelete ("aud2");

   return(0);
}

double values[8];
double valuea[8];
double trends[][64];
double trendl[][8][5];
int start()
{
      // код доступен только после оплаты
   }

   int i,r,counted_bars=IndicatorCounted();

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
           int limit=MathMin(Bars-counted_bars,Bars-1);
           if (returnBars) { arrUSD[0] = limit; return(0); }

           static bool initialized = false;
           if (!initialized)
           {
               initialized = true;
               int cur = StartPos; 
               int st = 23; 
                  if (USD) { sl(0,"~",cur,Color_USD,"USD"); cur+=st;  }
                  if (EUR) { sl(1,"~",cur,Color_EUR,"EUR"); cur+=st; addSymbol("EURUSD"); }
                  if (GBP) { sl(2,"~",cur,Color_GBP,"GBP"); cur+=st; addSymbol("GBPUSD"); }
                  if (CHF) { sl(3,"~",cur,Color_CHF,"CHF"); cur+=st; addSymbol("USDCHF"); }
                  if (JPY) { sl(4,"~",cur,Color_JPY,"JPY"); cur+=st; addSymbol("USDJPY"); }
                  if (AUD) { sl(5,"~",cur,Color_AUD,"AUD"); cur+=st; addSymbol("AUDUSD"); }
                  if (CAD) { sl(6,"~",cur,Color_CAD,"CAD"); cur+=st; addSymbol("USDCAD"); }
                  if (NZD) { sl(7,"~",cur,Color_NZD,"NZD"); cur+=st; addSymbol("NZDUSD"); }
           }
           for (int t=0; t<ArraySize(symbols); t++) limit = getLimit(limit,symbols[t]);
           if (ArrayRange(trends,0) != Bars) ArrayResize(trends,Bars);
           if (ArrayRange(trendl,0) != Bars) ArrayResize(trendl,Bars);

   ArrayInitialize(values,-1);
   if (calculateValue || timeFrame==Period())   
   {
      for(i = 0, r=Bars-1; i < limit; i++,r--)
      {
         if (EUR) {
              double EURUSD_Fast = ma("EURUSD", MaFast, MaMethod, Price, i);
              double EURUSD_Slow = ma("EURUSD", MaSlow, MaMethod, Price, i);
                 if (!EURUSD_Fast || !EURUSD_Slow) break; }
         if(GBP) {
              double GBPUSD_Fast = ma("GBPUSD", MaFast, MaMethod, Price, i);
              double GBPUSD_Slow = ma("GBPUSD", MaSlow, MaMethod, Price, i);
                 if(!GBPUSD_Fast || !GBPUSD_Slow) break;  }
         if(AUD) {
              double AUDUSD_Fast = ma("AUDUSD", MaFast, MaMethod, Price, i);
              double AUDUSD_Slow = ma("AUDUSD", MaSlow, MaMethod, Price, i);
                 if(!AUDUSD_Fast || !AUDUSD_Slow) break;  }
         if(NZD) {
              double NZDUSD_Fast = ma("NZDUSD", MaFast, MaMethod, Price, i);
              double NZDUSD_Slow = ma("NZDUSD", MaSlow, MaMethod, Price, i);
                 if(!NZDUSD_Fast || !NZDUSD_Slow)  break; }
         if(CAD) {
              double USDCAD_Fast = ma("USDCAD", MaFast, MaMethod, Price, i);
              double USDCAD_Slow = ma("USDCAD", MaSlow, MaMethod, Price, i);
                 if(!USDCAD_Fast || !USDCAD_Slow) break; }
         if(CHF) {
              double USDCHF_Fast = ma("USDCHF", MaFast, MaMethod, Price, i);
              double USDCHF_Slow = ma("USDCHF", MaSlow, MaMethod, Price, i);
                 if(!USDCHF_Fast || !USDCHF_Slow) break; }
         if(JPY) {
              double USDJPY_Fast = ma("USDJPY", MaFast, MaMethod, Price, i) / 100.0;
              double USDJPY_Slow = ma("USDJPY", MaSlow, MaMethod, Price, i) / 100.0;
                 if(!USDJPY_Fast || !USDJPY_Slow) break; }

         if(USD)
         {
            arrUSD[i] = 0;
              if(EUR) arrUSD[i] += EURUSD_Slow - EURUSD_Fast;
              if(GBP) arrUSD[i] += GBPUSD_Slow - GBPUSD_Fast;
              if(AUD) arrUSD[i] += AUDUSD_Slow - AUDUSD_Fast;
              if(NZD) arrUSD[i] += NZDUSD_Slow - NZDUSD_Fast;
              if(CHF) arrUSD[i] += USDCHF_Fast - USDCHF_Slow;
              if(CAD) arrUSD[i] += USDCAD_Fast - USDCAD_Slow;
              if(JPY) arrUSD[i] += USDJPY_Fast - USDJPY_Slow;
                    values[0] = arrUSD[i];

         }
         if(EUR)
         {
            arrEUR[i] = 0;
              if(USD) arrEUR[i] += EURUSD_Fast - EURUSD_Slow;
              if(GBP) arrEUR[i] += EURUSD_Fast / GBPUSD_Fast - EURUSD_Slow / GBPUSD_Slow;
              if(AUD) arrEUR[i] += EURUSD_Fast / AUDUSD_Fast - EURUSD_Slow / AUDUSD_Slow;
              if(NZD) arrEUR[i] += EURUSD_Fast / NZDUSD_Fast - EURUSD_Slow / NZDUSD_Slow;
              if(CHF) arrEUR[i] += EURUSD_Fast * USDCHF_Fast - EURUSD_Slow * USDCHF_Slow;
              if(CAD) arrEUR[i] += EURUSD_Fast * USDCAD_Fast - EURUSD_Slow * USDCAD_Slow;
              if(JPY) arrEUR[i] += EURUSD_Fast * USDJPY_Fast - EURUSD_Slow * USDJPY_Slow;
                    values[1] = arrEUR[i];
         }
         if(GBP)
         {
              arrGBP[i] = 0;
              if(USD) arrGBP[i] += GBPUSD_Fast - GBPUSD_Slow;
              if(EUR) arrGBP[i] += EURUSD_Slow / GBPUSD_Slow - EURUSD_Fast / GBPUSD_Fast;
              if(AUD) arrGBP[i] += GBPUSD_Fast / AUDUSD_Fast - GBPUSD_Slow / AUDUSD_Slow;
              if(NZD) arrGBP[i] += GBPUSD_Fast / NZDUSD_Fast - GBPUSD_Slow / NZDUSD_Slow;
              if(CHF) arrGBP[i] += GBPUSD_Fast * USDCHF_Fast - GBPUSD_Slow * USDCHF_Slow;
              if(CAD) arrGBP[i] += GBPUSD_Fast * USDCAD_Fast - GBPUSD_Slow * USDCAD_Slow;
              if(JPY) arrGBP[i] += GBPUSD_Fast * USDJPY_Fast - GBPUSD_Slow * USDJPY_Slow;
                    values[2] = arrGBP[i];
         }
         if(AUD)
         {
              arrAUD[i] = 0;
              if(USD) arrAUD[i] += AUDUSD_Fast - AUDUSD_Slow;
              if(EUR) arrAUD[i] += EURUSD_Slow / AUDUSD_Slow - EURUSD_Fast / AUDUSD_Fast;
              if(GBP) arrAUD[i] += GBPUSD_Slow / AUDUSD_Slow - GBPUSD_Fast / AUDUSD_Fast;
              if(NZD) arrAUD[i] += AUDUSD_Fast / NZDUSD_Fast - AUDUSD_Slow / NZDUSD_Slow;
              if(CHF) arrAUD[i] += AUDUSD_Fast * USDCHF_Fast - AUDUSD_Slow * USDCHF_Slow;
              if(CAD) arrAUD[i] += AUDUSD_Fast * USDCAD_Fast - AUDUSD_Slow * USDCAD_Slow;
              if(JPY) arrAUD[i] += AUDUSD_Fast * USDJPY_Fast - AUDUSD_Slow * USDJPY_Slow;
                    values[5] = arrAUD[i];
         }
         if(NZD)
         {
              arrNZD[i] = 0;
              if(USD) arrNZD[i] += NZDUSD_Fast - NZDUSD_Slow;
              if(EUR) arrNZD[i] += EURUSD_Slow / NZDUSD_Slow - EURUSD_Fast / NZDUSD_Fast;
              if(GBP) arrNZD[i] += GBPUSD_Slow / NZDUSD_Slow - GBPUSD_Fast / NZDUSD_Fast;
              if(AUD) arrNZD[i] += AUDUSD_Slow / NZDUSD_Slow - AUDUSD_Fast / NZDUSD_Fast;
              if(CHF) arrNZD[i] += NZDUSD_Fast * USDCHF_Fast - NZDUSD_Slow * USDCHF_Slow;
              if(CAD) arrNZD[i] += NZDUSD_Fast * USDCAD_Fast - NZDUSD_Slow * USDCAD_Slow;
              if(JPY) arrNZD[i] += NZDUSD_Fast * USDJPY_Fast - NZDUSD_Slow * USDJPY_Slow;
                    values[7] = arrNZD[i];
         }
         if(CAD)
         {
              arrCAD[i] = 0;
              if(USD) arrCAD[i] += USDCAD_Slow - USDCAD_Fast;
              if(EUR) arrCAD[i] += EURUSD_Slow * USDCAD_Slow - EURUSD_Fast * USDCAD_Fast;
              if(GBP) arrCAD[i] += GBPUSD_Slow * USDCAD_Slow - GBPUSD_Fast * USDCAD_Fast;
              if(AUD) arrCAD[i] += AUDUSD_Slow * USDCAD_Slow - AUDUSD_Fast * USDCAD_Fast;
              if(NZD) arrCAD[i] += NZDUSD_Slow * USDCAD_Slow - NZDUSD_Fast * USDCAD_Fast;
              if(CHF) arrCAD[i] += USDCHF_Fast / USDCAD_Fast - USDCHF_Slow / USDCAD_Slow;
              if(JPY) arrCAD[i] += USDJPY_Fast / USDCAD_Fast - USDJPY_Slow / USDCAD_Slow;
                    values[6] = arrCAD[i];
         }
         if(CHF)
         {
              arrCHF[i] = 0;
              if(USD) arrCHF[i] += USDCHF_Slow - USDCHF_Fast;
              if(EUR) arrCHF[i] += EURUSD_Slow * USDCHF_Slow - EURUSD_Fast * USDCHF_Fast;
              if(GBP) arrCHF[i] += GBPUSD_Slow * USDCHF_Slow - GBPUSD_Fast * USDCHF_Fast;
              if(AUD) arrCHF[i] += AUDUSD_Slow * USDCHF_Slow - AUDUSD_Fast * USDCHF_Fast;
              if(NZD) arrCHF[i] += NZDUSD_Slow * USDCHF_Slow - NZDUSD_Fast * USDCHF_Fast;
              if(CAD) arrCHF[i] += USDCHF_Slow / USDCAD_Slow - USDCHF_Fast / USDCAD_Fast;
              if(JPY) arrCHF[i] += USDJPY_Fast / USDCHF_Fast - USDJPY_Slow / USDCHF_Slow;
                    values[3] = arrCHF[i];
         }
         if(JPY)
         {
              arrJPY[i] = 0;
              if(USD) arrJPY[i] += USDJPY_Slow - USDJPY_Fast;
              if(EUR) arrJPY[i] += EURUSD_Slow * USDJPY_Slow - EURUSD_Fast * USDJPY_Fast;
              if(GBP) arrJPY[i] += GBPUSD_Slow * USDJPY_Slow - GBPUSD_Fast * USDJPY_Fast;
              if(AUD) arrJPY[i] += AUDUSD_Slow * USDJPY_Slow - AUDUSD_Fast * USDJPY_Fast;
              if(NZD) arrJPY[i] += NZDUSD_Slow * USDJPY_Slow - NZDUSD_Fast * USDJPY_Fast;
              if(CAD) arrJPY[i] += USDJPY_Slow / USDCAD_Slow - USDJPY_Fast / USDCAD_Fast;
              if(CHF) arrJPY[i] += USDJPY_Slow / USDCHF_Slow - USDJPY_Fast / USDCHF_Fast;
                    values[4] = arrJPY[i];
         }
         for (int k=0;   k<7; k++)
         for (int j=k+1; j<8; j++)
            {
               if (values[k]>values[j]) trends[r][k*8+j] =  1;
               if (values[k]<values[j]) trends[r][k*8+j] = -1;
            }
            if (i==0) ArrayCopy(valuea,values);
         for (k=0;k<8;k++)
         {
            if (values[k]>LevelUp2) trendl[r][k][0] =  1;
            if (values[k]<LevelUp2) trendl[r][k][0] = -1;
            if (values[k]>LevelUp1) trendl[r][k][1] =  1;
            if (values[k]<LevelUp1) trendl[r][k][1] = -1;
            if (values[k]>LevelDn1) trendl[r][k][2] =  1;
            if (values[k]<LevelDn1) trendl[r][k][2] = -1;
            if (values[k]>LevelDn2) trendl[r][k][3] =  1;
            if (values[k]<LevelDn2) trendl[r][k][3] = -1;
         }            
      }
      for(r=Bars-i-1; i >=0; i--,r++)
      {
            if (arrUSD[i]>arrUSD[i+1]) trendl[r][0][4] =  1;
            if (arrUSD[i]<arrUSD[i+1]) trendl[r][0][4] = -1;
            if (arrEUR[i]>arrEUR[i+1]) trendl[r][1][4] =  1;
            if (arrEUR[i]<arrEUR[i+1]) trendl[r][1][4] = -1;
            if (arrGBP[i]>arrGBP[i+1]) trendl[r][2][4] =  1;
            if (arrGBP[i]<arrGBP[i+1]) trendl[r][2][4] = -1;
            if (arrCHF[i]>arrCHF[i+1]) trendl[r][3][4] =  1;
            if (arrCHF[i]<arrCHF[i+1]) trendl[r][3][4] = -1;
            if (arrJPY[i]>arrJPY[i+1]) trendl[r][4][4] =  1;
 

Показано первые 50% кода (символов: 24615)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 461,50₽ ≈ $30.08