Errori, bug, domande - pagina 2219

 
fxsaber:


Risultato suForexTimeFXTM-Demo01


Lo script apre e chiude le posizioni finché non rileva un "ordine fantasma" - né tra quelli attuali né nella storia. Devo considerarlo un bug o una caratteristica della piattaforma?


Lo script è scritto in modo tale che diverse posizioni possono aprirsi a causa di questa sfumatura. Ma non impedisce di ottenere un "ordine fantasma".

Non voglio essere nerd, ma le espressioni come queste:

(ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE))

Si possono ricordare a memoria tutti i valori numerici di un dato enum e in che ordine vanno, ma altre persone potrebbero non conoscere queste budella. Non si dovrebbe gestire un enum in questo modo. La brevità è certamente la sorella del talento, ma solo se non danneggia la qualità.

E parlando della questione in discussione, l'order.deal, non il result.order, dovrebbe essere controllato per la posizione da aprire. Di conseguenza, deve essere trovato tra le posizioni, non tra gli ordini. Non è così?

 
Alexey Navoykov:

La brevità è, ovviamente, la sorella del talento, ma non a scapito della qualità.

Sembra essere un'operazione MQL comune.

E parlando della questione in discussione, l'order.deal, non il result.order, dovrebbe essere controllato per la posizione da aprire. Di conseguenza, dovrebbe essere cercato tra le posizioni, non tra gli ordini. Non è così?

L'ordine iniziale che viene inviato subito dopo OrderSend potrebbe non essere trovato da nessuna parte. La posizione è molto più tardiva dell'ordine.


ZZY Nel codice, ho volutamente lasciato il commento con il linguaggio più comprensibile dell'algoritmo di trading - MQL4.

 
fxsaber:

L'ordine originale che viene inviato immediatamente dopo OrderSend potrebbe non essere da nessuna parte. La posizione è molto più tardiva dell'ordine.

Non è il punto, infatti, secondo la documentazione, OrderSend non è obbligato a ricevere alcun biglietto:

Quando si invia un ordine di mercato (MqlTradeRequest.action=TRADE_ACTION_DEAL) il risultato positivo della funzione OrderSend() non significa che l'ordine sia stato eseguito (le operazioni corrispondenti sono state eseguite). In questo caso true significa solo che l'ordine è stato inserito con successo nel sistema di trading per un'ulteriore esecuzione. Il server di trading può riempire i valori dei campidel risultatonellastruttura del risultato restituito, se questi dati gli saranno noti al momento della generazione della chiamata OrderSend(). In generale, l'evento o gli eventi di affari corrispondenti a un ordine possono verificarsi dopo l'invio della risposta alla chiamata OrderSend(). Quindi, per qualsiasi tipo di richiesta di compravendita, quando si riceve il risultato di OrderSend(), bisogna prima controllare il codice di ritorno del server di compravenditaretcode e il codice di risposta del sistema di compravendita esternoretcode_external(se necessario) disponibili nellastruttura delrisultato restituito.

Quindi, non possiamo fare a meno di OnTradeTransaction in ogni caso.

Così, si scopre che non ci sono operazioni commerciali sincrone garantite in MQL5.

 
Alexey Navoykov:

Non ha molta importanza, perché secondo la documentazione, OrderSend non è obbligato a ricevere alcun biglietto:

Quindi OnTradeTransaction deve essere controllato in ogni caso.

Non è necessario controllarlo in ogni caso. È solo opzionale.

Un Result.order non nullo dopo l'OrderSend sincrono ci dice sempre che è stata ricevuta una risposta dal server commerciale con un ordine registrato su di esso. Questo biglietto proviene esattamente dal server. E se OrderSend ha successo, questo biglietto viene sempre ricevuto.

L'inconveniente, tuttavia, sembra accadere non a causa di OrderSend, ma al momento di accettare l'ordine in un trade. Anche se c'èORDER_STATE_REQUEST_ADD per questi casi. Comunque, aspettando una risposta da MQ. Secondo me, questo è un bug quando c'è un ordine sul server commerciale, ma dopo l'OrderSend sincrono sul terminale non se ne parla.

 
fxsaber:

Comunque, in attesa di una risposta da MQ. Secondo me, questo è un bug, quando c'è un ordine sul server commerciale, ma dopo OrderSend sincrono sul terminale non c'è traccia di esso.

Dico di più, dovremmo chiedere agli sviluppatori di garantire la sincronizzazione completa di OrderSend, sia sul terminale che sul server. Altrimenti, se il sincronismo di esecuzione non è garantito, allora perché abbiamo bisogno di questa funzione? Per questo scopo c'è già OrderSendAsync.

 
Dmitriy:

Salve. Oggi ho aggiornato alla versione 1860 e durante l'ottimizzazione dell'Expert Advisor ho riscontrato questo problema:

Il ritardo tra i passaggi è di 1 minuto! Potete per favore consigliarmi quale può essere il problema?

p.s. Prima dell'aggiornamento tutto funzionava alla perfezione.

Stai usando la funzione Bars, per caso?
Se è così, vedi questo.

 

Solo una domanda:

Forse ha senso fare dei file comuni? L'unica cosa che mi dà fastidio è la costante rinominazione di mq4 e mq5. In relazione ai progetti, stavo pensando, forse dovrei fare un'estensione comune come mq ?

E si può semplicemente copiare il codice da terminale a terminale senza alcuna modifica nelle estensioni...

 
Vladimir Pastushak:

Solo una domanda:

Forse ha senso fare dei file comuni? L'unica cosa che mi dà fastidio è la costante rinominazione di mq4 e mq5. In relazione ai progetti, stavo pensando, forse dovrei fare un'estensione comune come mq ?

E si può semplicemente copiare il codice da terminale a terminale senza alcuna modifica nelle estensioni...

E chi vieta di scrivere questi codici nei file mqh e di collegarli usando (#include). Questo è quello che ho fatto per un bel po' di tempo.

 
Konstantin Nikitin:

E chi vieta di scrivere questi codici nei file mqh e di collegarli con (#include). Cosa che ho fatto per un bel po' di tempo.

si collega, cambio le estensioni ... vicini.

 
Alexey Navoykov:

Dirò di più, dovremmo chiedere agli sviluppatori di garantire che OrderSend sia completamente sincrono, sia sul terminale che sul server. Altrimenti, se l'esecuzione sincrona non è garantita, perché abbiamo bisogno di questa funzione? C'è già OrderSendAsync per questo scopo.

Fatemi capire bene. Sincronizzazione dell'invio dell'ORDINE al sistema di trading della piattaforma e al terminale stesso.