Problème avec le montant total des ordres ouverts

 

Bonjour à tous. J'ai essayé tous les conseils que j'ai pu trouver sur ce forum, mais aucun ne semble fonctionner. Quelqu'un peut-il m'aider ? Je pense que le problème vient de ma fonction OrderTotal. Je négocie 10 paires de devises, c'est-à-dire que j'ai ouvert l'EA sur 10 graphiques. Il s'agit d'une simple stratégie de couverture. Je veux que l'EA ouvre une transaction (longue ou courte) en fonction des signaux. Si le trade va dans mon sens, Trailingstop ou Take profit. Si, cependant, le trade va dans le sens contraire, je veux qu'il ouvre un trade dans la direction opposée. Le code que j'utilise semble fonctionner mais parfois il se bloque, c'est-à-dire qu'il n'ouvre plus aucun trade. De plus, quand il y a un ou deux trades ouverts sur une paire, il ne semble pas vouloir ouvrir de trades sur d'autres paires.

Voici mon code

int start()
{
     {
     if (OrdersTotal() == 0)
     if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
         }

  for(int i=OrdersTotal()-1; i>=0; i--) 
  {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
      if (OrderSymbol()==Symbol())
      //Calculate the point value in case there are extra digits in the quotes
      if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
      else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
      else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
      else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);

//calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
      double lots = NormalizeDouble(OrderLots() * Multiplier, 2); 
      
     if (OrderType() == OP_BUY) 
      {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *PointValue,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *PointValue,Digits))
            {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *PointValue,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
              }
            }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*PointValue,Digits))
            if(OrdersTotal() == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*PointValue, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
          }
 
  1. Vous devez filtrer les métiers.
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
          if (OrderSymbol()==Symbol())
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;  // These
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;// four
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; // lines
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);                    // Execute only on Symbol orders.
    
          double lots = NormalizeDouble(OrderLots() * Multiplier, 2);  // This and below are always executed
          if (OrderType() == OP_BUY)                                   // Symbol is irrelevant.             
    
    Avec des accolades.
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
          if (OrderSymbol()==Symbol())
    {                                                                   // Rest of code executes only on Symbol orders.
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
          double lots = NormalizeDouble(OrderLots() * Multiplier, 2); 
          
          if (OrderType() == OP_BUY) 
             :
    }

  2. Sur un broker à 4 chiffres, point = 0.0001
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
    Fixé et simplifié.
    PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    if(MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1) PointValue *= 10;

  3. Puisque tout ce qui se trouve à l'intérieur des accolades est Symbol(), chaque MarketInfo peut être remplacé par des variables prédéfinies
  4. Ne codifiez pas les chiffres en dur.
    Vérifiez vos codes de retourQue sont les valeurs de retour des fonctions ? Comment les utiliser ? -MQL4 forum and Common Errors in MQL4 Programs and How to Avoid Them - MQL4 Articles
    result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue);
 

1. merci beaucoup pour votre aide. J'ai ajouté un support comme suggéré, mais l'EA n'ouvre toujours une transaction que sur une paire de devises. Il n'ouvrira pas de transaction sur aucun des autres graphiques même si les conditions d'achat ont été remplies. Je suis bloqué sur ce point depuis des semaines, pourriez-vous s'il vous plaît jeter un autre coup d'œil.

2) EDIT : Plus nécessaire

3) Mon code ressemble maintenant à ceci

int start()
{
  {
    if (OrdersTotal() == 0)
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
  }       

  for(int i=OrdersTotal()-1; i>=0; i--) 
    {
      //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
      double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
      if (OrderSymbol()==Symbol())
    { 
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(OrdersTotal() == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }
 
    if (OrdersTotal() == 0)
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*PointValue, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
Si un ordre est ouvert sur une paire, il n'en ouvrira pas d'autre jusqu'à ce que OrdersTotal()==0 à nouveau.
 
GumRai:
Si un ordre est ouvert sur une paire, il n'en ouvrira pas d'autre jusqu'à ce que OrdersTotal()==0.

Je vous remercie pour votre aide. J'ai besoin de limiter le premier ordre original à une seule transaction. Je ne veux pas que l'EA continue à ouvrir des ordres lorsque la condition d'achat est remplie. J'ai donc ajouté l'Orderstotal pour limiter cela. Ce code, cependant, semble interférer avec le code suivant

else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(OrdersTotal() == 1) //<----------
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());

Ici, je veux que l'EA n'ouvre qu'une seule couverture par transaction ouverte, donc OrderTotal ==1.

Quelle est donc la meilleure façon de limiter le nombre de transactions, c'est-à-dire une transaction initiale et une transaction de couverture ? Merci.

 
Trader3000: Quel est donc le meilleur moyen de limiter le nombre de transactions, c'est-à-dire une transaction originale et une transaction de couverture ?
  1. Donc comptez le nombre d'ordres qui sont ouverts sur le graphique actuel. OrdersTotal renvoie le nombre d'ordres qui sont ouverts sur tous les graphiques.
  2. Le fait de ne pas filtrer par le nombre magique rend l'EA incompatible avec tous les autres (y compris lui-même sur d'autres TF) et le trading manuel 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 l'aide que vous m'avez apportée. J'ai résolu le problème et l'EA ouvre maintenant une transaction sur tous les graphiques lorsque la condition d'achat est remplie, mais rien ne fonctionne en dessous. L'EA n'appelle pas les fonctions Trailingstop ou Hedge. Quelqu'un pourrait-il jeter un coup d'œil et me dire ce que j'ai fait de mal, car je n'arrive pas à comprendre.

int start()
{ 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
    {
         result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
    
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
 else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(total == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }
 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   double lots = NormalizeDouble(OrderLots() * Multiplier, 2);

Je ne sais pas exactement ce que vous faites, mais je vous suggère d'éviter de nommer 2 variables dont la seule différence est une majuscule. Il est facile de confondre les 2, surtout lorsque d'autres personnes qui lisent votre code peuvent très bien avoir adopté la convention selon laquelle les variables qui commencent par une lettre majuscule sont Globalscope.

Aucune commande n'a été sélectionnée, donc OrderLots() peut être n'importe quoi.


    
     if (OrderType() == OP_BUY) 

Ceci utiliserait les valeurs de la dernière commande sélectionnée dans la boucle précédente, il se peut que ce ne soit pas le nombre magique ou le symbole correct.

 

Merci pour votre réponse. Ce que j'essaie de faire, c'est que l'EA ouvre la première transaction originale dont la taille de lot est un pourcentage de mon capital. Si la transaction est défavorable, le hedge est déclenché au moment opportun.

L'EA doit ouvrir une couverture dans la direction opposée, mais ici la taille de lot doit être 3 fois la taille de lot d'origine (OrderLots).

J'ai maintenant placé les Lots directement dans la fonction OrderSend, mais ni le trailingstop ni les {} n'ont été utilisés.

le hedge est déclenché au moment opportun. Les deux fonctionnaient parfaitement avant que je n'ajoute ceci

total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }

int start()
{ 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
    {
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(total == 1)
            result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }

Je crois que mes accolades {} ne sont pas au bon endroit.

 
Je vous l'ai déjà dit dans la deuxième partie de mon message précédent.
 

Merci beaucoup pour toute l'aide que vous m'avez apportée jusqu'à présent. Je progresse. Tout semble maintenant fonctionner comme il se doit, sauf que l'EA ne tient pas compte de la condition d'ouverture d'un hedge trade. Il ouvre parfois (mais pas toujours) une opération de couverture même si les conditions ne sont pas remplies. De même, le TrailingStop ne se déclenche pas toujours. Je pense qu'il me manque encore des accolades {} quelque part. Mon code ressemble maintenant à ceci. Quelqu'un peut-il y jeter un coup d'œil pour moi ? Merci.

int start()
{ 
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
    {
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK)
            if(total == 1)
            {
            result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
            }
       }
      // else if (OrderType() == OP_SELL)
      // ... 

GumRai:

This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.


J'ai essayé de résoudre ce problème en changeant les accolades. Est-ce la meilleure façon, ou dois-je dupliquer et ajouter la fonction OrderSelect à chaque fois avant OrderSend ? Merci.
Raison: