Ouvrir un ordre opposé - page 3

 
RaptorUK:

Il peut s'agir d'un numéro magique différent duMagicNumber ou d'un symbole autre que celui sur lequel l'EA est exécuté ou encore d'un OP_SELLLIMIT ou OP_BUYLIMIT . . aussi, vous devez vérifier les valeurs de retour de vos appels OrderDelete() . . .

Pourquoi avez-vous besoin d'appeler RefreshRates() ? Je ne veux pas dire que vous devez vous en débarrasser, mais pouvez-vous expliquer pourquoi vous appelez RefreshRates() là où vous le faites ?


Que sont les valeurs de retour des fonctions ? Comment les utiliser ?


Bonjour RaptorUK.

D'après ce que je comprends, le MagicNumber est le même que celui de OP_SELLSTOP et OP_BUYSTOP.

Les appels à OrderDelete(), j'ai bien peur de ne pas comprendre ce que vous voulez dire.....

RefreshRates() J'ai juste mis là après le problème avec la fermeture.

Maintenant je suis à Lisbonne (Portugal).

Luis

 
luisneves:


Bonjour RaptorUK.

D'après ce que je comprends, le MagicNumber est le même que celui de OP_SELLSTOP et OP_BUYSTOP.

Appels de la fonction OrderDelete(), j'ai bien peur de ne pas comprendre ce que vous voulez dire.....

Lorsque vous appelez OrderDelete() (en utilisant la fonction OrderDelete()), il renvoie une valeur, il renvoie une valeur bool, si la valeur est vraie l'OrderDelete() a fonctionné, si elle est fausse l'OrderDelete() a échoué . Vérifiez donc la valeur de retour et si elle est fausse, signalez l'erreur au journal en utilisant Print() ou utilisez Comment() ou Alert() pour savoir que vous avez un problème et pouvoir l'étudier.

Sur la base de votre code, je ferais ces modifications... Si c'était mon code, je ferais des modifications supplémentaires pour imprimer plus d'informations en cas d'erreur, Bid, Ask, FreezeLevel, StopLevel, etc.

void CloseAll()
   {
   int OrdType, GLError;
   
   RefreshRates();
                    
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)
      if( OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber() == MagicNumber 
         && OrderSymbol() == Symbol())
         {
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
            {
            if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), UseSlippage, Yellow))
               GLError = GetLastError();
            }

         if(OrdType == OP_SELLSTOP || OrdType == OP_BUYSTOP || OrdType == OP_BUYLIMIT || OrdType == OP_SELLLIMIT)
            {
            if(!OrderDelete(OrderTicket())
               GLError = GetLastError();
            }

         if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());         
         }
   } 
 
RaptorUK:

Lorsque vous appelez la fonction OrderDelete() (en utilisant la fonction OrderDelete()), elle renvoie une valeur, elle renvoie une valeur bool, si la valeur est vraie la fonction OrderDelete() a fonctionné, si elle est fausse la fonction OrderDelete() a échoué . Vérifiez donc la valeur de retour et si elle est fausse, signalez l'erreur au journal en utilisant Print() ou utilisez Comment() ou Alert() pour savoir que vous avez un problème et pouvoir l'étudier.

Sur la base de votre code, j'apporterais ces modifications... Si c'était mon code, j'apporterais des modifications supplémentaires pour imprimer plus d'informations en cas d'erreur, Bid, Ask, FreezeLevel, StopLevel, etc.


Bonjour RaptorUK,

La raison pour laquelle l'ordre en attente n'a pas été supprimé est liée à la prise de profit qui était trop faible, dans ce cas 5 pips. Ma confusion vient du fait que si j'avais une routine pour mettre le stoploss, le prix d'ouverture et le take profit hors de la zone de gel, pourquoi cela n'a pas fonctionné. Ok mais maintenant ça marche.

A propos, je veux fermer l'ordre opposé une fois que l'autre a été déclenché, pour cela j'ai mis ce code supplémentaire mais (vous pouvez commencer à rire...) mais rien.....

Une aide ?

 while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();
         Ticket=OrderSend(Symbol(),OP_BUYSTOP,LotSize,BuyLevel,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Stop Order",MagicNumber,0,Green);
         if(Ticket>0)
         
          int o=OrderType();
          if (o==OP_BUY)
          OrderDelete(OrderTicket());        
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY Stop Order Opened : ",OrderOpenPrice());
           }
         //else Print("Error opening BUY Stop Order : ",GetLastError());
 
luisneves:


Bonjour RaptorUK,

La raison pour laquelle l'ordre en attente n'a pas été suppriméest liée à la prise de profit qui était trop faible, dans ce cas 5 pips. Ma confusion vient du fait que si j'avais une routine pour mettre le stoploss, le prix d'ouverture et le take profit hors de la zone de gel, pourquoi cela n'a pas fonctionné. Ok mais maintenant ça marche.

2. à propos, je veux fermer l'ordre opposé une fois que l'autre a été déclenché. pour cela j'ai mis ce code supplémentaire mais(vous pouvez commencer à rire...) mais rien.....

Une aide ?


1) Ah, c'est pourquoi vous devez vérifier les valeurs de retour et imprimer les codes d'erreur, etc. Vous devez vous assurer que toute action de négociation sur un ordre est conforme aux informations figurant ici :Exigences et limites de la réalisation de transactions

2. vous devez attendre que l'ordre change de type de OP_BUYSTOP à OP_BUY, cela peut prendre un certain temps, vous devez donc continuer à vérifier.... Une fois qu'il s'est transformé en OP_BUY, vous pouvez fermer l'ordre opposé et pour ce faire, vous allez devoir trouver le bon ordre à fermer. Vous devriez lire ma récente conversation avecWhooDoo22 qui couvre un sujet similaire.

 

Salut RaptorUk,

J'ai suivi le lien que tu as fourni mais le thème, bien qu'intéressant, est trop long et avec tellement d'opinions divergentes que je m'y suis perdu.

J'ai donc introduit un code pour fermer l'opposé en suspens et encore une fois rien et je ne vois rien dans le journal qui donne une aide quelconque..... qu'est-ce que je manque ici ......

merci pour tout éclairage.....

Luis

//Sell Pending Stop Loss & Take Profit Calculation     
     
   if(StopLoss>0)SellStopLoss=PendingSellPrice+(StopLoss*pt);
   if(TakeProfit>0)SellTakeProfit=PendingSellPrice-(TakeProfit*pt);
   
//Place Sell Pending Order
        
         while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();       
         Ticket=OrderSend(Symbol(),OP_SELLSTOP,LotSize,SellLevel,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Stop Order",MagicNumber,0,Red);
         if(Ticket>0)OppositePendindDel();          
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL Stop Order Opened : ",OrderOpenPrice());
           }
        //else Print("Error opening SELL Stop Order : ",GetLastError());
         } 
//+---------------------------------------------------------------------------+
int OppositePendindDel()
{
 int c,d,GLError;
 int e=OrdersTotal();
 
 for(c=e-1;c>=0;c--)
 {  
   OrderSelect(c,SELECT_BY_POS,MODE_TRADES);
   if(OrderType()==OP_BUY||OrderType()==OP_SELL)
   {
    for(d=e-1;d>=0;d--)
    {
     OrderSelect(d,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderType()==OP_SELLSTOP)
     {
      if(!OrderDelete(OrderTicket()))
            GLError = GetLastError();
      
      return(1);
      }
      if(OrderType()==OP_BUYSTOP)
      {
       if(!OrderDelete(OrderTicket()))
             GLError = GetLastError();
       }
       if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());
       return(1);
       }
      }
     }
    }
 
luisneves:

Salut RaptorUk,

J'ai suivi le lien que tu as fourni mais le thème, bien qu'intéressant, est trop long et avec tellement d'opinions divergentes que je m'y suis perdu.

J'ai donc introduit un code pour fermer l'opposé en attente et encore une fois rien et je ne vois rien dans le journal qui donne une aide quelconque..... qu'est-ce que je manque ici ......

RaptorUK:

2. vous devez attendre que l'ordre change de type de OP_BUYSTOP à OP_BUY, cela peut prendre un certain temps,donc vous devez continuer à vérifier... une fois qu'il s'est transformé en OP_BUY, vous pouvez fermer l'ordre opposé et pour ce faire, vous allez devoir trouver le bon ordre à fermer.

 
RaptorUK:



Bonjour RaptorUK ,

Ok, maintenant il semble que l'ordre opposéen attente soit supprimé après qu'unordre en attente se soit déclenché, mais maintenant certains ordres arrivent en double, ce qui signifie que l'application a placé une vente et un achat en même temps et que la taille du lot est la même pour les deux ordres alors qu'elle doit placer un ordre à la fois. Je commence à devenir fou.....

N'importe quelle aide ici, s'il vous plaît !!!!

Dossiers :
 
luisneves:


Bonjour RaptorUK,

Ok, maintenant il semble que l'ordre opposé en attente soit supprimé après qu'un ordre en attente se soit déclenché, mais maintenant certains ordres arrivent en double, ce qui signifie que l'application a placé une vente et un achat en même temps et que la taille du lot est la même pour les deux ordres alors qu'elle doit placer un ordre à la fois. Je commence à devenir fou.....

Toute aide ici, s'il vous plaît !!!!

En regardant votre code, je trouve qu'il est très difficile de suivre ce que vous essayez de faire, je vois très peu de commentaires pour m'aider, votre fonction start() ne me montre pas ce que vous essayez de faire à chaque tick, vous n'avez pas de disposition cohérente de l'indentation.

Quel est le rôle de la fonction GoToClose() ? Si vous faites quelques commentaires au début de la fonction décrivant ce qu'elle est censée faire, je pourrais voir si elle fait réellement ce qu'elle est censée faire.CloseAll() ; si une seule transaction correspondant à votre symbole et à votre numéro magique est bénéficiaire , ou si vous avez plus de 7 transactions pour un symbole et un numéro magique. CloseAll() ne ferme que les transactions correspondant àvotre symbole et àvotre numéro magique. Par conséquent, si vous aviez 7 transactions pour un symbole ou un numéro magique différent, GoToClose() continuerait à appeler CloseAll() et rien d'autre ne se produirait.


Si vous placez une transaction manuelle sur votre compte de démonstration et que vous exécutez ensuite votre EA, il ne fera rien... il verra la transaction mais ne l'ignorera pas, il la comptera et par conséquent ne placera pas sa propre transaction, et ne fermera pas cette transaction ouverte. Que doit faire votre EA dans cette situation ? Que se passe-t-il si une transaction est placée par un autre EA avec un numéro magique différent ?

Vous devez avoir une image claire de ce que vous essayez de faire, commentez votre fonction start() pour que le flux et le processus soient clairs, commentez chaque fonction pour qu'il soit clair ce que chacune est censée faire. Lorsque vous aurez fait cela, vous comprendrez peut-être où se situe votre problème...

 
RaptorUK:

En regardant votre code, je trouve qu'il est très difficile de suivre ce que vous essayez de faire, je vois très peu de commentaires pour m'aider, votre fonction start() ne me montre pas ce que vous essayez de faire à chaque tick, vous n'avez pas de disposition cohérente de l'indentation.

Quel est le rôle de la fonction GoToClose() ? Si vous faites des commentaires au début de la fonction décrivant ce qu'elle est censée faire, je pourrais voir si elle fait réellement ce qu'elle est censée faire.CloseAll() ; si une seule transaction correspondant à votre symbole et à votre numéro magique est bénéficiaire , ou si vous avez plus de 7 transactions pour un symbole et un numéro magique. CloseAll() ne ferme que les transactions correspondant àvotre symbole et àvotre numéro magique. Par conséquent, si vous aviez 7 transactions pour un symbole ou un numéro magique différent, GoToClose() continuerait à appeler CloseAll() et rien d'autre ne se produirait.


Si vous placez une transaction manuelle sur votre compte de démonstration et que vous exécutez ensuite votre EA, elle ne fera rien... elle verra la transaction mais ne l'ignorera pas, elle la comptera et par conséquent ne placera pas sa propre transaction, ni ne fermera cette transaction ouverte. Que doit faire votre EA dans cette situation ? Que se passe-t-il si une transaction est placée par un autre EA avec un numéro magique différent ?

Vous devez avoir une image claire de ce que vous essayez de faire, commentez votre fonction start() pour que le flux et le processus soient clairs, commentez chaque fonction pour qu'il soit clair ce que chacune d'entre elles est censée faire.


Bonjour RaptorUK,

Désolé pour le désordre. Pour l'instant, il semble que l'EA fasse ce que l'on attend d'elle, à l'exception de ce problème ;

L'EA devrait ouvrir un ordre opposé à chaque fois que l'ordre précédent ne prend pas le TakeProfit avec un incrément de taille de lot et avec le même montant de TakeProfit et il le fait.le problème est qu'il ne doit mettre qu'un seul ordre à la fois et il en met plus d'un. En regardant le rapport, vous pouvez voir que les ordres 6 et 7 sont tous deux des ventes et que l'ordre 7 devrait être un achat.

Maintenant j'ai mis le code par fonction. La raison pour laquelle j'ai tous ces appels nuls est que je veux avoir un fonctionnement complet de blocs indépendants et ici je sais que j'ai des problèmes pour arranger cela. Le Go to Open et le Go to Close est juste une façon de dire que si nous n'avons pas d'ordres ouverts, le premier va à l'ouverture, sinon le Go to Close (c'est un désordre, je dois travailler là-dessus)....) J'utilise le symbole et le numéro magique pour garantir que l'ea ne traite que ses propres ordres.

La stratégie principale est (et les blocs sont par cet ordre) ;

1- Deux ordres en attente sont au-dessus et en dessous du prix. Une fois que le prix déclenche l'un d'entre eux, l'ordre en attente opposé est supprimé. Cela fonctionne.

2- Si le prix prend le TakeProfit alors l'ordre est fermé et l'EA recommence à placer deux ordres en attente et le processus recommence. Cela fonctionne.

2- Si le prix ne choisit pas le TakeProfit et rebondit une fois que le montant du TakeProfit a baissé (pour les ordres d'achat) alors un ordre de vente opposé devrait s'ouvrir avec le même montant de TakeProfit et avec une taille de lot supérieure à l'ordre précédent. Cela fonctionne sauf qu'il y a plus d'un ordre et d'après le rapport, on peut voir que les ordres 6 et 7 sont tous deux des ordres de vente et qu'il ne devrait y en avoir qu'un seul, le 7 étant un ordre d'achat.

3- Une fois que le dernier ordre prend un profit, tous les ordres ouverts doivent être fermés. Et le processus commence à gagner. Cela fonctionne.

4- Dans ce ping pong on doit s'attendre à ce qu'au maximum 7 fois un ordre prenne le TakeProfit sinon ces ordres sont fermés.

Par exemple, si nous voulons un TakeProfit de 2 pips, nous attendons que le prix atteigne 3 pips, puis l'une de ces fonctions (break even ou trailing stop de profit minimum) place une ligne d'arrêt au niveau de 2 pips. Si le prix monte (pour l'achat) alors la ligne d'arrêt ira avec lui et une fois que le prix rebondit d'un pip, l'ordre se ferme et parce qu'il a un profit, tous les ordres ouverts sont fermés. Ici, je ne suis pas sûr que cela puisse fonctionner correctement.

Merci

Luis

Dossiers :
 
luisneves:


Salut RaptorUK,

Désolé pour le désordre. Pour l'instant, il semble que l'EA fasse ce que l'on attend de lui, à l'exception de ce problème ;

L'EA devrait ouvrir un ordre opposé chaque fois que l'ordre précédent ne prend pas le TakeProfit avec un incrément de taille de lot et avec le même montant de TakeProfit et il le fait.le problème est qu'il doit mettre un seul ordre à la fois et il en met plus d'un. En regardant le rapport, vous pouvez voir que les ordres 6 et 7 sont tous deux des ventes et que l'ordre 7 devrait être un achat.

Maintenant j'ai mis le code par fonction. La raison pour laquelle j'ai tous ces appels nuls est que je veux avoir un fonctionnement complet de blocs indépendants et ici je sais que j'ai des problèmes pour arranger cela. Le Go to Open et le Go to Close est juste une façon de dire que si nous n'avons pas d'ordres ouverts, le premier va à l'ouverture, sinon le Go to Close (c'est un désordre, je dois travailler là-dessus)....) J'utilise le symbole et le numéro magique pour garantir que l'ea ne traite que ses propres ordres.

La stratégie principale est (et les blocs sont par cet ordre) ;

1- Deux ordres en attente sont au-dessus et en dessous du prix. Une fois que le prix déclenche l'un d'entre eux, l'ordre en attente opposé est supprimé. Cela fonctionne.

2- Si le prix prend le TakeProfit alors l'ordre est fermé et l'EA recommence à placer deux ordres en attente et le processus recommence. Cela fonctionne.

2- Si le prix ne choisit pas le TakeProfit et rebondit une fois que le montant du TakeProfit a baissé (pour les ordres d'achat) alors un ordre de vente opposé devrait s'ouvrir avec le même montant de TakeProfit et avec une taille de lot supérieure à l'ordre précédent. Cela fonctionne sauf qu'il y a plus d'un ordre et d'après le rapport, on peut voir que les ordres 6 et 7 sont tous deux des ordres de vente et qu'il ne devrait y en avoir qu'un seul, le 7 étant un ordre d'achat.

3- Une fois que le dernier ordre prend un profit, tous les ordres ouverts doivent être fermés. Et le processus commence à gagner. Cela fonctionne.

4- Dans ce ping pong on doit s'attendre à ce qu'au maximum 7 fois un ordre prenne le TakeProfit sinon ces ordres sont fermés.

Par exemple, si nous voulons un TakeProfit de 2 pips, nous attendons que le prix atteigne 3 pips, puis l'une de ces fonctions (break even ou trailing stop de profit minimum) place une ligne d'arrêt au niveau de 2 pips. Si le prix monte (pour l'achat) alors la ligne d'arrêt ira avec lui et une fois que le prix rebondit d'un pip, l'ordre se ferme et parce qu'il a un profit, tous les ordres ouverts sont fermés. Ici, je ne suis pas sûr que cela puisse fonctionner correctement.

Merci

Luis

Ok, je pense avoir trouvé ce qui ne va pas avec l'ouverture de plusieurs ordres. J'ai dûles inclure dans le code (Negrito Italic) ;

Open Opposite Order
 
   double  MartingaleBuyPrice = Ask+StopLevel;
   if(MartingaleBuyPrice<UpperStopLevel)MartingaleBuyPrice=UpperStopLevel+MinStop*pt;
   
   double MartingaleSellPrice= Bid-StopLevel;
   if(MartingaleSellPrice>LowerStopLevel)MartingaleSellPrice=LowerStopLevel-MinStop*pt;
   
   int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && ((OrderOpenPrice()-OrderClosePrice())/pt)> ReturnDist && SellTicket==0)
               {                
               Sell Ticket = OrderSend(Symbol(), OP_SELL, mlots, MartingaleSellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Sell Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && (OrderClosePrice()-OrderOpenPrice()/pt)> ReturnDist && BuyTicket==0)
               {               
               Buy Ticket = OrderSend(Symbol(), OP_BUY, mlots, MartingaleBuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Buy Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }
         }
      }
   }
//+------------------------------------------------------------------+  
void AddLimitsBuy()
                  {
                  OrderSelect(Buy Ticket,SELECT_BY_TICKET);
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                       RefreshRates();  
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) BuyStopLoss   = OpenPrice - (StopLoss * pt);
                  if(TakeProfit > 0)BuyTakeProfit = OpenPrice + (TakeProfit * pt);
                                      
                                      if(BuyStopLoss > 0 && BuyStopLoss > LowerStopLevel) 
                                              {                                 
                                                    BuyStopLoss = LowerStopLevel - MinStop*pt;
                                              }
                                      
                                      if(BuyTakeProfit > 0 && BuyTakeProfit < UpperStopLevel) 
                                              {
                                                     BuyTakeProfit = UpperStopLevel + MinStop*pt;
                                              }

                                      if(IsTradeContextBusy())Sleep(10);        

                  if(BuyStopLoss > 0 || BuyTakeProfit > 0) 
                     {          
                      OrderModify(Ticket,OP_BUY,BuyStopLoss,BuyTakeProfit,0);                            
                     }
                    } 
//+------------------------------------------------------------------+
void AddLimitsSell()
                  {
                  OrderSelect(Sell Ticket,SELECT_BY_TICKET);                 
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                      RefreshRates();   
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) SellStopLoss = OpenPrice + (StopLoss*pt);
                                      if(TakeProfit > 0) SellTakeProfit = OpenPrice - (TakeProfit*pt);
                                    
                                      if(SellStopLoss > 0 && SellStopLoss < UpperStopLevel) 
                                              {                                 
                                                    SellStopLoss = UpperStopLevel + MinStop*pt;
                                              }
                                      if(SellTakeProfit> 0 && SellTakeProfit > LowerStopLevel) 
                                              {
                                                    SellTakeProfit = LowerStopLevel - MinStop*pt;
                                              }
                                            
                                      if(IsTradeContextBusy()) Sleep(10);       

                  if(SellStopLoss > 0 || SellTakeProfit > 0) 
                    {           
                      OrderModify(Ticket,OP_SELL,SellStopLoss,SellTakeProfit,0);
                    }                    
                   }  


Fichier de rapport manquant
Raison: