Ciao a tutti, scusate se la domanda può essere banale, ma vorrei inserire in un mio EA un filtro, cioè non deve mai aprire 2 operazioni consecutive nella stessa direzione. Ad esempio se l'ultima operazione è stata in buy deve essere inibita l'apertura in buy, anche se ci sono le condizioni.
So che con "Ordershistorytotal" si richiamano tutte le operazioni fatte, ma come faccio a dire all'EA devi prendere in considerazione solo l'ultima?
Qualcuno può indicarmi che tipo di controllo devo far fare e la sintassi esatta?
Ordershistorytotal
Re: Ordershistorytotal
Ciao Gigi1968,
la OrdersHistoryTotal() considera soltanto lo storico di ordini e gli ordini chiusi.
Se vuoi contare gli ordini ancora aperti e quelli pendenti devi usare la OrdersTotal() https://docs.mql4.com/trading/orderstotal
Di seguito ti riporto un esempio di un suo possibile utilizzo, una funzione che restituisce il numero di ordini
la OrdersHistoryTotal() considera soltanto lo storico di ordini e gli ordini chiusi.
Se vuoi contare gli ordini ancora aperti e quelli pendenti devi usare la OrdersTotal() https://docs.mql4.com/trading/orderstotal
Di seguito ti riporto un esempio di un suo possibile utilizzo, una funzione che restituisce il numero di ordini
Codice: Seleziona tutto
//+-------------------------------------------------------------------------+
//| Conta le posizioni
//| input:
//| - magic = numero intero magic number
//| - type = OP_BUY - buy order,
//| OP_SELL - sell order,
//| OP_BUYLIMIT - buy limit pending order,
//| OP_BUYSTOP - buy stop pending order,
//| OP_SELLLIMIT - sell limit pending order,
//| OP_SELLSTOP - sell stop pending order.
//+--------------------------------------------------------------------------+
int CountPosOrders(int magic, int type)
{
int Orders = 0;
for(int i = 0; i < OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true
&& OrderSymbol() == Symbol()
&& OrderMagicNumber() == magic
&& OrderType() == type)
Orders++;
}
return(Orders);
}
Re: Ordershistorytotal
Ciao, nel mio EA ho già messo il filtro per non far aprire 2 posizioni contemporaneamente, quello che vorrei mettere è che una volta chiuso un ordine il successivo non deve essere dello stesso tipo.
Esempio: operazione Buy, una volta chiusa (sia profit che stop) l'operazione successiva non deve essere di nuovo Buy (deve essere inibita l'apertura di ordini buy) ma potrà essere sell al verificarsi delle condizioni. Stessa cosa in caso di Sell.
Grazie
Esempio: operazione Buy, una volta chiusa (sia profit che stop) l'operazione successiva non deve essere di nuovo Buy (deve essere inibita l'apertura di ordini buy) ma potrà essere sell al verificarsi delle condizioni. Stessa cosa in caso di Sell.
Grazie
Re: Ordershistorytotal
Non ho una funzione pronta che faccia quello che chiedi. Però ti posso suggerire di usare la OrderSelect() per selezionare l'ultimo ordine in history e la OrderType() per leggere se buy o sell. Importante anche controllare con la OrderCloseTime() che la data di chiusura sia diversa da 0 perchè la OrderSelect con MODE_HISTORY seleziona oridni sia chiusi sia ordini cancellati (ordini pendenti).
A grandi linee, un controllo potrebbe essere simile a questo
OrderSelect(0,SELECT_BY_POS,MODE_HISTORY) && OrderOpenTime() != 0
e poi ti ricavi il tipo di ordine con OrderType()
A grandi linee, un controllo potrebbe essere simile a questo
OrderSelect(0,SELECT_BY_POS,MODE_HISTORY) && OrderOpenTime() != 0
e poi ti ricavi il tipo di ordine con OrderType()
-
- Messaggi: 21
- Iscritto il: 19/02/2021, 15:00
Re: Ordershistorytotal
Codice: Seleziona tutto
//+------------------------------------------------------------------------------------------
//| ricerca l'ultimo ordine a mercato dell'EA (magic number 12345) sul grafico attivo,
//| chiuso nel periodo filtrato (Account History)
//+------------------------------------------------------------------------------------------
void OnStart(){
if(UltimoTrade() == OP_BUY) Alert("Apri SELL");
else if(UltimoTrade() == OP_SELL) Alert("Apri BUY");
else Alert("Apri qualsiasi ordine");
}
//+------------------------------------------------------------------------------------------
int UltimoTrade(){
int histOrdTot = OrdersHistoryTotal();
int tipOrd;
for(int i= histOrdTot-1; i >=0; i--){
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
Alert("Nessun ordine trovato nel periodo scelto"); return(-1);}
tipOrd= OrderType();
if(OrderSymbol() == _Symbol && OrderMagicNumber() == 12345){
if(tipOrd == OP_BUY) return(OP_BUY);
if(tipOrd == OP_SELL) return(OP_SELL);
}
}
return(-1);
}
Chi c’è in linea
Visitano il forum: Nessuno e 0 ospiti