EA che non chiude tutti gli ordini

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico

Moderatore: Dainesi

Rispondi
onire
Messaggi: 10
Iscritto il: 03/03/2017, 17:54

EA che non chiude tutti gli ordini

Messaggio da onire » 28/03/2017, 16:39

Salve ragazzi,
per prendere confidenza con MQL4 stavo riscrivendo questo EA a modo mio.
Al momento per semplificare le cose, ho 2 EA, che lancio a mano dall'editor, uno per aprire gli ordini l'altro per chiuderli.
Mi sono accorto che l'EA non chiude tutti gli ordini, ne lascia sempre qualcuno aperto (sospetto che questo succeda anche per l'apertura, ma ancora non ho verificato).

Il codice mi sembra semplice e corretto:

Codice: Seleziona tutto

#property copyright "onire"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int         Magic=16384; //Magic number
input int         Slippage=15;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ChiudiTutte();
//---
   Print("Tutti chiusi ",OrdersTotal());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Chiude tutte le posizioni con un fissato magic numebr            |
//+------------------------------------------------------------------+
void ChiudiTutte()
  {
   Print("Ordini totali: ",OrdersTotal());
   for(int TradeNumber=0; TradeNumber<OrdersTotal(); TradeNumber++)
     {
      Print("Ordini Rimanenti: ",OrdersTotal());
      bool selected=OrderSelect(TradeNumber,SELECT_BY_POS,MODE_TRADES);
      
      string  dataSymbol=OrderSymbol();
      Print("Chiudo simbolo ",dataSymbol);

      while(MarketInfo(dataSymbol,MODE_BID)==0)
        {
         //Print(dataSymbol," return 0 Bid price");
        }
      double  bidSymbol=MarketInfo(dataSymbol,MODE_BID);

      while(MarketInfo(dataSymbol,MODE_ASK)==0)
        {
         //Print(dataSymbol," return 0 Ask price");
        }
      double askSymbol=MarketInfo(dataSymbol,MODE_ASK);

      if((OrderType()==OP_BUY) && OrderMagicNumber()==Magic)
        {
         bool result=false;
         while(result==false)
           {
            result=OrderClose(OrderTicket(),OrderLots(),bidSymbol,Slippage,clrBlue);
           }
        }
      if((OrderType()==OP_SELL) && OrderMagicNumber()==Magic)
        {
         bool result=false;
         while(result==false)
           {
            result=OrderClose(OrderTicket(),OrderLots(),askSymbol,Slippage,clrBlue);
           }
        }
     }
  }
Il codice attraverso la funzione OrdersTotal() vede quanti sono gli ordini totali e cerca di chiuderli uno ad uno confrontando con il magic number (sempre lo stesso).
Ad un certo punto il programma esce dalla funzione, mah :blink:
2017.03.28 16:22:50.927 Chiusura EURUSD,H1: initialized
2017.03.28 16:22:50.927 Chiusura EURUSD,H1: Tutti chiusi 3
2017.03.28 16:22:50.927 Chiusura EURUSD,H1: close #202946964 sell 0.01 USDCHF at 0.98378 sl: 0.98642 tp: 0.97883 at price 0.98387
2017.03.28 16:22:50.723 Chiusura EURUSD,H1: Chiudo simbolo USDCHF
2017.03.28 16:22:50.723 Chiusura EURUSD,H1: Ordini Rimanenti: 4
2017.03.28 16:22:50.723 Chiusura EURUSD,H1: close #202946928 sell 0.01 USDCHF at 0.98383 sl: 0.98645 tp: 0.97886 at price 0.98386
2017.03.28 16:22:50.484 Chiusura EURUSD,H1: Chiudo simbolo USDCHF
2017.03.28 16:22:50.484 Chiusura EURUSD,H1: Ordini Rimanenti: 5
2017.03.28 16:22:50.484 Chiusura EURUSD,H1: close #202946850 sell 0.01 USDCHF at 0.98377 sl: 0.98640 tp: 0.97881 at price 0.98385
2017.03.28 16:22:50.234 Chiusura EURUSD,H1: Chiudo simbolo USDCHF
2017.03.28 16:22:50.234 Chiusura EURUSD,H1: Ordini Rimanenti: 6
2017.03.28 16:22:50.234 Chiusura EURUSD,H1: close #202943629 buy 0.01 EURCAD at 1.45289 sl: 1.44870 tp: 1.46060 at price 1.45393
2017.03.28 16:22:50.031 Chiusura EURUSD,H1: Chiudo simbolo EURCAD
2017.03.28 16:22:50.031 Chiusura EURUSD,H1: Ordini Rimanenti: 7
2017.03.28 16:22:50.031 Chiusura EURUSD,H1: Ordini totali: 7
2017.03.28 16:22:50.015 Chiusura EURUSD,H1 inputs: Magic=16384; Slippage=15;
2017.03.28 16:22:48.989 Expert Chiusura EURUSD,H1: loaded successfully
Questo è il log dell'EA.
Dopo aver chiuso la posizione n.4 esce dalla funzione e torna in OnInit().

Mi sorge un dubbio, non è che mentre è in esecuzione avviene l'evento OnTick() e quindi salta?

A voi è mai capitato?

Sponsor

Sponsor
 

onire
Messaggi: 10
Iscritto il: 03/03/2017, 17:54

Re: EA che non chiude tutti gli ordini

Messaggio da onire » 28/03/2017, 17:06

Penso di aver risolto :green:
Finisco le prove e poi vi faccio sapere.

Cià

onire
Messaggi: 10
Iscritto il: 03/03/2017, 17:54

Re: EA che non chiude tutti gli ordini

Messaggio da onire » 29/03/2017, 9:45

Codice corretto:

Codice: Seleziona tutto

void ChiudiTutte()
  {
   int NumOrd = OrdersTotal();
   
   int TuttiITickets[];
   ArrayResize(TuttiITickets,NumOrd);
   
   Print("Ordini totali: ",NumOrd);
   
   //--- 
   for(int TradeNumber=0; TradeNumber<NumOrd; TradeNumber++)
     {
      bool selected=OrderSelect(TradeNumber,SELECT_BY_POS,MODE_TRADES);
      
      string  dataSymbol=OrderSymbol();
      TuttiITickets[TradeNumber]=OrderTicket();
      Print("Simbolo ",dataSymbol," con Ticket num. ",OrderTicket()," ,Magic ",OrderMagicNumber());

    }
   
   for(int TradeNumber=0; TradeNumber<NumOrd; TradeNumber++)
     {
      Print("Ordini Rimanenti: ",OrdersTotal());
	   bool selected=OrderSelect(TuttiITickets[TradeNumber],SELECT_BY_TICKET,MODE_TRADES);
      
      string  dataSymbol=OrderSymbol();
      Print("Chiudo simbolo ",dataSymbol," con Ticket num. ",OrderTicket());

      while(MarketInfo(dataSymbol,MODE_BID)==0)
        {
         //Print(dataSymbol," return 0 Bid price");
        }
      double  bidSymbol=MarketInfo(dataSymbol,MODE_BID);

      while(MarketInfo(dataSymbol,MODE_ASK)==0)
        {
         //Print(dataSymbol," return 0 Ask price");
        }
      double askSymbol=MarketInfo(dataSymbol,MODE_ASK);

      if((OrderType()==OP_BUY) && OrderMagicNumber()==Magic)
        {
         bool result=false;
         while(result==false)
           {
            result=OrderClose(OrderTicket(),OrderLots(),bidSymbol,Slippage,clrBlue);
           }
        }
      if((OrderType()==OP_SELL) && OrderMagicNumber()==Magic)
        {
         bool result=false;
         while(result==false)
           {
            result=OrderClose(OrderTicket(),OrderLots(),askSymbol,Slippage,clrBlue);
           }
        }
     }
  }

resucitato
Messaggi: 78
Iscritto il: 30/01/2017, 14:17

Re: EA che non chiude tutti gli ordini

Messaggio da resucitato » 29/03/2017, 13:00

quando usi il ciclo for per questa operazione devi partire dall indice più grande fino a zero tipo:

Codice: Seleziona tutto

bool chiudiECancella(){
	for(int i=OrdersTotal()-1;i>=0;i--){
		if(OrderSelect(i,SELECT_BY_POS)){
			if(OrderType()==OP_SELLLIMIT){
				bool csl = OrderDelete(OrderTicket());
			}
			if(OrderType()==OP_BUYLIMIT){
				bool cbl = OrderDelete(OrderTicket());
			}
			if(OrderType()==OP_BUY){
				bool cbm = OrderClose(OrderTicket(),OrderLots(),Bid,10);
			}
			if(OrderType()==OP_SELL){
				bool csm = OrderClose(OrderTicket(),OrderLots(),Ask,10);
			}
		}
	}

	if(OrdersTotal()>0){
		chiudiECancella();
	}
	
	return true;
}

onire
Messaggi: 10
Iscritto il: 03/03/2017, 17:54

Re: EA che non chiude tutti gli ordini

Messaggio da onire » 29/03/2017, 14:53

Penso che il problema dipenda da SELECT_BY_POS, perchè con SELECT_BY_TICKET funziona tutto.
Grazie :)

resucitato
Messaggi: 78
Iscritto il: 30/01/2017, 14:17

Re: EA che non chiude tutti gli ordini

Messaggio da resucitato » 29/03/2017, 21:35

si infatti è la POS, quando chiudi l'ordine 0, l ordine 1 diventa 0 e il 2 diventa 1 e cosí via..

Avatar utente
Dainesi
Messaggi: 301
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)
Contatta:

Re: EA che non chiude tutti gli ordini

Messaggio da Dainesi » 30/03/2017, 10:52

L'iterazione dell'insieme DEVE avvenire a ritroso poiché l'insieme sotto osservazione (il portafoglio ordini esistente) è "in movimento".

Inoltre ti suggerisco di testare il valore di ritorno della OrderClose() per valutare se l'operazione è andata a buon fine e se no perché, affinché tu possa attivare soluzioni alternative.
Dalla versione 1045 in poi si sono presentate pericolose anomalie sia per le chiusure che per le aperture. Meglio abbondare con i controlli!

resucitato
Messaggi: 78
Iscritto il: 30/01/2017, 14:17

Re: EA che non chiude tutti gli ordini

Messaggio da resucitato » 30/03/2017, 11:47

Dainesi ha scritto:L'iterazione dell'insieme DEVE avvenire a ritroso poiché l'insieme sotto osservazione (il portafoglio ordini esistente) è "in movimento".

Inoltre ti suggerisco di testare il valore di ritorno della OrderClose() per valutare se l'operazione è andata a buon fine e se no perché, affinché tu possa attivare soluzioni alternative.
Dalla versione 1045 in poi si sono presentate pericolose anomalie sia per le chiusure che per le aperture. Meglio abbondare con i controlli!
si. io eviterei proprio di fare affidamento su questo tipo di operazioni sulla mt4, soprattutto se le si deve usare per una strategia veloce. Il problema peggiore è che il broker che amministra il server può cambiare i settaggi come gli pare e infatti una volta mi è capitato di ritrovarmi a tradare a intervalli di 10 secondi, in pratica non potevo più aprire o chiudere gli ordini consecutivamente

Rispondi