EA che non chiude tutti gli ordini

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

Moderator: Dainesi

Post Reply
onire
Posts: 10
Joined: 03/03/2017, 17:54

EA che non chiude tutti gli ordini

Post by 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:

Code: Select all

#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
Posts: 10
Joined: 03/03/2017, 17:54

Re: EA che non chiude tutti gli ordini

Post by onire » 28/03/2017, 17:06

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

Cià

onire
Posts: 10
Joined: 03/03/2017, 17:54

Re: EA che non chiude tutti gli ordini

Post by onire » 29/03/2017, 9:45

Codice corretto:

Code: Select all

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
Posts: 78
Joined: 30/01/2017, 14:17

Re: EA che non chiude tutti gli ordini

Post by resucitato » 29/03/2017, 13:00

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

Code: Select all

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
Posts: 10
Joined: 03/03/2017, 17:54

Re: EA che non chiude tutti gli ordini

Post by onire » 29/03/2017, 14:53

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

resucitato
Posts: 78
Joined: 30/01/2017, 14:17

Re: EA che non chiude tutti gli ordini

Post by 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..

User avatar
Dainesi
Posts: 292
Joined: 12/05/2014, 12:10
Location: Castellanza (VA)
Contact:

Re: EA che non chiude tutti gli ordini

Post by 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
Posts: 78
Joined: 30/01/2017, 14:17

Re: EA che non chiude tutti gli ordini

Post by resucitato » 30/03/2017, 11:47

Dainesi wrote: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

Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests