Con cosa sostituire OnTradeTransaction() in mql4? - pagina 4

 

Cattura tutti gli eventi per tick, confrontandoli con i dati registrati in precedenza.

Tutto in array.

In realtà, a volte ci sono dei freni, quando ci sono molti tic. Ecco perché ho fatto un Ritardo tra i controlli di 1 secondo.

Riguarda il monitoraggio di molte posizioni.

E se si monitorano solo le posizioni di un particolare robot, è ovviamente più facile lì.

 

Ho un compito semplice, e non ci sono più di due o tre dozzine di ordini al lavoro.

E quindi userò un timer per controllare cosa c'è in OrdersTotal() e scrivere i volumi nelle nuove e vecchie variabili con sostituzione ad ogni iterazione, e se il volume è cambiato - fare ulteriori passi.

 
Aleksandr Volotko:

Ho un compito semplice, e non ci sono più di due o tre dozzine di ordini al lavoro.

E quindi userò un timer per controllare cosa c'è in OrdersTotal() e scrivere i volumi nelle nuove e vecchie variabili con sostituzione ad ogni iterazione, e se il volume è cambiato - fare ulteriori passi.

Il volume non cambia quando scatta un ordine pendente.

 
Artyom Trishkin:

Il volume non cambierà quando l'ordine pendente scatta.

Bene, filtro gli ordini per tipo nel ciclo e calcolo il volume della posizione cumulativa aperta.

Mi rattrista il fatto di dover sprecare risorse e perdere tempo, quando in MT5 si può semplicemente aspettare un evento specifico senza alcuno stress.

 
Aleksandr Volotko:

Bene, filtro gli ordini per tipo nel ciclo e calcolo il volume della posizione cumulativa aperta.

È triste che tu debba allenarti in questo modo e sprecare risorse, quando in MT5 puoi semplicemente aspettare un evento specifico senza alcuno stress.

Beh, mt5 è un ordine di grandezza superiore a mt4.

Questo vale anche per altre funzioni.

 
Nella mia situazione specifica, con transazioni una volta al giorno, e l'evento una volta al giorno saranno impegnati 60*60*24=86.400 gesti extra. E non c'è ancora un altro modo per farlo.

 
Aleksandr Volotko:
Nella mia situazione specifica, se trattiamo una volta al giorno e abbiamo un evento una volta al giorno, avremo 60*60*24=86.400 sforzi extra. E non c'è ancora un altro modo.

Dipende dal compito.

Se vogliamo catturare l'apertura/chiusura (non parziale) di una posizione e l'impostazione/cancellazione di un ordine, allora non abbiamo bisogno di passare attraverso la lista ogni volta in un ciclo.

Possiamo semplicemente controllare i valori attuali e precedenti di OrdersTotal(). Se rileviamo una differenza, abbiamo un evento, e poi guardiamo il valore.

Ho fatto tutto usando la somma hash delle proprietà ordine e posizione. Non appena è cambiato - abbiamo qualche evento - allora guardiamo cosa esattamente è cambiato lì.

Ma avevo un compito per tracciare tutto, e qualsiasi cambiamento.

 
Aleksandr Volotko:
Nella mia situazione specifica, se i trade vengono eseguiti una volta al giorno e un evento ha luogo una volta al giorno, dovremo fare 60*60*24=86.400 sforzi extra. E non c'è altro modo.

C'è anche questo approccio (se la comparsa di un nuovo ordine è possibile solo dal lato EA):

  1. All'inizio dell'EA, viene generato un array dei suoi ordini bypassando tutti gli ordini della lista.
  2. Ad ogni nuovo tick, la presenza dell'ordine viene controllata usando

if (OrderSelect(nTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)

Se l'ordine è presente, aggiorna i suoi dati se necessario. Questo se il monitoraggio di SL/TP/volume è necessario. Se non è richiesto, non facciamo nient'altro.

Se l'ordine si trova nella lista dei chiusi (OrderCloseTime() > 0), allora cancellalo dall'array. L'array sarà rifornito solo quando l'ordine è aperto da un EA.

Di conseguenza, non dovremo passare attraverso l'intera lista di ordini ad ogni tick. Le operazioni sono possibili solo con il proprio array.

 

Proverò a confrontare i valori di OrdersTotal() per ora (grazie a @Artyom Trishkin), questo dovrebbe essere sufficiente. Non avrò chiusure parziali.

Durante l'inizializzazione, assegnerò il valore -1 al vecchio ordine, in modo che all'inizio venga sempre eseguito il controllo completo, indipendentemente dalla presenza di ordini nel mercato.

Dopo di che, un nuovo ordine apparirà (evento) o il vecchio sarà cancellato (evento) e anche il simbolo non ha importanza - possiamo controllare tutto completamente, è ancora molte volte meno frequente di un continuo agitarsi.

 
Aleksandr Volotko:

Proverò a confrontare i valori di OrdersTotal() per ora (grazie a @Artyom Trishkin), questo dovrebbe essere sufficiente. Non avrò chiusure parziali.

Durante l'inizializzazione, assegnerò il valore -1 al vecchio, in modo che all'inizio venga sempre eseguito il controllo completo, indipendentemente dalla presenza di ordini nel mercato.

Dopo di che, il nuovo ordine apparirà (evento) o il vecchio sarà cancellato (evento) e anche il simbolo non ha importanza - possiamo eseguire un controllo completo su tutti, è ancora molte volte meno frequente del martellamento senza fine.

Ma deve essere gestito con attenzione, oggi ho affrontato che una posizione si è chiusa e l'altra aperta su un'altra, e quasi allo stesso tempo tra i tick.

Alla fine OrdersTotal() è rimasto 8. La logica dell'Expert Advisor si è confusa - non ha ricalcolato i nuovi dati