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

OGT Zone Recovery EA

ogt zone recovery ea v1.5.1@amazing_owner.mq4

Похожие материалы по тегам

ares_indicator.pineTradingView · 1 общих теговgold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов! cycle-identifier.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 1 общих теговprecisionflowea.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

OGT Zone Recovery EA — торговый советник для MetaTrader 4, реализующий стратегию восстановления позиций (zone recovery). Советник отслеживает сигналы RSI на множестве таймфреймов (от M1 до месячного) и открывает начальные рыночные ордера в направлении противоположном текущему тренду. При движении цены в зону убытка активируется механизм восстановления с открытием противоположных стоп-ордеров и увеличением объёма.

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

Советник работает на каждом тике или только при открытии нового бара (настраиваемый параметр). Включена имитация комиссии и проскальзывания для бэктестинга. Все торговые операции выполняются через стандартный API OrderSend с обработкой ошибок и повторными попытками.

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

НастройкаОписание
ZONE RECOVERY SETTINGS ** (RecoverySettings) Настройки Восстановления Зон — Заголовок раздела настроек восстановления зон
Recovery Zone Size (points) (RecoveryZoneSize) Размер Зоны Восстановления — Размер зоны восстановления (в пунктах)
Take Profit (points) (TakeProfit) Тейк-Профит — Тейк-профит начального ордера (в пунктах)
Max Trades (0 for unlimited) (MaxTrades) Максимальное Количество Сделок — Максимальное количество одновременных сделок (0 — без ограничений)
Max Loss after Max Trades reached? (SetMaxLoss) Установить Максимальный Убыток — Включение ограничения убытка по сумме после достижения максимального количества сделок
Max Loss after Max Trades (0 for unlimted) in deposit currency. (MaxLoss) Максимальный Убыток — Максимальный убыток в валюте депозита, после которого все сделки закрываются (0 — без ограничений)
Use a Recovery Take Profit (UseRecoveryTakeProfit) Использовать Тейк-Профит Восстановления — Включение отдельного тейк-профита для ордеров восстановления
Recovery Take Profit (points). (RecoveryTakeProfit) Тейк-Профит Восстановления — Тейк-профит для ордеров восстановления (в пунктах)
Price for pending orders (PendingPrice) Цена Отложенных Ордеров — Цена для открытия отложенных ордеров
ATR Dynamic Zone Sizing ** (ATRHeader) ATR Динамические Зоны — Заголовок раздела настроек динамического определения зон через ATR
Use ATR? (UseATR) Использовать ATR — Включение использования индикатора ATR для динамического определения размеров зон и тейк-профитов
ATR Period (ATRPeriod) Период ATR — Период индикатора ATR для расчёта зон и тейк-профитов
Fraction of ATR to use as Recovery Zone (ATRZoneFraction) Доля ATR для Зоны — Доля ATR, используемая для определения размера зоны восстановления
Fraction or ATR to use for TP sizes (ATRTPFraction) Доля ATR для Тейк-Профита — Доля ATR, используемая для определения размера тейк-профита
Fraction of ATR to use for recovery TP. (ATRRecoveryZone) Доля ATR для Восстановления — Доля ATR, используемая для определения тейк-профита восстановления
MONEY MANAGEMENT SETTINGS ** (MoneyManagement) Управление Деньгами — Заголовок раздела настроек управления денежными средствами
Account % Initial Lot Size (set to 0 if not used) (RiskPercent) Процент Риска — Процент риска от депозита для расчёта размера лота (0 — не используется)
Initial Lot Size (if % not used) (InitialLotSize) Начальный Размер Лота — Начальный размер лота (используется при отключённом управлении риском в процентах)
Multiplier for Lots (LotMultiplier) Множитель Лота — Множитель для увеличения размера лота при каждом последующем ордере восстановления
LotAdditions Добавка к Лоту — Дополнительное значение, добавляемое к объёму при расчёте лота восстановления
CUSTOM LOT SIZES ** (CustomLotSizing) Пользовательские Размеры Лота — Заголовок раздела пользовательских размеров лота
CustomLotSize1 Пользовательский Лот 1 — Первый пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize2 Пользовательский Лот 2 — Второй пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize3 Пользовательский Лот 3 — Третий пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize4 Пользовательский Лот 4 — Четвёртый пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize5 Пользовательский Лот 5 — Пятый пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize6 Пользовательский Лот 6 — Шестой пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize7 Пользовательский Лот 7 — Седьмой пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize8 Пользовательский Лот 8 — Восьмой пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize9 Пользовательский Лот 9 — Девятый пользовательский размер лота (если используется кастомное управление объёмом)
CustomLotSize10 Пользовательский Лот 10 — Десятый пользовательский размер лота (если используется кастомное управление объёмом)
TIMER SETTINGS ** (TimerSettings) Настройки Таймера — Заголовок раздела настроек торгового таймера
Use a Trade Timer? (UseTimer) Использовать Таймер — Включение торгового таймера с заданными часами начала и окончания
Start Hour (StartHour) Час Начала — Час начала торгового таймера
Start Minute (StartMinute) Минута Начала — Минута начала торгового таймера
End Hour (EndHour) Час Окончания — Час окончания торгового таймера
End Minute (EndMinute) Минута Окончания — Минута окончания торгового таймера
Use local time? (UseLocalTime) Использовать Локальное Время — Использование локального времени вместо серверного для торгового таймера
EA SETTINGS ** (TradeSettings) Настройки Советника — Заголовок раздела основных настроек советника
EA_Mode Режим Советника — Режим работы советника: ручной (Manual) или на основе RSI на множестве таймфреймов (RSI_MTF)
RSI Period (RSIPeriod) Период RSI — Период индикатора RSI, используемого для определения сигналов
Over-bought level (OverboughtLevel) Уровень Перекупленности — Уровень перекупленности RSI для генерации сигнала на продажу
Over-sold level (OversoldLevel) Уровень Перепроданности — Уровень перепроданности RSI для генерации сигнала на покупку
Use M1 Timeframe? (UseM1Timeframe) Использовать Таймфрейм M1 — Включение 1-минутного таймфрейма для определения сигналов RSI
Use M5 Timeframe? (UseM5Timeframe) Использовать Таймфрейм M5 — Включение 5-минутного таймфрейма для определения сигналов RSI
Use M15 Timeframe? (UseM15Timeframe) Использовать Таймфрейм M15 — Включение 15-минутного таймфрейма для определения сигналов RSI
Use M30 Timeframe? (UseM30Timeframe) Использовать Таймфрейм M30 — Включение 30-минутного таймфрейма для определения сигналов RSI
Use H1 Timeframe? (UseH1Timeframe) Использовать Таймфрейм H1 — Включение часового таймфрейма для определения сигналов RSI
Use H4 Timeframe? (UseH4Timeframe) Использовать Таймфрейм H4 — Включение четырёхчасового таймфрейма для определения сигналов RSI
Use Daily Timeframe? (UseDailyTimeframe) Использовать Таймфрейм D1 — Включение ежедневного таймфрейма для определения сигналов RSI
Use Weekly Timeframe? (UseWeeklyTimeframe) Использовать Таймфрейм W1 — Включение недельного таймфрейма для определения сигналов RSI
Use Monthly Timeframe? (UseMonthlyTimeframe) Использовать Таймфрейм MN1 — Включение месячного таймфрейма для определения сигналов RSI
VISUALS ** (Visuals) Визуальные Настройки — Заголовок раздела визуальных настроек
profitLineColor Цвет Линии Прибыли — Цвет линии тейк-профита на графике
Panel X coordinate. (Panel_X) X-координата Панели — Координата X положения торговой панели на графике
Panel Y coordinate. (Panel_Y) Y-координата Панели — Координата Y положения торговой панели на графике
Panel background colour. (Panel_Color) Цвет Фона Панели — Цвет фона торговой панели на графике
Panel lable text color. (Panel_Lable_Color) Цвет Текста Панели — Цвет текста меток на торговой панели
OTHER SETTINGS ** (BacktestingSettings) Настройки Бэктестинга — Заголовок раздела настроек бэктестинга
Magic Number (MagicNumber) Магический Номер — Магический номер для идентификации ордеров, открытых данным советником
Slippage Max (Points). (Slippage) Проскальзывание — Максимальное допустимое проскальзывание (в пунктах)
Trade on New Bar? (TradeOnBarOpen) Торговля при Открытии Бара — Открытие сделок только при появлении нового бара
Back tester speed (speed) Скорость Тестирования — Скорость бэктестера (количество тиков в секунду при визуальном тестировании)
Back tester simulated commission (TestCommission) Комиссия для Тестирования — Симулированная комиссия для бэктестинга
Получить полный код

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

#property description   "Coded by: A Sweeney"

#property strict

enum EA_Setting {Manual, RSI_MTF};

enum CLOSE_PENDING_TYPE
{
   CLOSE_BUY_LIMIT,
   CLOSE_SELL_LIMIT,
   CLOSE_BUY_STOP,
   CLOSE_SELL_STOP,
   CLOSE_ALL_PENDING
};

sinput string RecoverySettings; // ** ZONE RECOVERY SETTINGS **
extern int RecoveryZoneSize = 200; // Recovery Zone Size (points)
extern int TakeProfit = 200; // Take Profit (points)
input int MaxTrades = 0; // Max Trades (0 for unlimited)
input bool SetMaxLoss = false; // Max Loss after Max Trades reached?
input double MaxLoss = 0; // Max Loss after Max Trades (0 for unlimted) in deposit currency.
input bool UseRecoveryTakeProfit = true; // Use a Recovery Take Profit
input int RecoveryTakeProfit = 50; // Recovery Take Profit (points).
extern double PendingPrice = 0; // Price for pending orders

sinput string ATRHeader; // ** ATR Dynamic Zone Sizing **
input bool UseATR = false; // Use ATR?
input int ATRPeriod = 14; // ATR Period
input double ATRZoneFraction = 0.2; // Fraction of ATR to use as Recovery Zone
input double ATRTPFraction = 0.3; // Fraction or ATR to use for TP sizes
input double ATRRecoveryZone = 0.15; // Fraction of ATR to use for recovery TP.

sinput string MoneyManagement;  	// ** MONEY MANAGEMENT SETTINGS **
input double RiskPercent = 0; // Account % Initial Lot Size  (set to 0 if not used) 
input double InitialLotSize = 0.1; // Initial Lot Size (if % not used)
input double LotMultiplier = 2; // Multiplier for Lots
input double LotAdditions = 0;
sinput string CustomLotSizing; // ** CUSTOM LOT SIZES **
input double CustomLotSize1 = 0;
input double CustomLotSize2 = 0;
input double CustomLotSize3 = 0;
input double CustomLotSize4 = 0;
input double CustomLotSize5 = 0;
input double CustomLotSize6 = 0;
input double CustomLotSize7 = 0;
input double CustomLotSize8 = 0;
input double CustomLotSize9 = 0;
input double CustomLotSize10 = 0;

sinput string TimerSettings;			// **  TIMER SETTINGS **
input bool UseTimer = false; // Use a Trade Timer?
input int StartHour = 0; // Start Hour
input int StartMinute = 0; // Start Minute
input int EndHour = 0; // End Hour
input int EndMinute = 0; // End Minute
input bool UseLocalTime = false; // Use local time?

sinput string TradeSettings;    	// ** EA SETTINGS **
input EA_Setting EA_Mode= Manual;
input int RSIPeriod = 14; // RSI Period
input double OverboughtLevel = 70; //Over-bought level
input double OversoldLevel = 30; // Over-sold level
input bool UseM1Timeframe = false; // Use M1 Timeframe?
input bool UseM5Timeframe = false; // Use M5 Timeframe?
input bool UseM15Timeframe = true; // Use M15 Timeframe?
input bool UseM30Timeframe = true; // Use M30 Timeframe?
input bool UseH1Timeframe = false; // Use H1 Timeframe?
input bool UseH4Timeframe = false; // Use H4 Timeframe?
input bool UseDailyTimeframe = false; // Use Daily Timeframe?
input bool UseWeeklyTimeframe = false; // Use Weekly Timeframe?
input bool UseMonthlyTimeframe = false; // Use Monthly Timeframe?

sinput string Visuals; // ** VISUALS **
input color profitLineColor = clrLightSeaGreen;
input int Panel_X = 40; // Panel X coordinate.
input int Panel_Y = 40; // Panel Y coordinate.
input color Panel_Color = clrBlack; // Panel background colour.
input color Panel_Lable_Color = clrWhite; // Panel lable text color.

sinput string BacktestingSettings; // ** OTHER SETTINGS **
input int MagicNumber = 141020; // Magic Number
input int Slippage = 100; // Slippage Max (Points).
input bool TradeOnBarOpen = true; // Trade on New Bar?
input int speed = 500; // Back tester speed
input double TestCommission = 7; // Back tester simulated commission

#define EA_NAME "OGT Zone Recovery v1.5.0"
#define SELL_BUTTON "Sell Button"
#define BUY_BUTTON "Buy Button"
#define PENDING_EDIT "Pending Edit"
#define CLOSE_ALL_BUTTON "Close All Button"
#define TP_EDIT "TP Edit"
#define ZONE_EDIT "Zone Edit"
string gTradingPanelObjects[100];
#define PROFIT_LINE "Profit Line"

datetime gLastTime;
int gInitialTicket;
double gBuyOpenPrice;
double gSellOpenPrice;
double gBuyTakeProfit;
double gSellTakeProfit;
double gLotSize;
double gInitialLotSize;
double gInitialProfitTarget;
bool gRecoveryInitiated;
int gBuyStopTicket = 0;
int gSellStopTicket = 0;
int gBuyTicket = 0;
int gSellTicket = 0;
double gCustomLotSizes[10]; 

double UsePip;
double UseSlippage;
double gCurrentDirection;

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

void OnDeinit(const int reason)
{
   switch(reason)
   {
      case 0:
      {
         DeleteTradePanel();
         Print("EA De-Initialised, removed by EA");
         break;
      }
      case 1:
      {
         DeleteTradePanel();
         Print("EA De-Initialised, removed by user");
         break;
      }
      case 2:
      {
         DeleteTradePanel();
         Print("EA De-Initialised, EA recompiled");
         break;
      }
      case 3:
      {
         DeleteTradePanel();
         Print("EA De-Initialised, Symbol changed");
         break;
      }   
      case 4:
      {
         DeleteTradePanel();
         Print("EA De-Initialised, chart closed by user.");
         break;
      }
      case 5:
      {
         Print("EA De-Initialised, input parameters changed.");
         break;
      }
      case 6:
      {
         Print("EA De-Initialised, account changed");
         break;
      }
      case 7:
      {
         DeleteTradePanel();
         Print("EA De-Initialised, A new template has been applied.");
         break;
      }
      case 8:
      {
         DeleteTradePanel();
         Print("EA De-Initialised, EA failed to initialize.");
         break;
      }
      case 9:
      {
         DeleteTradePanel();
         Print("EA De-Initialised, Terminal closed by user.");
         break;
      }  
   }
}

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

void TakeTrade(int direction)
{

    double tp = 0;
    double rz = 0;

    if(UseATR == true)
    {
      double atr = iATR(_Symbol, PERIOD_D1, ATRPeriod, 1);
      tp = atr*ATRTPFraction;
      rz = atr*ATRZoneFraction;

    } else if(UseATR == false)
    {
      tp = TakeProfit*_Point; // tp as price units
      rz = RecoveryZoneSize*_Point; // rz as price
    }
    if(CustomLotSize1 != 0) gLotSize = CustomLotSize1;
    else gLotSize = gInitialLotSize;

    double price = 0;

   if(direction == 1)
   {

       gBuyTicket = OpenMarketOrder(Symbol(), OP_BUY, gLotSize, "Initial Buy Order", clrGreen);
       if(OrderSelect(gBuyTicket, SELECT_BY_TICKET))
       {                 
          gBuyOpenPrice = OrderOpenPrice();       
          gSellOpenPrice = NormalizeDouble((gBuyOpenPrice - rz), _Digits);
          gBuyTakeProfit = NormalizeDouble((gBuyOpenPrice + tp), _Digits);
          gSellTakeProfit = NormalizeDouble((gBuyOpenPrice - (tp + rz)), _Digits);

          gLotSize = GetTradeVolume(2);
          gSellStopTicket = OpenPendingOrder(Symbol(), OP_SELLSTOP, gLotSize, gSellOpenPrice, 0, 0, "Initial Recovery Sell Stop)", 0, clrPink);
          gCurrentDirection = direction;
          price = gBuyOpenPrice;
       }
   }

   else if(direction == -1)
   {
       gSellTicket = OpenMarketOrder(Symbol(), OP_SELL, gLotSize, "Initial Sell Order", clrRed);
       if(OrderSelect(gSellTicket, SELECT_BY_TICKET))
       {
          gSellOpenPrice = OrderOpenPrice(); 
          gBuyOpenPrice = NormalizeDouble((gSellOpenPrice + rz), _Digits);
          gSellTakeProfit = NormalizeDouble((gSellOpenPrice - tp), _Digits);
          gBuyTakeProfit = NormalizeDouble((gSellOpenPrice + (tp + rz)), _Digits);

          gLotSize = GetTradeVolume(2);
          gBuyStopTicket = OpenPendingOrder(Symbol(), OP_BUYSTOP, gLotSize, gBuyOpenPrice, 0, 0, "Initial Recovery Buy Stop)", 0, clrTurquoise);
          gCurrentDirection = direction;
          price = gSellOpenPrice;
       }
   }
   CreateProfitLine(direction, price, tp); 
}

void PlaceTrade(int pType)
{
    double tp = 0;
    double rz = 0;

    if(UseATR == true)
    {
      double atr = iATR(_Symbol, PERIOD_D1, ATRPeriod, 1);
      tp = atr*ATRTPFraction;
      rz = atr*ATRZoneFraction;

    } else if(UseATR == false)
    {
      tp = TakeProfit*_Point;  // tp as price
      rz = RecoveryZoneSize*_Point; // rz  as price
    }
    if(CustomLotSize1 != 0) gLotSize = CustomLotSize1;
    else gLotSize = gInitialLotSize;

    if(pType == OP_BUYLIMIT)
    {
      gBuyStopTicket = OpenPendingOrder(_Symbol, OP_BUYLIMIT, gLotSize, PendingPrice, 0, 0, "Buy Limit Order", 0, 0);
      gBuyOpenPrice = PendingPrice;       
      gSellOpenPrice = NormalizeDouble((gBuyOpenPrice - rz), _Digits);
      gCurrentDirection = -1;

    } else if(pType == OP_BUYSTOP)
    {
      gBuyStopTicket = OpenPendingOrder(_Symbol, OP_BUYSTOP, gLotSize, PendingPrice, 0, 0, "Buy Stop Order", 0, 0);
      gBuyOpenPrice = PendingPrice;       
      gSellOpenPrice = NormalizeDouble((gBuyOpenPrice - rz), _Digits);
      gCurrentDirection = -1;

    } else if(pType == OP_SELLLIMIT)
    {
      gSellOpenPrice = PendingPrice; 
      gBuyOpenPrice = NormalizeDouble((gSellOpenPrice + rz), _Digits);
      gSellStopTicket = OpenPendingOrder(_Symbol, OP_SELLLIMIT, gLotSize, PendingPrice, 0, 0,  "Sell Limit Order", 0, 0);
      gCurrentDirection = 1;
    } else if(pType == OP_SELLSTOP)
    {
      gSellOpenPrice = PendingPrice; 
      gBuyOpenPrice = NormalizeDouble((gSellOpenPrice + rz), _Digits);
      gSellStopTicket = OpenPendingOrder(_Symbol, OP_SELLSTOP, gLotSize, PendingPrice, 0, 0,  "Sell Stop Order", 0, 0);
      gCurrentDirection = 1;
    }
    CreateProfitLine(gCurrentDirection, PendingPrice, 0);
}

int Is_RSI_OBOS_on_MTF(int shift)
{
   int direction = 0;

   double rsi = iRSI(_Symbol, PERIOD_M1, RSIPeriod, PRICE_CLOSE, shift);
   if((UseM1Timeframe == false) || (rsi < OversoldLevel))
   {
      rsi = iRSI(_Symbol, PERIOD_M5, RSIPeriod, PRICE_CLOSE, shift);
      if(UseM5Timeframe == false || (rsi < OversoldLevel))
      {
         rsi = iRSI(_Symbol, PERIOD_M15, RSIPeriod, PRICE_CLOSE, shift);
         if((UseM15Timeframe == false) || (rsi < OversoldLevel))
         {
            rsi = iRSI(_Symbol, PERIOD_M30, RSIPeriod, PRICE_CLOSE, shift);
            if((UseM30Timeframe == false) || (rsi < OversoldLevel))
            {
               rsi = iRSI(_Symbol, PERIOD_H1, RSIPeriod, PRICE_CLOSE, shift);
               if((UseH1Timeframe == false) || (rsi < OversoldLevel))
               {
                  rsi = iRSI(_Symbol, PERIOD_H4, RSIPeriod, PRICE_CLOSE, shift);
                  if((UseH4Timeframe == false) || (rsi < OversoldLevel))
                  {
                     rsi = iRSI(_Symbol, PERIOD_D1, RSIPeriod, PRICE_CLOSE, shift);
                     if((UseDailyTimeframe == false) || (rsi < OversoldLevel))
                     {
                        rsi = iRSI(_Symbol, PERIOD_W1, RSIPeriod, PRICE_CLOSE, shift);
                        if((UseWeeklyTimeframe == false) || (rsi < OversoldLevel))
                        {
                           rsi = iRSI(_Symbol, PERIOD_MN1, RSIPeriod, PRICE_CLOSE, shift);
                           if((UseMonthlyTimeframe == false) || (rsi < OversoldLevel))
                           {
                              direction = 1;
                              return direction;
                           }
                        }
                     }                     
                  }
               }
            }
         }
      }
   }

   rsi = iRSI(_Symbol, PERIOD_M1, RSIPeriod, PRICE_CLOSE, shift);
   if((UseM1Timeframe == false) || (rsi > OverboughtLevel))
   {
      rsi = iRSI(_Symbol, PERIOD_M5, RSIPeriod, PRICE_CLOSE, shift);
      if(UseM5Timeframe == false || (rsi > OverboughtLevel))
      {
         rsi = iRSI(_Symbol, PERIOD_M15, RSIPeriod, PRICE_CLOSE, shift);
         if((UseM15Timeframe == false) || (rsi > OverboughtLevel))
         {
            rsi = iRSI(_Symbol, PERIOD_M30, RSIPeriod, PRICE_CLOSE, shift);
            if((UseM30Timeframe == false) || (rsi > OverboughtLevel))
            {
               rsi = iRSI(_Symbol, PERIOD_H1, RSIPeriod, PRICE_CLOSE, shift);
               if((UseH1Timeframe == false) || (rsi > OverboughtLevel))
               {
                  rsi = iRSI(_Symbol, PERIOD_H4, RSIPeriod, PRICE_CLOSE, shift);
                  if((UseH4Timeframe == false) || (rsi > OverboughtLevel))
                  {
                     rsi = iRSI(_Symbol, PERIOD_D1, RSIPeriod, PRICE_CLOSE, shift);
                     if((UseDailyTimeframe == false) || (rsi > OverboughtLevel))
                     {
                        rsi = iRSI(_Symbol, PERIOD_W1

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

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

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

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

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

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

Стоимость полного кода
3 260,10₽ ≈ $39.84