-----------------------------------------------------------------+ //| 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
Saluti
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
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
OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;
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); } }
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.
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.
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

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
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