Подскажите пожалуйста с треллингом

 

У меня треллинг двигает только один ордер пока не закроет.  Потом двигает второй и т.д.

Как мне сделать чтобы он двигал сказу все по данному символу?

Вот мой код

void tral(int m)
{
 
  for (int i=0; i<OrdersTotal(); i++) {
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
  if (OrderSymbol()==Symbol() && OrderMagicNumber() == m) {
  TrailingPositions();
  }
  }
  }
}


//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp;
  int ts;
  int t= 0;
 
  if(hung == true && ts(mn1) > 0) ts = sl - ts(mn1);
  if(hung == true && ts(mn2) > 0) ts = sl - ts(mn2);
  if(hung == true && ts(mn3) > 0) ts = sl - ts(mn3);
   
  else ts = sl;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
  pBid = MarketInfo(OrderSymbol(), MODE_BID);
  if ((pBid-OrderOpenPrice())>ts/strs*pp) {
  if (OrderStopLoss()<pBid-(ts+sl/10-1)*pp) {
  ModifyStopLoss(pBid-ts*pp);
  return;
  }
  }
  }
  if (OrderType()==OP_SELL) {
  pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
  if (OrderOpenPrice()-pAsk>ts/strs*pp) {
  if (OrderStopLoss()>pAsk+(ts+sl/10-1)*pp || OrderStopLoss()==0) {
  ModifyStopLoss(pAsk+ts*pp);
  return;
  }
  }
  }
}

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss |
//| Параметры: |
//| ldStopLoss - уровень StopLoss |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
 
}


int ts(int m)
{  
int a = 0;
for (int i=0; i<OrdersTotal(); i++) {
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
  if (OrderSymbol()==Symbol() && OrderMagicNumber() == m) {
  if(OrderType() == OP_BUY && Bid > OrderOpenPrice() + (sl + sl/k)*Point) 
  a = ((Bid - OrderOpenPrice() - sl*Point)/k)/Point;
  if(OrderType() == OP_SELL && Ask < OrderOpenPrice() - (sl + sl/k)*Point)
  a = ((OrderOpenPrice() - Ask - sl*Point)/k)/Point;  
  }
  }
  }
 
 return(a);
 }  


А это вызовы в start()

tral(mn1);
tral(mn2);
tral(mn3);

 

Навскидку:

void TrailingPositions(int mn) // добавляем параметр mn
{
  double pBid, pAsk, pp;
  int ts;
  int t= 0;
 
  if(hung == true && ts(mn) > 0) ts = sl - ts(mn); // проверяем только переданный mn
... далее оставим как есть
}

// переписываем функцию ts без цикла, т.к. цикл выбора ордера уже снаружи
int ts(int m)
{  
  int a = 0;
  if(OrderType() == OP_BUY && Bid > OrderOpenPrice() + (sl + sl/k)*Point) 
  a = ((Bid - OrderOpenPrice() - sl*Point)/k)/Point;
  if(OrderType() == OP_SELL && Ask < OrderOpenPrice() - (sl + sl/k)*Point)
  a = ((OrderOpenPrice() - Ask - sl*Point)/k)/Point;  
  return(a);
}

В текущем коде из-за вложенности select-ов (внутри ts) и троекратного if-a всегда обрабатывается ордер с mn3.

 

Что-то я не аойму tral вызывается 3 раза для каждого mn отдельно, почему тогда он работает только для mn3?

И если это так то подскажите пожалуйста как это исправить

 
Спасибо, поняла!
Причина обращения: