Le Trailingstop EA ne fonctionne pas

 

Bonjour à tous. Je n'arrive pas à faire fonctionner mon EA correctement. Je l'exécute sur 10 paires/charts différents simultanément. Il semble y avoir deux problèmes. 1 :

1. il ne déclenche pas le Trailingstop la plupart du temps. Parfois, il fonctionne, cependant. Je pense que le problème se situe au niveau de mon OrderSelect, mais je ne peux pas le résoudre.

2. il me donne parfois l'erreur 130, mais je ne vois pas comment mon SL/TP peut être invalide. Toutes les valeurs que j'imprime sont au-dessus du niveau de base pour toutes les paires. Et même si je reçois l'erreur 130, il modifie parfois l'ordre comme si tout allait bien.

Voici l'ensemble de l'EA. Pouvez-vous y jeter un coup d'œil et me dire quel est le problème ?

#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. Vous avez plusieurs blocs de code mal alignés en raison de l'absence de parenthèses. Bien qu'équilibrées, elles sont manquantes, comme au début du bloc "for" et de quelques blocs "if".
  2. La ligne"if(OrderSymbol()!=Symbol()) continue;{" est très suspecte et rend difficile de voir comment le flux de code devrait être. Il suffit d'écrire"if(OrderSymbol()==_Symbol) {". Au lieu de"Symbol()", vous pouvez également utiliser"_Symbol".
  3. Utilisez"OrderClosePrice()" et non"Ask" ou"Bid".
  4. Ajoutez des parenthèses lorsque vous effectuez des comparaisons afin de faciliter la lecture et de garantir l'ordre des choses. Par exemple, au lieu de"if(Bid-OrderOpenPrice()>TrailingStart*Pip)", utilisez"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip )".
  5. Essayez de fusionner les blocs de code d'achat et de vente en un seul bloc de code qui gère les deux. Cela fera moins de code à déboguer et plus facile à lire et à modifier à l'avenir.

PS ! NB ! Utilisez également un numéro magique pour les commandes !

PS ! N'oubliez pas non plus de tenir compte des glissements qui peuvent provoquer les 130 erreurs. Un minimum de StopLevel seul n'est pas suffisant. Il faut l'augmenter légèrement pour tenir compte d'un éventuel slippage, par exemple en ajoutant un facteur du spread actuel. Le courtier peut également avoir mis en place un FreezeLevel !

 
FMIC:
  1. Vous avez plusieurs blocs de code mal alignés en raison de parenthèses manquantes. Bien qu'équilibrées, elles sont manquantes, notamment au début du bloc "for" et de quelques blocs "if".
  2. La ligne"if(OrderSymbol()!=Symbol()) continue;{" est très suspecte et rend difficile de voir comment le flux de code devrait être.
    Il suffit de dire"if(OrderSymbol()==_Symbol) {". Au lieu de"Symbol()", vous pouvez également utiliser"_Symbol".
  3. Utilisez"OrderClosePrice()" et non"Ask" ou"Bid".
  4. Ajoutez des parenthèses lorsque vous effectuez des comparaisons afin de faciliter la lecture et de garantir l'ordre des choses :
    Par exemple, au lieu de"if(Bid-OrderOpenPrice()>TrailingStart*Pip)", utilisez"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )".
  5. Essayez de fusionner les blocs de code d'achat et de vente en un seul bloc de code qui gère les deux. Cela rendra le code moins difficile à déboguer et plus facile à lire et à modifier à l'avenir.

PS ! NB ! Utilisez également un numéro magique pour les ordres !

PS ! N'oubliez pas non plus de tenir compte du slippage qui peut provoquer les 130 erreurs. Un niveau minimum de StopLevel seul n'est pas suffisant. Faites-le légèrement plus grand pour tenir compte d'un éventuel slippage, en ajoutant par exemple un facteur du spread actuel. Le courtier peut également avoir mis en place un FreezeLevel !

Merci beaucoup pour votre réponse et pour avoir essayé de m'aider. J'ai quelques questions/commentaires :

1. dans le #1, vous m'avez suggéré d'ajouter des parenthèses (), ce que j'ai fait selon votre suggestion dans le #4. Mais je ne vois pas comment je peux ajouter des parenthèses () au début du "for". Pouvez-vous m'expliquer cela ou vouliez-vous dire des crochets {} ?

2) J'ai changé le symbole en _Symbol, mais pour améliorer mes connaissances, je me demandais si vous pouviez m'expliquer quel est l'avantage d'utiliser _Symbol plutôt que Symbol() ?

3) J'ai changé toutes les demandes et offres en OrderClosePrice(), mais pourriez-vous m'expliquer quel est l'avantage de cette méthode ?

4. j'ai fait ceci

5) Je vais essayer de voir comment je peux simplifier davantage.

6) Puisque je saisis mes transactions manuellement, j'ai cru comprendre que je ne pouvais pas utiliser les MagicNumbers, n'est-ce pas ?

7) Je ne vois pas comment ni où je peux tenir compte du slippage. Pouvez-vous me dire où ou comment l'ajouter ? Pour OrderModify, il ne permet que les paramètres suivants :

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

8) Dans mon code, j'ai déjà ajouté 1 pip (10 points) au niveau minimum du stoplevel, ce qui devrait tenir compte du slippage dans la plupart des cas.

9) J'ai imprimé le niveau de gel pour toutes les paires et ils sont tous 0.0, donc cela ne semble pas être un problème.

10) Même si je reçois toujours l'erreur 130 et l'erreur 1, lorsque l'EA fonctionne, il modifie et ferme toujours l'ordre. Donc, selon ces résultats, je reçois l'erreur car l'ordre est modifié en même temps. Comme si c'était un problème partiel :

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 : Acheter = 130

2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15 : modifier #50202284 acheter 0.01 USDCAD à 1.28477 sl : 1.28597 tp : 0.00000 ok

2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15 : modifier #50202284 acheter 0.01 USDCAD à 1.28477 sl : 1.28596 tp : 0.00000 ok

2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15 : Achat = 130

2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15 : Achat = 130

2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15 : modifier #50202284 acheter 0.01 USDCAD à 1.28477 sl : 1.28590 tp : 0.00000 ok

2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15 : modifier #50202284 acheter 0.01 USDCAD à 1.28477 sl : 1.28582 tp : 0.00000 ok

2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15 : modifier #50202284 acheter 0.01 USDCAD à 1.28477 sl : 1.28581 tp : 0.00000 ok

2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15 : modifier #50202284 acheter 0.01 USDCAD à 1.28477 sl : 1.28577 tp : 0.00000 ok

2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15 : Acheter = 130

2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15 : modifier #50202284 acheter 0.01 USDCAD à 1.28477 sl : 1.28575 tp : 0.00000 ok

2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15 : Acheter = 130

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15 : Achat = 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

Voici un autre exemple où le Trailingstop est clairement au-dessus du stoplevel (de 10 pips/100 points) et pourtant il produit toujours l'erreur 130 :

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15 : Erreur d'achat = 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



 

Veuillez fournir le code le plus récent avec les mises à jour que vous avez effectuées. Sinon, je ne peux pas commenter les modifications récentes que vous avez apportées pour voir si elles sont correctes.

  1. Désolé, je voulais dire des crochets. Vous devez corriger cela, sinon il continuera à échouer. C'est le plus important de tous les points.
  2. a) Ce point ne concerne pas principalement le "_Symbol", mais plutôt le "!=" et le "continue".
    b) "_Symbole" est exécuté plus rapidement parce qu'il s'agit d'une variable, alors que "Symbole()" serait exécuté comme un appel de fonction, ce qui est plus lent.
  3. OrderClosePrice() est le prix de clôture actuel de l'ordre. S'il est encore ouvert, il indique automatiquement le cours acheteur ou vendeur selon le type d'ordre. Veuillez lire les documents relatifs à cette fonction.
  4. OK ! Voyons les changements de code que vous avez fait.
  5. OK ! Voyons les modifications que vous avez apportées au code.
  6. Oui, pour les transactions manuelles, le nombre magique est 0. Cependant, dans votre code, définissez le nombre magique comme un "externe" ou une "entrée", en lui attribuant un "0" par défaut, puis utilisez cette variable dans votre code. De cette façon, vous pouvez facilement utiliser l'EA dans d'autres situations ou réutiliser votre code pour d'autres EA.
  7. J'ai expliqué comment tenir compte du slippage. Assurez-vous que le "TrailStop > ( StopLevel + ( CurrentSpread * Factor )" où le facteur est au moins "1.0" (idéalement "1.5" ou "2.0" ; plus grand si vous voyez que vous rencontrez toujours l'erreur 130 due à un slippage excessif).
  8. Il n'est pas garanti que 10 points suffisent à couvrir l'écart, car l'écart varie selon le symbole et change constamment, en particulier pendant les événements d'actualité et lorsque la liquidité est faible, comme pendant les heures creuses.
  9. OK ! Si "FreezeLevel" n'est pas utilisé, c'est OK, mais je suggère que vous le preniez en compte dans votre code, de sorte que si vous l'utilisez avec un autre courtier (qui pourrait l'avoir), l'EA fonctionnera toujours.
  10. Fournissez le nouveau code avec les modifications afin qu'il puisse être analysé.
 
FMIC:

Veuillez fournir le code le plus récent avec les mises à jour que vous avez effectuées. Sinon, je ne peux pas commenter les modifications récentes que vous avez apportées pour voir si elles sont correctes.

  1. Désolé, je voulais dire des crochets. Vous devez corriger cela, ou bien il continuera à échouer. C'est le plus important de tous les points.
  2. a) Ce point ne concerne pas principalement le "_Symbol", mais plutôt le "!=" et le "continue".
    b) "_Symbole" est exécuté plus rapidement parce qu'il s'agit d'une variable, alors que "Symbole()" serait exécuté comme un appel de fonction, ce qui est plus lent.
  3. OrderClosePrice() est le prix de clôture actuel de l'ordre. S'il est toujours ouvert, il indique automatiquement le cours acheteur ou vendeur selon le type d'ordre. Veuillez lire les documents relatifs à cette fonction.
  4. OK ! Voyons les changements de code que vous avez fait.
  5. OK ! Voyons les modifications que vous avez apportées au code.
  6. Oui, pour les transactions manuelles, le nombre magique est 0. Cependant, dans votre code, définissez le nombre magique comme un "externe" ou une "entrée", en lui attribuant un "0" par défaut, puis utilisez cette variable dans votre code. De cette façon, vous pouvez facilement utiliser l'EA dans d'autres situations ou réutiliser votre code pour d'autres EA.
  7. J'ai expliqué comment tenir compte du slippage. Assurez-vous que le "TrailStop > ( StopLevel + ( CurrentSpread * Factor )" où le facteur est au moins "1.0" (idéalement "1.5" ou "2.0" ; plus grand si vous voyez que vous rencontrez toujours l'erreur 130 due à un slippage excessif).
  8. Il n'est pas garanti que 10 points suffisent à couvrir l'écart, car l'écart varie selon le symbole et change constamment, en particulier pendant les événements d'actualité et lorsque la liquidité est faible, comme pendant les heures creuses.
  9. OK ! Si "FreezeLevel" n'est pas utilisé, c'est OK, mais je suggère que vous le preniez en compte dans votre code, de sorte que si vous l'utilisez avec un autre courtier (qui pourrait l'avoir), l'EA fonctionnera toujours.
  10. Fournissez le nouveau code avec les modifications afin qu'il puisse être analysé.


Merci beaucoup. Je vais examiner tous les conseils et suggestions ci-dessus. En attendant, voici le dernier code. Je pense également avoir trouvé une erreur dans cette ligne :

#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);
}
//+------------------------------------------------------------------+

Un changement assez important que j'ai fait est que j'ai changé la première ligne ci-dessous pour la deuxième, parce que je pense qu'il doit y avoir une valeur supérieure à zéro pour le stoploss. Est-ce vrai ?

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

L'exemple de code suivant sert de solution/alternative possible à votre code. Veuillez noter cependant que le code n'a pas été testé ou débogué (seulement compilé), et qu'il s'agit donc uniquement d'un "pseudo" code :

#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() );
                     }
                  }
               }
            }
         }
      }
   }
}
 

Essayez ceci Trader3000

Comparez ce code avec celui que vous avez déjà... il est très similaire et je l'utilise depuis des années et il fonctionne comme une bombe...

//+------------------------------+
//| 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 est une variable double externe que l'utilisateur remplit...et

PipMultiplier est une fonction simple qui calcule la valeur du point décimal de la devise...

Si vous n'utilisez pas de MagicNumbers, supprimez ce critère.....

Cela va... ou plutôt "devrait" suivre n'importe quel ordre sur n'importe quel graphique.....

Je ne suis pas d'accord, mais cela fonctionne pour moi....

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

Je suis impressionné par votre aide FMIC.... Bien joué.

 

Mike.T:

Je suis impressionné par votre aide FMIC.... Très bien.

Merci !

Un conseil : n'utilisez pas "Ask" ou "Bid" - utilisez plutôt "OrderClosePrice()". Il s'agit d'une valeur en temps réel, qu'il s'agisse d'un ordre d' achat ou de vente.
 

@Mike.T : Quelque chose ne va pas avec votre code PipMulytiplier :

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

Cela ne semble pas être correct ! Pourquoi le multiplier par 100 pour des symboles à 2 chiffres ? Il ne devrait pas être multiplié du tout ! Il devrait être dans la même condition que les symboles à 4 chiffres.

Voici un exemple. Si le prix du USD/JPY passe de 108,65 à 108,77, il s'agit d'une augmentation de 12 pips, et non de 1200 pips !
 
FMIC:

Merci !

Un conseil : n'utilisez pas "Ask" ou "Bid", mais plutôt "OrderClosePrice()". Il s'agit d'une valeur en temps réel, qu'il s'agisse d'un ordre d'achat ou de vente.

Merci... je ne le savais pas.... donc... (sans détourner ce fil de discussion)... Je devrais plutôt utiliser OrderClosePrice() au lieu de Bid ou Ask... ?
 
Mike.T:
Merci... Je ne savais pas que.... donc... (sans détourner ce fil de discussion)... Je devrais plutôt utiliser OrderClosePrice() au lieu de Bid ou Ask... ?
Oui ! Pour les raisons mentionnées (voir la documentation) ainsi que pour vous permettre de fusionner la logique d'achat et de vente dans un seul bloc de code comme je l'ai démontré dans mon exemple.