Помогите с трейлингом МТ5

 

Здравствуйте. Не подскажите как организовать трейлинг сразу нескольких пар в одном боте?!

 
Maksim Rozhko:

Здравствуйте. Не подскажите как организовать трейлинг сразу нескольких пар в одном боте?!

В компоте?

 

Ну хотя бы) Есть бот, который торгует сразу 4-мя парами, а трейлит только одну. Проще было бы 4 бота запихать на 4 пары, но мне важно в тестере увидеть суммарную просадку (выдержет ли депозит). Вот голову ломаю как заставить его трейлить сразу 4 пары

 
Maksim Rozhko:

Ну хотя бы) Есть бот, который торгует сразу 4-мя парами, а трейлит только одну. Проще было бы 4 бота запихать на 4 пары, но мне важно в тестере увидеть суммарную просадку (выдержет ли депозит). Вот голову ломаю как заставить его трейлить сразу 4 пары

Чудеса! Компот живой и торгует :)

 

Ладно, я больше не буду шутить.

Покажите код трейлинга Вашего советника.

 

Код:

void Trailing(const string symbol)

  {

double sym1=SymbolInfoDouble(symbol, SYMBOL_BID);
double sym2=SymbolInfoDouble(symbol, SYMBOL_ASK);

   if(InpTrailingStop==0)
      return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==symbol && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(sym1-m_position.PriceOpen()>ExtTrailingStop+ExtTrailingStep)
                  if(m_position.StopLoss()<sym1-(ExtTrailingStop+ExtTrailingStep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(sym1-ExtTrailingStop),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                     RefreshRates();
                     m_position.SelectByIndex(i);
                     PrintResultModify(m_trade,m_symbol,m_position);
                     continue;
                    }
              }
            else
              {
               if(m_position.PriceOpen()-sym2>ExtTrailingStop+ExtTrailingStep)
                  if((m_position.StopLoss()>(sym2+(ExtTrailingStop+ExtTrailingStep))) || 
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(sym2+ExtTrailingStop),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                     RefreshRates();
                     m_position.SelectByIndex(i);
                     PrintResultModify(m_trade,m_symbol,m_position);
                    }
              }

           }
  }
 
Maksim Rozhko:

Код:

Нужно для каждого символа рассчитывать свои ExtTrailingStop и ExtTrailingStep.

 

А если ExtTrailingStop и ExtTrailingStep для всех пар одинаковые значение имееют ну допустим 20пунктов? Все пары по 5 символов после запятой

 
Maksim Rozhko:

А если ExtTrailingStop и ExtTrailingStep для всех пар одинаковые значение имееют ну допустим 20пунктов? Все пары по 5 символов после запятой

Тогда можно использовать для всех символов ExtTrailingStop и ExtTrailingStep рассчитанные в OnInit. Но это неправильно и опасно будущими проблемами!


Ещё один НЕПРАВИЛЬНЫЙ совет: удалите условие m_position.Symbol()==symbol вообще.

 

В oninit'e

   ExtTrailingStop= InpTrailingStop * m_adjusted_point;
   ExtTrailingStep= InpTrailingStep * m_adjusted_point;
   ExtTrailingStopnzd= InpTrailingStopnzd * m_adjusted_point;
   ExtTrailingStepnzd= InpTrailingStepnzd * m_adjusted_point;
   ExtTrailingStopcad= InpTrailingStopcad * m_adjusted_point;
   ExtTrailingStepcad= InpTrailingStepcad * m_adjusted_point;
   ExtTrailingStopaud= InpTrailingStopaud * m_adjusted_point;
   ExtTrailingStepaud= InpTrailingStepaud * m_adjusted_point;


----------------------------------------------------

В OnTick'e

   Trailing(Symbol_01,ExtTrailingStop,ExtTrailingStep);

   Trailing(Symbol_02,ExtTrailingStopcad,ExtTrailingStepcad);

      Trailing(Symbol_03,ExtTrailingStopnzd,ExtTrailingStepnzd);

         Trailing(Symbol_04,ExtTrailingStopaud,ExtTrailingStepaud);

-----------------------------------------------------

Сам трейлинг

void Trailing(const string symbol, double exttrail,double extstep)

  {
   double sym1=SymbolInfoDouble(symbol, SYMBOL_BID);
   double sym2=SymbolInfoDouble(symbol, SYMBOL_ASK);
   if(InpTrailingStop==0)
      return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if( m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(sym1-m_position.PriceOpen()>exttrail+extstep)
                  if(m_position.StopLoss()<sym1-(exttrail+extstep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(sym1-exttrail),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                     RefreshRates();
                     m_position.SelectByIndex(i);
                     PrintResultModify(m_trade,m_symbol,m_position);
                     continue;
                    }
              }
            else
              {
               if(m_position.PriceOpen()-sym2>exttrail+extstep)
                  if((m_position.StopLoss()>(sym2+(exttrail+extstep))) || 
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(sym2+exttrail),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                     RefreshRates();
                     m_position.SelectByIndex(i);
                     PrintResultModify(m_trade,m_symbol,m_position);
                    }
              }

           }
  }

И всё-равно ничего не работает)

 
Maksim Rozhko:

В oninit'e


----------------------------------------------------

В OnTick'e

И всё-равно ничего не работает)

Пожалуйста вставляйте код правильно. Я поправил, но в следующий раз, если будете постить простыни из простого текста - буду всё удалять.