Le Trailingstop EA ne fonctionne pas - page 3

 
FMIC: 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.
Pas en temps réel.
  1. Avec Ask et Bid, vous devez rafraîchir RefreshRates() après des délais, c'est-à-dire entre plusieurs appels au serveur, après Sleep ou un long calcul.
  2. Avec OrderClosePrice, il est mis à jour seulement avec un OrderSelect. Ainsi, après un Sleep ou un long calcul (ou en gardant un ordre sélectionné entre les appels OnTick ), vous devez resélectionner.
    OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder:
Pas en temps réel.
  1. Avec Ask et Bid, vous devez rafraîchir RefreshRates() après des délais, c'est-à-dire entre plusieurs appels au serveur, après Sleep ou un long calcul.
  2. Avec OrderClosePrice, il est mis à jour seulement avec un OrderSelect. Ainsi après un Sleep ou un long calcul (ou en gardant un ordre sélectionné entre les appels OnTick,) vous devez re-sélectionner.

Merci pour ces informations. Je ne savais pas que "OrderClosePrice()" était mis en mémoire tampon. Je suppose donc que ni "OrderClosePrice()" ni les "Ask"/"Bid" ne constituent la solution idéale en temps réel.

Cependant, êtes-vous d'accord pour dire que "OrderClosePrice()" est une meilleure solution globale que l'utilisation de "Ask"/"Bid" après que "OrderSelect()" ait été effectué ?

Et pour une solution en temps réel, si elle est effectivement nécessaire, alors je suppose que nous pouvons nous rabattre sur les alternatives :

  • Re-sélectionner l'ordre avec "OrderSelect()" (EDIT : j'ai oublié de l'indiquer dans le post initial, même si vous l'avez signalé)
  • "RefreshRate()" avec "Ask"/"Bid".
  • "MarketInfo()" avec "MODE_ASK"/"MODE_BID" (ancien style MQL4)
  • "SymbolInfoDouble()" avec "SYMBOL_ASK"/"SYMBOL_BID" (nouveau style MQL4+ et MQL5)
  • "SymbolInfoTick()" (que j'utilise déjà dans la plupart de mes EA de toute façon).
 
FMIC: Cependant, êtes-vous d'accord pour dire que "OrderClosePrice()" est une meilleure solution globale que l'utilisation de "Ask"/"Bid" après que "OrderSelect()" ait été effectué ?
absolument.
 

Pourquoi essayez-vous de réinventer la roue ?

Regardez ici - vous trouverez tout ce dont vous avez besoin.

Sinon, commencez à modifier son code source.

 

Merci à tous pour l'aide apportée jusqu'à présent. Je pense avoir résolu le problème de l'erreur 130, mais il y a quelque chose qui ne va pas du tout avec ma fonction OrderSelect, ce qui est très probablement la raison pour laquelle elle ne modifie parfois que certains des ordres. Voici une liste des éléments que j'ai imprimés. Le numéro de ticket d'ordre est complètement erroné. Ce numéro de ticket appartient à une transaction que j'ai ouverte pour l'EURAUD. Bien que je n'aie pas inclus tous les résultats, il y a en fait plusieurs paires pour lesquelles les numéros de ticket d'ordre ne correspondent pas à la paire dans le terminal de transaction.

Quelqu'un peut-il jeter un coup d'œil et me dire ce qui ne va pas avec OrderSelect ? Merci.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15 : ticket = 0 Je pense que le ticket devrait imprimer la même valeur que OrdersTotal, il semble donc que mon compteur ne fonctionne pas.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15 : OrderSelect = true

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15 : OrdersTotal = 11

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15 : Selectbypos = 0

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15 : Selectbyticket = 1

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15 : OrderTicket = 50213357

extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   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);                     
                        
   {for(int i=OrdersTotal()-1; i>=0; i--){ //I added more curly brackets{}
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;{
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on.
                     if(TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<'
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the !
                        return(0); //I replaced the Getlasterrror with a return value
                        RefreshRates();
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(TrailingStop*Pip>Ask+(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        return(0);
                        RefreshRates();
                       }
                    }
                }  
            }
         }
      } 
   }
}  
  return(0);
}
//+------------------------------------------------------------------+



 

Bonjour à tous, merci pour votre aide. J'ai trouvé l'erreur et les problèmes ont été résolus. Comme je n'utilise pas de Stoploss, la valeur de OrderStopLoss() est toujours 0. Ce n'est pas un problème lorsque je modifie l'ordre d'achat car 0 est toujours inférieur à Bid-TrailingStop*Pip. Mais avec l'ordre de vente, 0 ne peut jamais être supérieur à Ask+Trailingstop*Pip. J'ai donc dû ajouter le or(|| OrderStopLoss()) à cette ligne :

if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ //Added OrderStopLoss()==0
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
 
Trader3000 Ce numéro de ticket appartient à une transaction que j'ai ouverte pour l'EURAUD.
Pas de filtrage sur votre boucle OrderSelect. Le symbole n'est pas égal au symbole de l'ordre lorsqu'une autre devise est ajoutée à un autre graphique séparé.- Forum MQL4
 
WHRoeder:
Trader3000: Ce numéro de ticket appartient à un trade que j'ai ouvert pour l'EURAUD.
Pas de filtrage sur votre boucle OrderSelect. Le symbole n'est pas égal au symbole de l'ordre lorsqu'une autre devise est ajoutée à un autre graphique séparé. - Forum MQL4

Merci beaucoup pour votre aide. Oui, il y a définitivement un problème avec OrderSelect car il ne fonctionne que sur certains graphiques. L'autre problème est que je ne peux pas inclure un MagicNumber car les transactions sont placées manuellement. J'ai utilisé la partie du code que je pense être pertinente, mais je n'arrive pas à le compiler. Il affiche cette erreur :

'MySelect' - la fonction ne peut être déclarée que dans la portée globale Trailing_v26.mq4 31 13

et la ligne 31 est celle-ci :

bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){

Voici l'ensemble de l'EA :

#property strict;
extern int TrailingStart=10;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
    bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
    if (!OrderSelect(iWhat, eSelect, ePool))     return (false);
    if (OrderSymbol()      != _Symbol)           return (false);
    if (ePool != MODE_HISTORY)                   return (true);
    return(OrderType() <= OP_SELL);
}
    for(int i = OrdersTotal()-1; i >= 0; i--)
    if (MySelect(i, SELECT_BY_POS)){

    for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
    if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
        int nextTkt = OrderTicket();
     
              if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }     
                     }  
                  }     
               }
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }
                     }
                  }  
               }
            
         
         
  return(0);
}
//+------------------------------------------------------------------+



 
Trader3000:

Oui, il y a définitivement un problème avec OrderSelect parce qu'il ne fonctionne que sur certains graphiques. L'autre problème est que je ne peux pas inclure un MagicNumber parce que les transactions sont placées manuellement. J'ai utilisé la partie du code qui me semble pertinente, mais je n'arrive pas à le faire compiler.

Je vous ai donné un code squelette parfaitement bon sur lequel vous pouvez vous baser, qui résout vos problèmes et les a même listés auparavant, mais vous choisissez de l'ignorer et continuez à vous battre en vous demandant pourquoi votre code ne fait pas ce que vous voulez !

Pourquoi ? Voulez-vous que votre code ne fonctionne pas ? Utilisez l'exemple et testez-le vous-même !

 
Il pense qu'il peut simplement couper et coller et qu'il n'a pas besoin d'apprendre à coder. Il ne peut même pas réparer cette simple erreur sans demander :
MySelect' - la fonction ne peut être déclarée que dans la portée globale Trailing_v26.mq4 31 13