Vérification de la bougie ouverte - page 4

 
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.

Salut GumRai,

Je me demandais si vous pouviez/voudriez m'aider un peu plus avec mon code ? Si vous pouviez juste me dire quels codes je devrais regarder, je vais essayer de le coder moi-même d'abord et puis revenir avec toutes les questions .

Ce que je veux c'est qu'une fois qu'un trade est placé, il met un Stop loss à, disons, 50 pips (ce qu'il fait maintenant). Cependant, une fois que le prix se déplace de 60 pips dans la direction de la transaction, il déplace le SL au seuil de rentabilité, et plus loin, il devient un stop suiveur à 70 pips de la transaction.

Comment dois-je m'y prendre ? Comme toujours, toute aide est la bienvenue.

 

Pour le seuil de rentabilité, je déplace toujours le SL au seuil de rentabilité + 1 point au moins. Cela évite tout problème éventuel de comparaison des doubles lors des contrôles ultérieurs.

Il s'agit simplement de vérifier 2 conditions (pour un achat)

OrderOpenPrice()>OrderStopLoss()

et

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

puis de modifier l'ordre pour que le SL soit le prix d'ouverture + 1 point ou tout autre montant que vous décidez de verrouiller.

Pour une vente, les conditions sont inversées, mais vous devez également coder pour tenir compte du fait que le SL est initialement égal à 0.

OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()==0 
 
GumRai:

Pour le seuil de rentabilité, je déplace toujours le SL au seuil de rentabilité + 1 point au moins. Cela évite tout problème éventuel de comparaison des doubles lors des contrôles ultérieurs.

Il s'agit simplement de vérifier 2 conditions (pour un achat)

et

puis de modifier l'ordre de façon à ce que le SL soit le prix d'ouverture + 1 point ou tout autre montant que vous décidez de verrouiller.

Pour une vente, les conditions sont inversées, mais vous devez également coder pour tenir compte du fait que le SL est initialement égal à 0.

Merci beaucoup. En fait, ce que je vais faire, c'est ajouter suffisamment de points pour que cela couvre (à peu près) le coût du courtage pour la transaction.

Pour la deuxième ligne, pourquoi utiliser le prix de clôture de l'ordre ou le prix d'ouverture de l'ordre ? Je n'ai pas bien compris ce code. Ne devrais-je pas utiliser Bid-OrderOpenPrice, puisque cela permettrait de savoir de combien le prix a bougé ?

Est-ce que je suis même proche de ce que je fais ici ci-dessous ?

 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),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

J'ai déclaré la commission ci-dessus comme un extern. Et j'ai utilisé Bid à la place.

Modifier :

Donc je suppose (sur la base de ce que j'ai trouvé ci-dessous) que le code que j'ai posté ci-dessus est incorrect ? J'ai trouvé ce qui suit dans le livre d'aide de MQL4... Il semble qu'il s'agisse simplement d'un stop suiveur, alors que ce dont j'ai besoin, c'est d'un stop de type Breakeven, suivi d'un stop suiveur. Comment puis-je modifier cela ?

 int TrailingStop = 50;
               //--- modifies Stop Loss price for buy order 
            if(TrailingStop>0)
               {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
                if(Bid-OrderOpenPrice()>Point*TrailingStop)
                {
                if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                  bool res =OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,clrNONE);
                   if(!res)
                        Print("Error in OrderModify. Error code=",GetLastError());
                     else
                        Print("Order modified successfully.");
                    }
                 }
                 }
 
 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),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

Tout votre bloc de code est conditionnel à BuyTicket==-1.

Si un ordre est ouvert, alors BuyTicket ne sera pas = -1, donc aucune vérification ne sera faite pour passer en BE pendant que la transaction est ouverte.

if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))

Quel est le rapport entre le numéro du ticket et le prix ?

Vous devez sélectionner un ordre avant d'utiliser OrderOpenPrice().

OrderClosePrice() est le Bid au moment où l'ordre est sélectionné pour un achat, ask pour une vente (pendant que l'ordre est encore ouvert).

 
SharkWaters:

Je suppose donc (sur la base de ce que j'ai trouvé ci-dessous) que le code que j'ai posté ci-dessus est incorrect ? J'ai trouvé ce qui suit dans le livre/aide de MQL4... Il semble qu'il s'agisse simplement d'un stop suiveur, alors que ce dont j'ai besoin, c'est d'abord d'un stop de type Breakeven, suivi d'un stop suiveur. Comment puis-je modifier cela ?

  int BreakEvenPoints=50;
  double BE_Decimal=BreakEvenPoints*Point;
//--- modifies Stop Loss price for buy order 
  if(BreakEvenPoints>0)
  {
   OrderSelect(BuyTicket,SELECT_BY_TICKET);
   if(Bid-OrderOpenPrice()>BE_Decimal)
     {
      if(OrderStopLoss()<OrderOpenPrice())
        {
         bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),
                              OrderTakeProfit(),0,clrNONE);
         if(!res)
            Print("Error in OrderModify to BE. Error code=",GetLastError());
         else
            Print("Order modified to BE successfully.");
        }
     }
  }
Essayez ceci
 
GumRai:
Essayez ceci

Merci pour les points ! J'ai fait les modifications nécessaires. Lorsque je compile, il affiche une alerte indiquant que "la valeur de retour de 'OrderSelect' doit être vérifiée". Bizarrement, cela se traduit par le déclenchement d'un seul achat, puis pour les autres, c'est à nouveau un code d'erreur 4108. La vente fonctionne correctement (je n'ai pas apporté de modifications à ce sujet).

Voici la section entière du code d'achat, au cas où je ferais quelque chose de mal - mais cette partie ne devrait pas l'être, puisque tout ce que j'ai ajouté est ce code au milieu. Le reste est comme avant, ce qui fonctionne parfaitement bien. Qu'est-ce que je fais de mal 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]
      double PreviousPriceClose2=iClose(NULL,0,2);
      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),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
               }
           }
   //Stop Order Modify for buy starts here
         int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                 }
              }
      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
        }
        

Mise à jour :

J'ai fait des recherches sur Google et j'ai modifié le système comme suit :

int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               if (OrderSelect(BuyTicket,SELECT_BY_TICKET))
               {
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                  }  
                 }
              }


Cela supprime l'erreur générée lorsque je clique sur compiler. Mais cela crée toujours l'erreur 4108 OrderModify dans le Journal.

 

Tout votre code est contenu dans la condition if

 if(bar_time!=Time[0])  

afin qu'il ne soit exécuté qu'une fois par nouvelle barre.

 

Quand BuyTicket == -1 vous essayez de sélectionner l'ordre avec un numéro de ticket de -1 et bien sûr il n'existe pas.

Vérifiez que BuyTicket>0 avant d'essayer de sélectionner un ordre.

 
GumRai:

Tout votre code est contenu dans la condition if

afin qu'il ne soit exécuté qu'une fois par nouvelle barre.


Merci de nous l'avoir fait remarquer.

Donc, pour cela, j'ai créé une parenthèse supplémentaire en haut, juste après Start comme :

int start() 
{
{

puis j'ai fermé une parenthèse (ce qui mettait fin à toute la sectionif(bar_time!=Time[0]) et j'ai ensuite placé le code à la fin suivi d'un return (0) ; et d'une parenthèse de fin pour fermer le start().

Pas d'erreur, ni dans le code, ni dans le journal de backtest, mais il n'y a eu qu'un seul achat et c'est tout - celui-là aussi a été clôturé à l'ouverture, bien que le prix n'ait pas augmenté depuis l'ouverture - sans même bouger de 50 pips.

Je pense que cela pourrait avoir un rapport avec le BuyTicket == -1 que vous avez mentionné. Mais honnêtement, je n'ai aucune idée de comment changer cela. J'ai mis ce -1 en me basant sur votre recommandation pour le code initial - qui a fonctionné de manière fantastique. Mais comment pourrais-jevérifier que BuyTicket>0 avant d'essayer de sélectionner une commande ?

 
SharkWaters:

Mais commentvérifier que BuyTicket>0 avant d'essayer de sélectionner un ordre ?

Je suis désolé, mais si vous devez poser cette question, c'est que vous essayez d'écrire un code beaucoup trop compliqué pour votre niveau de connaissances.

Je ne peux pas écrire votre code pour vous un peu à la fois.