Schließung von halben Parzellen. - Seite 18

 


Ok (UPDATE!) so im Grunde habe ich loswerden die kontinuierliche Schließung der "Hälfte einer Hälfte einer Hälfte usw." auf die Lose, wenn die zweite OrderClose() aufgerufen wird (wo die alle blauen if-Anweisung ist - anscheinend funktioniert dies ok!) - JEDOCH möchte ich NICHT, dass diese Funktion überhaupt aufgerufen wird, wenn die ERSTE OrderClose() Funktion"True" ist und erfolgreich war. "Close_Half_Order_Buy==True" funktioniert auch nicht...

Würde mich freuen, wenn mir jemand helfen könnte, dies zu beenden :)

(Ich habe eine Menge der "Prints" entfernt, um den Kern des Codes zu verdeutlichen).

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);

   double lotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

   double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
   
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);

   
for(int c=OrdersTotal()-1; c>=0; c--)
      {
      if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)==true)

      double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      	Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
               if(OrderOpenTime() != partclosedonce)
            {
            
            if(OrderType()==OP_BUY && Bid >= FirstTarget_Buy+(Point/2)) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,5,Blue);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               }
            }
         
      if(Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
          if(Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
          if(OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid,5,CLR_NONE);
               if(EMA_Buy_Close!=TRUE)Print("EMA_Buy_Close Last Error = ",GetLastError());
               if(EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
Irgendjemand?
 
DomGilberto:


Ok (UPDATE!) so im Grunde habe ich loswerden der kontinuierlichen Schließung von "die Hälfte einer Hälfte einer Hälfte usw." auf die Lose, wenn die zweite OrderClose() aufgerufen wird (wo die alle blauen if-Anweisung ist - anscheinend funktioniert das ok!) - JEDOCH möchte ich NICHT, dass diese Funktion überhaupt aufgerufen wird, wenn die ERSTE OrderClose() Funktion "True" ist und erfolgreich war. "Close_Half_Order_Buy==True" funktioniert auch nicht...

Würde mich freuen, wenn mir jemand helfen könnte, dies zu beenden :)

Der folgende Code lässt sich kompilieren (durch Deklarieren der MagicNumber-Variable und Auskommentieren der MoveToBreakEven()-Funktion), aber war nicht getestet.

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false, SecondBuyTarget_hit = false;
   int ct = 0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);
        
   for(int c = OrdersTotal() - 1; c >= 0; c--)
      if (OrderSelect(c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol() && OrderType() <= OP_SELL)
            if (OrderMagicNumber() == MagicNumber) {
               double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2);
               Print ("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy,Digits));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                  if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + (Point/2)) {
                     if (OrderClose(OrderTicket(),half,Bid,5,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true;
                        break;
                     }
                     else
                        Print("Close_Half_Order_Buy Last Error = ", GetLastError());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                  if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid,5,CLR_NONE))
                        SecondBuyTarget_hit = true;
                     else
                        Print("EMA_Buy_Close Last Error = ",GetLastError());                    
                  }

               break;
            }
   if (ct == 0) {
      FirstBuyTarget_hit = false;
      SecondBuyTarget_hit = false;
   }
}

Der obige Code geht davon aus, dass nur ein Auftrag pro Währungspaar erteilt wird.

 

Omg ich danke Ihnen so sehr für Ihre Hilfe! Ich weiß es wirklich zu schätzen :)

Könnten Sie mir bei einer letzten Sache helfen; im Moment habe ich ein FIXED 1:2 take profit target (hard TP). Ich möchte dieses eigentlich aus dem Auftrag entfernen. Wie Sie jedoch oben sehen können, verwenden die entsprechenden OrderClose()-Funktionen den OrderTakeProfit(), um zu berechnen, wo die OrderClose()-Funktionen schließen sollten.

Meine Frage lautet: Gibt es eine Möglichkeit, den OrderTakeProfit()-Kurs zu speichern, aber anstatt ihn in der Order zu fixieren, möchte ich eine bestimmte Anzahl von Lots mit OrderClose() zum OrderTakeProfit()-Kurs schließen? Der Grund dafür ist, dass ich manchmal einen Handel habe, der große Gewinne erzielt, aber weil ich OrderTakeProfit() mit der offenen Order festgelegt habe, werden alle Lots dort geschlossen, und ich möchte nur einige Lots teilweise zu diesem Ausstiegskurs schließen. Ich verwende einen Trailing Stop für die großen Läufer... Ich hoffe, das macht Sinn?

Das war's! Ich bin dann fertig und erledigt! Endlich!

UPDATE: Der obige Code ist eine schöne Art, ihn zu schreiben. Ich habe ein wenig gespielt, aber es ist nicht ganz schließen in der richtigen Reihenfolge. Es wird immer noch nur die Hälfte von dem geschlossen, was zuerst kommt. Es ist irgendwie das gleiche wie das, was ich hatte, bevor mit statischen datetime? Irgendwelche Ideen?

 
(ich habe das Gefühl, dass ich diesen Thread erschöpft habe)

Ich habe buchstäblich diese letzten 2 Fragen oben und das ist getan? Alles, was ich wissen muss, ist, wie kann ich die OrderTakeProfit() Preis zu speichern, so dass, wenn ich es ändern, kann ich immer noch verwenden, dass genaue Preis zu tun, eine OrderClose()? Funktioniert ein Static Double?
 
DomGilberto:

UPDATE: Der obige Code ist eine schöne Art, ihn zu schreiben. Ich habe ein wenig spielen, aber es ist nicht ganz schließen in der richtigen Reihenfolge. Es schließt immer noch nur die Hälfte auf was auch immer zuerst kommt. Es ist irgendwie das gleiche wie das, was ich hatte, bevor mit statischen datetime? Irgendwelche Ideen?

Posten Sie alle Änderungen, die Sie an dem obigen Code vorgenommen haben, und posten Sie Log-/Tagebucheinträge (oder Screenshots).

 
DomGilberto:

Omg ich danke Ihnen so sehr für Ihre Hilfe! Ich weiß es wirklich zu schätzen :)

Könnten Sie mir bei einer letzten Sache helfen; im Moment habe ich ein FIXED 1:2 take profit target (hard TP). Ich möchte dieses eigentlich aus dem Auftrag entfernen. Wie Sie jedoch oben sehen können, verwenden die entsprechenden OrderClose()-Funktionen den OrderTakeProfit(), um zu berechnen, wo die OrderClose()-Funktionen schließen sollten.

Meine Frage lautet: Gibt es eine Möglichkeit, den OrderTakeProfit()-Kurs zu speichern, aber anstatt ihn in der Order zu fixieren, möchte ich eine bestimmte Anzahl von Lots mit OrderClose() zum OrderTakeProfit()-Kurs schließen? Der Grund dafür ist, dass ich manchmal einen Handel habe, der große Gewinne erzielt, aber weil ich OrderTakeProfit() mit der offenen Order festgelegt habe, werden alle Lots dort geschlossen, und ich möchte nur einige Lots teilweise zu diesem Ausstiegskurs schließen. Ich verwende einen Trailing Stop für die großen Läufer... Ich hoffe, das macht Sinn?

Das war's! Ich bin dann fertig und erledigt! Endlich!

UPDATE: Der obige Code ist eine schöne Art, ihn zu schreiben. Ich habe ein wenig gespielt, aber es ist nicht ganz schließen in der richtigen Reihenfolge. Es wird immer noch nur die Hälfte von dem geschlossen, was zuerst kommt. Es ist irgendwie das gleiche wie das, was ich hatte, bevor mit statischen datetime? Irgendwelche Ideen?


Setzen Sie Ihren TakeProfit auf ein hohes Niveau und Sie können weiterhin Ihre relevanten OrderClose() -Funktionen verwenden , die OrderTakeProfit() verwenden, um zu berechnen, wo die OrderClose()-Funktionen schließen sollten. Ändern Sie nur die Berechnung , wo die OrderClose()-Funktionen schließen sollten
 
deVries - buchstäblich gerade herausgefunden, dass heute Morgen... Ich fing an, eine weitere Änderung vorzunehmen... dann wurde mir klar, dass ich es gleich bei der ersten Bestellung ändern sollte...

Dreizehn - Ich habe überhaupt keine Änderungen daran vorgenommen. Es funktioniert in etwa so wie der Code, den ich gepostet habe, aber du verwendest ein statisches bool im Gegensatz zu einem statischen datetime? Das ist der einzige wirkliche Unterschied, den ich feststellen konnte, als ich den Backtest durchführte. Abgesehen davon wird die zweite OrderClose() -Funktion mit dem gleitenden Durchschnitt und dem Schlusskurs darunter immer noch geschlossen, wenn diese Funktion zuerst vor der anderen OrderClose()-Funktion ausgeführt wird.
 
DomGilberto:

Dreizehn - Ich habe überhaupt keine Änderungen daran vorgenommen. Es hat in etwa so funktioniert wie der Code, den ich gepostet habe, aber du verwendest ein statisches bool im Gegensatz zu einem statischen datetime? Das ist der einzige wirkliche Unterschied, den ich feststellen konnte, als ich den Backtest durchführte. Abgesehen davon wird die zweite OrderClose()-Funktion mit dem gleitenden Durchschnitt und dem Schlusskurs darunter immer noch geschlossen, wenn diese Funktion zuerst vor der anderen OrderClose()-Funktion ausgeführt wird.
Durch die Verwendung des Fragezeichens bin ich mir nicht sicher, ob Sie mich fragen oder mir den hervorgehobenen Teil mitteilen wollen. Wenn der Tester anzeigt, dass der zweite Teilschluss vor dem ersten erfolgte, posten Sie bitte Ihre Handelsergebnisse aus dem Log/Journal, die vom Strategietester generiert wurden und zeigen, dass der zweite Teilschluss (der gleitende Durchschnitt) vor dem ersten Teilschluss erfolgte.
 
Thirteen:
Bei Ihrer Verwendung des Fragezeichens bin ich mir nicht sicher, ob Sie mich fragen oder mir den hervorgehobenen Teil mitteilen wollen. Wenn der Tester anzeigt, dass der zweite Teilschluss vor dem ersten erfolgte, posten Sie bitte Ihre Handelsergebnisse aus dem Log/Journal, die vom Strategietester generiert wurden und zeigen, dass der zweite Teilschluss (der gleitende Durchschnitt) vor dem ersten Teilschluss erfolgte.

Danke für die Rückmeldung, Thirteen - ich werde das Protokoll heute noch nachreichen :)