Come lavorare correttamente in MT5 con OrderSend - pagina 10

 
prostotrader:

Usalo.

Questo è un buon esempio. Ma ho una domanda. Cosa succede se OnTradeTransaction() non restituisce i dati sull'elaborazione dell'ordine? Beh, potrebbero essersi persi in qualche modo. Il server l'ha inviato ma il terminale non l'ha ricevuto. Quanto è garantito che otterrò il numero richiesto di chiamate alla funzione OnTradeTransaction() per il 100% degli ordini inviati e tutti i rapporti di transazione raggiungeranno il terminale (sono interessato a transaction.type = TRADE_TRANSACTION_REQUEST principalmente).

Perché se non ricevo questa risposta (a causa di un'interruzione di connessione, per esempio) non cancellerò la bandiera e tutto resterà in piedi.

 
fxsaber:

Non ho controllato, ma forse dopo OrderSend TUTTI gli EA ricevono l'evento corrispondente per OnTradeTransaction.

Allora tutto è risolto senza stampelle e per più EAs sullo stesso simbolo.

Controllato! È così che stanno le cose!
 
Oleg Shenker:

Questo è un buon esempio. Ma ecco una domanda che mi assilla. Cosa succede se OnTradeTransaction() non restituisce i dati dell'elaborazione dell'ordine? Beh, potrebbero essersi persi in qualche modo. Il server l'ha inviato ma il terminale non l'ha ricevuto. Quanto è garantito che otterrò il numero richiesto di chiamate alla funzione OnTradeTransaction() per il 100% degli ordini inviati e tutti i rapporti di transazione raggiungeranno il terminale (sono interessato a transaction.type = TRADE_TRANSACTION_REQUEST principalmente).

Perché se non ricevo questa risposta (a causa di un'interruzione della connessione, per esempio) non rimuoverò la bandiera e tutto resterà in piedi.

Ho avuto diverse volte che l'evento OnTradeTransaction non si è verificato,

Quindi ho scritto una funzione che controlla lo stato degli ordini usando un timer con un periodo di 0,5 secondi.

L'implementazione complica il codice generale dell'Expert Advisor, ma non c'è garanzia al 100% quando si lavora su Internet,

che tutto funzionerà come un orologio.

Aggiunto da

Ho avuto l'idea di controllare qui

https://www.mql5.com/ru/blogs/post/557544

Отслеживание ордера, после команды OrderSendAsync
Отслеживание ордера, после команды OrderSendAsync
  • 2015.04.29
  • Mikhail Filimonov
  • www.mql5.com
Отслеживание ордера, после команды OrderSendAsyncМихаил | 23 апреля, 2015В статье рассказывается принцип отслеживания ордера после команды OrderSendAsync, если нет события TradeTransaction...
 
prostotrader:

Ho avuto diverse volte che l'evento OnTradeTransaction non si è verificato,

Pertanto, ho scritto una funzione che controlla lo stato degli ordini utilizzando un timer con un periodo di 0,5 secondi.

L'implementazione complica il codice generale dell'Expert Advisor, ma non c'è garanzia al 100% quando si lavora su Internet,

che tutto funzionerà come un orologio.

Aggiunto da

Ho avuto l'idea di controllare qui

https://www.mql5.com/ru/blogs/post/557544

Mi sembra che il tizio stia cercando di sfondare una porta aperta creando dei codici magici speciali per ogni transazione. C'è un order_id con cui un ordine può essere identificato in modo univoco.

O mi sfugge il punto?

 
Oleg Shenker:

Mi sembra che il tipo stia sfondando una porta aperta creando codici magici speciali per ogni commercio. C'è un order_id che può essere usato per identificare univocamente l'ordine.

O mi sfugge il punto?

Sì, c'è un order_id, ma purtroppo a volte gli eventi non arrivano a OnTradeTransaction

(L'ho avuto diverse volte personalmente).

E poi dove "mettere" l'order_id?

Aggiunto da

Qui, c'è stato un ritardo nella risposta del server oggi

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...
 
prostotrader:

Sì, c'è un order_id, ma purtroppo a volte gli eventi non arrivano in OnTradeTransaction

(L'ho avuto alcune volte personalmente).

Dove "infilare" l'order_id allora?

Aggiunto da

Qui, c'è stato un ritardo nella risposta del server oggi

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...

L'altro giorno ho avuto un altro "deflettore".

2016.12.23 15:04:02.865 TriArbTrader_8-4 (EURGBP,H1)    1111 DealSell           3 orders are sent.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Retcode = 10009. Slippage = 1631.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Position is closed in 59699 mksec.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Retcode = 10009. Slippage = 1631.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Position is closed in 59712 mksec.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction GBPUSD Retcode = 10009. Slippage = 1379.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction GBPUSD Position is closed in 127691 mksec.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction All reposts are checked. Direction = 0
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction Unexpected transaction request.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURGBP Retcode = 10009. Slippage = -40993.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURGBP Position is closed in 1339448077 mksec.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction All reposts are checked. Direction = -1

Sono stati inviati tre ordini, e c'è una chiara registrazione nel registro. Dopo di che, la funzione OnTradeTransactions() TRADE_TRANSACTION_TYPE è stata chiamata quattro volte.

Il codice della funzione inizia con dei controlli:

void OnTradeTransaction(const MqlTradeTransaction& transaction,
                        const MqlTradeRequest&     request,
                        const MqlTradeResult&      results)
   {
    if(transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL)
      {
       if(request.magic == ExpertMagic)
         {

Cioè, solo TRADE_TRANSACTION_REQUIEST con il suo timbro di esperto può entrare, dove stanno le stampanti...

L'helpdesk ha iniziato a convincermi che ho due EA identici in piedi (ovviamente sullo stesso grafico, a giudicare dal log). E poi hanno detto: "sei un pazzo, correggi gli errori nel codice".

In breve, secondo loro non può essere. Ma il registro mostra chiaramente che l'evento è arrivato quattro volte.

 
prostotrader:

Sì, c'è un order_id, ma purtroppo a volte gli eventi non arrivano in OnTradeTransaction

(L'ho avuto alcune volte personalmente).

Dove "infilare" l'order_id allora?

Aggiunto da

Ecco, oggi ho avuto un ritardo di risposta del server.

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...

Ma comunque, ancora non capisco perché non possiamo cercare un ordine per ticker? È molto facile controllare quali degli ordini che abbiamo inviato non sono arrivati a TradeTransaction. E poi basta guardare lo stato dell'ordine con questo biglietto nella storia.

Anche se la cronologia degli ordini mostra solo gli ordini con lo stato FILLED.

 
Oleg Shenker:

E ancora non è chiaro perché l'ordine non può essere cercato per ticker? Dopo tutto, è facile controllare quale ordine non è arrivato a TradeTransaction. E poi basta guardare lo stato dell'ordine con questo ticker nella storia.

Anche se, quando l'ho provato personalmente, nella cronologia degli ordini, c'erano solo ordini con lo stato FILLED.

Sì, perché l'ordine potrebbe non essere nella storia(ordine pendente, ecc.)

Aggiunto

E tu hai il codice sbagliato

 
prostotrader:

Sì, perché l'ordine potrebbe non essere nella storia(ordine pendente, ecc.)

Aggiunto da

E tu hai il codice sbagliato

Cosa c'è che non va? Quanti errori si possono fare in due righe di codice.

 
Oleg Shenker:

Cosa c'è che non va? Quanti errori si possono fare in due righe di codice.

Non due, uno :)

if(transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL)

TRADE_TRANSACTION_REQUEST è necessario quando si usa OrderSendAsymc per ottenere il biglietto d'ordine.

Motivazione: