FORTI. Problemi di applicazione - pagina 15

 

Buon pomeriggio, Renat!

Potreste commentare la seguente situazione su FORTS (reale):

C'è un prezzo nel bicchiere con un volume di 8. Questo volume è stato fatto da due corrispondenti (4 con lo stesso prezzo)

Compro (vendo) questo volume (8)usando un ordinelimite.

Succede quanto segue:

1. Se l'ordine è completamente riempito, ottengo in OnTradeTransaction:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_FILLED

2. Se l'ordine è riempito con il volume del 2° corrispondente, ottengo quanto segue in OnTradeTransaction:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_PARTIAL

3. Se l'ordine viene riempito con il volume del 1° corrispondente, ottengo in OnTradeTransaction: 3:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_CANCELED

Perché? Perché nel secondo e terzo caso l'ordine è stato eseguito parzialmente.

2015.03.02 17:10:26.204 Trades  'xxxxx': sell limit 8.00 GOLD-6.15 at 1222.1
2015.03.02 17:10:26.234 Trades  'xxxxx': sell limit 8.00 GOLD-6.15 at 1222.1 placed for execution in 23 ms
2015.03.02 17:10:26.254 Trades  'xxxxx': deal #9801184 sell 4.00 GOLD-6.15 at 1222.1 done (based on order #11413991)

2015.03.02 17:10:26.254 Forts_trader (GOLD-6.15,H1)     OnTradeTransaction: ордер удалён. Билет = 11413991


 

Ho fatto un controllo su questo ordine ed ecco il risultato:

Questo accadeva sulla build 1060 del terminale e sulla build 1035 del server.

Dopo la compensazione serale (principale) il terminale si è aggiornato a 1085, ma io

ha fermato il trading per scoprirne il motivo.

Sulla demo (1085 - 1085) non riesco a riprodurre l'errore (nessun cambiamento rapido nello stack)

 

"Tirato su" la storia di tutti i miei ordini.

L'errore esiste nelle build 1035, 1060 e 1085

 

Nel primo caso, l'ordine viene eseguito completamente in una sola operazione e il saldo non eseguito non viene rimosso, perché l'ordine è stato eseguito per l'intero volume. Nel registro, possiamo vedere una delle voci che avete menzionato:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_FILLED


Nel secondo caso, l'ordine viene eseguito parzialmente e il saldo non eseguito viene rimosso. Questo succede perché avete impostato la politica di esecuzione degli ordini - ORDER_FILLING_IOC:

Indica l'accordo di eseguire un'operazione al massimo volume disponibile sul mercato entro i limiti specificati nell'ordine. Se l'esecuzione completa non è possibile, l'ordine sarà eseguito per il volume disponibile e il volume non eseguito dell'ordine sarà cancellato.


Nel tuo caso l'ordine era per 8 lotti a 1222.1. Al momento dell'ordine, il volume dei contro-ordini a un prezzo non peggiore di 1222.1 era di 4 lotti. Di conseguenza, 4 lotti sono stati eseguiti come una sola operazione (perché 4 lotti erano rappresentati da un ordine opposto). Il resto dell'ordine è stato ritirato, cioè l'ordine è stato annullato.

Secondo i registri che avete fornito:

l'ordine è stato eseguito parzialmente:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_PARTIAL

Poi il resto è stato cancellato, cioè l'ordine è stato annullato:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_CANCELED
 
Renat:

Nel primo caso, l'ordine viene eseguito completamente in una sola operazione e il saldo non eseguito non viene rimosso, perché l'ordine è stato eseguito per l'intero volume. Nel registro, possiamo vedere una delle voci che avete menzionato:



Nel secondo caso, l'ordine viene eseguito parzialmente e il saldo non eseguito viene rimosso. Questo succede perché avete impostato la politica di esecuzione degli ordini - ORDER_FILLING_IOC:

Indica l'accordo di eseguire un'operazione al massimo volume disponibile sul mercato entro i limiti specificati nell'ordine. Se l'esecuzione completa non è possibile, l'ordine sarà eseguito per il volume disponibile e il volume non eseguito dell'ordine sarà cancellato.


Nel tuo caso, l'ordine era per 8 lotti a 1222.1. Al momento dell'ordine, c'erano 4 lotti ad un prezzo non peggiore di 1222.1. Di conseguenza, 4 lotti sono stati eseguiti come una sola operazione (perché 4 lotti erano rappresentati da un ordine opposto). Il resto dell'ordine è stato ritirato, cioè l'ordine è stato annullato.

Secondo i registri che avete fornito:

l'ordine è stato eseguito parzialmente:

Poi il saldo viene rimosso, cioè l'ordine viene cancellato:

Allora come interpretare la DOCUMENTAZIONE?

Il fatto è che onTradeTransaction non c'è nessun messaggio sul trade(TRADE_TRANSACTION_DEAL_ADD) quandoORDER_STATE_CANCELED !

Ma lo scambio è stato!

 
Mikalas:

Allora come si deve interpretare la DOCUMENTAZIONE?

Ilmandato è stato revocato. Il cliente può essere rilasciato per andare a casa.
 
Renat:
L'ordine è stato revocato. Il cliente può essere lasciato andare a casa.

Il fatto è che onTradeTransaction non c'è nessun messaggio di transazione(TRADE_TRANSACTION_DEAL_ADD) quandoORDER_STATE_CANCELED !

Ma la transazione è stata!

E dove hai visto PARZIALE (questo è un modo di fare)? Solo CANCELLATO!

E nella cronologia è memorizzato (vedi immagine) come CANCELLATO

 

Buon pomeriggio Renat!

Pensi che sia corretto che un ordine parzialmente eseguito debba essere memorizzato nella storia come un ordineORDER_STATE_CANCELED,

e in OnTradeTransaction non dovremmo avere una conferma dell'affare di un ordine parzialmente eseguito?

Ditemi, la logica attuale della piattaforma rimane così com'è o siete pronti a fare dei cambiamenti nel prossimo futuro?

 
kond777:

Buon pomeriggio Renat!

Pensi che sia corretto che un ordine parzialmente eseguito debba essere memorizzato nella storia come un ordineORDER_STATE_CANCELED,

e in OnTradeTransaction non dovremmo avere una conferma dell'affare di un ordine parzialmente eseguito?

Ditemi, la logica attuale della piattaforma rimane così com'è o siete pronti a fare dei cambiamenti nel prossimo futuro?

Hai controllato tu stesso o hai solo reagito alle descrizioni incomplete di Mikalas? L'ordine era CIO, dopo tutto.

Ancora una volta abbiamo controllato il comportamento dalla nostra parte:

1. Installato un Expert Advisor dall'articolo Prescrizioni di MQL5 - Elaborazione degli eventi TradeTransaction.

2. Abbiamo piazzato un ordine IOC sullo strumento a bassa liquidità SILV-3.15. L'ordine è stato piazzato per vendere 11 lotti al prezzo di 16.48, mentre solo 1 lotto era disponibile a questo prezzo.

Abbiamo ottenuto quanto segue:

Nel terminale:


A parte il fatto che l'ordine è "cancellato", possiamo vedere che 1 lotto su 11 richiesti è stato eseguito, che è il comportamento corretto.

Nel registro di Expert Advisor:

2015.03.03 16:32:56.022 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_ADD
2015.03.03 16:32:56.173 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2015.03.03 16:32:56.325 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_REQUEST
2015.03.03 16:32:56.477 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2015.03.03 16:32:56.628 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_DEAL_ADD   <====== транзакция о сделке пришла
2015.03.03 16:32:56.779 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2015.03.03 16:32:56.930 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_DELETE
2015.03.03 16:32:57.082 tradeprocessor (SILV-3.15,H1)   Тип торговой транзакции: TRADE_TRANSACTION_HISTORY_ADD

Cioè la transazione sull'affare è arrivata in OnTradeTransaction(). Se la transazione non arrivasse, non la vedreste affatto nel terminale. Controlli per favore che la transazione TRADE_TRANSACTION_DEAL_ADD non sia arrivata. Confronta il comportamento del tuo EA con quello suggerito sopra dall'EA.

 

Buongiorno, Renat!

Non si garantisce l'arrivo dell'evento OnTradeTransaction, quindi non è arrivato (TRADE_TRANSACTION_DEAL_ADD)

E quando l'evento TRADE_TRANSACTION_HISTORY_ADD è arrivato, lo stato dell'ordine eraORDER_STATE_CANCELED

È lì che sono cresciute le "gambe".

Secondo me, se l'ordine (non importa come è stato eseguito) è stato eseguito parzialmente, allora il suo stato

dovrebbe essere registrato nella storia come ORDER_STATE_PARTIAL