OrderSend Expiration Time

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao carlo10,
ho cercato di applicare i suggerimenti che mi hai dato, ma non ho capito come vanno inserite quelle funzioni nell'EA. Ho anche fatto una ricerca su internet se trovavo qualche esempio che mi chiarisse le idee ma non ho trovato nulla: potresti per favore specificarmi meglio come utilizzare quelle funzioni? Effettivamente il mancato inserimento di alcuni ordini pendenti avviene a causa della mancanza di movimenti dei prezzi. Ho modificato il periodo di entrata inserendo un >= && <= nei minuti ottenendo un miglioramento ma è pur sempre un palliativo e non sempre funziona a dovere. Nel corso della mia ricerca ho invece trovato un codice che permette di inserire automaticamente un MagiNumber diverso per ogni grafico: cosa ne pensi, ha qualche controindicazione?
Grazie e buona serata.
Paolo
Allegati
0-EA-PROVE-ORARIO.mq4
(6.5 KiB) Scaricato 38 volte
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: OrderSend Expiration Time

Messaggio da carlo10 »

Paolino ha scritto:Ho anche fatto una ricerca su internet se trovavo qualche esempio che mi chiarisse le idee ma non ho trovato nulla: potresti per favore specificarmi meglio come utilizzare quelle funzioni? Effettivamente il mancato inserimento di alcuni ordini pendenti avviene a causa della mancanza di movimenti dei prezzi.
Ti riferisci in particolare alla OnTimer?
Paolino ha scritto:Nel corso della mia ricerca ho invece trovato un codice che permette di inserire automaticamente un MagiNumber diverso per ogni grafico: cosa ne pensi, ha qualche controindicazione?
Nessuna controindicazione, se mi passi il link ci do un'occhiata.
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao carlo10
direi che per quelle che possono essere le mie conoscenze la soluzione migliore per il mio caso è la OnTimer, riguardo al codice che calcola il MagicNumber l'avevo inserito nell'EA allegato al mio messaggio precedente, comunque, ti riporto sotto il codice.
Come si fa a riportare nel messaggio che si sta scrivendo una parte del testo di un messaggio precedente (in sostanza il riquadro con la scritta "Paolino ha scritto: ..... nella tua risposta)?
Grazie
Ciao
Paolo

P.S.: che calcolo fa? prima assegna a MagicNumber il valore 0 e dopo il ciclo for moltiplica il MagicNumber *3 (che fa sempre 0) e gli somma StringGetChart(Symbol(),i

Codice: Seleziona tutto

// CALCOLO DEL MAGIC NUMBER 
  MagicNumber = MagicFromSymbol();




//+------------------- CALCOLO DEL MAGIC NUMBER DIVERSO PER OGNI GRAFICO -----------------+ 
  int MagicFromSymbol() 
  { 
  MagicNumber=0;  
  for (int i=0; i<5; i++) 
  {  
  MagicNumber=MagicNumber*3+StringGetChar(Symbol(),i);  
  }  
  MagicNumber=MagicNumber*3+Period();  
  return(MagicNumber);  
  }
//+---------------------------------------------------------------------------------------+
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Funzione OnTimer

Messaggio da carlo10 »

Per quotare basta premere il tasto CITA in alto a destra sul messaggio a cui vuoi rispondere.

Lo script sul magic è corretto ma nel caso in cui tu inserisca il tuo EA su due grafici differenti dello stesso cross e dello stesso periodo ti ritornerà per forza di cose lo stesso magic number quindi devi stare attento a non utilizzarlo su grafici uguali. Lo StringGetChar ti fa ricavare il codice ASCII di un carattere all'interno della stringa. Il ciclo for serve a passare un carattere alla volta. Ad esempio su EURUSD il primo ciclo for farà questo calcolo:

Codice: Seleziona tutto

MagicNumber=MagicNumber*3+StringGetChar(Symbol(),i);  
MagicNumber = 0 * 3 + StringGetChar("EURUSD", 0) = 69
Al secondo ciclo avrai questa situazione:

Codice: Seleziona tutto

MagicNumber = 69 * 3 + StringGetChar("EURUSD", 1) = 292
E così via. Sono tutti passaggi che potresti capire meglio scomponendo la formula e stampandoti il valore dei vari pezzi con dei Print.

Per quanto riguarda la funzione OnTimer, puoi impostare ad esempio nella OnInit ogni quanto vuoi che la tua funzione OnTimer sia richiamata:

Codice: Seleziona tutto

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(10);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
   
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
Con la struttura base sopra la tua funzione OnTimer sarà richiamata ogni 10 secondi perchè alla EventSetTimer viene passato il parametro 10.
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao carlo10,
grazie per la spiegazione del MagicNumber. Riguardo a OnTimer priverò ad applicarla, anche se non sono sicuro di aver capito bene dove inserire i comandi che mi suggerisci: nel caso tornerò a interpellarti.
Grazie ancora e buona giornata.
Paolo
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao carlo10,
ho provato ad inserire nel mio EA il codice relativo al OnTimer che mi hai indicato, ma non sono sicuro di averlo fatto correttamente. Mi pare di aver capito che va messo all'inizio, al di fuori del ciclo int start(), è così?
Inoltre mi sono accorto che se vengono inseriti degli ordini buy stop o sell stop e vengono eseguiti immediatamente il mio EA inserisce un altro ordine stop e in caso di ulteriore esecuzione ne inserisce un altro e così via (una volta ne ho visti 14): il conteggio degli ordini stop, verificato da print (oltre che da comment che ho inserito per permettermi il controllo dal grafico) è corretto, ma viene saltato il controllo del numero degli ordini inseriti if(NumeroOrdiniBuyStop()==0) e if(NumeroOrdiniSellStop()==0), eseguiti if(NumeroOrdiniBuy()==0) e if(NumeroOrdiniSell()==0) così come if(candleHasOrdersB(MagicNumberB) == FALSE) e if(candleHasOrdersS(MagicNumberS) == FALSE) che dovrebbe impedire di inserire più di un ordine per barra. Quest'ultimo codice l'ho scomposto in buy stop e sell stop visto che inserisco 2 ordini per volta: ho fatto male o ho sbagliato qualcosa? Per cortesia potresti dirmi cosa c'è che non va?
Grazie anticipate
Paolo
Allegati
0-EA-PROVE-ORARIO.mq4
(9.37 KiB) Scaricato 44 volte
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: OrderSend Expiration Time

Messaggio da carlo10 »

Tutto quello che c'è dentro a Start va spostato all'interno della funzione OnTimer.

La start è una funzione che viene eseguita ad ogni tick mentre la OnTimer viene definita ad ogni intervallo definito nelle EventSetTimer, nel tuo caso 10 secondi.

La start deve quindi rimanere vuota, puoi anche toglierla in teoria. Fammi sapere se così il comportamento migliora.
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao carlo10,
ho fatto la correzione che mi hai suggerito e adesso il mio EA funziona correttamente, anche il conteggio degli ordini, che non funzionava a causa di alcuni errori che avevo fatto nella compilazione del codice. L'unico problema che mi rimarrebbe da risolvere è che nel calcolare il Numero Magico partendo dal codice ASCII per i grafici NZDJPY e CADJPY il risultato è in entrambi i casi 0: perchè?
Avrei ancora da farti una domanda. Meta Trader per ogni ordine inserito lascia traccia sul grafico di alcuni oggetti (frecce/lineette), che vado a cancellare cliccando col tasto desto del mouse sul grafico, selezionando lista oggetti per poi cancellarli uno ad uno: esiste la possibilità di inserire nell'EA un codice che attivandosi ad una certa ora li cancella automaticamente?
Se mi troverò a dover affrontare altri problemi tornerò a interpellarti, intanto ti ringrazio ancora caldamente per il grande aiuto che mi hai dato e anche per la cortesia e la sollecitudine che hai sempre avuto.
Ciao
Paolo
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: OrderSend Expiration Time

Messaggio da carlo10 »

Allora ti do 2 compiti per casa.

Il primo compito è quello di mostrarmi passaggio per passaggio come vengono calcolati i magic number delle 2 coppie che mi hai indicato. Ti anticipo che per quanto mi riguarda il risultato non è zero.

Il secondo compito è quello di studiare questa funzione e fare qualche prova: ObjectsDeleteAll.
Dovrebbe essere proprio quello che ti serve per cancellare gli oggetti dal grafico.
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao carlo10,
ho fatto i compiti a casa. Per quanto riguarda il Magic Number ho fatto l'EA 0-EA-CALCOLO-MN che rileva il valore secondo il codice ASCII di ciascuna lettera e calcola il MagicNumber moltiplicandoli / sommandoli secondo quanto indicato dal codice. Penso di aver compreso il funzionamento, quello che non capisco è perchè attaccando l'EA 0-EA-PROVE-ORARIO su 18 grafici contemporaneamente non calcola il MagicNumber per NZDJPY e CADJPY (per entrambi rilascia 0 per gli ordini BUY e 20000 per gli ordini SELL). La cosa ancora più strana è che se attacco l'EA 0-EA-CALCOLO-MN sugli stessi 18 grafici li calcola correttamente tutti e 18, eppure il pezzo di codice è lo stesso per entrambi: ha una logica tutto questo? Ho anche provato a copiare quel pezzo di codice su un altro EA e funziona sempre correttamente anche li. Riguardo invece all'uso di ObjectsDeleteAll(); ho fatto una ricerca e l'unica cosa che mi pare di aver capito è che fa parte dei comandi void OnDeinit e che si può indicargli quali segni cancellare (ma non ho capito come indicargli ... cosa) però il comando ObjectsDeleteAll(); dovrebbe cancellarli tutti ... o no?. Secondo questa logica l'ho inserito come puoi vedere nell'EA 0-EA-PROVE-ORARIO ma non cancella nulla. Potresti per cortesia darmi qualche altra indicazione?
Grazie
Ciao
Paolo
Allegati
0-EA-PROVE-ORARIO.mq4
(9.86 KiB) Scaricato 50 volte
0-EA-CALCOLO-MN.mq4
(4.48 KiB) Scaricato 38 volte
Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite