Kontrolle Kerze offen - Seite 4

 
GumRai:

Eine kleine Änderung, denn es wurde geprüft, ob ein Auftrag geschlossen wurde, obwohl es keinen gab.

Dem Code zufolge gibt es keinen Grund, einen Verkauf zu eröffnen, sobald ein Kauf geschlossen wird.

Die Bedingung für den Ausstieg aus einem Kauf ist nicht dieselbe wie die Bedingung für die Eröffnung eines Verkaufs.

Denken Sie daran, dass, da Sie nur das Öffnen der Kerze prüfen, Close[0] der Geldwert des ersten Ticks ist, der für die Kerze empfangen wurde.

Hallo GumRai,

Ich habe mich gefragt, ob du mir bei meinem Code weiterhelfen kannst/willst? Wenn du mir einfach sagen könntest, welche Codes ich mir ansehen sollte, werde ich versuchen, es zuerst selbst zu kodieren und dann einfach mit Fragen zurückkommen.

Was ich will, ist, dass, sobald ein Handel platziert wird, setzt es einen Stop-Loss bei, sagen wir, 50 Pips (das ist, was es jetzt tut). Sobald sich der Kurs jedoch um 60 Pips in Richtung des Trades bewegt, wird der SL auf Break-Even gesetzt, und im weiteren Verlauf wird ein Trailing-Stop 70 Pips vom Trade entfernt gesetzt.

Wie würde ich vorgehen, um dies zu tun? Wie immer wäre ich für jede Hilfe sehr dankbar.

 

Für den Break-even verschiebe ich die SL immer mindestens auf Break-even + 1 Punkt. Das vermeidet mögliche Probleme mit dem Vergleich von Doubles bei späteren Kontrollen.

Es geht einfach darum, 2 Bedingungen zu prüfen (für einen Kauf)

OrderOpenPrice()>OrderStopLoss()

und

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

und dann den Auftrag so zu ändern, dass der SL dem Eröffnungskurs + 1 Punkt oder dem Betrag entspricht, den Sie festschreiben möchten.

Bei einem Verkauf ist es die umgekehrte Bedingung, aber Sie sollten auch kodieren, um zu berücksichtigen, wenn der SL anfangs 0 ist.

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

Für den Break-even verschiebe ich die SL immer mindestens auf Break-even + 1 Punkt. Das vermeidet mögliche Probleme mit dem Vergleich von Doubles bei späteren Kontrollen.

Es geht einfach darum, 2 Bedingungen zu prüfen (für einen Kauf)

und

und dann den Auftrag so zu ändern, dass der SL dem Eröffnungskurs + 1 Punkt oder dem Betrag entspricht, den Sie festschreiben möchten.

Bei einem Verkauf ist es die umgekehrte Bedingung, aber Sie sollten auch kodieren, um zu berücksichtigen, wenn der SL anfangs 0 ist.

Vielen Dank für den Hinweis. In der Tat, was ich tun werde, ist genug Punkte hinzufügen, so dass es gerade (ungefähr) deckt die Kosten für die Brokerage für den Handel.

Für die zweite Zeile..warum sollte ich Orderclose price-OrderOpenPrice verwenden? Ich habe diesen Code nicht ganz verstanden. Müsste ich nicht Bid-OrderOpenPrice verwenden, da dies die Bewegung des Kurses widerspiegelt?

Bin ich überhaupt nahe dran mit dem, was ich hier unten mache?

 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);
        }

Ich habe commission oben als extern deklariert. Und ich habe stattdessen Bid verwendet.

Bearbeiten:

Ich vermute also (basierend auf dem, was ich unten gefunden habe), dass der Code, den ich oben gepostet habe, falsch ist? Ich fand die folgenden in der MQL4 Buch/Hilfe... Es scheint nur ein Trailing-Stop, während das, was ich brauche, ist ein Breakeven-Stop zuerst, gefolgt von Trailing-Stop. Wie würde ich dies ändern?

 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);
        }

Ihr gesamter Code-Block ist an BuyTicket==-1 gebunden.

Wenn ein Auftrag eröffnet wird, ist BuyTicket nicht = -1, so dass keine Prüfungen für den Wechsel zu BE durchgeführt werden, während der Handel geöffnet ist.

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

Was hat die Ticketnummer mit dem Preis zu tun?

Sie müssen eine Order auswählen, bevor Sie OrderOpenPrice() verwenden.

OrderClosePrice() ist der Geldkurs (Bid) zu dem Zeitpunkt, zu dem die Order für einen Kauf ausgewählt wird, und der Briefkurs (Ask) für einen Verkauf (während die Order noch offen ist).

 
SharkWaters:

Ich vermute also (basierend auf dem, was ich unten gefunden habe), dass der Code, den ich oben gepostet habe, falsch ist? Ich fand die folgenden in der MQL4 Buch/Hilfe...Es scheint zu sein, nur ein Trailing-Stop, während was ich brauche, ist ein Breakeven-Stop zuerst, gefolgt von Trailing-Stop. Wie würde ich dies ändern?

  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.");
        }
     }
  }
Versuchen Sie dies
 
GumRai:
Versuchen Sie dies

Vielen Dank für die Hinweise! Ich habe die notwendigen Änderungen vorgenommen. Wenn ich kompiliere, zeigt es eine Warnung an, dass "der Rückgabewert von 'OrderSelect' überprüft werden sollte. Dies führt seltsamerweise dazu, dass nur ein Kauf ausgelöst wird und für den Rest wird wieder ein 4108-Fehlercode angezeigt. Verkaufen funktioniert gut (ich habe keine Änderungen daran vorgenommen).

Hier ist der gesamte Abschnitt des Kauf-Codes, für den Fall, dass ich etwas falsch mache - aber dieser Teil sollte nicht sein, da ich nur diesen Code in der Mitte hinzugefügt habe. Der Rest war wie vorher, was perfekt funktionierte. Was mache ich hier falsch?

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
        }
        

Update:

Ich habe noch mehr gegoogelt und es wie folgt geändert:

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.");
                    }
                  }  
                 }
              }


Dadurch wird der Fehler beseitigt, der beim Klicken auf "Kompilieren" auftritt. Aber es erzeugt immer noch den OrderModify-Fehler 4108 im Journal.

 

Ihr gesamter Code ist in der if-Bedingung enthalten

 if(bar_time!=Time[0])  

enthalten, so dass er nur einmal pro neuem Balken ausgeführt wird.

 

Wenn BuyTicket == -1 ist, versuchen Sie, die Bestellung mit einer Ticketnummer von -1 auszuwählen, die natürlich nicht existiert.

Prüfen Sie, ob BuyTicket>0 ist, bevor Sie versuchen, einen Auftrag auszuwählen.

 
GumRai:

Ihr gesamter Code ist in der if-Bedingung enthalten

enthalten, so dass er nur einmal pro neuem Balken ausgeführt wird.


Danke für diesen Hinweis.

Deshalb habe ich oben eine zusätzliche Klammer eingefügt, direkt nach Start wie:

int start() 
{
{

und schloss dann eine Klammer (die den gesamten Abschnittif(bar_time!=Time[0]) beendete) und platzierte dann den Code am Ende, gefolgt von einem Return (0); und einer Endklammer, um den Start() zu schließen.

Keine Fehler, entweder in den Code oder die Backtest-Journal, aber es dauerte nur einen Kauf Handel und das ist es--das auch, die es geschlossen rechts zu öffnen, obwohl Preis nicht rühren höher von der Eröffnung--geschweige denn bewegen 50 Pips.

Ich denke, das könnte mit dem BuyTicket zu tun haben, das == -1 ist, das Sie erwähnt haben. Aber ich habe ehrlich gesagt keine Ahnung, wie man das ändern kann. Ich würde diese -1 Sache in basierend auf Ihrer Empfehlung für den ursprünglichen Code setzen--was fantastisch funktioniert. Aber wie würde ichprüfen, ob BuyTicket>0 ist, bevor ich versuche, eine Bestellung auszuwählen?

 
SharkWaters:

Aber wie würde ichprüfen, ob BuyTicket>0 ist, bevor ich versuche, eine Bestellung auszuwählen?

Es tut mir leid, aber wenn Sie diese Frage stellen müssen, versuchen Sie, einen Code zu schreiben, der viel zu kompliziert für Ihren Wissensstand ist.

Ich kann Ihren Code nicht Stück für Stück für Sie schreiben.

Grund der Beschwerde: