Schließung von halben Parzellen. - Seite 3

 
DomGilberto:

Rundet MathFloor Nachkommastellen auf die nächste GANZE Zahl ab?

MathFloor() tut, was in der Dokumentation steht ... "Die Funktion MathFloor gibt einen numerischen Wert zurück, der die größte ganze Zahl darstellt, die kleiner oder gleich x ist."

DomGilberto:


Macht FirstTarget als benutzerdefinierter Parameter innerhalb von "OrderClose()" Sinn - vorausgesetzt "sizeClose" war korrekt? (siehe zitierten Code)

Nein ... Sie haben das hier:

FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();

// meaning this

FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();

wenn Sie wahrscheinlich dies meinen ...

FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;

Verwenden Sie Klammern (und Leerzeichen), um die Dinge klar und eindeutig zu machen.

DomGilberto:


Ihr Code hat nicht geholfen - sorry.

Warum? Ist das falsch? Inwiefern?

DomGilberto:


Können Sie benutzerdefinierte Variablen drucken? Wenn ja, muss ich etwas falsch machen, da es im Journal nicht angezeigt wird.

Ja, Sie können beliebige Variablen ausgeben. . was tust du? zeige deinen Code.

 
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }
   } 
     
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP)
    {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
      
      double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
       
       if (half < minLot) half = Lots;
       half=Lots/2;
       OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); 
       }
    } 


In Bezug auf das Drucken von benutzerdefinierten Variablen, wie würde ich über tun dies für "FirstTarget_Buy" gehen?

Ich werde einige Zeit damit verbringen, meinen gesamten Code durchzugehen und eine Menge auszudrucken - ich weiß, wie man es mit bools und ints macht (Integer -1 schlägt fehl und bool ist eine wahre oder falsche Aussage - einfach.), aber ich verstehe nicht, wie man es macht, wenn man einer benutzerdefinierten Variablen Funktionen zuweist?

Danke für die Aufklärung der obigen "FirsTarget"-Formel! Entschuldigung, ich wollte sagen, dass Ihr Code nicht hilfreich ist, weil ich nicht verstehe, wie man die Formel zusammensetzt... Ich finde es wirklich kontraintuitiv - Man sollte meinen, dass der Aufruf von "OrderSelect" es Ihnen ermöglichen würde, einfach zu sehen, was die Losgröße auf dieser Tickorder war... und sie dann einfach zu teilen...

Tut mir leid, dass ich wie ein kompletter Schwachkopf rüberkomme!

 
DomGilberto:

Tut mir leid, dass ich wie ein Vollidiot rüberkomme!

Ganz und gar nicht, Sie müssen nur Ihren blinden Fleck finden und ihn aufklären. Sobald Sie das getan haben, werden Sie sich fragen, warum Sie es so schwer fanden, alles ist einfach, wenn man weiß, wie es geht.

DomGilberto:

Was das Drucken von benutzerdefinierten Variablen angeht, wie würde ich das für "FirstTarget_Buy" machen?

Ich werde einige Zeit damit verbringen, meinen gesamten Code durchzugehen und eine Menge auszudrucken - ich weiß, wie man es mit bools und ints macht (Integer -1 schlägt fehl und bool ist eine wahre oder falsche Aussage - einfach), aber ich verstehe nicht, wie man es macht, wenn man einer benutzerdefinierten Variablen Funktionen zuweist?

So ... beachten Sie auch den Hinweis auf geschweifte Klammern
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );

      Print("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy, Digits) );   // prints FirstTarget_Buy with the same number of digits as the current symbol
         {                                                                                        // why this brace ?   
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }                                                               // why this brace ?  
   } 

DomGilberto:

Ich wollte damit sagen, dass Ihr Code in dem Sinne nicht hilfreich ist, dass ich nicht verstehe, wie man die Formel zusammensetzt... Ich finde es wirklich kontraintuitiv - Sie hätten gedacht, dass der Aufruf von "OrderSelect" es Ihnen ermöglichen würde, einfach zu sehen, was die Losgröße auf dieser Tickorder war... und sie dann einfach zu teilen...

Sie können einfach OrderSelect die Reihenfolge, die Verwendung OrderLots() und dividieren durch zwei ... Sie können das tun, und in vielen Situationen wird es funktionieren. Ich schreibe Code für alle Fälle, die ich vorhersehen kann, damit ich ihn nicht ständig korrigieren muss, wenn er nicht funktioniert...

Wenn Ihre Positionsgröße 2,0 Lots beträgt, ist das geteilt durch zwei 1,0 Lots, und das wird funktionieren...

Wenn Ihre Positionsgröße 0,3 Lots beträgt, ist dies geteilt durch zwei 0,15 Lots und dies ist eine ungültige Positionsgröße, wenn MODE_LOTSTEP 0,1 ist... Sie können 0,1 oder 0,2 NICHT 0,15 verwenden, also müssen Sie diese Prüfung und Anpassung codieren.


Was Sie hier haben, wird nicht in allen Fällen funktionieren...

double Lots = OrderLots(); 
      

         
         half = Lots / 2; 
 

Ahhhh! Ich habe gerade die letzten 15-20 Minuten damit verbracht, Drucke überall zu verteilen - ich beginne zu verstehen, was ich falsch mache. Ich wähle grundsätzlich den PENDING-Auftrag aus... JEDOCH, da es sich um eine schwebende Order handelt, besteht zu dem Zeitpunkt, an dem ich sie auswähle, eine ziemlich hohe Wahrscheinlichkeit, dass sich die OrderLots, der Stop und die Ziele geändert haben, weshalb ich sie in eine Schleife einfügen muss, um sie mit meinen schwebenden Orders zu synchronisieren, die ständig berechnet werden, bevor sie ausgelöst werden.

Diese verflixte doubletostr :P - Spot on RaptorUK! Ich kann jetzt sehen, dass dies korrekt berechnet wird, dank Ihrer Anpassung :)

Ich glaube, ich weiß jetzt, wie ich das meiste machen kann. Nur aus Neugierde, welche "if"-Anweisung würde funktionieren, um NUR den Auftrag aufzurufen, der ausgelöst wurde. Im Moment rufe ich sie auf, wenn ich eine Marktorder offen habe, aber ich versuche herauszufinden, wie ich sie aufrufe, wenn die Pending Order ausgelöst wurde?

Der Code unten und die entsprechende "if"-Anweisung scheint nur auf offene schwebende Aufträge zu rufen. Ich möchte nur eine Möglichkeit finden, eine bestimmte benutzerdefinierte Funktion (z. B. void) auf der Grundlage einer ausgelösten Order aufzurufen? (wenn das Sinn macht!)

Danke, dass Sie so viel für mich geklärt haben :)

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
}         

if(OpenOrdersThisPair(Symbol())>0)
 
DomGilberto:

Ahhhh! Ich habe gerade die letzten 15-20 Minuten damit verbracht, Drucke überall zu verteilen - ich beginne zu verstehen, was ich falsch mache.

Einfach, wenn Sie wissen, wie

DomGilberto:


Ich denke, ich weiß jetzt, wie ich das meiste machen kann. Nur aus Neugierde: Welche "if"-Anweisung würde funktionieren, um NUR den Auftrag aufzurufen, der AUSGELÖST wurde? Im Moment rufe ich sie auf, wenn ich einen Marktauftrag geöffnet habe, aber ich versuche herauszufinden, wie ich sie aufrufe, wenn der schwebende Auftrag ausgelöst wurde?

Wenn eine Pending Order ausgelöst wurde, wird sie zu einem OP_BUY oder OP_SELL, also ...

if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   { 
   
   }

Ein Tipp: Verwenden Sie mehr Leerzeichen ... wenn Sie einen Fehler bei der Division durch Null erhalten und herausfinden wollen, wo er auftritt, ist es einfach, nach Leerzeichen zu suchen und nur Ihre Divisionen zu finden, anstatt all Ihre Kommentare ... Ich verwende also Leerzeichen um = + - / % usw.

 
Ah, natürlich (facepalm!)

Guter Tipp - werde ich machen! Vielen Dank für deine Hilfe :) Ich melde mich, wenn ich es geschafft habe!
 
Ok, ich bin wieder da! ... Nicht so gute Nachrichten - ich habe mehrere Variationen des Codes ausprobiert und getestet, ohne Erfolg. Das ist mein momentaner Stand.

Ich erhalte keine Informationen über die Drucke? Im Journal taucht absolut nichts auf. Ich nehme an, dass dies daran liegt, dass in der ersten "if"-Anweisung nichts ausgewählt wird, was den OrderType betrifft. Von dem, was ich hier im Code sehen kann, hätte ich gedacht, dass ich zumindest nicht weit davon entfernt bin...?
if(OrderType() == OP_BUY ){
   
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy)            
         
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
            Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
            }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
 
DomGilberto:
Okay, ich bin wieder da! ... Allerdings gibt es keine guten Nachrichten - ich habe mehrere Varianten des Codes ausprobiert und getestet, ohne Erfolg. Das ist mein momentaner Stand der Dinge.

Ich erhalte keine Informationen über die Ausdrucke? Im Journal taucht absolut nichts auf. Ich nehme an, dass dies daran liegt, dass in der ersten "if"-Anweisung nichts ausgewählt wird, was den OrderType betrifft. Von dem, was ich hier im Code sehen kann, hätte ich gedacht, dass ich zumindest nicht weit davon entfernt bin...?

Wie wählen Sie den Auftrag aus, bevor Sie dies tun?

if(OrderType() == OP_BUY ){

Sie haben hier immer noch Probleme

      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());  //  OrderSelect has failed,  why do you continue . . . 
            }
            if(OrderMagicNumber()==MagicNumber)                            //  . . . to this line ?
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy) 
 

Warum nicht . . .

for( int c = OrdersTotal()-1; c >= 0; c-- )
   {
   if( OrderSelect(c, SELECT_BY_TICKET, MODE_TRADES) )
      {
      Print("Order Ticker Number = ",OrderTicket());
      Print("Order Lots Open = ", OrderLots());
      } 
   else 
      {
      Print("Order Select returned the error of ", GetLastError()); 
      continue;                                                        // try next order position in the loop
      }
   if(OrderMagicNumber() == MagicNumber)    
      if(OrderSymbol() == Symbol())
         if(OrderType() == OP_BUY)
            if(OpenOrdersThisPair(Symbol()) == 1) 
 
Ich kann nicht glauben, dass ich diese Anfängerfehler mache... Das ärgert mich! Ja, ich kann jetzt drucken und den Auftrag auswählen. Das ist der Code, der in Bezug auf den Druck funktioniert - die Lose werden aber immer noch nicht geschlossen? Ich habe auch die Journalmeldungen unten eingefügt.
  if(OrderSelect(OrdersTotal(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1){
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
           Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
         }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else{
           Print("Order Select returned the error of ", GetLastError()); // Order Select does not seem to want to work?
            continue;
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0    // Not sure what is going on here?		
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000           // This is the right calculation based 
                                                                                                                      // upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931                // This price is also correct.