Il mio EA fa una doppia entrata - pagina 10

 
angevoyageur: Non sono sicuro di capire cosa intendi. Il problema di cui stiamo parlando in questo topic non è causato da una cattiva codifica ma da una cattiva progettazione in mql5 (è la mia opinione, o forse è semplicemente un bug?). Cosa intendi per "multiple trading thread"?

Sono tornato indietro e ho riletto quello che tu consideri un cattivo design.

Nel vecchio Mt4 queste classi non esistono. Il metodo normale di controllo di Successful_Orders all'interno è Ticket#==(-1) && GetLastError(). Non ho mai visto un caso in cui il tuo ordine restituisce un ticket# valido e GLE=0. Ma al tick successivo, la tua OrdersTotal() restituisce ancora 0.

Ora tieni presente che non ho esaminato tutta la documentazione di mql5. Tuttavia, se si dice che PositionSelect_Information non viene aggiornato fino a dopo. E qualcuno sta usando PositionSelect per valutare la sua logica di ingresso. Allora quella persona deve aspettare che PositionSelect_Information sia aggiornato prima di uscire dalla logica di OrderSend.

Per la cosa del thread... Stavo parlando di thread multipli vs singolo battistrada per l'invio di ordini. Come in ordini simultanei che si aprono allo stesso tempo. Può essere o non essere rilevante qui.

 
Ubzen:

Sono tornato indietro e ho riletto quello che tu consideri un cattivo design.

In old-mt4 queste classi non esistono. Il normale metodo di controllo di Successful_Orders all'interno è Ticket#==(-1) && GetLastError(). Non ho mai visto un caso in cui il tuo ordine restituisce un ticket# valido e GLE=0. Ma al tick successivo, la tua OrdersTotal() restituisce ancora 0.

Ora tieni presente che non ho letto tutta la documentazione di mql5. Tuttavia, se si dice che PositionSelect_Information non viene aggiornato fino a dopo. E qualcuno sta usando PositionSelect per valutare la sua logica di ingresso. Allora quella persona deve aspettare che PositionSelect_Information sia aggiornato prima di uscire dalla logica di OrderSend.

Per la cosa del thread... Stavo parlando di thread multipli vs singolo battuto per l'invio di ordini. Come in ordini simultanei che si aprono allo stesso tempo. Può essere o non essere rilevante qui.

La documentazione su PositionSelect non dice nulla su "non viene aggiornato fino a dopo". Dice solo che anche se PositionSelect è vero, le informazioni su una posizione possono essere obsolete, il che non è collegato al tuo problema qui.

Miprenderò il tempo di fare alcuni test quando il mercato è aperto per essere sicuro di non dire nulla di stupido, risposta più completa più tardi.

 
angevoyageur:

La documentazione su PositionSelect non dice nulla su "non viene aggiornato fino a dopo". Dice solo che anche se PositionSelect è vero, le informazioni su una posizione possono essere obsolete, il che non è collegato al tuo problema.

Miprenderò il tempo di fare alcuni test quando il mercato è aperto per essere sicuro di non dire nulla di stupido, risposta più completa più tardi.

K..... e btw, se il documento non dice nulla allora sono totalmente d'accordo con te.

La domanda che faremo al Service_Desk alla fine è "perché non si può aggiornare la Position_Information quando trade.PositionOpen()==true?

Probabilmente avranno una buona risposta per noi .

 
angevoyageur:

No. Stavo solo pensando a questo... Sarebbe probabilmente utile se tutte le persone interessate scrivessero un ticket al ServiceDesk su questo problema. Tuttavia sono molto scettico se MQ è disposto a cambiare questo design. Ma possiamo provare.

Le persone possono scrivere al ServiceDesk e riportare il numero del ticket qui. Il mio è

Errori, MetaTrader 5 MQL, Aprire, Avviare: 2013.12.23 19:08, #916435


Ho anche informato il service desk, #933192 | 2014.01.19 14:44

 

MQ in realtà può facilmente riprogettare questo per avere una funzione di timeout?

Come nessuna risposta allora otterremo un errore, qualcosa del genere?

 
doshur:

MQ in realtà può facilmente riprogettare questo per avere una funzione di timeout?

Come nessuna risposta allora otterremo un errore, qualcosa del genere?


Hanno fatto esattamente l'inverso. Quando mql5 è stato creato c'era un parametro di timeout per funzioni come PositionSelect.

Ma lo hanno rimosso dopo, vedi punto 9 qui https://www.mql5.com/en/forum/53/page5#comment_14479

 

Sono d'accordo con gli argomenti di un cattivo design, ma secondo me il problema principale con MQL5 è stato quello di adattare un codice di successo basato sul Forex per lavorare come tale con i mercati azionari (che è davvero una grande cosa).

Per esempio, molti mercati azionari usano il protocollo FIX come standard, e per me questo protocollo di comunicazione non è facile da adattare a qualsiasi codice o architettura.

Comunque, credo che i ragazzi di MQ abbiano avuto una sfida temporale, e hanno dovuto creare MQL5 basato su MQL4, e non da zero. Ricordo che il campionato in quell'anno è stato sospeso per avere più tempo.

Quindi, forse questo argomento può essere un grande consiglio per il futuro MQL6 e per un'architettura davvero nuova da zero, soprattutto per quanto riguarda la resilienza delle transazioni e le soluzioni agnostiche per lavorare in qualsiasi mercato.

 
doshur:

MQ in realtà può facilmente riprogettare questo per avere una funzione di timeout?

Come nessuna risposta allora avremo un errore, qualcosa del genere?

Tradizionalmente, TimeOut non significa che l'ordine non diventerà una posizione. Dovrete aspettare per un lungo periodo di tempo... controllando se diventa una posizione... e finendo per sospendere il trading se l'ordine non viene eseguito.

Penso che MQ sarebbe d'accordo con figurelli sul fatto che questo sia un errore del programmatore. Perché le funzioni su cui si basa trade.PositionOpen dicono chiaramente che è necessario controllare altre cose.


****** (Aggiungendo l'Agenda personale... potete smettere di leggere a questo punto) *******

Questa è la ragione per la quale non do la caccia ai nuovi programmatori sulle funzioni e i loro valori di ritorno quando li aiuto su mql_forum. Non vedo il motivo di dire di fare sempre quanto segue.

if( OrderSend()<0 ) { Print( GetLastError() ); }

Questo dovrebbe essere un trader automatico ... potresti essere assente ... e quello che fa è Print()?

Nella mia mente, Error_Handling e Error_Reporting sono 2 mostri molto diversi. Cercare di spiegare i modi corretti di gestire un errore potrebbe richiedere pagine ed è molto personale per il trader quante volte dovrebbe riprovare o addirittura se dovrebbe terminare il trading.

**** Ora non sto dicendo che se un principiante sta codificando un EA e ha problemi di trading ... Che non dovrebbe stampare ( GetLastError(); ) <- Questo dovrebbe essere ovvio. Ma se devo dire loro di fare sempre Get_Error, allora dovrei anche dire loro di fare sempre Handle_Error. *** Fine dell'ordine del giorno. ****

 
angevoyageur:


Hanno fatto esattamente l'inverso. Quando mql5 è stato creato c'era un parametro di timeout per funzioni come PositionSelect.

Ma lo hanno rimosso dopo, vedi punto 9 qui https://www.mql5.com/en/forum/53/page5#comment_14479

È ora di farlo rivivere?
 
doshur:
È il momento di rivitalizzarla?

Non credo. Una richiesta di trading sincrono deve essere sincrona in tutti gli aspetti. È così semplice.

Qui la richiesta è sincrona ma poi bisogna gestire cose asincrone. E nulla è documentato su questo.