[MQL4] Функция трейлинга и усреднения Тейк Профита

romanzif

romanzif

Местный
Команда форума
Администратор
Монет
120,231
Данную функцию имеет смысл использовать если вы разрабатываете усредняющий советник (сеточник)

В функцию нужно передать у какого типа ордеров пересчитывать и изменять Тейк Профит.
Соотвественно после открытия ордера на продажу вызываем функцию TrallTP(OP_SELL);
А после открытия ордера на покупку вызываем функцию TrallTP(OP_BUY);

Код:
//+------------------------------------------------------------------+
void TrallTP(int type)
{
   double price = 0, lots = 0, avgprice = 0;
   for (int i=OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS))
      {
         if (OrderMagicNumber() == Magic && OrderSymbol() == Symbol() && OrderType()==type)
         {
            price +=OrderOpenPrice() * OrderLots();
            lots +=OrderLots();
         }     
      }
   }
  
   if (price == 0) return; // если нет ордеров, то выходим из функции

   avgprice = NormalizeDouble(price / lots, Digits); // высчитываем среднюю цену открытых ордеров
  
   if (type == OP_BUY)
   {
      TP = NormalizeDouble(avgprice + Takeprofit * Point, Digits); // задаем ТП если ордера были на покупку
   }
   if (type == OP_SELL)
   {
      TP = NormalizeDouble(avgprice - Takeprofit * Point, Digits); // задаем ТП для ордеров на продажу
   }
  
   for (int i=OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS))
      {
         if (OrderMagicNumber() == Magic && OrderType()==type && OrderSymbol() == Symbol())
         {
            if (TP == OrderTakeProfit()) continue; // не меняем ТП если он такой же, иначе будет ошибка.
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), TP, OrderExpiration(), clrAliceBlue)) printf("Error: ", GetLastError());
         }
      }
   }       
}
//+------------------------------------------------------------------+
 

Проверенные Брокеры

Реклама

Заработок онлайн

Назад
Верх