Ordershistorytotal

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
Rispondi
Gigi1968
Messaggi: 3
Iscritto il: 26/09/2017, 13:07

Ordershistorytotal

Messaggio da Gigi1968 »

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?
senapazio
Messaggi: 142
Iscritto il: 13/09/2015, 1:47

Re: Ordershistorytotal

Messaggio da senapazio »

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

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);
}
Gigi1968
Messaggi: 3
Iscritto il: 26/09/2017, 13:07

Re: Ordershistorytotal

Messaggio da Gigi1968 »

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
senapazio
Messaggi: 142
Iscritto il: 13/09/2015, 1:47

Re: Ordershistorytotal

Messaggio da senapazio »

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()
Semporasere
Messaggi: 21
Iscritto il: 19/02/2021, 15:00

Re: Ordershistorytotal

Messaggio da Semporasere »

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);  
}
Saluti
Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti