Ouvrir un ordre opposé - page 2

 

Vous ne pouvez pas faire cela pour ajuster le Slippage pour les Brokers à 4/5 chiffres, cela n'a aucun sens.

Le slippage DOIT être un int, donc un nombre entier, pour un Broker à 4 chiffres le slippage est en Pips, donc Slippage = 3 signifie 3 Pips, pour un Broker à 5 chiffres le slippage est en points, donc Slippage = 3 signifie 3 points ou 0. 3 Pips.Donc, pour compenser, pour un courtier à 5 chiffres, le chiffre du slippage doit être multiplié par dix, ce qui donne 30 ... 30 points = 3 Pips.

Donc ce code est faux...

int init()
   {
   if (Digits ==3 || Digits ==5) pt = 10 * Point;
   else pt = Point;
   Slippage = Slippage * pt;    
   }
 

Essayez cette version modifiée de votrefonction OpenOppositeOrder() ....

void OpenOppositeOrder() 
   {
   int Op;  
 
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  // only continue if the OrderSelect() worked
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice())
               {      
               Ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && Ask > OrderOpenPrice())
               {      
               Ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError() );
                  }   
               }
            }
         }
      }
   }
 
RaptorUK:

Essayez cette version modifiée de votre fonction OpenOppositeOrder() ....


Salut RaptorUk,

Avant tout, merci pour l'aide fournie jusqu'à présent. Maintenant l'EA commence à fonctionner. J'ai fait d'autres modifications sur la façon de tout fermer si un ordre a un profit et c'est ok mais comme vous l'avez déjà vu et prédit pour que cette stratégie fonctionne il est nécessaire que l'ordre qui atteint le profit ait la taille du lot augmentée pour compenser les ordres précédents. avec cela à l'esprit j'ai introduit le code pour le faire. Donc je fais face à une confusion ici. J'ai besoin de confirmer si le dernier ordre a réalisé un profit ou non et je veux utiliser OrderProfit() de manière à ajuster la taille du lot de l'ordre suivant, mais ne dois-je pas fermer l'ordre précédent pour obtenir cette information ?

Voici le code pour ouvrir un ordre opposé qui fonctionne bien (merci à vous) où j'introduis le code supplémentaire pour savoir si l'ordre précédent qui est ouvert a un profit. Suis-je dans la bonne voie pour obtenir cette information ?

Je vous remercie

Luis

 void OpenOppositeOrder() 
 {
// LastOrder Loss Compensation 
   int Orders;
   Orders= OrdersTotal();
   if (Orders>0)
   {  
    for(i=0;i<Orders;i++)
   {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()== MagicNumber)
   {
    lastprofit = OrderProfit();
    lastlot = OrderLots();
   }
  }
 }
  mlots=0;
  if (lastprofit<0)mlots=NormalizeDouble(lastlot*Multiplier,Digits);
  else mlots=LotSize;
 
//+------------------------------------------------------------------+ 
//Open Opposite Order 
   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 && Bid < OrderOpenPrice())
               {  
               if(Martingale)ilots=mlots;else ilots=LotSize; 
               Ticket = OrderSend(Symbol(), OP_SELL, ilots, Bid, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && Ask > OrderOpenPrice())
               { 
               if(Martingale)ilots=mlots;else ilots=LotSize;
               Ticket = OrderSend(Symbol(), OP_BUY, ilots, Ask, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError() );
                  }   
               }
            }
         }
      }
   }
 
luisneves:


Bonjour RaptorUk,

Avant tout, merci pour l'aide fournie jusqu'à présent. Maintenant l'EA commence à fonctionner. J'ai fait d'autres modifications sur la façon de tout fermer si un ordre a un profit et c'est ok mais comme vous l'avez déjà vu et prédit pour que cette stratégie fonctionne, il est nécessaire que l'ordre qui atteint le profit ait la taille du lot augmentée pour compenser les ordres précédents. J'ai besoin de confirmer si le dernier ordre a réalisé un profit ou non et je veux utiliser OrderProfit() de manière à ajuster la taille du lot de l'ordre suivant, mais ne dois-je pas fermer l'ordre précédent pour obtenir cette information ?

Voici le code pour ouvrir un ordre opposé qui fonctionne bien (merci à vous) où j'introduis le code supplémentaire pour savoir si l'ordre précédent qui est ouvert a un profit. Suis-je dans la bonne voie pour obtenir cette information ?

Je pense que cela va vous poser des problèmes....

mlots = NormalizeDouble(lastlot * Multiplier, Digits);

Par exemple, si le résultat était 1.12316734 lots, votre NormalizeDouble() sur un par à 5 chiffres le changera en1.12316, ce qui ne sera pas conforme à l'exigence du Lot Step. ... vous devez utiliser des mathématiques pour que votre taille de lot modifiée soit un multiple du Lot Step MarketInfo(Symbol(),MODE_LOTSTEP)

 
RaptorUK:

Je pense que cela va vous poser des problèmes....

par exemple, si le résultat était 1.12316734 lots, votre NormalizeDouble() sur un par à 5 chiffres le changera en1.12316 et cela ne sera pas conforme à l'exigence du Lot Step . ... vous devez utiliser des mathématiques pour que votre taille de lot modifiée soit un multiple du Lot Step MarketInfo(Symbol(),MODE_LOTSTEP)


Bonjour RaptorUK,

En ce qui concerne votre conseil de chercher à maintenir la taille de mon lot à un multiple de Lot Step, je cherche à me documenter sur le sujet.

Maintenant j'ai un autre problème (plus un...)

Pour ouvrir les ordres au-dessus et en dessous du prix actuel, je veux utiliser une ligne où une fois que l'Ea commence à courir, je compare le prix avec la ligne qui est encore.

Un premier problème se pose ; comment puis-je comparer la ligne avec une différence dans le prix ?

Voici le code que j'ai jusqu'à présent. Voici comment je peux donner le nom à comparer car si je mets iHigh après priceline cela ne fonctionne pas.

Merci d'avance pour tout indice sur ces questions.

Luis

priceline=iHigh(Symbol(),0,0);
 ObjectCreate("highline",OBJ_HLINE,0,0,Bid); 
 ObjectSet("highline",OBJPROP_COLOR,LimeGreen);
 ObjectSet("highline",OBJPROP_WIDTH,1);
 WindowRedraw();

Cela semble ne pas fonctionner du tout ...

if(Bid > priceline+Distance*pt)                      
                {       
// Open buy order

                            while(IsTradeContextBusy()) Sleep(10);
                                 RefreshRates();        
                       
             Ticket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
             if(Ticket>0)AddLimitsBuy();
            }

J'ai mis ici l'objet supprimer, parce que j'ai besoin que la ligne soit supprimée avec la clôture de tous les ordres. ai-je raison ?

void CloseAll()
      {
         int i,Op,Error;
         int Total=OrdersTotal();
     
         if(Total>0)
         {
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         else
         {
         ObjectDelete("highline");
         }
        }
       }
      }
 
luisneves:

Cela ne semble pas fonctionner du tout (...)

J'ai mis ici l'objet supprimer, parce que j'ai besoin que la ligne soit supprimée avec la clôture de tous les ordres. ai-je raison ?

OK, je pense que je comprends ce que vous voulez faire, vous voulez vérifier où en est Bid par rapport à votre ligne, pour ce faire, vous devez obtenir la position de la ligne ... utilisez ObjectGet() avec le nom de l'objet et l'indice de propriétéOBJPROP_TIME1 cela retournera le prix auquel la ligne est placée.

Votre appel ObjectDelete() me semble correct. Je n'aime pas particulièrement l'utilisation de ObjectsDeleteAll(), je pense que c'est paresseux et dangereux... ou au moins gênant pour les autres.

 
RaptorUK:

OK, je pense que je comprends ce que vous voulez faire, vous voulez vérifier où se trouve Bid par rapport à votre ligne, pour cela vous devez obtenir la position de la ligne ... utilisez ObjectGet() avec le nom de l'objet et l'index de la propriétéOBJPROP_TIME1 cela retournera le prix auquel la ligne est placée.

Votre appel ObjectDelete() me semble correct.


Bonjour RaptorUK,

J'essaie de fermer tous les ordres si l'un d'entre eux clôture avec un bénéfice, mais lorsque cela se produit, un ordre en attente est toujours ouvert, alors que l'instruction de fermeture est incluse dans la fonction CloseAll(). Avez-vous des indices sur ce problème ?

Merci d'avance pour toute aide que vous pourrez m'apporter

Luis

int GoToClose()
 {
  int pos;  
 {
  for(int Profit=OrdersTotal()-1;pos>=0;pos--)
  if(OrderSelect(Profit,SELECT_BY_POS)
  && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()
  && OrderProfit()+OrderSwap()+OrderCommission()>0||OrdersTotal()> MaxOrders)CloseAll();  
 }
}
//+---------------------------------------------------------------------------+  
      void CloseAll()
      {
         int Op,Error;
                    
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if(Op==OP_SELLSTOP||OP_BUYSTOP||OP_SELLLIMIT||OP_BUYLIMIT)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print("Error opening BUY Stop Order : ",GetLastError());         
         }
        }             
 
luisneves:


Bonjour RaptorUK,

J'essaie de fermer tous les ordres si l'un d'entre eux clôture avec un bénéfice, mais lorsque cela se produit, un ordre en attente est toujours ouvert, alors que l'instruction de fermeture est incluse dans la fonction CloseAll(). Avez-vous des indices sur ce problème ?

Vous devez comprendre comment les expressions fonctionnent... Vous ne pouvez pas faire ça...

if(Op == OP_SELLSTOP || OP_BUYSTOP || OP_SELLLIMIT || OP_BUYLIMIT)

C'est une situation similaire à celle-ci, mais pas exactement la même: https://www.mql5.com/en/forum/141790


Quel est le résultat de ....

WhatValue = (5  || 4  ||  3  ||  2 );

|| est un opérateur booléen et ne fonctionne donc que sur les bools....


ce qui donne une valeur booléenne résultante . . .

( Op == OP_SELLSTOP )

. . . si vous voulez utiliser un opérateur booléen sur vos valeurs, vous pouvez utiliser ceci. . . .

int WhatValue = (5  | 4  |  3  |  2 );

. . . mais ce n'est pas ce que vous essayez de faire.

 
RaptorUK:

Vous devez comprendre comment les expressions fonctionnent... Vous ne pouvez pas faire ça...

c'est une situation similaire à celle-ci, mais pas exactement la même: https://www.mql5.com/en/forum/141790


Quel est le résultat de . . .

|| est un opérateur booléen et ne fonctionne que sur les bools... ...


Le résultat est une valeur booléenne....

. . . si vous voulez utiliser un opérateur booléen sur vos valeurs, vous pouvez utiliser ceci. . . .

. . . mais ce n'est pas ce que vous essayez de faire.


Salut RaptorUK,

Je vois, mais maintenant avec cette idée en tête, j'ai modifié le code et l'ordre en attente est toujours là...

void CloseAll()
      {
         int Op,Error;
                    
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)
         && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
         {
         Op=OrderType();
         if(Op==OP_BUY)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Bid, UseSlippage, Yellow);
         }
         if(Op==OP_SELL)
         {
         RefreshRates();
         OrderClose(OrderTicket(),OrderLots(),Ask, UseSlippage, Yellow);
         }
         if(Op==OP_SELLSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         if(Op==OP_BUYSTOP)
         {
         RefreshRates();
         OrderDelete(OrderTicket());
         }
         else Print("Error opening BUY Stop Order : ",GetLastError());         
         }
        }        
 
luisneves:


Bonjour RaptorUK,

Je vois, mais maintenant avec cette idée en tête, j'ai modifié le code et l'ordre en attente est toujours là...

Il peut s'agir d'un Magic Number différent duMagicNumber ou d'un symbole autre que celui sur lequel l'EA fonctionne ou d'un OP_SELLLIMIT ou OP_BUYLIMIT . . aussi, vous devez vérifier les valeurs de retour de vos appels OrderDelete() et OrderClose() . . .

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 ?


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

Raison: