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

two_ma_cross.mq4

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

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

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

О программе

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

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

НастройкаОписание
First MA Method (Ma1Method) Метод первой MA — Тип скользящей средней для первой MA (например, SMA, EMA).
First MA Period (Ma1Preiod) Период первой MA — Период расчёта первой скользящей средней.
First Ma Shift (Ma1Shift) Сдвиг первой MA — Горизонтальное смещение первой скользящей средней по графику.
First MA Applied Price (Ma1Price) Цена применения первой MA — Тип цены, на основе которой рассчитывается первая скользящая средняя.
Second MA Method (Ma2Method) Метод второй MA — Тип скользящей средней для второй MA (например, SMA, EMA).
Second MA Period (Ma2Preiod) Период второй MA — Период расчёта второй скользящей средней.
Second Ma Shift (Ma2Shift) Сдвиг второй MA — Горизонтальное смещение второй скользящей средней по графику.
Second MA Applied Price (Ma2Price) Цена применения второй MA — Тип цены, на основе которой рассчитывается вторая скользящая средняя.
Order lot Value (LotValue) Значение лота — Процент от свободного маржи, используемый для расчёта объёма позиции.
Stop Loss value in pt (StopLoss) Стоп-лосс — Уровень стоп-лосса в пунктах от цены входа.
Take Profit value in pt (TakeProfit) Тейк-профит — Уровень тейк-профита в пунктах от цены входа.
Disable/Enable halving trailing stop (UseTrailing) Включить трейлинг-стоп — Включает или отключает трейлинг-стоп с постепенным сужением.
Division ratio (DivisionRatio) Коэффициент деления — Коэффициент, определяющий шаг сужения трейлинг-стопа.
Disable/Enable trailing stop in loss (TrailingInLoss) Трейлинг в зоне убытка — Разрешает или запрещает движение трейлинг-стопа в зоне убытка.
Use Breakeven (UseBreakeven) Использовать безубыток — Включает перевод стоп-лосса в точку безубытка при достижении заданного уровня прибыли.
Transfer to breakeven when reaching value (BreakevenValue) Значение безубытка — Уровень прибыли в пунктах, при достижении которого стоп-лосс переводится в безубыток.
Order opening slippage (Slippage) Проскальзывание — Максимально допустимое отклонение цены при открытии ордера.
A number of simultaneously open orders (OrdersCount) Максимум ордеров — Максимальное количество одновременно открытых позиций по магическому номеру.
Magic number (magicNumber) Магический номер — Идентификатор ордеров советника для отслеживания и управления.
comment Комментарий — Текст комментария, добавляемый к открываемым ордерам.
Получить полный код

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

#property version   "1.00"
#property strict

input ENUM_MA_METHOD Ma1Method = MODE_SMA; //First MA Method
input int Ma1Preiod = 100; //First MA Period
input int Ma1Shift =0 ; //First Ma Shift
input ENUM_APPLIED_PRICE Ma1Price = PRICE_CLOSE;//First MA Applied Price

input ENUM_MA_METHOD Ma2Method = MODE_SMA; //Second MA Method
input int Ma2Preiod = 30; //Second MA Period
input int Ma2Shift = 0; //Second Ma Shift
input ENUM_APPLIED_PRICE Ma2Price = PRICE_CLOSE;//Second MA Applied Price

input double LotValue=0.1;           // Order lot Value
input int    StopLoss=10;            // Stop Loss value in pt
input int    TakeProfit=10;          // Take Profit value in pt
input bool   UseTrailing=false;      // Disable/Enable halving trailing stop
input double DivisionRatio = 0.5;    // Division ratio
input bool   TrailingInLoss=false;   // Disable/Enable trailing stop in loss
input bool   UseBreakeven=false;     // Use Breakeven
input int    BreakevenValue=100;     // Transfer to breakeven when reaching value
input int    Slippage=5;             // Order opening slippage
input int    OrdersCount=1;          // A number of simultaneously open orders
input int    magicNumber = 41503;    //Magic number
input string comment= "MA Cross Expert";

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

void OnDeinit(const int reason)
  {

  }

  datetime time;

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

int getSignal(int shift = 1)
{
   double ma1_1 = iMA(NULL, NULL, Ma1Preiod, Ma1Shift, Ma1Method, Ma1Price, shift);
   double ma1_2 = iMA(NULL, NULL, Ma1Preiod, Ma1Shift, Ma1Method, Ma1Price, shift+1);
   double ma2_1 = iMA(NULL, NULL, Ma2Preiod, Ma2Shift, Ma2Method, Ma2Price, shift);
   double ma2_2 = iMA(NULL, NULL, Ma2Preiod, Ma2Shift, Ma2Method, Ma2Price, shift+1);
   if (ma1_1 > ma2_1 && ma1_2 <= ma2_2) return 1;
   if (ma1_1 < ma2_1 && ma1_2 >= ma2_2) return 2;

   return 0;
}

void TrallsCheck()
{
   if(KolvoMN() > 0)
   {
      for(int j=1;j<=Mas_Ord_New[0][0];j++)
      {                             
           if(Mas_Ord_New[j][7] == magicNumber )
           {
              HalfTrallSignal(Mas_Ord_New[j][4]);  
           }

      }

   }
}

void CheckMoveStopLoss()
{
  for(int j=0;j<=Mas_Ord_New[0][0];j++)
  {    
      if(Mas_Ord_New[j][7] == magicNumber)                              
         MoveStopLossToProfitZone(Mas_Ord_New[j][4]);
  }

}

void HalfTrallSignal(int ticket)
   { 

     int iTicket = ticket; // unique number (ticket) of an open position
     int iTmFrme = Period (); // chart period, on which bars are pressed
     double dCoeff = DivisionRatio; // "compression ratio", in% from 0.01 to 1
     bool bTrlinloss = TrailingInLoss; // whether to trail in the area of losses (between the stop loss and the opening rate)

    OrderSelect(ticket,SELECT_BY_TICKET);

    double dBid = MarketInfo(Symbol(),MODE_BID);
    double dAsk = MarketInfo(Symbol(),MODE_ASK);
    double dNewSl;
    double dNexMove;     

      if (OrderType()==OP_BUY)
         {
         if ((bTrlinloss) && (OrderStopLoss()!=0))
            {
               dNexMove = NormalizeDouble(dCoeff*(dBid-OrderStopLoss()),Digits);
               dNewSl = NormalizeDouble(OrderStopLoss()+dNexMove,Digits);            
            }
         else
            {
            if (OrderOpenPrice()>OrderStopLoss())
               {
                  dNexMove = NormalizeDouble(dCoeff*(dBid-OrderOpenPrice()),Digits);   
                  dNewSl = NormalizeDouble(OrderOpenPrice()+dNexMove,Digits);
               }

            if (OrderStopLoss()>=OrderOpenPrice())
               {
                  dNexMove = NormalizeDouble(dCoeff*(dBid-OrderStopLoss()),Digits);
                  dNewSl = NormalizeDouble(OrderStopLoss()+dNexMove,Digits);
               }                                      
            }

         if ((dNewSl>OrderStopLoss()) && (dNexMove>0) && ((dNewSl<Bid- MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
            {
               if (!OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Red))
               Print("Failed to modify stop loss order №",OrderTicket(),". Error: ",GetLastError());
            }
         }       

      if (OrderType()==OP_SELL)
         {
            if ((bTrlinloss) && (OrderStopLoss()!=0))
               {
                  dNexMove = NormalizeDouble(dCoeff*(OrderStopLoss()-(dAsk)),Digits);
                  dNewSl = NormalizeDouble(OrderStopLoss()-dNexMove,Digits);            
               }
            else
               {         
               if (OrderOpenPrice()<OrderStopLoss())
                  {
                     dNexMove = NormalizeDouble(dCoeff*(OrderOpenPrice()-(dAsk)),Digits);                 
                     dNewSl = NormalizeDouble(OrderOpenPrice()-dNexMove,Digits);
                  }

               if (OrderStopLoss()<=OrderOpenPrice())
                  {
                     dNexMove = NormalizeDouble(dCoeff*(OrderStopLoss()-(dAsk)),Digits);
                     dNewSl = NormalizeDouble(OrderStopLoss()-dNexMove,Digits);
                  }                  
               }

            if ((dNewSl<OrderStopLoss()) && (dNexMove>0) && (dNewSl>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
               {
                  if (!OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Blue))
                  Print("Failed to modify stop loss order №",OrderTicket(),". Error: ",GetLastError());
               }
         } 

   }

void MoveStopLossToProfitZone(int ticket)
{
   double ord_sl = OrderStopLoss();
   double sl_op_diff = MathAbs(ord_sl - OrderOpenPrice());
   if(sl_op_diff == 0) return;
   double move_pt = NormalizeDouble(BreakevenValue*Point,Digits);
   int Ticket_c = -1;
   if (OrderType()==OP_BUY) 
      {       
         double diff = Bid - OrderOpenPrice(); 
         if(diff > 0 && diff > move_pt) 
          { 

            if(OrderOpenPrice() > OrderStopLoss())
            {
               Ticket_c = OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(), OrderTakeProfit(),0);
               if(Ticket_c == 0 && !IsTesting())
               {
                  Sleep(2000);
                  MoveStopLossToProfitZone(ticket);             
               }

            }

          }
      }
      if (OrderType()==OP_SELL) 
      {

         double diff = ord_sl - Ask - (ord_sl - OrderOpenPrice()); 
         if(diff > 0 && diff > move_pt) 
         {             

             if(OrderOpenPrice() < OrderStopLoss())
             {             
                Ticket_c =OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(), OrderTakeProfit(),0);

                if(Ticket_c == 0 && !IsTesting())
                {
                   Sleep(2000);
                    MoveStopLossToProfitZone(ticket);             
                }
             }

          }

      } 

}

 double Mas_Ord_New [150][10];
 double Mas_Ord_Old[150][10];
 int Mas_Tip [6];

int his=0;

int Terminal()
  {
   int Qnt=0;                          // Счётчик количества ордеров
   if(IsTesting())
   {

      if(OrdersTotal() == Mas_Ord_New[0][0] && OrdersHistoryTotal() == his) 
      {

         return 0;
      }
      his = OrdersHistoryTotal();

   }

   ArrayCopy(Mas_Ord_Old, Mas_Ord_New);// Сохраняем предыдущую историю
   Qnt=0;                              // Обнуление счётчика ордеров
   ArrayInitialize(Mas_Ord_New,0);     // Обнуление массива
   ArrayInitialize(Mas_Tip,    0);     // Обнуление массива

   for(int i=0; i<OrdersTotal(); i++) // По рыночн. и отлож. ордерам
     {
      if((OrderSelect(i,SELECT_BY_POS)==true)     //Если есть следующ.
      && (OrderSymbol()==Symbol()))               //.. и наша вал.пара
        {

         Qnt++;                                   // Колич. ордеров
         Mas_Ord_New[Qnt][1]=OrderOpenPrice();    // Курс открытия орд
         Mas_Ord_New[Qnt][2]=OrderStopLoss();     // Курс SL
         Mas_Ord_New[Qnt][3]=OrderTakeProfit();   // Курс ТР
         Mas_Ord_New[Qnt][4]=OrderTicket();       // Номер ордера
         Mas_Ord_New[Qnt][5]=OrderLots();         // Количество лотов
         Mas_Tip[OrderType()]++;                  // Кол. ордеров типа
         Mas_Ord_New[Qnt][6]=OrderType();         // Тип ордера
         Mas_Ord_New[Qnt][7]=OrderMagicNumber();  // Магическое число 
         if (OrderComment()=="")
            Mas_Ord_New[Qnt][8]=0;                // Если нет коммент
         else
            Mas_Ord_New[Qnt][8]=1;                // Если есть коммент

        }
     }
   Mas_Ord_New[0][0]=Qnt;                         // Колич. ордеров

   return(0);
  }

 int KolvoMN()
 {
    int RR=0;
    for(int i=1; i<=Mas_Ord_New[0][0]; i++)
    { 
      if (Mas_Ord_New[i][7]==magicNumber) RR=RR+1;
    }

    return (RR);
 }

int PreCheck(int OrdType)
{
   if(KolvoMN() >= OrdersCount) return 0;
   int ret = 0;
   int stoploss = 0;
   int takeprofit=0;
   double volume=0;
   double price=0;
   int slippage;
   stoploss = StopLoss;
   takeprofit = TakeProfit;
   volume = GetVolume(stoploss);
   if(OrdType == OP_BUY) price = Ask;
   if(OrdType == OP_SELL) price = Bid;
   if(stoploss > 0)
   {
      double sl = 0;
      double tp = 0;
      if(OrdType == OP_BUY)  
      {
         Print(" stoploss "+stoploss + " takeprofit "+takeprofit );
         if(stoploss != 0) sl = NormalizeDouble(Bid - stoploss * Point, Digits);
         if(takeprofit != 0)tp = NormalizeDouble(Bid + takeprofit * Point, Digits);
      }
      if(OrdType == OP_SELL)  
      {

         if(stoploss != 0) sl = NormalizeDouble(Ask + stoploss * Point, Digits);
         if(takeprofit != 0) tp = NormalizeDouble(Ask - takeprofit * Point, Digits);
      }

      int result = OrderOpenF(NULL,OrdType,volume,price,Slippage,sl,tp,comment + " "+magicNumber,magicNumber,NULL,NULL);
      return result;
   }
 

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

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

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

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

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

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

Стоимость полного кода
1 222₽ ≈ $14.94