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

 
TYRBO:
problema risolto confrontando i prezzi
Nel tester? In un mercato reale su un conto a spread fluttuante, il prezzo di pareggio cambierà dopo un tick
 
Artyom Trishkin:

In questo contesto, il mio punto è questo:

  1. Dobbiamo ottenere il minor numero possibile di cicli per tick.
  2. Abbiamo bisogno di avere un array costante con i dati degli ordini e delle posizioni a mercato e un array con i dati degli ordini e delle posizioni cancellate/chiuse
  3. Se abbiamo l'array localmente in una funzione, chiamarlo ripetutamente richiede di riempirlo di nuovo. Suggerisco che sia riempito solo una volta ad un nuovo tick - così l'array è globale, altrimenti lo perderemmo quando si esce dalla funzione.
  4. Per trovare qualcosa in esso (nell'array), abbiamo bisogno di un array pieno e di funzioni che restituiscano i dati trovati. All'interno delle funzioni, possiamo dichiarare array ausiliari per i calcoli necessari.

Per questo motivo, sarebbe meglio avere degli array globali - per gli ordini e le posizioni chiuse e aperte. Una volta su un nuovo tick, passiamo la quantità necessaria di ordini/posizioni una volta, riempiendo i due array con essi. E poi riceviamo da loro tutti i dati necessari nello stesso tick. Si noti che non solo l'ultimo ordine/posizione chiuso/aperto e tutti i suoi dati sono calcolati, ma anche tutti i tick genitori e figli di tutte le posizioni sono cercati in caso di chiusura parziale. Di conseguenza, in qualsiasi momento posso vedere quale biglietto ha avuto origine da una o un'altra posizione, se è stato chiuso parzialmente più di una volta - tutto questo funziona già in una classe che gira in un timer. Ho molti altri dati di cui ho bisogno con un piccolo numero totale di cicli. La profondità di storia necessaria per gli array è impostata per il tester.

E così via...

Mi dispiace. Un'altra aggiunta (non per controbilanciare, ma come aggiunta), vorrei aggiungere che gli array locali constatic non sono persi. Cioè, se le condizioni vi permettono di farlo senza dichiararle globalmente.

 
P./S.: Sto completando questo, naturalmente, in base al mio interesse "acquisito")). Perché posso applicare la statica locale in casi ammissibili.
 
Vitaly Muzichenko:

Ora lo sto lentamente riscrivendo per 5. Voglio dire che il prezzo può cambiare molto rapidamente e il livello può essere inferiore al valore dello stop-loss, il che porterà ad un errore. Voglio dire che il prezzo può cambiare molto rapidamente e il livello sarà inferiore al livello di stop consentito, il che porterà ad un errore.

Ho capito che questa cosa"SymbolInfoTick" è necessaria per ottenere il prezzo corrente?

Quindi, per ottenere gli attuali Ask e Bid in mql4, il refresh avrebbe dovuto essere chiamato comunque. E si scopre che è improbabile che il carico cambi rispetto alla chiamata di SymbolInfoTick().

Ma ecco un'altra aggiunta: scrivo SymbolInfoTick() nel seguente ciclo per ottenere prezzi accurati

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Se otteniamo prezzi normali dalla prima volta, questo ciclo non aumenterà il tempo di esecuzione. E se c'è qualche fallimento, è meglio ripetere che ottenere lo stesso prezzo al posto di quello attuale.

 
Alexey Viktorov:

Quindi, per ottenere gli effettivi Ask e Bid in mql4, devi comunque chiamare refresh. E si scopre che è improbabile che il carico cambi rispetto alla chiamata di SymbolInfoTick().

Ma ecco un'altra aggiunta: per ottenere senza errori i prezzi reali, ho messo SymbolInfoTick() in questo ciclo

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Se otteniamo prezzi normali dalla prima volta, questo ciclo non aumenterà il tempo di esecuzione. E se c'è qualche fallimento, è meglio ripetere che ottenere lo stesso prezzo al posto di quello attuale.

Capisco, dove dovremmo metterlo, dentro o prima del ciclo?
 
Vitaly Muzichenko:
Capisco, ma dove dovrei metterlo, dentro il ciclo o prima?
Beh, è un ciclo separato finché non avremo i prezzi attuali. Abbiamo già discusso dove metterlo. Se c'è un'imboscata con prezzi non reali, dovremmo impostarla nel ciclo di valutazione degli ordini.
 
Alexey Viktorov:

Quindi, per ottenere gli effettivi Ask e Bid in mql4, devi comunque chiamare refresh. E si scopre che è improbabile che il carico cambi rispetto alla chiamata di SymbolInfoTick().

Ma ecco un'altra aggiunta: per ottenere senza errori i prezzi reali, ho messo SymbolInfoTick() in questo ciclo

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Se otteniamo prezzi normali dalla prima volta, questo ciclo non aumenterà il tempo di esecuzione. E se c'è qualche fallimento, è meglio ripetere che ottenere lo stesso prezzo al posto di quello attuale.

E se non li ricevete affatto? Come si fa a rallentare il ciclo?
 
Artyom Trishkin:
E se non riceve affatto? Come si fa a rallentare il ciclo?

Sì, logicamente potrebbe essere, per esempio, il terminale ha perso la connessione - ci sono molte ragioni per questo, l'ho avuto 50 volte al giorno.

Qual è il modo migliore per ottenere prezzi aggiornati, pur essendo meno dispendioso in termini di risorse, si badi bene - per la rete a strascico.

 
Vitaly Muzichenko:

Sì, logicamente potrebbe essere, per esempio, il terminale ha perso la connessione - ci sono molte ragioni per questo, l'ho avuto 50 volte al giorno.

Qual è il modo migliore per ottenere prezzi aggiornati, pur essendo meno dispendioso in termini di risorse, ricorda - per la rete a strascico.

controlla indietro di 10 pagine, c'è un buon schema lì
 
trader781:
Controlla indietro di 10 pagine, c'è uno schema abbastanza buono lì.
Non l'ho trovato e non lo ricordo qui.