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

grid strategy 21112024 - 1_5363996961055735984.mq4

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

pro +.pineTradingView · 3 общих теговofada_gold_trader_v230.mq5MQL5 / MetaTrader 5 · 3 общих теговmulti strategy algo combined by enigma mode.pineTradingView · 3 общих теговmelona ob strategy 6th update (by 3dots).pineTradingView · 3 общих теговsmc+ict+indicators+scalping master.pineTradingView · 3 общих теговpremium_super_scalping killer algo.pineTradingView · 3 общих тегов
Вы автор или правообладатель?

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

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

О программе

Данный продукт представляет собой торгового робота (Expert Advisor) для MetaTrader 4, реализующий сеточную (grid) торговлю. Робот управляет семью торговыми стратегиями одновременно, каждая из которых использует свой индикатор для генерации сигналов на покупку или продажу: скользящие средние (MA), полосы Боллинджера (BB), паттерны свечей, стохастик, MACD и RSI. Стратегии работают параллельно и идентифицируются уникальными магическими числами.

Основная логика заключается в открытии и управлении сеткой ордеров: при отсутствии позиций робот открывает сделку, а при необходимости — добавляет дополнительные ордера на заданном расстоянии (iOrderStep). Лоты рассчитываются либо как фиксированное значение, либо как процент от свободного маржинального баланса с возможностью умножения. При достижении определённых условий робот модифицирует стоп-лоссы и тейк-профиты существующих позиций. Если совокупный профит с учётом начального депозита стратегии становится отрицательным, все позиции стратегии закрываются и она отключается.

Параметры настраиваются пользователем через входные переменные: размер тейк-профита, тип расчёта лота, начальный лот, множитель, дистанция между позициями, минимальный профит в пунктах и допустимое проскальзывание. Робот не является автоматическим советником в терминологии Pine Script — это полноценный MQL4-советник для ручной или автоматической торговли на платформе MetaTrader 4.

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

НастройкаОписание
iTakeProfit Размер тейк-профита в пунктах, устанавливаемый на первом ордере стратегии при его открытии. При значении 0 тейк-профит не устанавливается.
iTypeLots Тип расчёта начального лота: «Лоты» — фиксированное числовое значение, «Процент» — расчёт лота как процента от свободного маржинального баланса.
iStartLots Начальный размер лота для первой позиции в сетке. Используется также как базовое значение при расчёте лота в процентном режиме.
iMultiplier Множитель лота, применяемый при расчёте размера лота для дополнительных позиций в сетке. Умножает лот предыдущей позиции.
iOrderStep Дистанция между позициями в сетке, измеряемая в пунктах. Определяет расстояние, при котором открывается следующий ордер.
iMinimalProfit Минимальный профит в пунктах, используемый при расчёте средневзвешенных цен для модификации ордеров. Задаётся в пунктах цены.
iSlippage Допустимое проскальзывание цены при отправке рыночных ордеров и модификации существующих позиций, измеряемое в пунктах.
Получить полный код

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

#property version     "24.110"
#property description "Разработка торговых роботов и автоматизация торговых процессов."
#property description "Уведомления о начале вебинара в телеграмм "
#property strict
/*
Название торгового робота?
*/
enum ENUM_TYPE_CALC_LOTS
  {
   Lots    = 0, // Лоты
   Percent = 1  // Процент
  };

input int                  iTakeProfit         = 300;      // Тейк Профит
sinput ENUM_TYPE_CALC_LOTS iTypeLots           = Lots;     // Тип рассчета лота Процент или Значение
sinput double              iStartLots          = 0.01;     // Начальный лот
input double               iMultiplier         = 2.0;      // Множитель лота
input int                  iOrderStep          = 290;      // Дистанция между позициями
input int                  iMinimalProfit      = 30;       // Минимальный профит в пунктах
sinput int                 iSlippage           = 30;       // Проскальзывание

struct _str_
  {
   /* 01 */int               magic;         // === Меджик номер стратегии, он же порядковый номер стратегии
   /* 02 */string            name;          // === Имя торговой стратегии
   /* 03 */double            depo;          // === Депозит выделенный торговой стратегии
   /* 04 */bool              work;          // === Признак работы торговой стратегии true - работать false - выключить

   /* 05 */string            descr;         // === Тектовое описание результата работы
   /* 06 */datetime          time_start;    // === Время начала работы стратегии
   /* 07 */datetime          time_stop;     // === Время конца  работы стратегии
   /* 08 */int               deals;         // === Количество сделок по стратегии
   /* 09 */double            profit;        // === Профит стратегии за время теста    (Профит в день)   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   /* 10 */double            deals_d;       // === Количество сделок в день

   void              Print()
     {

      double pos_day = ((int)time_stop - (int)time_start) / (60 * 60 * 24);
      pos_day = pos_day == 0 ? 1 : pos_day;

      ::Print(" =============================================== ");
      ::Print("                         Итоговый баланс " + DoubleToString(depo + profit, 2));
      ::Print("                      Причина остановки " + (work ? "Конец теста Успех!" : " Потеря депозита, Провал!"));
      ::Print("                   Позиций в день " + DoubleToString(deals / pos_day, 2));
      ::Print("                Чистый профит " + DoubleToString(profit, 2));
      ::Print("             Позиций всего " + IntegerToString(deals));
      ::Print("          Дата стоп " + TimeToString(time_stop, TIME_DATE | TIME_SECONDS));
      ::Print("       Дата старт " + TimeToString(time_start, TIME_DATE | TIME_SECONDS));
      ::Print("    Депозит " + DoubleToString(depo, 2));
      ::Print(" Стратегия " + name + " Magic " + (string)magic);
      ::Print(" =============================================== ");
     }
  };
_str_ strategy[] =
  {

     {1, "MA",         500, true, "",  NULL, NULL, 0, 0, 0},
     {2, "BB",         500, true, "",  NULL, NULL, 0, 0, 0},
     {3, "Candle 1",   500, true, "",  NULL, NULL, 0, 0, 0},
     {4, "Candle 2",   500, true, "",  NULL, NULL, 0, 0, 0},
     {5, "Stochastic", 500, true, "",  NULL, NULL, 0, 0, 0},
     {6, "MACD",       500, true, "",  NULL, NULL, 0, 0, 0},
     {7, "RSI",        500, true, "",  NULL, NULL, 0, 0, 0},
  };

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

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

bool Strategy(int iIndex)
  {

   double
   BuyPriceMax = 0, BuyPriceMin = 0, BuyPriceMaxLot = 0, BuyPriceMinLot = 0, BuyPriceSumm = 0, BuyLotsSumm = 0,
   SelPriceMin = 0, SelPriceMax = 0, SelPriceMinLot = 0, SelPriceMaxLot = 0, SelPriceSumm = 0, SelLotsSumm = 0,

   op = 0, lt = 0, sl = 0, tp = 0, profit = 0;

   int    b = 0, s = 0, ty = -1, tk = -1;

   int    BuyTicMax = -1, BuyTicMin = -1, SelTicMax = -1, SelTicMin = -1;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(strategy[iIndex].work)                            // === Стратегии разрешено работать
            if(OrderMagicNumber() == strategy[iIndex].magic)
               if(OrderSymbol() == _Symbol)
                 {

                  op = OrderOpenPrice();
                  lt = OrderLots();
                  ty = OrderType();
                  tk = OrderTicket();

                  if(ty == OP_BUY)
                    {
                     if(op > BuyPriceMax || BuyPriceMax == 0)
                       {
                        BuyPriceMax    = op;
                        BuyPriceMaxLot = lt;
                        BuyTicMax      = tk;

                       }
                     if(op < BuyPriceMin || BuyPriceMin == 0)
                       {
                        BuyPriceMin    = op;
                        BuyPriceMinLot = lt;
                        BuyTicMin      = tk;
                       }
                     b++;
                     BuyPriceSumm += op * lt;
                     BuyLotsSumm  += lt;
                    }

                  if(ty == OP_SELL)
                    {
                     if(op > SelPriceMax || SelPriceMax == 0)
                       {
                        SelPriceMax    = op;
                        SelPriceMaxLot = lt;
                        SelTicMax      = tk;
                       }
                     if(op < SelPriceMin || SelPriceMin == 0)
                       {
                        SelPriceMin    = op;
                        SelPriceMinLot = lt;
                        SelTicMin      = tk;
                       }
                     s++;
                     SelPriceSumm += op * lt;
                     SelLotsSumm  += lt;
                    }
                 }

   double AwerageBuyPrice = 0, AwerageSelPrice = 0;
   if(b >= 2 && BuyLotsSumm > 0 && b <= 3)
      AwerageBuyPrice = Nd((BuyPriceSumm / BuyLotsSumm) + iMinimalProfit * _Point);
   if(s >= 2 && SelLotsSumm > 0 && s <= 3)
      AwerageSelPrice = Nd((SelPriceSumm / SelLotsSumm) - iMinimalProfit * _Point);

   if(b >= 4 && BuyLotsSumm > 0)
      AwerageBuyPrice = Nd((BuyPriceMax * BuyPriceMaxLot + BuyPriceMin * BuyPriceMinLot) / (BuyPriceMaxLot + BuyPriceMinLot) + iMinimalProfit * _Point);
   if(s >= 4 && SelLotsSumm > 0)
      AwerageSelPrice = Nd((SelPriceMax * SelPriceMaxLot + SelPriceMin * SelPriceMinLot) / (SelPriceMaxLot + SelPriceMinLot) - iMinimalProfit * _Point);

   double BuyLot = 0, SelLot = 0;
   if(b == 0)
      BuyLot = iTypeLots == Percent ? LotPercent(iStartLots) : iStartLots;
   else
      BuyLot = BuyPriceMinLot * iMultiplier;  // Добавить код пересчета с 0,01 * 1,5 =

   if(s == 0)
      SelLot = iTypeLots == Percent ? LotPercent(iStartLots) : iStartLots;
   else
      SelLot = SelPriceMaxLot * iMultiplier;

   BuyLot = CheckVolumeValue(BuyLot);
   SelLot = CheckVolumeValue(SelLot);

   if(strategy[iIndex].work)                            // === Стратегии разрешено работать
     {
      if(Signal(strategy[iIndex].magic) == OP_BUY)
         if((b == 0) || (b > 0 && (BuyPriceMin - Ask) >= (iOrderStep * _Point)))
            if(OrderSend(_Symbol, OP_BUY, Nd(BuyLot, 2), Nd(Ask), iSlippage, 0, 0, "Grid", strategy[iIndex].magic, 0, clrGreen) < 0)
               Print("OrderSend error OP_BUY #", GetLastError());

      if(Signal(strategy[iIndex].magic) == OP_SELL)
         if((s == 0) || (s > 0 && (Bid - SelPriceMax) >= (iOrderStep * _Point)))
            if(OrderSend(_Symbol, OP_SELL, Nd(SelLot, 2), Nd(Bid), iSlippage, 0, 0, "Grid", strategy[iIndex].magic, 0, clrGreen) < 0)
               Print("OrderSend error OP_SELL #", GetLastError());
     }

   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(strategy[iIndex].work)                            // === Стратегии разрешено работать
            if(OrderMagicNumber() == strategy[iIndex].magic)
               if(OrderSymbol() == _Symbol)
           

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

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

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

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

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

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

Стоимость полного кода
988,60₽ ≈ $12.08