Répondre

Codification possible pour permettre l'ouverture de plusieurs commerces afin de dépasser la taille maximale du terrain

0 réponses

jbrunet

Abonné, bbp_participant, communauté, 13 réponses.

Visiter le profil

il y a 10 ans #111607

La plupart des courtiers limitent le nombre de lots qu'ils vous autorisent à ouvrir. Dans certains cas, il est souhaitable d'ouvrir plusieurs transactions afin d'obtenir un nombre de lots ouverts supérieur au maximum autorisé par le courtier pour un ticket de transaction. J'ai fait quelques expériences et j'ai découvert que la modification suivante de la fonction sqOpenOrderWithErrorHandling() permet d'obtenir ce résultat. Je propose cette modification comme une suggestion à inclure dans les versions futures, si les développeurs et les autres utilisateurs le jugent souhaitable. Si quelqu'un souhaite essayer cette fonction, il est libre de le faire, mais assurez-vous de la tester minutieusement pour être sûr qu'elle ne casse rien d'autre. Mes propres tests ont montré (jusqu'à présent) que cela ne perturbe pas d'autres fonctions et je l'ai donc utilisé avec succès.

 

Veuillez noter qu'au lieu de LotsDecimals, qui est défini comme double par EA Wizard, j'utilise habituellement une variable int, decimals, qui est une variable int globale et qui est définie comme le nombre de décimales autorisées pour la taille des lots par ce courtier particulier. Dans la plupart des cas, il s'agit de 2, pour les courtiers qui autorisent les micro-lots. J'ai utilisé LotsDecimals dans mon codage personnalisé ci-dessous, puisque c'est la norme pour EA Wizard, mais dans ma propre pratique, j'utilise la variable int decimals à la place.

 

int sqOpenOrderWithErrorHandling(string symbol, int orderType, double orderLots, double price, double realSL, double realPT, string comment, int orderMagicNumber) {
   int ticket, error ;
 
// ***** Code personnalisé ajouté
  double mmaxlots=MarketInfo(Symbol(), MODE_MAXLOT) ;
  double mminlots=MarketInfo(Symbol(), MODE_MINLOT) ;
 
  double jlots=orderLots ;     
  double ilots=0.0 ;
  while(jlots>0.0) 
    {
        ilots=jlots ;
        if(ilots>mmaxlots) ilots=mmaxlots ;
        if(ilots<mminlots) ilots=mminlots ;
        ilots=NormalizeDouble(ilots,LotsDecimals) ;
        jlots=jlots-ilots ;
      
 
 
   if(symbol == "NULL") {
      ticket = OrderSend(Symbol(), orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber) ;
   } else {
      ticket = OrderSend(symbol, orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber) ;
   }
// **** Fin du code personnalisé ajouté pour cette section... Voir le code supplémentaire à la fin de la fonction.
 

 

   if(ticket < 0) {
      // la commande a échoué, l'erreur est consignée dans le journal
      return(-1*GetLastError()) ;
   }
 
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ;
   Log("Order opened : ", OrderTicket(), " at price :", OrderOpenPrice()) ;
 
   // mettre en place un stop loss et un objectif de profit
   // il faut le faire séparément pour prendre en charge les courtiers ECN
   if((realSL > 0 || realPT > 0) && (OrderStopLoss() != realSL || OrderTakeProfit() != realPT))) {
      if(OrderModify(ticket, OrderOpenPrice(), realSL, realPT, 0, 0)) {
         Log("Ordre modifié, StopLoss : ", realSL,", Profit Target : ", realPT) ;
      } else {
         error = GetLastError() ;
         Log("Erreur lors de la modification de la commande : ",error, " : ", ErrorDescription(error)) ;
 
         RefreshRates() ;
         if(orderType == OP_BUY) price = Ask ;
         if(orderType == OP_SELL) price = Bid ;
         if(OrderClose(ticket, orderLots, price, 6) != true) {
            error = GetLastError() ;
            Log("CANNOT CLOSE ORDER : ", OrderTicket(), ", Erreur d'ouverture de l'ordre : ", error, " : ", ErrorDescription(error)) ;
            retour(-1*erreur) ;
         }
      }
   }
 
// ***** Code additionnel personnalisé

 

  if(jlots>0.0) continue ;
 }  
 
// **** Fin du code personnalisé ajouté pour cette section

 

 
  retour(ticket) ;
}

0