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

OrderSend Expiration Time

Messaggio da Paolino »

Per favore, qualcuno sa dirmi come si scrive la scadenza di un ordine pendente? Grazie
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: OrderSend Expiration Time

Messaggio da carlo10 »

Ciao,

se intendi la di cancellazione del pendente che deve essere cancellato se non entra a mercato prima puoi usare questa:

Codice: Seleziona tutto

int ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, Bid - 15 * Point, 5, Bid - 5 * Point, Bid - 30 * Point, NULL, 0, TimeCurrent() + 3600, Red);
Dove il TimeCurrent() + 3600 indica che l'ordine sarà cancellato tra un'ora se non entra a mercato prima.
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ok, grazie carlo10.
Ciao

Paolo
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao carlo10,

ho provato ad utilizzare il comando Expiration che mi hai suggerito ma non sono riuscito a farlo funzionare, nel senso che se inserisco TimeCurrent()+300 (ho interpretato correttamente il tuo suggerimento inserendo +300 su un grafico a 5 minuti?) non esegue nessun ordine, se invece lascio il valore 0 funziona correttamente. Sbaglio qualcosa? Ti sarò grato se vorrai dare uno sguardo al mio EA, al quale in questi giorni ho messo un po d'ordine ... o no? Il mio intento sarebbe quello di non utilizzare l'eliminazione degli ordini selezionandoli per poi cancellarli ma invece l'expiration.
Grazie
Ciao
Paolo
Allegati
BARRE-TRAILING-STOP-CANCELLA-PENDENTI.mq4
(13.76 KiB) Scaricato 65 volte
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao carlo10,
penso di aver scoperto dove sta il problema: la piattaforma permette di utilizzare la funzione expiration per un periodo superiore ai 5 minuti (così mi pare di aver capito facendo una ricerca su internet): ti risulta? Ho coretto il time frame a 30 minuti con TimeCurrent()+1800 e sta funzionando. Ho anche eliminato il controllo se è iniziata una nuova barra, che dovrebbe essere inutile. L'unico dubbio che mi rimane è sul funzionamento del trailing stop che col tester strategia funziona male, nel senso che corregge lo stop anche negli ordini pendenti: è un problema che ho già avuto e corretto. Sto provando in demo il funzionamento dell'EA e non mi pare che succeda, verificherò.
Per adesso grazie per tutto l'aiuto che mi hai dato.
Ciao
Paolo
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: OrderSend Expiration Time

Messaggio da carlo10 »

Paolino ha scritto:penso di aver scoperto dove sta il problema: la piattaforma permette di utilizzare la funzione expiration per un periodo superiore ai 5 minuti (così mi pare di aver capito facendo una ricerca su internet): ti risulta?
Ciao Paolo,

non lo sapevo ma non ho mai usato questa funzione sui miei EA. Buono a sapersi comunque!
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao Carlo10,

avrei nuovamente bisogno del Tuo aiuto per risolvere un problema che mi sta assillando da giorni e al quale non riesco a darmi una spiegazione. Ho fatto questo semplice EA, che allego, che deve aprire una posizione Buy Stop e una Sell Stop ad un certo orario prestabilito. Trascorso un certo periodo (in questo caso 14 minuti) gli ordini pendenti non eseguiti vengono cancellati mediante l'expiration. Ad un secondo orario prestabilito (in questo caso 15 minuti) devono essere inseriti gli ordini Buy Stop e Sell Stop precedentemente cancellati, ovviamente a livelli differenti. L'EA in questione viene attaccato a 18 grafici con gli stessi orari di inserimento degli ordini Buy Stop e Sell Stop. All'avvio, quando cioè non ci sono ordini inseriti, ne pendenti ne eseguiti, tutto bene, così come la cancellazione degli ordini pendenti non eseguiti. Il problema lo riscontro al reinserimento degli ordini Buy Stop e Sell Stop al secondo orario, nel senso che in 1 o più grafici (in genere non più di 3) 1 o entrambi non vengono inseriti. Mi domando, se l'EA è lo stesso per tutti i 18, perchè funziona quasi ovunque e no su qualcuno? Potrebbe trattarsi di un problema "fisiologico" dovuto al fatto che opera contemporaneamente su più grafici e fa "confusione"?
Se vorrai dargli uno sguardo e dirmi come risolvere il problema te ne sarò molto grato, per adesso ti ringrazio anticipatamente.
Ciao
Paolo
Allegati
0-EA-PROVE-ORARIO.mq4
(5.08 KiB) Scaricato 95 volte
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: OrderSend Expiration Time

Messaggio da carlo10 »

Eccomi qua!

Allora per il discorso se più EA attaccati potrebbero entrare in conflitto la risposta è dipende da come sono stati programmati.

Guardando il tuo codice se ogni volta che attacchi l'EA al grafico utilizzi un magic number differente non dovresti avere problemi.

Per quanto riguarda la mancata apertura dei secondi ordini stop vedo che è strettamente legata agli orari inseriti in input ed in particolare ad OraInizio2 e MinutiInizio2. Tu sei proprio sicuro che in quel minuto il numero di ordini fosse uguale a 0?

Altro fattore da considereare è il fuso orario del broker. Ti stai basando sull'orario del tuo PC o su quello del broker? Dovresti utilizzare quello del broker.

Come al solito per questi casi consiglio di inserire delle stampe di prova nei vari punti dell'EA per capire in quale ramo del codice si entra. Se ti saresti aspettato di aprire degli ordini e non hai errori di apertura significa che l'EA non entra in quella parte del codice a quel punto vale la pena stamparsi le variabili chiave prima dell'IF per vedere se il risultato a runtime è effettivamente quello che ti aspettavi.
Paolino
Messaggi: 512
Iscritto il: 05/04/2015, 21:57

Re: OrderSend Expiration Time

Messaggio da Paolino »

Ciao Carlo10,
torno a ringraziarti perchè senza il tuo aiuti non caverei un ragno dal buco ...
Ti relaziono riguardo alle domande/suggerimenti che mi hai dato:
riguardo all'orario è quello del broker (lo deduco dal fatto che quando si apre una barra corrispondente all'orario di attivazione dell'EA gli ordini vengono immediatamente eseguiti mentre l'orario del mio PC è sfasato di una ventina di secondi), comunque sia, sarebbe possibile inserire un codice che fa operare l'EA nell'orario del broker?
Venendo ai risultati delle mie prove odierne, mettere un magic number diverso per ogni grafico non cambiava niente, nemmeno inserendo anche degli orari di attivazione differenti da grafico a grafico.
Ho inserito la funzione "Print" come mi hai suggerito (ho imparato qualcosa che pur conoscendo non ho mai utilizzato poichè non gli davo una gran importanza, invece ... c'è sempre da imparare).
E' possibile che la funzione "Print" possa influire sul corretto funzionamento di un EA? In un primo tempo l'ho inserita appena sopra i 2 OrderSend (senza modificare nient'altro) e mi ha inserito una montagna di ordini ... Successivamente l'ho spostata nella posizione attuale ed ho eseguito 2 test: il risultato del conteggio degli ordini è corretto e l'EA ha funzionato correttamente in entrambe le prove, inserendo, nel secondo orario, esattamente gli ordini pendenti precedentemente cancellati. Si è trattato di un caso fortunato o posso considerare risolto il problema?
Per finire, un ultima considerazione: il tempo dopo il quale l'expiration cancella un ordine pendente non dovrebbe partire dal momento del suo inserimento? Gli ordini pendenti vengono inseriti nel giro di una decina di secondi: perchè allora vengono cancellati tutti nello stesso istante, facendo partire il tempo dall'orario di attivazione dell'EA?
Scusa per la lungaggine e grazie infinite per il tempo che mi stai dedicando.
Ciao
Paolo
Allegati
0-EA-PROVE-ORARIO.mq4
(5.42 KiB) Scaricato 67 volte
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: OrderSend Expiration Time

Messaggio da carlo10 »

Provo a rispondere a tutto ma la prossima volta non farmi tutte queste domande :lol:

I print che hai introdotto non possono aver influito sulla logica e sul funzionamento del tuo EA. Questa non è un'affermazione vera in assoluto perchè se non si sta attenti ad esempio un Print può farti eseguire o meno un'altra istruzione all'interno di un IF se queste 2 istruzioni non sono racchiuse tra graffe... Ma in questo caso si tratterebbe di un errore di programmazione ed è quello che hai commesso probabilmente nella variante in cui ti apriva una montagna di ordini. L'IF senza graffe eseguire una sola istruzione.

L'orario in cui scattano gli ordini è assolutamente l'orario del broker e non centra nulla con l'orario del tuo pc. La cosa a cui stare attento è però che nell'arco di tempo da te selezionato ci siano dei Tick. Solo in questo caso la funzione start (che ora sarebbe più corretto modificare in OnTick) viene eseguita. Per essere sicuro di eseguire un'istruzione ad un determinato orario anche in assenza di nuovi tick dovresti utilizzare la funzione OnTimer, qui trovi qualche info a riguardo: http://docs.mql4.com/basis/function/events

Tra la prima versione dell'EA e la seconda vedo che c'è uno scarto di 2 minuti tra l'orario di inizio 2 e l'Expiration. Ti faccio quindi io una domanda. E' possibile che nella prima versione il primo ordine pendente fosse ancora attivo e non ti si aprisse quindi il secondo pendente causa accavallamento? A questa domanda che è solo un'ipotesi dovresti riuscire a rispondere guardando i log delle stampe che hai eseguito.

Sull'ultima domanda ti dico che dovrebbe essere come hai detto, ovvero. Se due ordini pendenti vengono aperti a distanza di 1 minuto uno dall'altro ed entrambi hanno 5 minuti come scadenza allora vengono anche cancellati ad un minuto di distanza. Prova ad aumentare il tempo tra le 2 aperture magari con uno sleep() e vedrai che non si cancellano assieme....
Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti