L'Ea crée plusieurs ordres identiques en attente/limite [Aidez-nous].

 

Bonjour, j'ai créé un Ea, mais lorsque je fais un back testing, il crée plusieurs ordres identiques en attente sur chaque tick. Comment arrêter cela ? J'ai juste besoin d'un ordre à la fois, je n'ai pas besoin de sa copie.

Si j'exécute cet EA sur un graphique horaire avec"prix ouvert uniquement", il ne crée pas de copie.

De plus, mon EA a une option pour le commerce de renversement si la limite d'achat échoue alors il ouvre le commerce de vente. S'il vous plaît, dites-moi également si je l'ai configuré correctement ou non. Toute aide sera appréciée.

Je vous remercie pour votre temps.

// Main function//
if(condition)
   {
     if( condition )
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( condition)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
   if ( BuyTicket == 0)
   {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;

   // reverse trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
     }    
   }
      
return(BuyTicket);
}
 
cashcube: Comment arrêter ça.
Comment pensez-vous ? Vous vérifiez qu'il y a déjà une sortie avant d'en ouvrir une nouvelle.
 
WHRoeder:
cashcube : Comment arrêter ça.
Comment ? Vous vérifiez qu'il y a déjà une sortie avant d'en ouvrir une nouvelle.

Que faire alors ? Supprimer le code buyticket == 0 & sellticket == 0 ?
 
Les EA doivent être codés pour récupérer. En cas de panne de courant, de crash du système d'exploitation, de fermeture accidentelle du terminal ou du graphique, au prochain tick, toutes les variables statiques/globales du ticket auront été perdues. Vous aurez un ordre ouvert mais vous ne le saurez pas, donc l'EA n'essaiera jamais de le fermer, de suivre le SL, etc. Comment allez-vous récupérer ? Utilisez une boucleOrderSelect pour récupérer, ou un stockage persistant (GV/fichier) des numéros de tickets requis.
 
WHRoeder:
Les EA doivent être codés pour se rétablir. Si l'alimentation électrique est coupée, si le système d'exploitation se bloque, si le terminal ou le graphique est accidentellement fermé, au prochain tick, toutes les variables statiques/globales du ticket auront été perdues. Vous aurez un ordre ouvert mais ne le saurez pas, donc l'EA n'essaiera jamais de le fermer, de suivre le SL, etc. Comment allez-vous récupérer ? Utilisez une boucleOrderSelect pour récupérer, ou un stockage persistant (GV/fichier) des numéros de tickets requis.

Bonjour, j'ai ajouté le changement de code de la manière suivante.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

Il prend toujours les mêmes ordres plusieurs fois à chaque tick.

De plus, si je supprime le signe " !", il ne prend aucune transaction.

Enfin, dois-je supprimer les contrôles buyticket et sellticket de ma fonction principale ?

Je vous remercie.

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. Ne collez pas le code
    Jouer la vidéo
    Veuillez modifier votre message.
    Pour les grandes quantités de code, joignez-le.

  2. Vous n'écririez jamais if( (2+2 == 4) == true) n'est-ce pas ? if(2+2 == 4) est suffisant. N'écrivez donc pas if(bool == true), utilisez if(bool) ou if(! bool). Le code devient auto-documenté lorsque vous utilisez des noms de variables significatifs, comme bool isLongEnabled. Long_Entry ressemble à un prix de déclenchement ou à un numéro de billet et "if long entry" est une phrase incomplète.
  3. Où vérifiez-vous si le BuyTicket a été fermé ? La sélection par ticket sera toujours vraie (avec un numéro de ticket valide), l'ordre peut être en attente, ouvert, fermé ou supprimé.
  4. Vous avez complètement ignoré ma suggestion d'une boucle OrderSelect.
 

Bonjour WHReder, merci pour votre réponse.

Oui, j'ai ajouté ces éléments dans le code SRC. Mais cela ne s'est pas affiché lorsque j'ai édité.

J'ai supprimé == true terms comme vous l'avez suggéré.

Ne vous méprenez pas, j'ai un point faible dans la compréhension de cette boucle orderselect. Je ne l'ai pas ignorée. J'ai essayé de l'ajouter, mais c'est trop complexe, l'exécution montre 16 erreurs et 2 avertissements. Dans ce code, qu'est-ce que MN.Count ?

// extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

A propos de la vérification de la fermeture du ticket d'achat. Je ne l'ai pas vérifié parce que j'ai vérifié si le prix actuel est inférieur à la perte d'achat, alors l'opération d'achat a été fermée et j'ai ouvert un ordre de vente.

 Bid < BuyStopLoss 

Salutations

 

J'ai arrangé le code d'une certaine manière comme ceci... Mais je montre 2 erreurs maintenant... "Myselect" & "MyOrdersTotal" peuvent être déclearisés seulement dans la portée globale.

int BuyCall( double BC)
{  
//-----------code
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
   if(!OrderSelect(iWhat, eSelect, ePool) )  return (false);
   int      mn = OrderMagicNumber();
   if(mn < MNB1              )  return (false);
   if(mn > MNB2               )  return (false);
   if(OrderSymbol()      != Pair   )  return (false);
   if(ePool != MODE_HISTORY               )  return (true);
   return(OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){   #define  OP_ALL -1
   if(ePool == MODE_TRADES)            iPos = OrdersTotal()        - 1;
   else                                iPos = OrdersHistoryTotal() - 1;
   for(nOrders=0; iPos >= 0; iPos--) if(
      MySelect(iPos, SELECT_BY_POS, ePool)) if(
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return(nOrders);
}

  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }
      
return(BuyTicket);
}
 
Vous ne pouvez pas déclarer une fonction à l'intérieur d'une autre fonction
 
GumRai:
Vous ne pouvez pas déclarer une fonction à l'intérieur d'une autre fonction

Alors comment puis-je le faire ? Je veux dire que j'ai beaucoup de conditions à vérifier individuellement pour ouvrir un ordre d'achat/de vente.

C'est pourquoi j'ai créé une fonction buycall/sellcall pour rendre le code plus facile.

C'est juste que l'EA prend tellement de transactions identiques. Je ne sais pas comment arrêter cela.

 
GumRai:
Vous ne pouvez pas déclarer une fonction à l'intérieur d'une autre fonction

cashcube:

Alors comment puis-je le faire ? Je veux dire que j'ai beaucoup de conditions à vérifier individuellement pour ouvrir un ordre d'achat/de vente.

C'est pourquoi j'ai créé une fonction buycall/sellcall pour rendre le code plus facile.

C'est juste que l'EA prend tellement de transactions identiques. Je ne sais pas comment arrêter cela.

Tout d'abord, n'essayez pas de déclarer une fonction à l'intérieur d'une autre fonction.

Je suis incapable de comprendre ce que vous essayez de faire en regardant le code que vous avez posté. Je ne peux donc pas vous aider.