Почему модифицируется TakeProfit следом за Трейлингом???

 
Обьясните что не так 
Файлы:
open_order.mq5  43 kb
 
Kirill Andreev:
Обьясните что не так 

Тут ошибка:

NormalizeDouble(NormalizePrice(_Symbol,ask-TakeProfit*_Point),_Digits);
 
Kirill Andreev:
Обьясните что не так 

ошибка в функции трейлинга, вот в этих строках задается тп равным 0, по этому он и прыгает постоянно 

trade.PositionModify(Position.Ticket(),Position.PriceOpen(),0.0);
и
                    
trade.PositionModify(Position.Ticket(),
                                          NormalizeDouble(bid-ExtTrailingStop,digits),0.0);


 надо так 

void Position_trall()
  {
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   double ExtTrailingStop=InpTrailingStop*point;
   double ExtTrailingStep=InpTrailingStep*point;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(Position.SelectByIndex(i))
         if(Position.Symbol()==Symbol() && Position.Magic()==Magic)
           {
            //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
            if(Position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- когда у позиции ещё нет StopLoss
               if(Position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(bid-ExtTrailingStop>Position.PriceOpen())
                    {
                     //--- модификация позиции
                     trade.PositionModify(Position.Ticket(),Position.PriceOpen(),Position.TakeProfit());
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(bid-ExtTrailingStop-ExtTrailingStep>Position.StopLoss())
                    {
                     //--- модификация позиции
                     trade.PositionModify(Position.Ticket(),NormalizeDouble(bid-ExtTrailingStop,digits),Position.TakeProfit());
                    }
                 }
              }

            if(Position.PositionType()==POSITION_TYPE_SELL)
              {
               //--- когда у позиции ещё нет StopLoss
               if(Position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(ask+ExtTrailingStop<Position.PriceOpen())
                    {
                     //--- модификация позиции
                     trade.PositionModify(Position.Ticket(),Position.PriceOpen(),Position.TakeProfit());
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(ask+ExtTrailingStop+ExtTrailingStep<Position.StopLoss())
                    {
                     //--- модификация позиции
                     trade.PositionModify(Position.Ticket(),
                                          NormalizeDouble(ask+ExtTrailingStop,digits),Position.TakeProfit());
                    }
                 }
              }
           }
  }


 

 
Sergey Gritsay:

ошибка в функции трейлинга, вот в этих строках задается тп равным 0, по этому он и прыгает постоянно 

trade.PositionModify(Position.Ticket(),Position.PriceOpen(),0.0);
и
                    
trade.PositionModify(Position.Ticket(),
                                          NormalizeDouble(bid-ExtTrailingStop,digits),0.0);


 надо так 

void Position_trall()
  {
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   double ExtTrailingStop=InpTrailingStop*point;
   double ExtTrailingStep=InpTrailingStep*point;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(Position.SelectByIndex(i))
         if(Position.Symbol()==Symbol() && Position.Magic()==Magic)
           {
            //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
            if(Position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- когда у позиции ещё нет StopLoss
               if(Position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(bid-ExtTrailingStop>Position.PriceOpen())
                    {
                     //--- модификация позиции
                     trade.PositionModify(Position.Ticket(),Position.PriceOpen(),Position.TakeProfit());
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(bid-ExtTrailingStop-ExtTrailingStep>Position.StopLoss())
                    {
                     //--- модификация позиции
                     trade.PositionModify(Position.Ticket(),NormalizeDouble(bid-ExtTrailingStop,digits),Position.TakeProfit());
                    }
                 }
              }

            if(Position.PositionType()==POSITION_TYPE_SELL)
              {
               //--- когда у позиции ещё нет StopLoss
               if(Position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(ask+ExtTrailingStop<Position.PriceOpen())
                    {
                     //--- модификация позиции
                     trade.PositionModify(Position.Ticket(),Position.PriceOpen(),Position.TakeProfit());
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(ask+ExtTrailingStop+ExtTrailingStep<Position.StopLoss())
                    {
                     //--- модификация позиции
                     trade.PositionModify(Position.Ticket(),
                                          NormalizeDouble(ask+ExtTrailingStop,digits),Position.TakeProfit());
                    }
                 }
              }
           }
  }


 

  Спасибо, а то сколько раз смотрел код не мог понять.....(

  Отсутствие опыта сказывается(((( 

Причина обращения: