Analizzare le barre all'indietro in EA

 

Ciao a tutti,

Questa potrebbe essere una domanda davvero stupida, ma non sono proprio riuscito a trovare il modo di farlo. Sto cercando di creare un EA che, dopo aver analizzato alcune barre, decide se aprire o meno un ordine. Diciamo che apre un ordine. in qualche modo se il mio EA si ferma o metatrader si spegne, quando l'ho riaperto, voglio trovare le barre che causano l'apertura dell'ordine. Quindi cerco gli ordini e trovo il mio ordine (che l'EA ha appena aperto) e voglio ricominciare ad analizzare le barre. Come posso farlo? Come posso trovare la barra del mio ordine aperto e iniziare a risalire sulle barre.

per es:

Sto correndo sul periodo H1 e cerco le barre alle 12:00, 13:00, 14:00 e 15:00 poi decido di aprire un ordine alle 16:00. le barre importanti sono tra le 12:00 e le 15:00 e voglio identificare di nuovo queste barre. quindi quando riavvio l'EA prima troverò l'ordine e troverò la sua data di apertura, rileverò a quale barra appartiene questa data, e inizierò ad andare indietro sulle barre precedenti a quella data.

Ho pensato di usare Time array ecc. ma, mentre cerco di trovare le barre, cosa succede se arriva una nuova barra? i turni saranno cambiati e la mia ricerca sarà illogica.

Inoltre non voglio scrivere queste informazioni in un file. richiede troppo tempo e un sacco di gestione delle eccezioni ecc.

grazie.

 
paranoyakX:

Ho pensato di usare Time array ecc. ma, mentre cerco di trovare le barre, cosa succede se arriva una nuova barra? I turni saranno cambiati e la mia ricerca sarà illogica.


Una nuova barra non dovrebbe comparire mentre un EA sta eseguendo il suo codice. Funziona con i dati caricati quando OnTick() viene chiamato.

Non sono sicuro di cosa succederebbe se RefreshRates() venisse usato però.

 
GumRai: Non sono sicuro di cosa succederebbe se RefreshRates() fosse usato.

Anche se non succede spesso (in effetti, molto raramente), quando si usa RefreshRates(), ho avuto l'esperienza che i dati della barra vengono spostati a causa della formazione di una nuova barra. Per aggirare questo problema, cerco di copiare tutti i dati necessari nelle variabili, all'inizio, e poi non fare più affidamento sugli History Data Arrays o funzioni equivalenti durante il resto dell'esecuzione dell'evento. In questo modo, anche se nel mio codice richiedo di usare il RefreshRates(), posso ancora fare riferimento in modo sicuro alle condizioni iniziali.

@paranoyakX: Quindi, indipendentemente dall'uso di RefreshRates() o meno, si può provare un approccio simile. Infatti, in MQL5, non si ha la stessa capacità di MQL4 e si DEVE copiare i dati nei propri array per poterli elaborare. Quindi, facendo in questo modo, si è di fatto qualche passo più vicini a poter rendere il proprio codice compatibile sia con MQL4 che con MQL5.

Tuttavia, la soluzione migliore, è quella di non codificare tutto questo nell'EA, ma invece di codificare la maggior parte di quella logica in un indicatore, che non soffre di questo problema, perché l'approccio è totalmente diverso. Cerca di programmare la maggior parte possibile della logica del segnale in un indicatore. Questo è utile anche perché puoi usare e testare visivamente l'indicatore finché non funziona esattamente come vuoi tu. Un altro uso della soluzione dell'indicatore, è che fornirà la segnalazione non solo per l'EA ma anche per il trading manuale. L'EA quindi, deve solo concentrarsi sulla gestione del trading e non sulla segnalazione.

 
paranoyakX:

[...] Ho pensato di usare Time array ecc. ma, mentre cerco di trovare le barre, cosa succede se arriva una nuova barra? I turni saranno cambiati e la mia ricerca sarà illogica.

Quello che chiedi è potenzialmente così semplice che mi chiedo se mi sfugge il punto. Dato un precedente OrderSelect(), puoi cercare il turno delle barre associato al suo OrderOpenTime() semplicemente facendo quanto segue:

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);

Per esempio:

  • Grafico H1
  • L'ora corrente è 16:32
  • L'ordine è stato aperto alle 14:23
  • Il codice precedente dovrebbe restituire BarShiftOfOrderOpen = 2, cioè la barra H1 alle 14:00, e Time[BarShiftOfOrderOpen] sarà 14:00
 
jjc: Quello che chiedi è potenzialmente così semplice che mi chiedo se mi sfugge il punto. Dato un precedente OrderSelect(), si può cercare il bar-shift associato al suo OrderOpenTime() semplicemente facendo quanto segue:

Per esempio:

  • Grafico H1
  • L'ora corrente è 16:32
  • L'ordine è stato aperto alle 14:23
  • Il codice sopra dovrebbe restituire BarShiftOfOrderOpen = 2, cioè la barra H1 alle 14:00, e Time[BarShiftOfOrderOpen] sarà 14:00

Sì, questo è esattamente ciò che OP sta dicendo, ma ciò che sta mettendo in dubbio non è come farlo, ma come evitare che diventi non valido a causa di uno spostamento di barra causato da un nuovo tick in arrivo che forma una nuova barra, mentre lui sta elaborando i dati.

Tuttavia, questo NON dovrebbe accadere, tranne quando si usa RefreshRates(). Per quella possibilità (che è rara), ho suggerito i metodi alternativi nello stesso modo in cui lo fa MQL5.

 
FMIC:

ma come evitare che diventi non valido a causa di uno spostamento di barra causato da un nuovo tick in arrivo che forma una nuova barra

Dove lo dice il PO? Questa potrebbe essere la domanda, ma penso che tu stia sentendo gli zoccoli e pensando alle zebre piuttosto che ai cavalli. La menzione della persistenza dello stato EA in un file attraverso i riavvii di MT4 mi suggerisce che la domanda è in realtà molto, molto più semplice.
 

Ciao ragazzi,

grazie mille per le risposte,

@FMIC, è interessante che non ho mai pensato di usare indicatori e come dici tu questo potrebbe essere molto più facile se ne creo e uso uno, ma naturalmente questo porterà nuove domande, come trovare il valore dell'indicatore che si accoppia con il mio ordine ecc. Inoltre non farò questo processo ogni volta, solo OnInit() una volta. quindi forse usare un EA va bene per questo.

@jjc, grazie anche per la tua soluzione. In realtà ero un po' preoccupato per la "nuova barra", ma come tutti voi dite, mentre l'EA è in esecuzione non ci saranno cambi di turno (e non sto usando la funzione RefreshRates()) quindi posso usare anche il tuo codice. Sono solo curioso ora dopo quello che ha detto @FMIC, sarebbe più bello se creassi questo come un indicatore?

 
jjc:
Dove lo dice l'OP? Questa potrebbe essere la domanda, ma penso che tu stia sentendo gli zoccoli e pensando alle zebre piuttosto che ai cavalli. La menzione della persistenza dello stato EA in un file attraverso i riavvii di MT4 mi suggerisce che la domanda è in realtà molto, molto più semplice.

Anche GumRai l'ha capito e l'ha citato, cosa che farò di nuovo qui:

paranoyakX:

Ho pensato di usare Time array ecc. ma, mentre cercavo di trovare le barre, cosa succederebbe se arrivasse una nuova barra? i turni verrebbero cambiati e la mia ricerca sarebbe illogica.

 
paranoyakX:

@FMIC, è interessante che non ho mai pensato di usare indicatori e come dici tu questo potrebbe essere molto più facile se ne creo e uso uno, ma naturalmente questo porterà nuove domande, come trovare il valore dell'indicatore che si accoppia con il mio ordine ecc. Inoltre non farò questo processo ogni volta, solo OnInit() una volta. quindi forse usare un EA va bene per questo.

@jjc, grazie anche per la tua soluzione. In realtà ero un po' preoccupato per la "nuova barra", ma come tutti voi dite, mentre l'EA è in esecuzione non ci saranno cambi di turno (e non sto usando la funzione RefreshRates()) quindi posso usare anche il tuo codice. Sono solo curioso ora dopo quello che ha detto @FMIC, sarebbe più bello se creassi questo come un indicatore?

Non badare al mio suggerimento se è troppo complicato per te! Fallo in qualsiasi modo sia più facile per te ora e poi quando sei più a tuo agio con esso, prova anche l'altro modo

PS! Non dovresti mettere alcun codice logico nel tuo OnInit(), che è solo dove inizializzi le cose e mai nulla a che fare con i dati di una serie di array di dati storici. Tutta la vostra logica e il codice principale dovrebbero essere in OnTick() o in OnCalculate().

 
FMIC:

Anche GumRai l'ha capito e l'ha citato, cosa che farò di nuovo qui:

Tu e Gumrai state facendo un'enorme supposizione sul significato di "se sale una nuova barra" che l'evidenza non giustifica ancora. L'OP non ha ancora detto "se una nuova barra sale durante OnStart".

Ho il sospetto che paranoyakX stia memorizzando i dettagli del trade/segnale in variabili globali nell'EA. Il problema, sospetto, non è la formazione di nuove barre durante una chiamata a OnStart(), ma la formazione di nuove barredurante la vita dell'EA.

 
jjc:

Tu e Gumrai state facendo un'enorme supposizione sul significato di "se sale una nuova barra" che le prove non giustificano ancora. L'OP non ha ancora detto "se una nuova barra sale durante OnStart".

Ho il sospetto che paranoyakX stia memorizzando i dettagli del trade/segnale in variabili globali nell'EA. Il problema, sospetto, non è la formazione di nuove barre durante una chiamata a OnStart(), ma invece la formazione di nuove barredurante la vita dell'EA.

Non c'è OnStart() negli EA ma ho capito cosa intendevi. Tuttavia, l'OP anche in risposta ai tuoi commenti ha detto e cito:

In realtà ero un po' preoccupato per la "nuova barra", ma come tutti voi dite, mentre l'EA è in esecuzione non ci saranno cambi di turno (e non sto usando la funzione RefreshRates())

Motivazione: