Vérification de la bougie ouverte - page 3

 
  1. Le code a été écrit avant la construction 600. On ne peut plus utiliser de points dans les noms de variables depuis février 2014. Il suffit de les remplacer par des underscores.
  2. Voici un exemple de code indépendant de la direction
    double DIR, OOP, OCP, ISL;  int OP;
    
    if(     Bid > High[1]){
       DIR = +1; OOP = Ask; OCP = Bid; OP = OP_BUY;
    }
    else if(Bid <  Low[1]){
       DIR = -1; OOP = Bid; OCP = Ask; OP = OP_BUY;
    }
    else return;
    
    ISL = OCP -DIR* pips_to_change( extISL_Pips );
    ... OrderSend(...);
    Vous échangez simplement Ask/Bid pour les prix d'ouverture/clôture et vous écrivez tout le reste comme si c'était un achat : ISL est inférieur à OCP (OCP - ISL) et le -DIR* change le signe pour une vente.
    Si vous avez besoin d'une comparaison (A > B) , utilisez (A - B) *DIR> 0 pour inverser la comparaison pour une vente.
 
GumRai:

Il semble que vous ayez l'idée.

Modifiez et postez votre code et moi ou quelqu'un d'autre le commentera.

Hé GumRai,

Cela fait un moment que je n'ai pas posté de mise à jour ici, mais j'ai travaillé sur le code et je l'ai finalement terminé - pénible quand on travaille 10 heures par jour. J'ai deux problèmes principaux cependant. 1) Peu importe ce que je fais, il génère un code d'erreur : "Unknown ticket XYZ for OrderCloseFunction" et 2) J'ai fait une sauvegarde du fichier, (appelé un USDCAD, un autre EURUSD), avec différents numéros magiques etc, mais il ne prend toujours qu'une transaction à la fois - et ne traite pas les paires indépendamment. En fait, il crée également une erreur "invalid ticket for OrderCloseFunction".

J'ai essayé de chercher sur Google, mais en vain. J'apprécierais vraiment si vous pouviez me guider dans la bonne direction à ce sujet. Qu'est-ce que je fais de mal ?

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//part with the extern int stating the terms of the MA removed to reduce space.

int MagicNumber = 1234;
int MagicNumber2 = 2345;
double Pips;
int BuyTicket;
int SellTicket;
int CloseTicket;
int CloseSellTicket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double Ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (Ticksize == 0.00001 || Ticksize == 0.001)
   Pips = Ticksize*10;
   else Pips = Ticksize;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
//---

   static datetime bar_time=0;
  if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);
      double PreviousPriceClose2=iClose(NULL,0,2);
      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
        
      else
      for(int i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(iClose(NULL, 0,0)<PreviousSlow)
        {
          CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         }
         }
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(OrdersTotal()==0)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
      for(i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if(iClose(NULL, 0,1)>PreviousSlow)
        {
          CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              }
     }
     }
    return(0);
    return(0); 
    }
//--------------

  

Merci d'avance !

 

Ne jamais utiliser OrdersTotal()==0 comme condition pour ouvrir des positions.

Cela signifie que si une transaction a été ouverte manuellement ou par un autre EA ou le même EA attaché à un autre symbole graphique, seule une transaction peut être ouverte.

Vous avez une variable globale BuyTicket, initialisez-la à -1.

int BuyTicket=-1;

      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),
                                "Main Entry EA",MagicNumber,0,clrLimeGreen);
        }

Ne pas boucler les ordres avant de les fermer, c'est inutile.

else
if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
  {
   if(OrderCloseTime()==0)
     {
      if(Close[0]<PreviousSlow)
        {
         bool  CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         if(CloseTicket)
            BuyTicket=-1;
        }
     }
   else
      BuyTicket=-1;  //Order has closed so reset variable
  }

Maintenant, lorsque vous utilisez des variables déclarées globalement pour les numéros de tickets, il peut y avoir des problèmes si le terminal est fermé et redémarré pour une raison quelconque.

Déclarez donc une nouvelle variable de portée globale

 bool Recovery=true;

  
  if(Recovery)
     {
     //loop through open orders and check for magic number, symbol and type
     //if you find a buy order with the magic number and symbol
     BuyTicket=OrderTicket();
     //if you find a sell order with the magic number and symbol
     SellTicket=OrderTicket();
     Recovery=false;
     }

J'ai tapé ceci rapidement, donc je peux avoir fait des erreurs, mais c'est suffisant pour vous donner l'idée.

 
GumRai:


La raison pour laquelle j'ai mis la boucle ici est que j'ai remarqué que lorsque la vente était fermée, l'achat n'était pas déclenché pour une raison quelconque.

J'ai fait les changements nécessaires... mais il y a toujours quelque chose qui cloche. Il ne prend aucune transaction longue maintenant, et génère un code d'erreur de ticket invalide, et l'erreur OrderClose 4051. Avez-vous des suggestions sur ce qui ne va toujours pas ?

Ce qui est étrange, c'est qu'aussi bien dans le code précédent que dans le code actuel (pour la vente uniquement), il prenait les transactions de manière raisonnablement correcte (si je ne l'implémentais que sur un seul graphique).

Je ne pensais pas que cela aurait été si difficile haha ! Je suppose que je me suis trompé quand je pensais que c'était une chose très simple et directe... acheter quand la bougie traverse et s'ouvre au-dessus de la MA, fermer et vendre quand la bougie traverse et descend en dessous de la MA.


if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
        
      else
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
      {
      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;
            }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;
            }
            
    return(0);
    return(0); 
    }
 

Je suis désolé, mais je ne sais pas ce que vous essayez de faire.

if(OrderSelect(SELECT_BY_POS,MODE_TRADES))

Il ne sélectionne aucun ordre. Est-ce que le code compile au moins ?

      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;

Ici, le else s'applique si(OrderCloseTime()==0) est faux.

       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;

Ici, il s'applique si le OrderSelect échoue, ce qui est certainement le cas.

 
GumRai:

Je suis désolé, mais je ne sais pas ce que vous essayez de faire.

Il ne sélectionne aucun ordre. Est-ce que le code compile au moins ?

Ici, le else s'applique si(OrderCloseTime()==0) est faux.

Ici, il s'applique si le OrderSelect échoue, ce qui est certainement le cas.

Désolé, c'est entièrement ma faute. Je n'ai pas lu/appliqué vos suggestions correctement ; merci beaucoup de me les avoir signalées. Je l'ai fait correctement ici. Aucune erreur n'a été générée dans le rapport. La seule chose est que maintenant, il entre plusieurs ordres de vente et d'achat à la fois, ce qui l'empêche de fermer les transactions au bon moment.

Edit : Pour être précis, il ne sort qu'au niveau du SL et du TP, et non lorsque le prix traverse l'autre côté de la MA. Est-ce que cela a quelque chose à voir avec le bool ?

int start()
  {
   static datetime bar_time=0;
  if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
      else
      if(OrderSelect(BuyTicket,MODE_TRADES))
      {
         if(OrderCloseTime()==0)
         {
          if(Close[0]<PreviousSlow)
           {
             bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
             if(CloseTicket)
               BuyTicket=-1;
               }
            }
            else
               BuyTicket= -1; //Order has closed so reset variable
               }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SellTicket,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else 
            SellTicket= -1; //Order has closed so reset variable
            }
    return(0);
    return(0); 
    }
 
if(OrderSelect(BuyTicket,MODE_TRADES))
Ceci ne sélectionne pas une transaction, suivez l'exemple que je vous ai donné et faites-le correctement.
 
GumRai:
Ceci ne sélectionne pas un trade, s'il vous plaît suivez l'exemple que je vous ai donné et faites-le correctement.

Je me sens... vraiment stupide. lol. Merci d'avoir trouvé ça !

1) Il reste deux choses...il crée maintenant un code d'erreur de OrderClose 4108. Dois-je poster le code à nouveau ? C'est le même que ci-dessus avec la correction que vous avez indiquée. Il entre et sort selon les règles.

2) Et il n'entre pas immédiatement en position courte dès qu'il ferme la position longue comme le montre l'image. La flèche verte vers le bas montre où il aurait dû être court. Il a pris un achat, et l'a fermé à perte une fois qu'il a clôturé en dessous de la MA jaune. Ici, il aurait dû être court. Comment puis-je boucler cela ?

Merci beaucoup GumRai. Honnêtement, je n'aurais jamais atteint un tel niveau sans votre aide.

aurait dû être court-circuité ici

 
int start()
  {
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }

      if(SellTicket==-1)
        {
         if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
           {
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(SellTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]>PreviousSlow)
              {
               bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
               if(CloseSellTicket)
                  SellTicket=-1;
              }
           }
         else
            SellTicket=-1; //Order has closed so reset variable
        }
     }
   return(0);
  }

Petit changement car il vérifiait la fermeture d'un ordre alors qu'il n'y en avait pas.

Selon le code, il n'y a aucune raison pour qu'une vente soit ouverte immédiatement après la fermeture d'un achat.

La condition pour sortir d'un achat n'est pas la même que la condition pour ouvrir une vente.

Rappelez-vous que comme vous ne vérifiez que l'ouverture de la bougie, Close[0] sera la valeur de l'offre du premier tick reçu pour la bougie.

 
GumRai:

Petit changement car il vérifiait la fermeture d'un ordre alors qu'il n'y en avait pas.

Selon le code, il n'y a aucune raison pour qu'une vente soit ouverte immédiatement après la fermeture d'un achat.

La condition pour sortir d'un achat n'est pas la même que la condition pour ouvrir une vente.

Rappelez-vous que comme vous ne vérifiez que l'ouverture de la bougie, Close[0] sera la valeur de l'offre du premier tick reçu pour la bougie.

Sacrément ! Vous l'avez fait ! Merci encore et encore GumRai. Vous êtes le meilleur.

Je ne peux pas faire de test pour l'instant, mais une fois que les marchés seront ouverts, je pense que je devrais pouvoir l'utiliser avec les autres paires, tant que j'ai des numéros magiques différents sur la démo.