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

 
GumRai:

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.

Je l'explique ici :

J'ai un maximum de 6 supports et 6 résistances pour chaque heure. Cela peut être 2 supports et 2 résistances ou n'importe quoi d'autre mais un maximum de 6 supports et 6 résistances pour chaque heure.

Je veux ouvrir un ordre limite sur ces niveaux S/R au début de chaque heure.

J'ai créé une fonction d'achat et une fonction de vente... de sorte que je n'ai pas besoin d'écrire le même code d'achat/vente pour les 12 niveaux S/R.

Maintenant, lorsque j'utilise le code suivant :

int SellCall(double SC)
{
   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);
}

Il crée plusieurs ordres identiques :

J'ai utilisé le codeWHRoeder aussi. Dans une fonction séparée. Comme je ne peux pas déclarer de fonction dans une fonction.

 

Votre problème n'est pas la fonction que vous avez postée, votre problème est dans le code qui appelle la fonction.

De toute évidence, il n'y a pas de vérification pour voir si les commandes ont déjà été passées.

 
GumRai:

Votre problème n'est pas la fonction que vous avez postée, votre problème est dans le code qui appelle la fonction.

Il est évident qu'il n'y a pas de vérification pour savoir si les commandes ont déjà été passées.

code d'appel de la fonction (snapshot)

 if(FS == 1 || FS == 5 || FS == 7)
   {
     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      
      BuyCall(S1);
      }  
     if( P3 == 1 || P3 ==5 || P3 ==7)
      {
  
      BuyCall(S2);
      }  
     if( P4 == 1 || P4 ==5 || P4 ==7)
      {
      
      BuyCall(S3);
      }      
          
     if( P5 == 1 || P5 ==5 || P5 ==7)
      {
     
      BuyCall(S4);
      }      
     if( P6 == 1 || P6 ==5 || P6 ==7)
      {
     
      BuyCall(S5);
      }  
     if( P7 == 1 || P7 ==5 || P7 ==7)
      {
      
      SellCall(R0);
      } 
     
      if( P8 == 1 || P8==5 || P8 ==7)
      {
    
      SellCall(R1);
      }  
      
     if( P9 == 1 || P9==5 || P9 ==7)
      {
      
      SellCall(R2);
      }          
          
    if( P10 == 1 || P10==5 || P10 ==7)
      {
     
      SellCall(R3);
      }   
    if( P11 == 1 || P11==5 || P11 ==7)
      {
     
      SellCall(R4);
      }                       
    if( P12 == 1 || P12==5 || P12 ==7)
      {
       
      SellCall(R5);
      }            
          
    }
   

Comment vérifier que les commandes ont déjà été passées ou non ? Avec des conditions buyticket > 0 ?

 
cashcube:

code pour appeler la fonction (snapshot)

Comment vérifier que les commandes ont déjà été passées ou non ? Avec des conditions buyticket > 0 ?

Il est difficile de donner des conseils car je ne sais pas ce que vous faites à la fin de l'heure avec les ordres non déclenchés et comment vous gérez les ordres déclenchés.

Vous pourriez créer un tableau déclaré globalement (ou 2) et stocker les numéros de tickets pour les ordres ouverts. Avant d'ouvrir un nouvel ordre, vérifiez si l'élément du tableau qui correspond au niveau a une valeur >0.

Bien sûr, vous devrez également vérifier les numéros de tickets et si vous supprimez des ordres non déclenchés, mettez l'élément du tableau à 0. Vous devrez peut-être aussi vérifier si l'ordre a été clôturé et, selon votre logique, le remettre à 0.

 
GumRai:

Il est difficile de donner des conseils car je ne sais pas ce que vous faites à la fin de l'heure avec les ordres non déclenchés et comment vous gérez les ordres déclenchés.

Vous pourriez créer un tableau déclaré globalement (ou 2) et stocker les numéros de tickets pour les ordres ouverts. Avant d'ouvrir un nouvel ordre, vérifiez si l'élément du tableau qui correspond au niveau a une valeur >0.

Bien sûr, vous devrez également vérifier les numéros de tickets et si vous supprimez des ordres non déclenchés, mettez l'élément du tableau à 0. Vous pouvez également avoir besoin de vérifier si l'ordre a été fermé et, selon votre logique, le remettre à 0.

Comme je définis les niveaux d'expiration des ordres non déclenchés, ils expirent à 0:59 ou 59ème minute. Pour les ordres déclenchés, SL et TP sont définis.

Auparavant, j'ai conçu Ea qui prend un ordre d' achat ou de vente par heure... aucun problème, le code était simple. Mais ici, il semble très difficile.

Ok, je vais essayer de le coder comme vous l'avez dit. Si un problème survient, je le posterai ici. De plus, il serait bon que vous puissiez partager un exemple de code simple pour compter le nombre de tickets.

Merci pour votre suggestion.

 

J'ai résolu mon problème temporairement avec le code suivant et en l'exécutant sur le graphique horaire. Simple

 //--- go trading only for first tiks of new bar
   if(Volume[0]>1) return(0);
 
Les barres ne sont pas fiables (un rafraîchissement/une reconnexion peut changer le nombre de barres sur le graphique) Le volume n'est pas fiable (ticks manqués) Utilisez toujours le temps. Nouvelle bougie - MQL4 forum
 
WHRoeder:
Les barres ne sont pas fiables (un rafraîchissement/une reconnexion peut changer le nombre de barres sur le graphique) Le volume n'est pas fiable (ticks manquants) Utilisez toujours le temps. Nouvelle bougie - MQL4 forum

Merci pour le code. Je l'ai ajouté à la fonction Tick. Mais maintenant mon EA ne prend aucune transaction. Comme j'utilise la fonction buycall/sell call pour placer des ordres en attente. Je n'ai pas pu ajouter cette fonction à l'intérieur de la fonction.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              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)
{ 
   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);
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

Une idée ?

 

De plus, l'opération inverse sur les ordres stoppés ne fonctionne pas non plus.

//-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0) // if last buy closed with loss
          { 
            //--- go trading only for first tiks of new bar
            if(Volume[0]>1) return(0);
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red);
          }
         break; 
          }
          }
     } 
 

Un point sur le code inverse ? pourquoi cela ne fonctionne pas ?

Merci.