Schließung von halben Parzellen. - Seite 8

 
DomGilberto:

Dies wird im Journal während meiner for-Schleife gedruckt, wo im Falle einer ausstehenden Buy Stop Order, wenn die 60 EMA ist > als die OrderStopLoss, wird es die ausstehende Bestellung zu schließen, öffnen Sie eine neue mit neuen SL (die hinter der 60EMA ist), passen Sie den Take-Profit, um die 1:2 Belohnung zu unterhalten, und ändern Sie die Lose relativ zu den Stop in Punkten und mein Risikoprofil (sagen wir 2%).

Wenn dies alles geschieht, funktioniert die benutzerdefinierte Variable "Current Lots", die "LotSize" innerhalb von OrderSend ist, sie sendet eine Lotgröße, die für den Server nicht korrekt ist: "0.18215"? Könnte dies ein Problem sein, obwohl die Aufträge eigentlich trotzdem gesendet werden - diese Frage steht eher im Zusammenhang mit "könnte dies der Grund sein, warum ich "OrderType==OP_BUY" nicht aufrufen kann?

Sie sollten das beheben und die Losgröße auf dieselbe Weise validieren, wie Sie es bereits getan haben ... Sie könnten sogar eine separate Funktion dafür codieren, die auf dem Code basiert, den Sie bereits haben ... zum Beispiel:

double ValidateLots(double PositionSize)
   {
   double LotStep, MinLot;

   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   MinLot  = MarketInfo(Symbol(), MODE_MINLOT);
   
   return( MathFloor(PositionSize / LotStep) * LotStep);
   }


Anstatt LotSize in OrderSend() zu verwenden, würden Sie ValidateLots(LotSize)

verwenden. Ich bezweifle allerdings, dass dies Ihr Problem verursacht...

 
Hmm - ja, ich habe gerade damit herumgespielt. Es scheint, dass die Bestellung einfach durchgeschickt wird, da der Server sowieso nur 0,00 (2 Dezimalstellen) zulässt. Die restlichen Ziffern sind also fast irrelevant.

Argh! Das ist so frustrierend - ich hänge jetzt schon zu lange an diesem Problem :(

Ich kann nicht erkennen, warum das ein Problem ist, und ich kann kein "OP_BUY" auswählen... Ich weiß, dass ich dieses Thema wahrscheinlich schon ausgeschöpft habe, aber jeder letzte Hinweis wäre sehr willkommen - vielen Dank auch für Ihre Hilfe!
if (direction==0){ <<<//--Buy--// This gets called upon if all the set-up is apparent.
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10; //--// (in process of changing at the moment)
      
      if(OpenOrdersThisPair(Symbol())==0)  //--//<--- No order open = then open one...
      {
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
      
         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
         {
         
               for(int b=OrdersTotal()-1; b >=0; b--) 
                  {
    
                     if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
                     {
                     Print(" Stop loss value for the order is ", OrderStopLoss());
                     }
    
                     else if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==false)
                     {
                     Print(" OrderSelect failed error code is ",GetLastError());
                     }
                     if(OrderMagicNumber()==MagicNumber)
                        if(OrderSymbol()==Symbol())
                           if(OrderType()==OP_BUYSTOP)
                              if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)
                                //if(OpenOrdersThisPair(Symbol())==1)
                                 { 
                                 DeleteOrder = OrderDelete(OrderTicket());
                                 if(DeleteOrder!=TRUE)Print("Buy Delete Order Last Error = ", GetLastError());
                                 }
                                  
                                 if(OpenOrdersThisPair(Symbol())==0)//<<-- If there are no open orders = place a new order.
                                  { 
                                  int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
                                  if(NewBuyOrder == -1)Print("New Buy Order Last Error = ", GetLastError());
                                  if(NewBuyOrder > 0)Print("NEW BUY ORDER:- Lots to open: ", DoubleToStr(LotSize, Digits), " Entry Price: ", DoubleToStr(buyPrice, Digits), 
                                  " Buy Stop Loss: ", DoubleToStr(bsl, Digits), " Buy Take Profit: ", DoubleToStr(btp, Digits), " Magic Number is: ", DoubleToStr(MagicNumber, Digits));  
                                  } 
                  }
             } 
       }
 
DomGilberto:
Hmm - ja, ich habe gerade damit herumgespielt. Es scheint, dass die Bestellung einfach durchgeschickt wird, da der Server sowieso nur 0,00 (2 Dezimalstellen) zulässt. Die restlichen Ziffern sind also fast irrelevant.

Argh! Das ist so frustrierend - ich hänge jetzt schon zu lange an diesem Problem :(

Ich kann nicht erkennen, warum das ein Problem ist, und ich kann kein "OP_BUY" auswählen... Ich weiß, dass ich dieses Thema wahrscheinlich schon ausgeschöpft habe, aber jeder letzte Hinweis wäre sehr willkommen - vielen Dank auch für Ihre Hilfe!!!

Ich denke, Sie müssen Ihren gesamten Code zeigen. . .

Ich sehe hier einige Probleme:

      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
       //  where are you checking the return value from the OrderSend() and reporting errors ?

         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)    //  where is the OrderSelect() ?
 
Der ganze Code passt nicht hierher? Ich habe ihn aber auf pastebin hochgeladen?

-http://pastebin.com/eaY1wKbN

Tut mir leid wegen der Syntax - es ist etwas schwieriger, alles zu sehen, aber sie haben kein MQL4? Also setze es unter C++
 
DomGilberto:
Der ganze Code passt nicht hierher? Ich habe ihn aber auf pastebin hochgeladen?

-http://pastebin.com/eaY1wKbN

Tut mir leid wegen der Syntax - es ist etwas schwieriger, alles zu sehen, aber sie haben kein MQL4? Also stelle es unter C++

Kein Problem . . .

Wenn Sie dies tun...

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+

   if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1 && OrderType()==OP_BUY)
     {

Ihre OrderSelect() wird fehlschlagen, wenn Ihre OrderTicket() fehlschlägt, es sei denn, Sie haben bereits eine Order ausgewählt. Brauchen Sie diesen Code überhaupt? Später haben Sie eine Schleife, in der Sie die Orders auswählen und ihr Symbol, ihre Magic Number und ihren Typ überprüfen...

Auch das muss korrigiert werden....

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())

               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

         if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
           {
            Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
            bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
            if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
           }

. . einige geschweifte Klammern hinzufügen . . .

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

               if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
                 {
                 Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
                 bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
                 if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
                 }
              }
 

Ok - ich habe weitere Ausdrucke eingefügt, um ein wenig mehr Klarheit darüber zu bekommen, was getan wird und wozu. Ich habe sie unten eingefügt.

Die Zeile, in der es heißt "Order Select for closing:-..." ist das, was an der Stelle "Close OP_BUY Half Lots @ 1:1 Function" ausgewählt wird, die Sie oben genannt haben. Es scheint, dass die Ticketnummer an diesem Punkt der Auswahl anders ist? Ich hatte den Teil "...&& OrderType()==OP_BUY" herausgelöscht, da es den Rest zu drucken scheint, wenn dieser Teil nicht in der "if"-Anweisung enthalten ist... Bringt dies ein wenig mehr Klarheit?

"First Buy Order Placed:-" ist die erste OrderSend-Funktion, die am Anfang durchläuft
"Checking Buy Order:-" ist die Funktion innerhalb der for-Schleife, die die schwebende Order löscht und wieder öffnet, wenn der MA > OrderStopLoss() ist.
"NEW BUY ORDER:-" ist die neue Order, die innerhalb der for-Schleife platziert wird.
"Order Select for closing:-..." - wie oben bereits erwähnt, ist dies der Teil, der ausgewählt wird, um die Hälfte der Lots zu schließen.

Tut mir leid, wenn das verwirrend war, denn ich habe diese Teile gerade erst hinzugefügt - Sie werden sie in dem Pastebin-Link oben nicht sehen... nur einfache Druckfunktionen :)

2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.37931
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.18
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Ticker Number = 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: open #9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: delete #8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 7
 
DomGilberto:

Ok - ich habe weitere Ausdrucke eingefügt, um ein wenig mehr Klarheit darüber zu bekommen, was getan wird und wozu. Ich habe sie unten eingefügt.

Die Zeile, in der es heißt "Order Select for closing:-...", ist das, was an der Stelle "Close OP_BUY Half Lots @ 1:1 Function" ausgewählt wird, nach der Sie oben gefragt haben. Es scheint, dass die Ticketnummer an diesem Punkt der Auswahl anders ist? Ich hatte den Teil "...&& OrderType()==OP_BUY" herausgelöscht, da es den Rest zu drucken scheint, wenn dieser Teil nicht in der "if"-Anweisung enthalten ist... Verschafft dies ein wenig mehr Klarheit?

"First Buy Order Placed:-" ist die erste OrderSend-Funktion, die am Anfang durchläuft
"Checking Buy Order:-" ist die Funktion innerhalb der for-Schleife, die die schwebende Order löscht und wieder öffnet, wenn der MA > OrderStopLoss() ist.
"NEW BUY ORDER:-" ist die neue Order, die innerhalb der for-Schleife platziert wird.
"Order Select for closing:-..." - wie oben bereits erwähnt, ist dies der Teil, der ausgewählt wird, um die Hälfte der Lots zu schließen.

Tut mir leid, wenn das verwirrend war, denn ich habe diese Teile gerade erst hinzugefügt - Sie werden sie in dem Pastebin-Link oben nicht sehen... nur einfache Druckfunktionen :)


Versuchen Sie die angehängte ... es ist meine beste Vermutung zu dem, was Sie zu tun versuchen.
Dateien:
dom.mq4  24 kb
 

Großartig - danke. Das ist ein großer Schritt in die richtige Richtung. Ich denke, weil es innerhalb einer for-Schleife, es will zu schließen, die Hälfte und die Hälfte und die Hälfte @ den Preis ... Anstatt es nur einmal zu tun? Nicht nur das, aber es scheint nicht zu schließen, die Hälfte aus, sobald der Preis >= auf den Ausstiegspreis ich will, stattdessen geht es darüber hinaus, und dann, wenn der Preis schwingt wieder niedriger in den Ausstiegspreis ich will, schließt es dann - seltsam... Ich danke Ihnen für Ihre Geduld, mir zu helfen! Sehr dankbar für Ihre Zeit!!


UPDATE: Außerdem habe ich gerade herausgefunden, dass, wenn ich die Experten-Eigenschaften (extern int) vor dem Ausführen von Strategie-Tester, dann die schließen Hälfte funktioniert überhaupt nicht - Dinge, die Auswirkungen auf die schließen Hälfte ist "MA_PadAmount" dies ist, wie viele Punkte, die ich als ein Pad auf den Stop-Loss, die in Pips, und "OrderPrice_PadAmount", die mir erlaubt, um anzugeben, wie viele Pips kann ich als Pad auf den Einstiegspreis der Aufträge setzen...

 
DomGilberto:
Großartig - danke. Das ist ein großer Schritt in die richtige Richtung. Ich denke, weil es innerhalb einer for-Schleife, es will zu schließen, die Hälfte und die Hälfte und die Hälfte @ den Preis ... Anstatt es nur einmal zu tun? Nicht nur das, aber es scheint nicht zu schließen, die Hälfte aus, sobald der Preis >= auf den Ausstiegspreis ich will, stattdessen geht es darüber hinaus, und dann, wenn der Preis schwingt wieder niedriger in den Ausstiegspreis ich will, schließt es dann - seltsam... Ich danke Ihnen für Ihre Geduld, mir zu helfen! Sehr dankbar für Ihre Zeit!!
Es ist nicht die for-Schleife, es ist nur so, dass es keine Möglichkeit hat, zu wissen, dass die Hälfte bereits geschlossen wurde ... wie haben Sie geplant, das zu behandeln?
 
Yea - ich buchstäblich gerade herausgefunden, dass, wenn ich die for-Schleife entfernt. Bin ich richtig zu sagen, dass, wenn ich die OrderTicket-Nummer von verfolgen, wenn es zum ersten Mal ausgewählt wird, sobald die OrderClose seine Sache getan hat und es wahr zurückgibt, dann könnte ich dies mit der OrderTicket-Nummer zu überprüfen, wie sie unterschiedlich sein werden - so brechen die Schleife und warten, bis eine andere neue Bestellung durch kommt?

Ich bin mir nicht ganz sicher, wie ich das schreiben soll, aber ist das ungefähr der richtige Weg?