Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1740

 
Maxim Kuznetsov #:

non dire alla gente cosa fare.

Devi ricordare i tuoi dati e lavorare con essi

Maxim, in questa situazione, non hai bisogno di ricordare nulla. È molto più sicuro guardare solo la posizione chiusa precedente.

Non c'è bisogno di fare nulla per ricordare i dati e ripristinarli dopo una situazione anomala. Se il terminale viene chiuso, i dati di posizione andranno persi. Di conseguenza, quando li memorizzate, dovreste considerare immediatamente la possibilità di un loro ripristino rapido ed efficace.

(Memorizzare un ordine nei commenti non sarebbe una soluzione affidabile - significa affidarsi alla volontà del broker/dealer).

E la cosa interessante è che leggerà comunque questi dati da qualche parte. Quindi non sarebbe più facile leggerlo direttamente dalla fonte?

 
Sergey Zhukov #:

come posso forzare il compilatore a compilare per MT4 e non per MT5?

#ifdef __MQL4__

#else

#endif
 
Artyom Trishkin #:

Maxim, in questa situazione, non hai bisogno di memorizzare nulla da nessuna parte. È molto più sicuro guardare solo la posizione chiusa passata.

Non dovete fare nulla per ricordare i dati e poi ripristinarli dopo un'emergenza. Se il terminale viene chiuso, i dati di posizione andranno persi. Di conseguenza, quando li memorizzate, dovreste considerare immediatamente la possibilità di un loro ripristino rapido ed efficace.

(Memorizzare un ordine nei commenti non sarebbe una soluzione affidabile - significherebbe affidarsi alla volontà del broker/dealer).

E la cosa interessante è che leggerà comunque questi dati da qualche parte. Quindi non sarebbe più facile leggerlo direttamente dalla fonte?

e poi segue "perché OnTimer non entra in un paio di secondi o OnTick manca selvaggiamente" :-)

Ripristinare lo stato una volta all'inizializzazione (o leggendo da un file o dalla cronologia/ambiente di navigazione) e questo è tutto... L'ultimo ordine insieme alle sue caratteristiche è memorizzato in una variabile ed è sempre noto

 
Maxim Kuznetsov #:

e poi segue il tema "perché OnTimer non entra in un paio di secondi o OnTick manca selvaggiamente" :-)

Quando si inizializza, si ripristina lo stato una volta (o leggendo da un file o guardando nella storia/ambiente) e questo è tutto... L'ultimo ordine insieme alle sue caratteristiche è memorizzato in una variabile ed è sempre noto

Per sapere come è stata chiusa l'ultima posizione, è necessario trovarla. Dopo tutto, mentre è aperto, non c'è modo di registrare e ricordare come è stato chiuso, perché è ancora aperto.

È possibile memorizzare un biglietto dell'ultima posizione aperta e usarlo per determinare come è stata chiusa, ma ... Quando si manipola con una posizione, mentre è aperta, il suo biglietto può cambiare. Di conseguenza, dobbiamo implementare una funzionalità per riscrivere il biglietto modificato. Tutto questo complica il codice.

Ho solo suggerito di cercare l'ultima posizione chiusa. E combina la ricerca di tutte le posizioni quando si riavvia l'EA e legge i dati di una sola posizione quando si chiude una nuova.

Dopo tutto, spero che tutti capiscano che non abbiamo bisogno di ripercorrere tutte le posizioni storiche, ma solo l'ultima. Cioè, ricordiamo solo una variabile dell'indice del ciclo - il suo valore attuale, e iniziamo un nuovo ciclo (quando il numero di ordini storici aumenta) dal valore di questa variabile, non da zero. E il valore di questa variabile è scritto in OnInit() all'inizio e al riavvio dell'Expert Advisor, così come alla chiusura di una nuova posizione. Cioè, in questo modo si evita la necessità di scrivere e leggere i dati di posizione e di lavorare con l'unità.

Penso che questo approccio sia il più redditizio, perché

1. Dovete solo ricordare il valore dell'indice del ciclo
2. Ottenere i dati solo al momento necessario utilizzando un accesso diretto a un ordine chiuso utilizzando il suo indice
3. Non è necessario creare una funzione di lettura/scrittura
4. È più veloce sia da lavorare che da scrivere.

E, sì, sono d'accordo che bisogna conoscere tutti i dati - io stesso lo faccio. Ma è auspicabile conoscerli a beneficio del programma e di se stessi.

 
Ivan Butko #:

Grazie per le informazioni!

Se hai tempo, per favore rispondi come risolvere:

Su una storia di N candele fa sono impostati due obiettivi diversamente diretti: Close[N]+50*Point e Close[N]-50*Point.
Poi c'è la condizione che il prezzo debba raggiungere uno dei target (se (High[i]> Close[N]+50*Point) o (se (Low[i]<Close[N]-50*Point)
Quando la condizione è soddisfatta, la distanza da Close[N] a High[i] è scritta nell'array x[high]=High[i].
Poi viene gettato a caso su uno qualsiasi dei grafici in qualsiasi momento.

E quando si controlla tramite Print(x[high]), 1-2 valori su dieci mostrano meno di 50! Uno ne ha 12, l'altro 49. Anche se è rigorosamente indicato+50*Point. 8-9 sono corretti (più di 50) e 1-2 sono anormali. Non è attraverso il tester, ma con un grafico reale piazzo un Expert Advisor (senza funzioni di trading), ma con i suddetti funziona con la storia e mostra risultati errati.

Più grande è il valore, meno si verificano questi errori. Ho pensato che potrebbe essere la diffusione che interferisce, ma... Non credo che ci sia uno spread sulla storia in MT4

Risolto.

 
Devo aggiungere RefreshRates() a OnTimer(), o il timer si aggiorna da solo per default?
 
Ivan Butko #:
Devo aggiungere RefreshRates() a OnTimer(), o il timer si aggiorna da solo per default?
Non lo fa
 
Aliaksandr Hryshyn #:
Non si aggiorna

Grazie

 
Artyom Trishkin #:

Per scoprire come è stata chiusa l'ultima posizione, bisogna trovarla. Finché è aperto, non c'è modo di registrare e ricordare come è stato chiuso - è ancora aperto.

È possibile memorizzare un biglietto dell'ultima posizione aperta e usarlo per determinare come si è chiusa, ma ... Quando si manipola con una posizione, mentre è aperta, il suo biglietto può cambiare. Di conseguenza, dobbiamo implementare una funzionalità per riscrivere il biglietto modificato. Tutto questo complica il codice.

Ho solo suggerito di cercare l'ultima posizione chiusa. E combina la ricerca di tutte le posizioni quando si riavvia l'EA e legge i dati di una sola posizione quando si chiude una nuova.

Dopo tutto, spero che tutti capiscano che non abbiamo bisogno di ripercorrere tutte le posizioni storiche, ma solo l'ultima. Cioè, ricordiamo solo una variabile dell'indice del ciclo - il suo valore attuale, e iniziamo un nuovo ciclo (quando il numero di ordini storici aumenta) dal valore di questa variabile, non da zero. E il valore di questa variabile è scritto in OnInit() all'inizio e al riavvio dell'Expert Advisor, così come quando si chiude una nuova posizione. Cioè, in questo modo si evita la necessità di scrivere e leggere i dati di posizione e di lavorare con l'unità.

Penso che questo approccio sia il più redditizio, perché

1. Dovete solo ricordare il valore dell'indice del ciclo
2. Ottenere i dati solo al momento necessario utilizzando un accesso diretto a un ordine chiuso utilizzando il suo indice
3. Non è necessario creare una funzione di lettura/scrittura
4. È più veloce sia da lavorare che da scrivere.

E, sì, sono d'accordo che bisogna conoscere tutti i dati - io stesso lo faccio. Ma conoscerli è auspicabile per il beneficio del programma e per voi stessi.

Non ho notato che il biglietto di una posizione cambia, mentre è aperta. Di solito è uguale al biglietto del primo ordine, che ha aperto questa posizione.

Ultimo chiuso - cosa succede se c'è più di un EA che fa trading sul simbolo, più il trading manuale?
 
JRandomTrader #:

Non ho notato che il biglietto di una posizione cambia mentre è aperta. Di solito è lo stesso del biglietto del primo ordine che ha aperto la posizione.

Ultimo chiuso - ma cosa succede se c'è più di un EA che fa trading sul simbolo, più il trading manuale?

Un riempimento o una chiusura parziale, e il biglietto è diverso. Dobbiamo determinare quale biglietto ha avuto origine da quale, e riscrivere quello ricordato. Tuttavia, non è chiaro di quale piattaforma stiamo parlando - entrambe sono leggermente diverse, ma è comunque necessario tenere traccia.

Si intende "l'ultimo chiuso appartenente a questo EA".

Motivazione: