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

grid strategy 21112024 - 2or_5363996961055735985.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, реализующий сеточную торговую систему. Робот управляет несколькими стратегиями одновременно, каждая из которых использует свой магический номер и может быть включена или выключена независимо.

Сигналы для открытия позиций формируются семью различными индикаторными стратегиями: скользящие средние MA, полосы Боллинджера, паттерны свечей, стохастик, MACD и RSI. Каждая стратегия имеет собственные параметры и логику формирования сигналов на покупку или продажу.

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

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

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

НастройкаОписание
iTakeProfit Тейк Профит — расстояние в пунктах для установки уровня тейк-профита при первом открытии позиции.
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)
                 {

                  op = OrderOpenPrice();
          

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

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

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

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

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

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

Стоимость полного кода
989,40₽ ≈ $12.09