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

 
GumRai:

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.

Merci GumRai pour votre réponse rapide. Mon programme a de nombreuses conditions comme les suivantes. J'ai vérifié jusqu'à P12. C'est comme un pivot. Si les conditions sont satisfaites, alors il ouvre des trades limités sur ces niveaux P1, P2, .... et son nombre est de 12. Je ne voulais pas écrire un code d'achat/vente pour chaque cas. C'est pourquoi j'ai créé des fonctions distinctes buycall/sellcall. Ci-dessous mon ancien code pour la vente.

     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}
 

Voici l'exemple. La même transaction est placée sur chaque tick. J'ai besoin de le placer sur chaque heure. Comme c'est un pivot horaire.

 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}

Lorsque vous ouvrez une limite de vente, vous définissez BuyTicket à 0.

Ensuite, vous vérifiez si BuyTicket==0, bien sûr que oui, vous venez de le définir.

Ensuite, vous fixez SellTicket à 0.

Au tick suivant, Sellticket==0, vous ouvrez donc une limite de vente et réglez à nouveau BuyTicket à 0.

et ainsi de suite............

 
GumRai:

Lorsque vous ouvrez une limite de vente, vous définissez BuyTicket à 0.

Ensuite, vous vérifiez si BuyTicket==0, bien sûr que oui, vous venez de le définir.

Ensuite, vous fixez SellTicket à 0.

Au tick suivant, Sellticket==0, vous ouvrez donc une limite de vente et réglez à nouveau BuyTicket à 0.

et ainsi de suite............

Ensuite, je dois supprimer les deux lignes que vous avez mises en évidence. C'est ce que j'ai fait. Maintenant, je n'affiche que le résultat d'une heure pour 2 mois de données de back testing.

Une autre chose que je remarque, dans mon sellcall, j'ai un reverse trade sur l'achat. Si la transaction de vente est arrêtée, la transaction d'achat s'ouvre. Maintenant, la fonction sellcall renvoie (Selltickets), est-ce que c'est correct ?

Je vous remercie.

 

int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
   if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,0,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       
       }
   }
 } 
 }
   return(SellTicket);

Je comprends maintenant dans ce code, d'abord il vérifie sellticket == 0 oui évident, puis placé l'ordre de vente, le prochain buyticket == 0 oui, le prochain place l'ordre d'achat ... mais quand le retour ... de nouveau vérifier sellticket == 0 , non ce n'est pas maintenant ... donc c'est pourquoi Ea arrêté après avoir pris un ensemble. Mais comment supprimer ce problème. Dans mon EA, les ordres inactifs en attente sont supprimés toutes les 59 minutes à partir de l'heure de départ. Je l'ai configuré de cette façon.

 

Maintenant, j'ai modifié le code de la manière suivante, il lit tous les supports et résistances.

J'ai un maximum de 6 supports et 6 résistances pour une heure. Parmi les 6 qui remplissent les conditions, il ouvre des ordres limites sur ces 6. Si 1 remplit les conditions, il ouvre des ordres limites sur celui-ci. C'est l'algo.

J'ai donc configuré le code de la façon suivante pour l'appel de fonction.

int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,TimeCurrent()+3540,Green);
    
   }   
return(0);
}

int SellCall(double SC)
{
  
 if( SellTicket >= 0 && SellTicket <= 5)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);
  
   } 
   return(0);
}

Maintenant, il fonctionne pendant une heure et vérifie 6 niveaux pour chaque achat/vente. Mais il ne fonctionne que pendant une heure. Que faire ici pour qu'il fonctionne parfaitement pour l'ensemble des données.

 
if ( BuyTicket >= 0 && BuyTicket <= 5)

Cela ne fonctionnera que dans le testeur de stratégie et ne fera plus rien une fois que les 6 premiers ordres seront ouverts.

Vous ne pouvez pas utiliser un numéro de ticket pour un test de cette manière.

 
GumRai:

Cela ne fonctionnera que dans le testeur de stratégie et ne fera plus rien une fois que les 6 premiers ordres seront ouverts.

Vous ne pouvez pas utiliser un numéro de ticket pour un test de cette manière.

Merci de votre réponse.

Alors que dois-je faire ? Si je supprime le BuyTicket =>0 ou toute autre condition BuyTicket. Alors l'EA prend de nombreuses positions identiques à chaque tick....., ce qui me donne une erreur d'ordre de 148.

 
cashcube: Alors que dois-je faire.
Réponse précédente.
 
cashcube:

Merci de votre réponse.

Alors que dois-je faire. Si je supprime la condition BuyTicket =>0 ou toute autre condition BuyTicket. Alors l'EA prend beaucoup de trades identiques à chaque tick....., ce qui me donne une erreur d'ordre de 148.

Nous ne savons pas ce que vous essayez de faire.

Si vous ne voulez qu'une seule transaction ouverte à la fois, vérifiez qu'il n'y a pas d'ordres ouverts avant d'en envoyer une nouvelle.

Si vous ne voulez qu'une seule transaction par barre, ne testez qu'une seule fois par barre.

Si vous voulez une combinaison de conditions, testez la combinaison.

Raison: