Problemi di chiusura, per favore aiutatemi

 

Ciao a tutti
Spero che la sintassi sia migliore di prima. Nell'ultima settimana ho letto il Codersguru.

Il programma qui sotto, anche se non ha alcun errore, il compilatore registrerà solo un ordine. Ma il mio codice non lo chiude.
Il programma dice --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), non ho
inserito lo stoploss o il takeprofit, come potete vedere. Motivo, c'è una condizione StopLoss già codificata come tale ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Blue)
Quindi non c'è bisogno di inserire un altro StopLoss, no? Per quanto riguarda il TakeProfit
Lo inserirò quando quest'altro problema sarà risolto.
È che il modo in cui ho codificato la condizione di chiusura, o ci sono di nuovo problemi con la sintassi?
Grazie a tutti per il vostro aiuto, e che il mio problema possa aiutare gli altri,
Saluti

-----------------------------------------------------------------+
//|                                         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()
Dovrebbe rendere i blocchi di codice più facili da leggere
 
if(OrderTicket() == OrderOpenPrice() - (ATR*2)) 
Ilbiglietto d'ordine è un numero intero molto grande (probabilmente nell'ordine dei miliardi), la chiave dell'ordine.
OOP - 2ATR è un prezzo.
I due non saranno MAI uguali
se intendevi OrderClosePrice() == OOP-2ATR i numeri reali non saranno quasi mai uguali. usa invece:
 if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...

OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol() 
Il tuo orderSend non sta impostando un numero magico
 
Ickyrus wrote >>
Dovrebbe rendere i tuoi blocchi di codice più facili da leggere


Sì, hai ragione. Con ogni tentativo e indagine, imparo un po' di più. Grazie per la pulizia. È stato solo negli ultimi giorni che ho potuto mettere le parentesi nel posto giusto. Più semplice è, meglio è.
Saluti
 
WHRoeder wrote >>
Il biglietto d'ordine è un numero intero molto grande (probabilmente nell'ordine dei miliardi), la chiave dell'ordine.
OOP - 2ATR è un prezzo.
I due non saranno MAI uguali
se intendevi OrderClosePrice() == OOP-2ATR i numeri reali non saranno quasi mai uguali. usa invece:

Il tuo orderSend non sta impostando un numero magico


Ciao WHRoeder
Grazie per aver dato un'occhiata e i suggerimenti. Ma devo dire che non ho capito subito l'OOP -2ATR.
OOP = OrderOpenPrice. All'inizio mi è passato sopra la testa. La tua spiegazione è assolutamente corretta. Mi sono fatto prendere dal segno ==. L'OrderClosePrice() potrebbe non essere mai uguale all'OrderOpenPrice() meno l'ATR*2. Grazie per averlo capito.
Vediamo se ho capito il tuo suggerimento. Lo riformulo qui. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Questo sembra leggere (userò cifre arbitrarie qui) OCP = 1.4361, OOP = 1.4321, ATR = 20. Quindi l'espressione sarebbe come
se (1.4321 - 1.4361 - (20*2) <= 0), mi dispiace, ma non capisco.
Forse posso usare le stesse cifre per riorganizzare l'espressione, per mostrare cosa intendevo. Ma anche questo non ha funzionato quando li ho inseriti nel programma.
La nuova disposizione si presenta così.

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

Dove l'OCP >=OOP + ATR*2, il controllo passa a:
OrderClose (OrderTicket(), OrderLots(), ecc.

L'altra osservazione è che l'OrderSend non sta impostando un numero magico.
Potrei semplicemente togliere questa parte dal programma: && OrderMagicNumber == MagicNumber,
Grazie ancora, e se puoi vedere altri miglioramenti, te ne sarei grato.
Saluti
 

Ciao Ais
Grazie per la tua risposta. Spero che tu stia bene.
Il suggerimento è stato inserito questa mattina. Mi dispiace dire che al compilatore non piace quello che ho codificato. Non sono sicuro di quale dichiarazione nel programma non sia corretta. I suggerimenti credo che vadano bene. Riposto il programma e segnalo l'area che credo sia il problema. Indicherò anche la strategia di chiusura.

La posizione di vendita sarà fermata sopra il prezzo di apertura dell'ordine di Atr*2. Ad esempio, OOP è 1.4321, Atr =20, e OCP = 1.4361.
Quindi ho codificato l'espressione come

if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // condizione soddisfatta, il controllo passa a....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;

Nota: non c'è nessun StopLoss(), o TakeProfit() nell'istruzione OrderSend, se questo ha qualche rilevanza.

Grazie ancora per l'aiuto di tutti
Saluti
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); 
  }
}
 

Ciao Huckleberry,
Ho intenzione di ridisegnare leggermente il tuo programma.
Ciao per ora

 

Perché fare "order = OrderTicket(); " e non usare questo valore nella funzione orderclose()?
Anche se la possibilità che l'ordine selezionato sia cambiato è minima, non sarebbe più sicuro usare il valore dell'ordine identificato positivamente?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() sarà il biglietto attualmente selezionato - a questo punto del mio apprendimento
Non riesco a capire quale orderticket è selezionato quando si fa l'OrderClose().

//// Modifica
In realtà non sono sicuro che "order= OrderTicket()" sia il ticket che hai identificato nel precedente If statment.

 
Ais wrote >>

Ciao Huckleberry,
Ho intenzione di ridisegnare leggermente il tuo programma.
Ciao per ora


Grazie mille. Aspetterò la vostra risposta.
Saluti
 
Ickyrus wrote >>

Perché fare "order = OrderTicket(); " e non usare questo valore nella funzione orderclose()?
Anche se la possibilità che l'ordine selezionato sia cambiato è minima, non sarebbe più sicuro usare il valore dell'ordine identificato positivamente?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() sarà il biglietto attualmente selezionato - a questo punto del mio apprendimento
Non riesco a capire quale orderticket è selezionato quando si fa l'OrderClose().

//// Modifica
In realtà non sono sicuro che "order= OrderTicket()" sia il ticket che hai identificato nel precedente If statment.


Ciao Ickyrus
Grazie per la tua osservazione e il tuo suggerimento. Il tuo tempo è prezioso.
Il tuo ragionamento ha perfettamente senso. Non sono più sicuro di te per quanto riguarda l'ordine selezionato. Farò un tentativo con il tuo suggerimento.
Grazie ancora
Saluti