Probleme beim Schließen, bitte helfen

 

Hallo an alle
Hoffe, dass die Syntax besser ist als vorher. In der letzten Woche habe ich den Codersguru gelesen.

Das Programm unten hat zwar keine Fehler, der Compiler protokolliert nur einen Auftrag. Aber mein Code wird ihn nicht schließen.
Das Programm sagt --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), ich habe
weder den StopLoss noch den TakeProfit eingefügt, wie Sie sehen können. Grund, es gibt eine StopLoss-Bedingung, die bereits als solche kodiert ist ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Blue)
Es besteht also keine Notwendigkeit, einen weiteren StopLoss einzufügen, oder? Was den TakeProfit anbelangt
Ich werde diesen Code einfügen, wenn das andere Problem gelöst ist.
Ist es die Art und Weise, wie ich die Schließungsbedingung kodiert habe, oder gibt es wieder Probleme mit der Syntax?
Vielen Dank an alle für Ihre Hilfe, und möge mein Problem anderen helfen,
Prost

-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
  {                                                               
    if (OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
&&  OrderMagicNumber()  == MagicNumber                          // with my MN    
&&  OrderSymbol()       == Symbol())                            // with my symbol
  {                                                                                                                                                    
    if(OrderType() == OP_SELL)
    order = OrderTicket(); 
                       
    if(OrderTicket() == OrderOpenPrice() + (ATR*2))     // ATR*2 above Sell. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),3,Blue);   
      Print("Sell order closed with Hard Stop"); 
     }     
  else
  {
      Print("Error closing Sell Hard Stop", GetLastError()); 
   }   
//---------- Closeing Buy -------------
           
    if(OrderType() == OP_BUY) 
    order = OrderTicket(); 
    
    if(OrderTicket() == OrderOpenPrice() - (ATR*2))     // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),3,Red); 
      Print("Buy order closed with Hard Stop");
     }     
  else 
  {
      Print("Error closing Buy Hard Stop", GetLastError());                                      
      return(0); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if(OrdersTotal() < 1)                                        // Checking for any working orders
   {                                   
     if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
     if(ticket>0)
   { 
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
      Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
    }
  else
      Print ("Error Opening Buy Order :" , GetLastError()); 
      return(0);                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
  if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                               //with no working orders
    {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
   if(ticket>0)
     {     
       if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
     }
    else
       Print ("Error Opening Sell Order :" ,GetLastError());
       return(0);
     }  
    return(0); 
  }
}
 
-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
       {                                                               
        if (
           OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol()                     // with my symbol
           )                     
           {                                                                                                                                                    
            if(OrderType() == OP_SELL) order = OrderTicket(); 
                       
            if(OrderTicket() == OrderOpenPrice() + (ATR*2))     // ATR*2 above Sell. Hard Stop
              {
               OrderClose(OrderTicket(),OrderLots(),3,Blue);   
               Print("Sell order closed with Hard Stop"); 
              }     
              else
              {
               Print("Error closing Sell Hard Stop", GetLastError()); 
              } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2))
                                 
                                                              //---------- Closeing Buy -------------
                     
              if(OrderType() == OP_BUY) order = OrderTicket(); 
               
              if(OrderTicket() == OrderOpenPrice() - (ATR*2))     // ATR*2 below Buy. Hard Stop
                {
                 OrderClose(OrderTicket(),OrderLots(),3,Red); 
                 Print("Buy order closed with Hard Stop");
                }     
                else 
                {
                 Print("Error closing Buy Hard Stop", GetLastError());                                      
                 return(0); 
                }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2))                                              
           }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc
       }// END for loop               
                     
                             
                                        //------------ Opening Buy -----------------
                       
    if(OrdersTotal() < 1)                                        // Checking for any working orders
      {                                   
       if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
        {                                                                                     
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
         if(ticket>0)
           { 
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
           }
           else
           Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0)
             
         return(0);                                                  
        }//ENDif (Ask > High[iHighest(NU... etc  
                                                      
                                                             //--------------- Opening Sell ----------------
                                                                         
       if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                                    //with no working orders
          {   
           ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
           if(ticket>0)
             {     
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
             }//ENDif (ticket>0)
             else
             Print ("Error Opening Sell Order :" ,GetLastError()); 
             //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                 
           return(0);
          }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])  
       return(0); 
      }//ENDif  (OrdersTotal() < 1)
}//ENDint start()
Sollte Ihre Codeblöcke leichter lesbar machen
 
if(OrderTicket() == OrderOpenPrice() - (ATR*2)) 
DasAuftragsticket ist eine sehr große ganze Zahl (wahrscheinlich im Milliardenbereich), der Schlüssel zum Auftrag.
OOP - 2ATR ist ein Preis.
Die beiden werden NIEMALS gleich sein
Wenn Sie OrderClosePrice() == OOP-2ATR gemeint haben, werden reale Zahlen fast nie gleich sein. verwenden Sie stattdessen:
 if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...

OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol() 
Ihr orderSend setzt keine magische Zahl
 
Ickyrus wrote >>
Sollte Ihre Codeblöcke leichter lesbar machen


Ja, Sie haben Recht. Bei jedem Versuch und Nachfragen lerne ich ein bisschen mehr. Danke fürs Aufräumen. Erst in den letzten Tagen konnte ich die Klammern an die richtigen Stellen setzen. Je einfacher, desto besser.
Prost
 
WHRoeder wrote >>
Das Auftragsticket ist eine sehr große ganze Zahl (wahrscheinlich im Milliardenbereich), der Schlüssel zum Auftrag.
OOP - 2ATR ist ein Preis.
Die beiden werden NIEMALS gleich sein
wenn Sie OrderClosePrice() == OOP-2ATR meinten, werden reale Zahlen fast nie gleich sein. verwenden Sie stattdessen:

Ihr orderSend setzt keine magische Zahl


Hallo WHRoeder
vielen Dank für deinen Blick und die Anregungen. Ich muss aber sagen, dass ich das OOP -2ATR nicht auf Anhieb verstanden habe.
OOP = OrderOpenPrice. Das ist mir zunächst über den Kopf gewachsen. Deine Erklärung ist absolut richtig. Ich hatte mich an dem == Zeichen verfangen. Der OrderClosePrice() könnte niemals dem OrderOpenPrice() minus (ATR*2) entsprechen. Danke, dass Sie das erkannt haben.
Lassen Sie mich sehen, ob ich Ihren Vorschlag verstehe. Ich werde ihn hier neu formulieren. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Das sieht so aus (ich verwende hier willkürliche Zahlen): OCP = 1,4361, OOP = 1,4321, ATR = 20. Der Ausdruck würde also wie folgt aussehen:
if (1.4321 - 1.4361 - (20*2) <= 0), Es tut mir leid, aber ich verstehe es nicht.
Vielleicht kann ich die gleichen Zahlen verwenden, um den Ausdruck umzustellen, um zu zeigen, was ich gemeint habe. Aber auch das hat nicht funktioniert, als ich sie in das Programm eingegeben habe.
Die neue Anordnung sieht wie folgt aus.

if (1,4361 >= 1,4321 + (20*2)).

Wenn der OCP >=OOP + ATR*2 ist, geht die Kontrolle an:
OrderClose (OrderTicket(), OrderLots(), usw.

Ihre andere Beobachtung war, dass OrderSend keine magische Zahl setzt.
Könnte ich diesen Teil einfach aus dem Programm nehmen: && OrderMagicNumber == MagicNumber,
Nochmals vielen Dank, und wenn Sie weitere Verbesserungen sehen, wäre ich Ihnen sehr dankbar.
Vielen Dank
 

Hallo Ais
danke für deine Antwort. Ich hoffe, es geht dir gut.
Die Anregung wurde heute Morgen eingefügt. Leider gefällt dem Compilier nicht, was ich codiert habe. Ich bin mir nicht sicher, welche Anweisung im Programm falsch ist. Die Vorschläge sind meiner Meinung nach in Ordnung. Ich werde das Programm erneut posten und den Bereich kennzeichnen, der meiner Meinung nach das Problem darstellt. Ich werde auch die Strategie für die Schließung angeben.

Die Verkaufsposition wird oberhalb des Eröffnungskurses der Order um Atr*2 gestoppt. Zum Beispiel: OOP ist 1,4321, Atr =20 und OCP = 1,4361.
Also habe ich den Ausdruck wie folgt kodiert,

if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // Bedingung ist erfüllt, Kontrolle geht an....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;

Hinweis: Es gibt keinen StopLoss() oder TakeProfit() in der OrderSend-Anweisung, falls das von Bedeutung ist.

Nochmals vielen Dank für jede Hilfe
Prost
double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
  {                                                               
    if (OrderSelect(index, SELECT_BY_TICKET)                  // existing orders
//&&  OrderMagicNumber()  == MagicNumber                      // with my MN    
&&  OrderSymbol()       == Symbol())                          // with my symbol
  {                                                                                                                                                    
    if(OrderType() == OP_SELL) order = OrderTicket(); 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                       
    if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met,
                                                        // control then passes to...
  {                                                     
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      Print("Sell order closed with Hard Stop"); 
     }     
  else
  {
      Print("Error closing Sell Hard Stop", GetLastError()); 
   }   
//---------- Closeing Buy -------------
           
    if(OrderType() == OP_BUY)  order = OrderTicket(); 
    
    if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2))        // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); 
      Print("Buy order closed with Hard Stop");
     }     
  else 
  {
      Print("Error closing Buy Hard Stop", GetLastError());                                      
      return(0); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if(OrdersTotal() < 1)                                        // Checking for any working orders
   {                                   
     if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
     if(ticket>0)
   { 
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
      Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
    }
  else
      Print ("Error Opening Buy Order :" , GetLastError()); 
      return(0);                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
  if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                               //with no working orders
    {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
   if(ticket>0)
     {     
       if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
     }
    else
       Print ("Error Opening Sell Order :" ,GetLastError());
       return(0);
     }  
    return(0); 
  }
}
 

Hallo Huckleberry,
Ich werde dein Programm ein wenig umgestalten.
Tschüss für jetzt

 

Warum "order = OrderTicket();" und nicht diesen Wert in der Funktion orderclose() verwenden?
Auch wenn die Wahrscheinlichkeit gering ist, dass sich die ausgewählte Bestellung geändert hat, wäre es nicht sicherer, den positiv identifizierten Bestellwert zu verwenden?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() wird das aktuell ausgewählte Ticket sein - in diesem Stadium meines Lernens
Ich kann nicht sagen, welches Orderticket ausgewählt ist, wenn Sie OrderClose() ausführen.

//// Bearbeiten
Ich bin mir nicht sicher, ob "order= OrderTicket()" das Ticket ist, das Sie in der vorangehenden If-Anweisung identifiziert haben.

 
Ais wrote >>

Hallo Huckleberry,
Ich werde dein Programm ein wenig umgestalten.
Tschüss für jetzt


Ich danke Ihnen sehr. Ich werde auf Ihre Antwort warten.
Auf Wiedersehen
 
Ickyrus wrote >>

Warum "order = OrderTicket();" und nicht diesen Wert in der Funktion orderclose() verwenden?
Auch wenn die Wahrscheinlichkeit gering ist, dass sich die ausgewählte Bestellung geändert hat, wäre es nicht sicherer, den positiv identifizierten Bestellwert zu verwenden?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() wird das aktuell ausgewählte Ticket sein - in diesem Stadium meines Lernens
Ich kann nicht sagen, welches Orderticket ausgewählt ist, wenn Sie OrderClose() ausführen.

//// Bearbeiten
Eigentlich bin ich mir nicht sicher, ob "order= OrderTicket()" das Ticket ist, das Sie in der vorangehenden If-Anweisung identifiziert haben.


Hallo Ickyrus
danke für deine Beobachtung und deinen Vorschlag. Ihre Zeit ist wertvoll.
Ihre Überlegungen machen durchaus Sinn. Ich bin mir nicht so sicher wie Sie, was die gewählte Reihenfolge betrifft. Ich werde Ihre Anregung ausprobieren.
Nochmals vielen Dank.
Zum Wohl