
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Per favore usa il pulsante </> per inserire il tuo codice.
Le mie scuse... Eccolo in formato corretto.
OrdersTotal() non corretto...
Sono stato sorpreso da una sequenza di codice in loop che usa OrdersTotal() che non dà risultati corretti (osservato con due diversi broker).
Sto usando MT4 versione 1090 su un desktop Linux Ubuntu-MATE 16.04, con WINE 3.0
Ecco cosa ho usato...
Ecco come stanno le cose:
Ho notato con due diversi broker che il valore di OrdersTotal() non sempre concorda con quello che viene mostrato nella scheda 'Trade' del broker MT4. Inizialmente, ho pensato che fosse il broker a causare il non corretto funzionamento di OrdersTotal(). Quando l'ho notato sul secondo broker, ho iniziato a chiedermi se MT4 avesse un 'problema' interno, o se il mio codice fosse sbagliato O se questo fosse un problema con MT4 che si sincronizza correttamente con il server....?
Dopo aver letto questo thread del forum, mi chiedo se avrei risultati migliori modificando il ciclo for:
O, c'è un flag o una linea di codice che assicura che OrdersTotal() sia correttamente sincronizzato durante un evento OnTick()?Qualsiasi chiarimento su questo sarebbe molto utile e sarebbe molto apprezzato!
Questo è uno degli errori più comuni che vedo, probabilmente dovuto in parte a spazzatura come Expert Advisor Builder. Così ho pensato che fosse il momento di un thread dedicato all'argomento in modo che possa essere collegato per riferimenti futuri.
Il problema
Facciamo un semplice esempio; vogliamo una funzione per chiudere tutti gli ordini aperti per il nostro EA, ci sono molti esempi ma creiamone uno da zero.
Abbiamo bisogno di un ciclo perché vogliamo chiudere tutti i nostri ordini per uno specifico EA, all'interno di questo ciclo avremo del codice per selezionare l'ordine, il codice per controllare che sia il simbolo e il numero magico corretti e infine il codice per chiudere l'ordine:
Questo codice è cattivo . . . NON USATELO. . . Spiegherò perché nella prossima sezione . . .
La spiegazione
Lavoriamo attraverso il codice di cui sopra . . . linea per linea, ordine per ordine . . .
Supponiamo di avere i seguenti ordini che vogliamo chiudere, tutti hanno lo stesso numero magico e simbolo del nostro EA, quindi vogliamo che il nostro codice li chiuda tutti:
1a esecuzione del ciclo:
il valore iniziale di PositionIndex è 0 quindi viene selezionato l'ordine alla posizione 0, il biglietto numero 111, questo ordine viene cancellato con successo e gli ordini rimanenti cambiano posizione come segue:
2a esecuzione del ciclo:
ora il valore di PositionIndex è 1 quindi viene selezionato l'ordine in posizione 1, il ticket numero 333, questo ordine viene cancellato con successo e i restanti ordini cambiano posizione come segue:
3a esecuzione del ciclo:
ora il valore di PositionIndex è 2 quindi viene selezionato l'ordine in posizione 2, il biglietto numero 555, questo ordine viene cancellato con successo e gli ordini rimanenti cambiano posizione come segue:
4a esecuzione del ciclo:
ora il valore di PositionIndex è 3 OrderSelect() cerca di selezionare l'ordine alla posizione 3 e fallisce, il continue porta l'esecuzione del codice al valore successivo nel ciclo .
5° e ultima esecuzione del ciclo:
ora il valore diPositionIndex è 4 OrderSelect() cerca di selezionare l'ordine alla posizione 4 e fallisce, il continue porta l'esecuzione del codice al prossimo valore nel ciclo . . . il ciclo è finito.
Ora siamo rimasti con 2 ordini, i biglietti 222 e 444 che avrebbero dovuto essere chiusi ma non lo sono stati . . . poi, come risolvere questo problema.
La soluzione
Il codice seguente è l'approccio corretto quando si chiudono gli ordini aperti o si cancellano gli ordini in sospeso. . .
La differenza chiave è che il ciclo decrementa da ( TotalNumberOfOrders - 1 ) a 0
Ancora una volta lavoriamo attraverso il codice di cui sopra ... linea per linea, ordine per ordine ...
Abbiamo gli stessi ordini di prima:
1a esecuzione del ciclo:
il valore iniziale di PositionIndex è TotalNumberOfOrders - 1 che è uguale a 5 - 1 = 4, quindi viene selezionato l'ordine in posizione 4, numero di ticket 555, questo ordine viene cancellato con successo e gli ordini rimanenti cambiano posizione come segue:
2a esecuzione del ciclo:
ora il valore di PositionIndex è 3 quindi viene selezionato l'ordine in posizione 3, il biglietto numero 444, questo ordine viene cancellato con successo e gli ordini rimanenti cambiano posizione come segue:
3a esecuzione del ciclo:
ora il valore di PositionIndex è 2 quindi viene selezionato l'ordine in posizione 2, il biglietto numero 333, questo ordine viene cancellato con successo e i restanti ordini cambiano posizione come segue:
4a esecuzione del ciclo:
ora il valore di PositionIndex è 1 quindi viene selezionato l'ordine in posizione 1, il biglietto numero 222, questo ordine viene cancellato con successo e i restanti ordini cambiano posizione come segue:
5° e ultimo giro del ciclo:
ora il valore di PositionIndex è 0 quindi viene selezionato l'ordine in posizione 0, biglietto numero 111, questo ordine viene cancellato con successo, il valore 0 è l'ultimo valore valido per il ciclo . . . il ciclo è finito .
Abbiamo cancellato con successo tutti i nostri ordini corrispondenti . . .
Link a questo thread: Loop e chiusura o cancellazione di ordini
Holetto questo thread sulla selezione degli ordini. In effetti, ho un codice in cui credo di aver fatto le cose per bene ma la selezione non mi funziona perché non riesco a leggere l'OpenPrice dell'ordine selezionato. Tutto il resto funziona bene, solo quella parte del codice fornito. Non sono sicuro del perché.
L'intero codice ha 4 sezioni in cui devo chiamare l'OrderOpenPrice subito dopo l'invio dell'ordine... OrderSend funziona bene, OrderSelect non mi dà i risultati di cui ho bisogno. Fate riferimento a 1 sezione del codice se potete aiutarmi.
Grazie.
Grazie caroSimon Gniadkowski,
Il tuo post mi ha davvero salvato il tempo.
Questo è il codice che suggerisco per chiudere gli ordini a mercato
E suggerisco che questo è il modo corretto se si usa un ciclo forward for (per rispettare le regole FIFO dei broker statunitensi)
Nel ciclo forward for,
Loop e chiusura o cancellazione di ordini - Forum di programmazione MQL4
Per il FIFO (broker USA),e si elaborano (potenzialmente) più ordini per simbolo, è necessario trovare l'ordine più vecchio, chiuderlo e, se l'operazione ha successo, rielaborare tutte le posizioni rimanenti.
Chiudere gli ordini con regole FIFO - Strategy Tester - Forum di programmazione MQL4 - Pagina 2 #16
Cosa sono i valori di ritorno delle funzioni ? Come posso usarli ? - Forum di programmazione MQL4
Errori comuni nei programmi MQL4 e come evitarli - Articoli MQL4
Saprete quanto questo mi ha aiutato. Non solo con il codice su cui stavo lavorando, ma con la mia comprensione. Ora funziona perfettamente e ho la comprensione per implementarlo in modi diversi.
Apprezzo davvero molto queste informazioni.