Le Trailingstop EA ne fonctionne pas - page 4

 
WHRoeder:
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


J'apprécie vraiment l'aide que vous et tout le monde m'apportez. J'ai tout essayé ces deux derniers jours pour obtenir cette compilation et je m'excuse de ne pas avoir demandé. La plupart d'entre vous m'ont suggéré de ne pas utiliser mon propre code et d'utiliser celui de quelqu'un d'autre, mais je ne vais pas apprendre si je ne comprends pas ce que je fais mal. Pour moi, mon code semble correct. Je lui demande de compter les ordres par position et de sélectionner uniquement ceux qui répondent à mes critères, puis de modifier cette transaction spécifique. Jusqu'à présent, après 4 pages, personne n'a indiqué quelle ligne de mon code est défectueuse. Si je ne vois pas et ne comprends pas d'abord ce que je fais mal, cela ne m'aidera pas d'apprendre en utilisant le code de quelqu'un d'autre. Mon but maintenant n'est pas d'avoir un EA Trailingstop qui fonctionne, parce qu'il y en a beaucoup, mais d'apprendre à coder, pour pouvoir aller de l'avant. En fait, mon code était presque identique à celui que Jimdandy a posté dans son tutoriel Youtube sur les Trailingstops. Comme il est pratiquement identique au sien, j'ai copié le code presque mot pour mot (sauf que je veux trader manuellement), mais son code ne fonctionne que parfois aussi bien.

J'ai imprimé quelques trucs, ce trade est presque 300 points au-delà du point où j'ai spécifié que le Trailingstop se déclenche(qui était 150 points) :

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : OrderModify = false

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : Ask = 1.45926

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : Selectbypos = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : Selectbyticket = 1

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : OrderTicket = 50381828

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : ticket = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : OrderSelect = true

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : OrdersTotal = 16

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : OrderSymbol = EURUSD

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15 : OrderTicket = 50381828

2016.04.22 00:17:58.934 Trailing_v33 EURAUD,M15 : OrderModify = false

Cet EA n'est placé que sur l'EURAUD. Comme vous pouvez le voir, il y a 16 ordres ouverts sur 9 autres graphiques. Le numéro du ticket sélectionné pour cette paire est complètement faux et le symbole de l'ordre est complètement faux. Les deux sont pour un ordre EURUSD ouvert. Sur la base de ce qui précède, ma boucle for a sélectionné la position 0 dans ce cas, alors que l'EURAUD qu'elle était censée sélectionner était en position 14 (15-1). Pourquoi ? Je lui ai dit d'ignorer cela.

Dans la vidéo mentionnée ci-dessus, Jim s'est penché sur ce problème, et a dit qu'il utilisait le code suivant pour surmonter mon problème, cependant, il s'agit d'un compteur pour envoyer correctement les ordres et non d'une fonction pour filtrer les ordres. J'ai essayé de l'utiliser comme un filtre, mais sans succès.

int OpenOrdersThisPair(string pair){
   int total=0;
      for(int s= OrdersTotal()-1; s>= 0; s--){
         OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
           if(OrderSymbol()==pair) total++;
       }
   return(total);  
}

Mon code ressemble maintenant à ceci : quelqu'un pourrait-il critiquer mon code afin que je puisse en tirer des leçons et me dire pourquoi il ne fonctionne pas sur plusieurs graphiques ? Je sais qu'il ne peut pas être si mauvais car il fonctionne parfaitement parfois. Merci.

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=10;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10,Pip=Point*10;
int TS=TrailingStart-TrailingStop;
bool UseTrailingStop=true,UseAutotrading=true;
//+------------------------------------------------------------------+
//|  Expert initialization function                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
    MessageBox("Please note: Your inputs cannot be less than the minimum levels required"+
            "\nby your broker. Please reload the EA and either increase the value of the"+
            "\nTrailingStart and/or decrease the value of the TrailingStop so that "+
            "\nTrailingStart-TrailingStop >= "+StringConcatenate(stoplevel)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|    Expert deinitialization function                              |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|   Expert start function                                          |
//+------------------------------------------------------------------+
int start(){
   if(UseTrailingStop) Trailing(); 
   if(UseAutotrading) Autotrading();  
   return(0);
}
//+------------------------------------------------------------------+
void Trailing(){
for(int b=OrdersTotal()-1; b>=0; b--){
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_BUY)
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip))
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip))
                        OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue);
   }     
   for(int s=OrdersTotal()-1; s>=0; s--){
     if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_SELL)
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip))
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0)
                        OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red);
   }
}
void Autotrading(){
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
}


 
Trader3000:

Jusqu'à présent, après 4 pages, personne n'a indiqué quelle ligne de mon code est cassée.

C'est faux ! Nous avons décrit vos erreurs et proposé des solutions pour les résoudre, sous de nombreuses formes et alternatives. Pourtant, vous les ignorez et continuez à faire les choses à votre façon. Non seulement cela, mais vous avez même aggravé la situation en ajoutant d'autres erreurs.

Lorsqu'un peintre apprend à peindre, il le fait d'abord en copiant les techniques des autres qui l'ont maîtrisé. Ce n'est qu'une fois qu'il est à l'aise avec ces techniques qu'il commence à créer sa PROPRE MANIÈRE de peindre.

Voici une courte liste de "mes critiques" :

  1. Utilisez vos crochets (parenthèses "frisées"). N'essayez pas de lésiner et d'économiser sur elles. Jusqu'à ce que votre code soit entièrement fonctionnel et débogué, ajoutez-les même si ce n'est que pour une seule ligne contenue dans le bloc. Placez-les également sur une ligne distincte. Ne vous inquiétez pas si vous avez beaucoup d'espace blanc. Vous pouvez toujours revenir en arrière et les nettoyer, mais au début, vous voulez vous assurer que tout est dans son bloc de code correct et que les accolades et les parenthèses sont équilibrées. L'enchaînement de plusieurs instructions "if" dans une cadence est une recette pour un désastre car il est très difficile à déboguer, surtout avec un compilateur délicat comme celui-ci.
  2. Votre code original ne comportait qu'une seule boucle que vous avez transformée en deux sans raison apparente, si ce n'est pour rendre votre code encore plus lent et répéter les endroits que vous devez corriger lorsqu'il y a des bogues.
  3. Utilisez des variables pour stocker les résultats des expressions ! Vous répétez les mêmes expressions plusieurs fois, ce qui rend votre code non seulement plus lent, mais aussi plus sujet aux erreurs et plus difficile à lire et à corriger parce que vous devez les modifier à plusieurs endroits.

Il y a d'autres choses que je pourrais énumérer, mais corrigez au moins celles-ci, une fois pour toutes !

Le codage est une langue comme une autre. Oui, vous pouvez simplement enchaîner les mots, mais cela ne fait pas de vous un poète. Dans le codage, vous devez également avoir un rythme et une structure, afin de le rendre lisible et fonctionnel.

 
FMIC:

Voici une courte liste de "mes critiques" :

J'avais initialement des crochets pour toutes mes instructions 'if', conformément au code que j'ai posté ici plus tôt, mais comme ce code ne fonctionnait pas, j'ai essayé d'autres choses, notamment de copier le code que j'ai collé dans mon message précédent. Comme je l'ai mentionné, ce n'est même pas mon code, mais il ne fonctionne pas non plus sur toutes les paires. Je vais cependant remplacer les crochets à nouveau et suivre les autres conseils. En attendant, j'ai appris que OrderSelect imprimera le symbole du premier ordre dans le terminal et non celui sur lequel l'EA est, donc ce n'était pas faux.

EDIT : Merci pour la suggestion #3 !!!!!!! Je pense que c'était le problème, parce que l'ordre doit d'abord être sélectionné par le symbole et ensuite la valeur doit être stockée. J'ai donc déplacé la variable en dessous de ces fonctions comme ci-dessous, et il semble que cela fonctionne maintenant (mais plus de tests sont nécessaires avant que je sache avec certitude

int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10,TSTP=TrailingStart*Pip,Trail=TrailingStop*Pip,SL=StopLoss*Pip;               
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail,OrderTakeProfit(),Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
 
Trader3000:

En fait, j'avais des crochets pour toutes mes instructions 'if' initialement, conformément au code que j'ai posté ici plus tôt, mais comme ce code ne fonctionnait pas, j'ai essayé d'autres choses, y compris de copier le code que j'ai collé dans mon message précédent. Comme je l'ai mentionné, ce n'est même pas mon code, mais il ne fonctionne pas non plus sur toutes les paires. Je vais cependant remplacer les crochets à nouveau et suivre les autres conseils. En attendant, j'ai appris que OrderSelect imprimera le symbole du premier ordre dans le terminal et non celui sur lequel l'EA est, donc ce n'était pas faux.

EDIT : Merci pour la suggestion #3 !!!!!!! Je pense que c'était le problème, parce que l'ordre doit d'abord être sélectionné par le symbole et ensuite la valeur doit être stockée. J'ai donc déplacé la variable en dessous de ces fonctions comme ci-dessous, et il semble que cela fonctionne maintenant (mais plus de tests sont nécessaires avant que je sache avec certitude

En regardant votre dernier code, je dois dire que j'abandonne ! (Vous refusez d'aller jusqu'au bout) !
 
FMIC: En regardant votre dernier code, j'ai ceci à dire - J'ABANDONNE ! (Tu refuses d'aller jusqu'au bout) !
Maintenant, vous comprenez peut-être ma "critique sévère" lorsqu'ils font perdre le temps de tout le monde. Bien que je comprenne les "choses simples" pour lesquelles ils pensent qu'il est acceptable de faire perdre du temps à tout le monde, ce n'est pas mon cas.

Trader3000: Je pense que c'était le problème,...
int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip, SL=StopLoss*Pip;
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail, OrderTakeProfit(), Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
Ton problème est que tu ne réfléchis pas.
int start(){
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue;
// Everything below is executed if NO order is selected or a selected order is symbol
      double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip;
      if(OrderType()==OP_BUY)
      && Bid-OrderOpenPrice()>TSTP)
      && OrderStopLoss()<Bid-Trail){
         if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange))
            Print("Error Buy TrailingStop: ",GetLastError());
      }
   :
 
WHRoeder:
Maintenant, vous comprenez peut-être ma "critique sévère" lorsqu'ils font perdre le temps de tout le monde. Bien que je comprenne les "choses simples" pour lesquelles ils pensent qu'il est acceptable de perdre le temps de tout le monde, je ne le comprends pas.

Oui ! Malheureusement, il semble que vous ayez raison !

 

Merci pour les réponses.J'ai donc modifié le code pour revenir à une version antérieure comme ci-dessous.Avec ce code, il semble fonctionner parfaitement sur toutes les paires où le stoplevel est de 50 points, mais pas sur les paires où le stoplevel est plus élevé, par exemple EURAUD, même si les variables externes sont plus élevées que le stoplevel.C'est donc bizarre.

extern int TrailingStart=15;
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)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
   int ticket=0,buy_ticket=0,sell_ticket=0;  
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol()){
      ticket++;
      if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
      if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
      }
            if(OrderType()==OP_BUY){
               if(OrderSelect(buy_ticket,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(OrderType()==OP_SELL){
               if(OrderSelect(sell_ticket,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);
}
//+------------------------------------------------------------------+
 

J'ai également trouvé un autre EA dont le code est très similaire au mien et j'ai comparé le code. J'ai souligné les principales différences.

1. augmentations au lieu de diminutions

2. il multiplie tout avec Point au lieu de Point*10

3. il ajoute le Trailingstop et le Trailingstep ensemble, puis en soustrait un et modifie l'ordre avec le Trailingstep. Si je comprends bien, le Trailingstart sera activé après un mouvement de 15 pips (150 points). Dans mon EA, le prix sera en retard de 5 pips et sera arrêté si le prix baisse à nouveau et atteint ce niveau de 5 pips. Dans son EA, il sera également activé après 15 pips, mais le nombre de pips en retard est de 19 (15+5-1), donc le prix doit baisser de 19 pips pour être arrêté. Par exemple : l'OrderOpenPrice est de 1.50000. Le prix monte de 150 points à 1.50150, ce qui active le Trailingstop. Si le prix redescend ensuite à 1.50100, il sera arrêté pour un profit de 5 pips. Dans son EA, le Trailingstop est également activé à 1.50150, mais le trail est à 1.49960 ce qui, je pense, provoquera l'erreur 130 puisque le stop est trop proche du stoplevel. Ou est-ce que je comprends mal ?

Mon problème pourrait-il être lié à un ou plusieurs de ces éléments ?

//+------------------------------------------------------------------+
//|                                                   e-Trailing.mq4 |
//|                                           Êèì Èãîðü Â. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 12.09.2005 Àâòîìàòè÷åñêèé Trailing Stop âñåõ îòêðûòûõ ïîçèöèé    |
//|            Âåøàòü òîëüêî íà îäèí ãðàôèê                          |
//+------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ------------------------------------------
extern bool   ProfitTrailing = True;  // Òðàëèòü òîëüêî ïðîôèò
extern int    TrailingStop   = 15;     // Ôèêñèðîâàííûé ðàçìåð òðàëà
extern int    TrailingStep   = 5;     // Øàã òðàëà
extern bool   UseSound       = True;  // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound  = "expert.wav";  // Íàèìåíîâàíèå çâóêîâîãî ôàéëà

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      TrailingPositions();
    }
  }
}

//+------------------------------------------------------------------+
//| Ñîïðîâîæäåíèå ïîçèöèè ïðîñòûì òðàëîì                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
      if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
      if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
        return;
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Ïåðåíîñ óðîâíÿ StopLoss                                          |
//| Ïàðàìåòðû:                                                       |
//|   ldStopLoss - óðîâåíü StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+
 
Trader3000:

J'ai également trouvé un autre EA qui a un code très similaire au mien et j'ai comparé le code.

Voyons si je comprends votre logique ! Vous êtes prêt à trouver un autre EA de quelqu'un d'autre d'on ne sait où et vous êtes prêt à incorporer ce code dans le vôtre, MAIS VOUS N'AVEZ PAS LA VOLONTÉ de prendre le code qui a été spécifiquement écrit pour vous aider et corriger vos problèmes !!!

WOW ! Comme c'est LOGIQUE de votre part ! Où est SPOCK quand on a besoin de lui !

SPOCK, que tu puisses reposer en paix ! Tu nous manques à tous !

 
FMIC:

Voyons si je comprends votre logique ! Tu es prêt à trouver un autre EA de quelqu'un d'autre d'on ne sait où et tu es prêt à incorporer ce code dans le tien, MAIS TU N'ES PAS PRÊT à prendre le code qui a été spécifiquement écrit pour t'aider et corriger tes problèmes ! !!

WOW ! Comme c'est LOGIQUE de votre part ! Où est SPOCK quand on a besoin de lui !

SPOCK, que tu puisses reposer en paix ! Tu nous manques à tous !

J'ai finalement trouvé la solution et je remercie tout le monde pour l'aide (et les critiques). Après être retourné au code que vous et Mike avez posté sur la première page, j'ai vu mon erreur. Je l'ai probablement négligée parce qu'elle était si subtile, mais surtout parce que je n'ai pas compris la logique du code correctement. Le problème était que je pensais que la quantité de pip pour le TrailingStop était la quantité de pips qu'il suivait. Mais le nombre de pips qu'il traîne derrière est en fait TrailingStart-TrailingStop. Donc, mes paramètres étaient en dessous du stoplevel pour les paires telles que la gbpjpy parce que j'ai entré 15 et 5. Puisque 5 est en dessous du stoplevel de 8. En augmentant simplement le TrailingStop, cela fonctionne maintenant sur toutes les paires. Merci !!!