Советник с трейлингстопом не работает

 

Привет всем. Я не могу заставить свой советник работать правильно. Я запускаю его на 10 различных парах/чартах одновременно. Кажется, есть две проблемы:

1. большую часть времени не срабатывает трейлингстоп. Иногда срабатывает, хотя. Я думаю, что проблема в моем OrderSelect, но не могу ее решить.

2. Иногда он выдает ошибку 130, но я не вижу, как мои SL/TP могут быть недействительными. Все значения, которые я печатаю, выше уровня стоплосса для всех пар. И даже если я получаю ошибку 130, он на самом деле иногда модифицирует ордер, как будто все в порядке.

Вот весь советник. Не могли бы вы взглянуть на него и сообщить мне, в чем может быть проблема?

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=11;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+1)+" Pips");
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+1;
   
   Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS)){
         if(OrderSymbol()!=Symbol()) continue;{
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if(Bid-OrderOpenPrice()>TrailingStart*Pip){
                     if(OrderStopLoss()<Bid-TrailingStop*Pip){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Pip,OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        Print("Bid = ",Bid);
                        Print("Bid-TrailingStop*Pip = ",Bid-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if(OrderOpenPrice()-Ask>TrailingStart*Pip){
                     if(OrderStopLoss()>Ask+TrailingStop*Pip){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Pip,OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        }
                    }
                }  
            }
         }
      }   
  return(0);
}
//+------------------------------------------------------------------+
 
  1. У вас есть несколько неправильно сбалансированных блоков кода из-за отсутствующих скобок. Хотя они сбалансированы, их не хватает, например, в начале блоков "for" и нескольких блоков "if".
  2. Строка"if(OrderSymbol()!=Symbol()) continue;{" очень подозрительна и затрудняет понимание того, каким должен быть поток кода. Просто сделайте"if(OrderSymbol()==_Symbol) {". Вместо"Symbol()" вы также можете использовать"_Symbol".
  3. Используйте"OrderClosePrice()", а не"Ask" или"Bid".
  4. Добавляйте круглые скобки при выполнении сравнений, чтобы облегчить чтение, а также гарантировать порядок действий. Например, вместо"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" используйте"if( ( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )".
  5. Попробуйте объединить оба блока кода Buy и Sell в один блок кода, который обрабатывает оба. Это сделает меньше кода для отладки и легче для чтения и модификации в будущем.

PS! NB! Также используйте магическое число для ордеров!

PS! Также не забудьте учесть проскальзывание, которое может вызвать 130 ошибок. Одного минимального значения StopLevel недостаточно. Сделайте его немного больше, чтобы учесть возможное проскальзывание, например, добавьте коэффициент текущего спреда. Брокер также может установить FreezeLevel!

 
FMIC:
  1. У вас есть несколько неправильно сбалансированных блоков кода из-за отсутствующих скобок. Хотя они сбалансированы, их не хватает, например, в начале блока "for" и нескольких блоков "if".
  2. Строка"if(OrderSymbol()!=Symbol()) continue;{" очень подозрительна и затрудняет восприятие потока кода.
    Просто сделайте"if(OrderSymbol()==_Symbol) {". Вместо"Symbol()" можно также использовать"_Symbol".
  3. Используйте"OrderClosePrice()", а не"Ask" или"Bid".
  4. Добавляйте скобки при сравнении, чтобы облегчить чтение и гарантировать порядок действий:
    Например, вместо"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" используйте"if( ( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )".
  5. Попытайтесь объединить блоки кода Buy и Sell в один блок кода, который обрабатывает оба блока. Это сделает меньше кода для отладки и легче для чтения и модификации в будущем.

PS! NB! Также используйте магическое число для ордеров!

PS! Также не забудьте учесть проскальзывание, которое может вызвать 130 ошибку. Одного минимального значения StopLevel недостаточно. Сделайте его немного больше, чтобы учесть возможное проскальзывание, например, добавьте коэффициент текущего спреда. Брокер также может установить FreezeLevel!

Большое спасибо за ваш ответ и за попытку помочь мне. У меня есть несколько вопросов/замечаний:

1. В #1 вы предложили мне добавить скобки (), что я и сделал согласно вашему предложению в #4. Но я не понимаю, как я могу добавить скобки () в начале "for". Объясните, пожалуйста, или вы имели в виду фигурные скобки {}?

2. я изменил его на _Symbol, но чтобы улучшить свои знания, я хотел бы узнать, не могли бы вы объяснить, в чем преимущество/выгода использования _Symbol перед Symbol()?

3. Я изменил все Asks и Bids на OrderClosePrice(), однако, не могли бы вы объяснить, в чем преимущество/выгода этого?

4. Я сделал следующее

5. я попробую посмотреть, как я могу упростить это больше.

6. поскольку я ввожу свои сделки вручную, я так понимаю, что я не могу использовать MagicNumbers. это не так?

7. я не понимаю, как и где я могу учесть проскальзывание. подскажите, пожалуйста, где или как его добавить. для OrderModify он позволяет только следующие параметры:

bool  OrderModify(
   int        ticket,      // ticket
   double     price,       // price
   double     stoploss,    // stop loss
   double     takeprofit,  // take profit
   datetime   expiration,  // expiration
   color      arrow_color  // color
   );

8. В своем коде я уже добавил 1 пункт (10 пунктов) к минимальному уровню стоплосса, что должно учитывать спред в большинстве случаев.

9. Я распечатал Freezelevel для всех пар, и все они равны 0.0, так что, похоже, это не проблема.

10. Несмотря на то, что я все еще получаю ошибку 130 и ошибку 1, когда советник работает, он все еще модифицирует и закрывает ордер. Таким образом, согласно этим результатам, я получаю ошибку, поскольку ордер модифицируется в то же время. Как будто это проблема partime:

2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28598 tp: 0.00000 ok

2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: покупка = 130

2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28597 tp: 0.00000 ok

2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28596 tp: 0.00000 ok

2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: покупка = 130

2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15: Покупка = 130

2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28590 tp: 0.00000 ok

2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28582 tp: 0.00000 ok

2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28581 tp: 0.00000 ok

2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28577 tp: 0.00000 ok

2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: покупка = 130

2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28575 tp: 0.00000 ok

2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: покупка = 130

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: Покупка = 1

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28571 tp: 0.00000 ok

Вот еще один пример, когда трейлингстоп явно выше уровня стоплосса (на 10 пунктов/100 пунктов), но все равно выдает ошибку 130:

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: Ошибка покупки = 130

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TS = 20

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: stoplevel = 10.0



 

Пожалуйста, предоставьте самый последний код с внесенными изменениями. В противном случае я не смогу прокомментировать внесенные вами изменения, чтобы убедиться в их правильности.

  1. Извините, я имел в виду фигурные скобки. Вы должны исправить это, иначе советник будет продолжать работать. Это самый важный из всех пунктов.
  2. a) Этот пункт в первую очередь относится не к "_Symbol", а к "!=" и "continue".
    б) "_Symbol" выполняется быстрее, потому что это переменная, в то время как "Symbol()" будет выполняться как вызов функции, что медленнее.
  3. OrderClosePrice() - это текущая цена закрытия ордера. Если ордер все еще открыт, он автоматически сообщает Bid или Ask в зависимости от типа ордера. Пожалуйста, прочитайте документацию по этой функции.
  4. ХОРОШО! Давайте посмотрим изменения в коде, которые вы сделали.
  5. OK! Посмотрим изменения в коде, которые вы сделали.
  6. Да, для ручных сделок магическое число равно 0. Однако в своем коде определите магическое число как "extern" или "input", присвоив ему значение "0" по умолчанию, а затем используйте эту переменную в своем коде. Таким образом, вы сможете легко использовать советника в других ситуациях или повторно использовать свой код для других советников.
  7. Я объяснил, как учитывать проскальзывание. Убедитесь, что "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )", где Factor не менее "1.0" (в идеале "1.5" или "2.0"; больше, если вы видите, что у вас все еще возникает ошибка 130 из-за чрезмерного проскальзывания).
  8. Нет гарантии, что 10 пунктов учтут спред, поскольку спред зависит от символа и постоянно меняется, особенно во время новостных событий и при низкой ликвидности, например, в нерабочее время.
  9. OK! Если "FreezeLevel" не используется, это нормально, но я предлагаю, чтобы вы все равно учитывали его в своем коде, чтобы в случае, если вы будете использовать его у другого брокера (у которого он может быть). советник все равно работал.
  10. Предоставьте новый код с изменениями, чтобы его можно было проанализировать.
 
FMIC:

Пожалуйста, предоставьте самый последний код с внесенными изменениями. В противном случае я не смогу прокомментировать внесенные вами изменения, чтобы убедиться в их правильности.

  1. Извините, я имел в виду фигурные скобки. Вы должны исправить это, иначе он будет продолжать терпеть неудачу. Это самый важный из всех пунктов.
  2. a) Этот пункт в первую очередь касается не "_Symbol", а "!=" и "continue".
    б) "_Symbol" выполняется быстрее, потому что это переменная, в то время как "Symbol()" будет выполняться как вызов функции, что медленнее.
  3. OrderClosePrice() - это текущая цена закрытия ордера. Если ордер все еще открыт, он автоматически сообщает цену Bid или Ask в зависимости от типа ордера. Пожалуйста, прочитайте документацию по этой функции.
  4. ХОРОШО! Давайте посмотрим изменения в коде, которые вы сделали.
  5. OK! Посмотрим изменения в коде, которые вы сделали.
  6. Да, для ручных сделок магическое число равно 0. Однако в своем коде определите магическое число как "extern" или "input", присвоив ему значение "0" по умолчанию, а затем используйте эту переменную в своем коде. Таким образом, вы сможете легко использовать советника в других ситуациях или повторно использовать свой код для других советников.
  7. Я объяснил, как учитывать проскальзывание. Убедитесь, что "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )", где Factor не менее "1.0" (в идеале "1.5" или "2.0"; больше, если вы видите, что у вас все еще возникает ошибка 130 из-за чрезмерного проскальзывания).
  8. Нет гарантии, что 10 пунктов учтут спред, поскольку спред зависит от символа и постоянно меняется, особенно во время новостных событий и при низкой ликвидности, например, в нерабочее время.
  9. OK! Если "FreezeLevel" не используется, это нормально, но я предлагаю, чтобы вы все равно учитывали его в вашем коде, так что в случае, если вы будете использовать его у другого брокера (который может иметь его). советник все равно будет работать.
  10. Предоставьте новый код с изменениями, чтобы его можно было проанализировать.


Большое спасибо. Я рассмотрю все вышеуказанные советы и предложения. А пока вот последний код. Также, я думаю, я нашел ошибку в этой строке:

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+2)+" Pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   /*Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   Print("Buy error = ",GetLastError());
                        Print("OrderOpenPrice = ",OrderOpenPrice());
                        Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ",
                        OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip);
                        Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        Print("TrailingStop*Pip = ",TrailingStop*Pip);
                        Print("OrderClosePrice = ",OrderClosePrice());
                        Print("OrderStopLoss = ",OrderStopLoss());
                        Print("OrderSymbol = ",OrderSymbol());
                        Print("OrdersTotal = ",OrdersTotal());
                        Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
                        Print("ticket = ",ticket);
                        Print("OrderTicket = ",OrderTicket());
                        Print("Selectbyticket = ",SELECT_BY_TICKET);
                        Print("Selectbypos = ",SELECT_BY_POS);
                        Print("Ask = ",Ask);
                        Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),
                        OrderTakeProfit(),Blue));*/
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy error = ",GetLastError());
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){
                     if(TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell error = ",GetLastError());
                        /*Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);*/
                        }
                    }
                }  
            }
         }
      }   
  return(0);
}
//+------------------------------------------------------------------+

Я изменил первую строку ниже на вторую, потому что я думаю, что для стоплосса должно быть значение больше нуля. Это правда?

 if(OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
 

Следующий пример кода служит в качестве возможного решения/альтернативы для вашего кода. Однако обратите внимание, что код не тестировался и не отлаживался (только компилировался), поэтому используйте его только как "псевдо" код:

#property strict

extern double
   dblTrailStartPips = 11.0,  // Trailing Start (Pips)
   dblTrailStopPips  = 5.0,   // Trailing Stop (Pips)
   dblPipMultiplier  = 10.0,  // Pips to Points Multiplier
   dblSpreadFactor   = 2.0;   // Spread Factor for Slippage Compensation
   
extern int
   intMagicNumber    = 0;     // Magic Number (0 for Manual Orders)
   
double
   dblTickSizeDelta,          // Size of a Tick (Delta)
   dblStopLevelDelta,         // Market Stop Level (Delta)
   dblTrailStartDelta,        // Trailing Start (Delta)
   dblTrailStopDelta;         // Trailing Stop (Delta)

// Initialisation
int OnInit()
{
   dblTickSizeDelta   = MarketInfo( _Symbol, MODE_TICKSIZE );
   dblStopLevelDelta  = MarketInfo( _Symbol, MODE_STOPLEVEL ) * _Point;
   dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier  * _Point;
   dblTrailStopDelta  = dblTrailStopPips  * dblPipMultiplier  * _Point;
   
   return( INIT_SUCCEEDED );
}

// Process Tick Event
void OnTick()
{
   double
      dblSpreadDelta  = Ask - Bid,
      dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ),
      dblTrailDelta   = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta;
   
   for( int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) )
         {
            int intDirection = 0;
            switch( OrderType() )
            {
               case OP_BUY:  intDirection = +1; break;
               case OP_SELL: intDirection = -1; break;
               default:                         continue;
            }
            
            double
               dblOpenPrice  = OrderOpenPrice(),
               dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection;
               
            if( dblCloseDelta > dblTrailStartDelta )
            {
               double
                  dblStopLossPrice = OrderStopLoss(),
                  dblStopLossDelta = ( dblStopLossPrice  - dblOpenPrice ) * intDirection,
                  dblTrailingDelta = dblCloseDelta - dblTrailDelta;
               
               if( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) )
               {
                  double dblStopLoss = round( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta;
                  if( dblStopLoss != dblStopLossPrice )
                  {
                     if( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) )
                     {
                        Print( "Order Modification Failed with Error: ", GetLastError() );
                     }
                  }
               }
            }
         }
      }
   }
}
 

Попробуйте это Trader3000

Сравните этот код с тем, что у вас уже есть... он очень похож, и я использую его уже много лет, и он работает как бомба...

//+------------------------------+
//| TRAILING STOP Function       |
//+------------------------------+
void Trailing_Stop_Function()
{
bool Ticket_TS_Long;
   for(int iTS_Long = OrdersTotal() - 1; iTS_Long >= 0 ; iTS_Long --)  
   {
      
      if(OrderSelect(iTS_Long,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol()
      && OrderType() == OP_BUY
      && OrderMagicNumber() == MagicNumberLong
      && Trailing_Stop_In_Pips > 0
      && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green));
         if (Ticket_TS_Long != true)
         {
         Print("TS-Order Modify Error ",GetLastError());
         }
      }
    } 
bool Ticket_TS_Short;
   for(int iTS_Short = OrdersTotal() - 1; iTS_Short >= 0 ; iTS_Short --)  
   {
      
   if(OrderSelect(iTS_Short,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol()
      && OrderType() == OP_SELL
      && OrderMagicNumber() == MagicNumberShort
      && Trailing_Stop_In_Pips > 0
      && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green));
         if (Ticket_TS_Short != true)
         {
         Print("TS-Order Modify Error ",GetLastError());
         }
      }
   }
}

Trail_After_Pips_Profit - это внешняя переменная double, которую заполняет пользователь... и

PipMultiplier - это простая функция, которая вычисляет значение десятичной точки валюты...

Если вы не используете MagicNumbers, то удалите этот критерий.....

Это будет... или скорее "должно" отслеживать любой ордер на любом графике......

Я готов внести поправку, но это работает для меня....

//+------------------------------------------+
//| Check for 5 Digits - Pipmultiplier       |
//+------------------------------------------+
   
   if(Digits==5||Digits==3) 
   {
   PipMultiplier = 10*Point;
   }
   else if(Digits==2) 
   {
   PipMultiplier = 100*Point;
   }
   
   else
   {
   PipMultiplier = Point;
   }
   

Я впечатлен вашей помощью FMIC.... Хороший

 

Mike.T:

Я впечатлен вашей помощью FMIC.... Отличный вариант

Спасибо!

Небольшой совет: не используйте "Ask" или "Bid" - вместо этого используйте "OrderClosePrice()". Это значение в реальном времени, независимо от того, является ли это ордер на покупку или продажу.
 

@Mike.T: Кажется, что-то не так с вашим кодом PipMulytiplier:

else if(Digits==2) 
{
   PipMultiplier = 100*Point;
}

Это не кажется правильным! Зачем умножать его на 100 для двухзначных символов? Он вообще не должен умножаться! Это должно быть то же условие, что и для 4-значных символов.

Вот пример. Если цена USD/JPY поднимается с 108,65 до 108,77, то это увеличение на 12 пунктов, а не на 1200 пунктов!
 
FMIC:

Спасибо!

Небольшой совет: не используйте "Ask" или "Bid" - вместо этого используйте "OrderClosePrice()". Это значение в реальном времени, независимо от того, что это ордер на покупку или продажу.

Спасибо... не знал, что.... так... (без хай-джекинга этой темы)... Мне лучше использовать OrderClosePrice() вместо Bid или Ask...?
 
Mike.T:
Спасибо... не знал, что.... так... (без хай-джекинга этой темы)... мне лучше использовать OrderClosePrice() вместо Bid или Ask...?
Да! По указанным причинам (см. документацию), а также для того, чтобы вы могли объединить логику покупки и продажи в один блок кода, как я показал в своем примере.
Причина обращения: