FORTES. Questões de aplicação da lei - página 15

 

Boa tarde, Renat!

Você poderia comentar a seguinte situação em FORTS (real):

Há um preço no copo com um volume de 8. Este volume foi feito por dois correspondentes (4 com o mesmo preço)

Eu compro (vendo) este volume (8)usando um pedidolimite.

Acontece o seguinte:

1. Se o pedido for completamente preenchido, eu entro na OnTradeTransaction:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_FILLED

2. Se o pedido for preenchido com o volume do 2º correspondente, recebo o seguinte na OnTradeTransaction:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_PARTIAL

3. Se o pedido é preenchido com o volume do 1º correspondente, eu entro na OnTradeTransaction:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_CANCELED

Por quê? Porque no segundo e terceiro casos a ordem foi parcialmente executada.

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


 

Escreveu um cheque nesta encomenda e aqui está o resultado:

Isto estava acontecendo na construção 1060 do terminal e na construção 1035 do servidor.

Após a noite (principal) de limpeza do terminal atualizado para 1085, mas I

parou a comercialização para descobrir a razão.

Em demonstração (1085 - 1085) Não consigo reproduzir o erro (sem mudanças rápidas no stack)

 

"Puxei para cima" a história de todas as minhas ordens.

O erro existe em 1035, 1060 e 1085 construções

 

No primeiro caso, a ordem é executada completamente em uma única operação e o saldo não executado não é removido, porque a ordem foi executada para o volume total. No registro, podemos ver uma das entradas que você mencionou:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_FILLED


No segundo caso, a ordem é parcialmente executada e o saldo não executado é removido. Isto acontece porque você definiu a política de execução de pedidos - ORDER_FILLING_IOC:

Indica acordo para executar uma negociação no volume máximo disponível no mercado, dentro dos limites especificados no pedido. Se a execução completa não for possível, a ordem será executada para o volume disponível e o volume não executado da ordem será cancelado.


No seu caso, o pedido era para 8 lotes a 1222,1. No momento em que o pedido foi feito, o volume de contra pedidos a um preço não pior do que 1222,1 era de 4 lotes. Como resultado, 4 lotes foram executados como uma única operação (porque 4 lotes foram representados por uma ordem oposta). O restante do pedido foi retirado, ou seja, o pedido foi cancelado.

De acordo com os registros que você forneceu:

a ordem foi parcialmente executada:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_PARTIAL

Em seguida, o restante foi eliminado, ou seja, o pedido foi cancelado:

OntradeTransaction --> TRADE_TRANSACTION_HISTORY_ADD --> ORDER_STATE_CANCELED
 
Renat:

No primeiro caso, a ordem é executada completamente em uma única operação e o saldo não executado não é removido, porque a ordem foi executada para o volume total. No registro, podemos ver uma das entradas que você mencionou:



No segundo caso, a ordem é parcialmente executada e o saldo não executado é removido. Isto acontece porque você definiu a política de execução de pedidos - ORDER_FILLING_IOC:

Indica acordo para executar uma negociação no volume máximo disponível no mercado, dentro dos limites especificados no pedido. Se a execução completa não for possível, a ordem será executada para o volume disponível e o volume não executado da ordem será cancelado.


No seu caso, o pedido era para 8 lotes a 1222,1. No momento em que o pedido foi feito, havia 4 lotes a um preço não pior do que 1222,1. Como resultado, 4 lotes foram executados como uma única operação (porque 4 lotes foram representados por uma ordem oposta). O restante do pedido foi retirado, ou seja, o pedido foi cancelado.

De acordo com os registros que você forneceu:

a ordem foi parcialmente executada:

Em seguida o saldo é removido, ou seja, o pedido é cancelado:

Então, como interpretar a DOCUMENTAÇÃO?

O problema é que naTradeTransaction não há mensagem sobre o comércio(TRADE_TRANSACTION_DEAL_ADD) quandoo ORDER_STATE_CANCELED!

Mas o comércio ERA !

 
Mikalas:

Então como deve ser interpretada a DOCUMENTAÇÃO?

O mandado foi levantado. O cliente pode ser liberado para ir para casa.
 
Renat:
A ordem foi levantada. O cliente pode ser deixado ir para casa.

O problema é que naTradeTransaction não há mensagem de transação(TRADE_TRANSACTION_DEAL_ADD) quandoo ORDER_STATE_CANCELED !

Mas a transação ERA !

E onde você viu PARTIAL (essa é uma maneira de fazer as coisas)? Somente CANCELADO !

E na história é armazenado (ver foto) como CANCELADO

 

Boa tarde Renat!

Você acha correto que uma ordem parcialmente executada deva ser armazenada no histórico como uma ordemORDER_STATE_CANCELED,

e na OnTradeTransaction não deveríamos ter uma confirmação do negócio de uma ordem parcialmente executada?

Diga-me, a lógica da plataforma atual permanece como está ou você está pronto para fazer mudanças num futuro previsível?

 
kond777:

Boa tarde Renat!

Você acha correto que uma ordem parcialmente executada deva ser armazenada no histórico como uma ordemORDER_STATE_CANCELED,

e na OnTradeTransaction não deveríamos ter uma confirmação do negócio de uma ordem parcialmente executada?

Diga-me, a lógica da plataforma atual permanece como está ou você está pronto para fazer mudanças num futuro previsível?

Você mesmo já verificou ou apenas reagiu às descrições incompletas de Mikalas? Afinal, o pedido era do COI.

Mais uma vez, verificamos o comportamento do nosso lado:

1. Instalou um consultor especializado do artigo Prescriptions of MQL5 - Processing TradeTransaction Events.

2. Fizemos um pedido do COI para o instrumento de baixo líquido SILV-3.15. O pedido foi feito para vender 11 lotes ao preço de 16,48, enquanto apenas 1 lote estava disponível a este preço.

Temos o seguinte:

No terminal:


Além do fato de a ordem ser "cancelada", podemos ver que 1 lote de 11 pedidos foi executado, o que é o comportamento correto.

No diário de bordo do 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

Isto é, a transação sobre o negócio veio na OnTradeTransaction(). Se a transação não viesse, você não a veria de forma alguma no terminal. Por favor, verifique se a transação TRADE_TRANSACTION_DEAL_ADD não chegou. Compare o comportamento de sua EA com o comportamento sugerido acima pelo Conselheiro Especialista.

 

Bom dia, Renat!

Você não garante a chegada do evento da OnTradeTransaction, portanto ele não veio (TRADE_TRANSACTION_DEAL_ADD)

E quando chegou o evento TRADE_TRANSACTION_HISTORY_ADD, o status do pedido foiORDER_STATE_CANCELED

Foi aí que as "pernas cresceram".

Na minha opinião, se a ordem (não importa como foi executada) foi parcialmente executada, então seu status

deve ser registrado na história como ORDER_STATE_PARTIAL