Трейлинг стоп для сетки

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nikita Chernyshov
1745
Nikita Chernyshov  

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



extern bool UseTrailing  = true; // Вкл\выкл трейлинг стоп
extern int lMinProfit    = 30;   // Мин. кол-во пунктов покупка
extern int sMinProfit    = 30;   // Мин. кол-во пунктов продажа
extern int lTrailingStop = 15;   // Уровень выставления трала покупка
extern int sTrailingStop = 15;   // Уровень выставления трала продажа
extern int lTrailingStep = 5;    // Шаг трала покупка
extern int sTrailingStep = 5;    // Шаг трала продажа

//+------------------------------------------------------------------+
//|  Трейлинг                                                        |
//+------------------------------------------------------------------+
void TrailingPositions(int otype) 
{
  int cnt = OrdersTotal();

  for (int i=0; i<cnt; i++) {
        if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
        if (OrderSymbol() != Symbol()) continue;                

        if (OrderType() == OP_BUY && otype == OP_BUY) {
        if (Bid-OrderOpenPrice() > lMinProfit*Point) {
                if (OrderStopLoss() < Bid-(lTrailingStop+lTrailingStep-1)*Point) {
                if(OrderModify(OrderTicket(), OrderOpenPrice(), Bid-lTrailingStop*Point, OrderTakeProfit(), 0, Blue))
                Print("Работает трейлинг");
                }
        }
        }

        if (OrderType() == OP_SELL && otype == OP_SELL) {
        if (OrderOpenPrice()-Ask > sMinProfit*Point) {
                if (OrderStopLoss() > Ask+(sTrailingStop+sTrailingStep-1)*Point || OrderStopLoss() == 0) {
                if(OrderModify(OrderTicket(), OrderOpenPrice(), Ask+sTrailingStop*Point, OrderTakeProfit(), 0, Red))
                Print("Работает трейлинг");
                }
        }
        }
  }
  
}


//+------------------------------------------------------------------+
// Фунция выставления единого Тейк-профита
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
  double avg_price, order_lots = 0;
  double price = 0;
  double tp = 0;
  
  for (int trade = OrdersTotal() -1; trade >=0; trade--)
    {
    if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
    {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) 
         {
           price += OrderOpenPrice() * OrderLots();
           order_lots += OrderLots();
         }
    }
  }
  avg_price = NormalizeDouble(price / order_lots, Digits);
  
  if (otype == OP_BUY)  tp = NormalizeDouble(avg_price + TakeP*Point,Digits);
  if (otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeP*Point,Digits);
  
  for (int trade = OrdersTotal() -1; trade >=0; trade--)
  {
    if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
    {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) 
         {
           if(OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0))
              Print("Ордера успешно модифицированы");
         }
    }
  }
}

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий