Подскажите. Правильно ли будет работать...

 
   for (int i=0; i<OrdersTotal(); i++)
      {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
         TrailingPositions();
         }
      }
 
 
////////
//
// .....
//
////////
 
//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp, TS;
 
  if(OrderMagicNumber()==Magic_1) TS=TrailingStop;
  if(OrderMagicNumber()==Magic_2) TS=TrailingStop_2;
  if(OrderMagicNumber()==Magic_3) TS=TrailingStop_3;
  if(OrderMagicNumber()==Magic_4) TS=TrailingStop_4;
  if(OrderMagicNumber()==Magic_5) TS=TrailingStop_5;
  if(OrderMagicNumber()==Magic_6) TS=TrailingStop_6;
  if(OrderMagicNumber()==Magic_7) TS=TrailingStop_7;
  if(OrderMagicNumber()==Magic_8) TS=TrailingStop_8;
  
  if(TS<5) return;
 
  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || ND((Bid-OrderOpenPrice()))>ND(TS*pp)) {
      if (ND(OrderStopLoss())<ND(Bid-(TS+TrailingStep-1)*pp) || ND(OrderStopLoss())==0) {
        ModifyStopLoss(ND(Bid-TS*pp));
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || ND(OrderOpenPrice()-Ask)>ND(TS*pp)) {
      if (ND(OrderStopLoss())>ND(Ask+(TS+TrailingStep-1)*pp) || ND(OrderStopLoss())==0) {
        ModifyStopLoss(ND(Ask+TS*pp));
        return;
      }
    }
  }
}
 
//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
 
  fm=OrderModify(OrderTicket(),ND(OrderOpenPrice()),ND(ldStopLoss),ND(OrderTakeProfit()),0,CLR_NONE);
  if (!fm) Print("Error OrderModify : ",GetLastError());
}
//+------------------------------------------------------------------+

Будет ли работать (в моем примере) Трэйлинг на несколько ордеров с разными Магиками. Т.е. например, если в данный момент имеется два ордера которые нужно тралить, будут ли они оба тралиться в раз? Или надо что-то поменять. При тестировании ничего уже понять не могу... вроде работает. :)

 
sashken:
   for (int i=0; i<OrdersTotal(); i++)
      {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
         TrailingPositions();
         }
      }
 
 
////////
//
// .....
//
////////
 
//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
 
 
  
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || ND((Bid-OrderOpenPrice()))>ND(TS*pp)) {
      if (ND(OrderStopLoss())<ND(Bid-(TS+TrailingStep-1)*pp) || ND(OrderStopLoss())==0) {
        ModifyStopLoss(ND(Bid-TS*pp));
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || ND(OrderOpenPrice()-Ask)>ND(TS*pp)) {
      if (ND(OrderStopLoss())>ND(Ask+(TS+TrailingStep-1)*pp) || ND(OrderStopLoss())==0) {
        ModifyStopLoss(ND(Ask+TS*pp));
        return;
      }
    }
  }
}
 
//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
 
  fm=OrderModify(OrderTicket(),ND(OrderOpenPrice()),ND(ldStopLoss),ND(OrderTakeProfit()),0,CLR_NONE);
  if (!fm) Print("Error OrderModify : ",GetLastError());
}
//+------------------------------------------------------------------+

Будет ли работать (в моем примере) Трэйлинг на несколько ордеров с разными Магиками. Т.е. например, если в данный момент имеется два ордера которые нужно тралить, будут ли они оба тралиться в раз? Или надо что-то поменять. При тестировании ничего уже понять не могу... вроде работает. :)


Удивительный код. Неудивительно, что и сам автор "ничего уже понять не может". Я и сам так писал, пока не прочитал статью уважаемого bstone "Как упростить код эксперта и избежать лишних хлопот".

Только не воспринимайте это как критику. Понимаете, когда видишь столько вложенных ступенчатых if, пропадает всякая охота вникать в код....-очень мучительно...

С уважением - С.Д.

 
sashken:

Будет ли работать (в моем примере) Трэйлинг на несколько ордеров с разными Магиками. Т.е. например, если в данный момент имеется два ордера которые нужно тралить, будут ли они оба тралиться в раз? Или надо что-то поменять. При тестировании ничего уже понять не могу... вроде работает. :)

Предполагаю, что разные маджики соответствуют разным инструментам. Поэтому Bid (Ask) надо заменить на запрошенные через MarketInfo() pBid (pAsk)
 
Sart:

Понимаете, когда видишь столько вложенных ступенчатых if, пропадает всякая охота вникать в код....-очень мучительно...

А когда возникает охота? Когда все условия под одним if находятся?
 
Вроде понял... должно работать:) Посмотрим на Чемпионате, всем спасибо.
 
Integer:
Sart:

Понимаете, когда видишь столько вложенных ступенчатых if, пропадает всякая охота вникать в код....-очень мучительно...

А когда возникает охота? Когда все условия под одним if находятся?
Напишите код, скажем, с уровнем вложения 5, а я перепишу его Вам без вложений...

С уважением - С.Д.
 
  if(x1==x2){
      if(x3==x4){
         if(x5==x6){
            if(x7==x8){
               if(x9==x10){
                  OhYes=true;
               }
            }
         }
      }
  }
 
  if((x1==x2) && (x3==x4) && (x5==x6) && (x7==x8) && (x9==x10)) OhYes=true;
А так подойдет
 
Vinin, аццкий сотона... аффигеть, давай две!
 
Integer:
  if(x1==x2){
      if(x3==x4){
         if(x5==x6){
            if(x7==x8){
               if(x9==x10){
                  OhYes=true;
               }
            }
         }
      }
  }

---------------------------------------------------------------------------------------------------------------------
Определим функцию:
bool iif( bool condition, boll ifTrue, bool ifFalse )
{
    if( condition ) return( ifTrue );
    
    return( ifFalse );
}
А теперь получим:
OhYes = iif(x1 == x2 && x3 == x4 && x5 == x6 && x7 == x8 && x9 == x10, True, False);

Согласитеь - небо и земля.

С уважением - С.Д.
 
Vinin:
  if((x1==x2) && (x3==x4) && (x5==x6) && (x7==x8) && (x9==x10)) OhYes=true;
А так подойдет
Так , конечно, лучше. Но, по bstone универсальнее.

С уважением - С.Д.
Причина обращения: