Pergunta sobre a função OnTradeTransaction - página 5

 
papaklass:

OnTradeTransaction() é o RUNNER de um evento comercial. Não importa o que desencadeou o evento, o importante é que o evento ocorreu.

Aqui está um extrato da documentação:

OrderSend() / OrderSendAsync() são FUNÇÕES COMERCIAIS.

Para a OnTradeTransaction() não faz diferença qual função você usou para enviar a ordem OrderSend() ou OrderSendAsync().

Já o li tantas vezes antes de criar o tema ... Eu não direi uma palavra.

Mas, no entanto, minha conclusão é que é mais provável perder uma transação em uma pilha do que perder uma transação em um segundo, e talvez nem mesmo uma (segunda). Isso é exatamente o que estou tentando descobrir. Tentando obter sua opinião sobre isto. Qual é a probabilidade de se perder uma transação se ela for bastante rara e única?

 
papaklass:
Em termos de probabilidades, eu não sei.

Terei que confiar na única opinião de Michael, com base em sua própria experiência. Se ele não perdeu uma única transação em meio ano de uma pilha de pedidos, então vamos supor que um único pedido não será perdido.

Aos poucos estou pegando o jeito, tentando não quebrar a lógica, mas às vezes uma atrapalha a outra...

 
AlexeyVik:

Teremos que confiar na opinião única de Michael, com base em sua própria experiência. Se ele não perdeu uma única transação em seis meses de uma pilha de pedidos, então vamos assumir que um único pedido não se perderá.

Estou lentamente dominando-a, tentando não quebrar a lógica, mas às vezes acontece que uma interfere com a outra...

Alexei, faça a si mesmo uma pergunta simples:

O que é melhor, cavar o histórico após cada comando, ou 1 vez, ou talvez nunca, verificar novamente o pedido (a OnTradeTransaction não foi acionada)?

A validação não é fácil de implementar (a propósito, meu exemplo tem erros), mas o princípio principal é que TODAS as ordens têm sua própria magia.

E mais uma coisa. Já disse que cada um é livre de seguir seu próprio caminho....

 
Mikalas:

Alexey, faça a si mesmo uma pergunta simples:

É melhor cavar o histórico após cada comando ou verificar novamente o pedido (OnTradeTransaction não funcionou) uma vez ou nunca?

A validação não é fácil de implementar (a propósito, meu exemplo tem erros), mas o princípio principal é que TODAS as ordens têm sua própria magia.

E mais uma coisa. Já disse que cada um é livre de seguir seu próprio caminho....

Michael, foi a resposta simples a esta simples pergunta que me levou a toda esta discussão. E até agora não vou desistir. Mas ainda não consigo entender se a perda da transação é possível após o comando OrderSend() ou durante a ativação da ordem pendente, ou durante o fechamento da posição usando stop/stop.

De sua primeira resposta eu entendi que mesmo OrderSendAsync() você não perde a transação. Estou tentando entendê-lo para decidir se é necessário ou não se preocupar em verificar tais transações, bastante raras. Além disso, levando em conta o que eu destinei.

Pura e logicamente, se a OrderSend() não for encerrada até obter resposta, a transação não pode ser perdida. Mas a ativação de uma ordem pendente e o fechamento de uma posição não se encaixam em minha lógica. Se uma transação neste caso for acionada dentro do MT5, respectivamente, ela não será perdida, mas se através de um servidor... Eu não sei. (Mas suponho que a intuição diz que o servidor me envia uma resposta e ativa a OnTradeTransaction().

 

Rapazes, aqui está o problema:

Se eu abrir uma posição, a OnTradeTransaction lida apenas com TRADE_TRANSACTION_DEAL_ADD... Tudo está bem.

Se uma SellStop, por exemplo, for colocada, apenas TRADE_TRANSACTION_ORDER_ADD é acionada... Tudo também é normal.

Mas se eu definir uma posição e uma ordem pendente, TRADE_TRANSACTION_DEAL_ADD funciona e TRADE_TRANSACTION_ORDER_ADD funciona duas vezes

por que é assim?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool  NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
    MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit()
{
 point = _Digits%2 == 0 ? _Point : _Point * 10;
  NewStart = true;
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
 if(NewStart)
  {
   Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
    Trade.SellStop(0.78, SymbolInfoDouble(_Symbol, SYMBOL_BID)-52*point, Symbol(), 0.0, 0.0, 0, 0);
   NewStart = false;
  }
}/*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{

  ENUM_TRADE_TRANSACTION_TYPE type = (ENUM_TRADE_TRANSACTION_TYPE)trans.type;
   
   switch(type)
    {
     case TRADE_TRANSACTION_ORDER_ADD:
      {
       Print("order add    * Тикет ордера * ", trans.order);
        Print("order add    * Объём ордера * ", trans.volume);
       break;
      }
     case TRADE_TRANSACTION_DEAL_ADD:
      {
       Print("deal add    * Тикет сделки * ", trans.deal);
        Print("deal add    * Объём сделки * ", trans.volume);
       break;
      }
     default: break;
    }

}/*******************************************************************/
 
AlexeyVik:

Rapazes, aqui está o problema:

Se eu abrir uma posição, a OnTradeTransaction lida apenas com TRADE_TRANSACTION_DEAL_ADD... Tudo está bem.

Se uma SellStop, por exemplo, for colocada, apenas TRADE_TRANSACTION_ORDER_ADD é acionada... Tudo também é normal.

Mas se eu definir uma posição e uma ordem pendente, TRADE_TRANSACTION_DEAL_ADD funciona e TRADE_TRANSACTION_ORDER_ADD funciona duas vezes

por que é assim?

Você deve estar enganado em algum lugar. Deve haver pelo menos dois eventos em ambos os casos: TRADE_TRANSACTION_ORDER_ADD e TRADE_TRANSACTION_DEAL_ADD. Porque você não recebe TRADE_TRANSACTION_ORDER_ADD não é claro.

Tente comentar a troca e imprimir o registro completo de todos os eventos recebidos na OnTradeTransaction.

 
C-4:

Você entendeu errado em algum lugar. Em ambos os casos, deve haver pelo menos dois eventos: TRADE_TRANSACTION_ORDER_ADD e TRADE_TRANSACTION_DEAL_ADD. Porque você não recebe TRADE_TRANSACTION_ORDER_ADD não é claro.

Tente comentar a troca e imprimir o registro completo de todos os eventos recebidos na OnTradeTransaction.

Sim, eu tentei. A impressão (EnumToString(tipo)) foi impressa antes do switch(tipo); ela foi impressa exatamente como eu descrevi.

Aqui estão as experiências repetidas.




 

Verifiquei seu código por minha conta. - Tudo funciona corretamente.

Opção sem enviaruma ordem de parada para acompanhamento:

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

Opção de enviar uma ordem de parada:

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


s.e., o tempo para o ciclo completo foi uma agradável surpresa: estável de 60-70 msec. Muito bem, desenvolvedores!
 
C-4:

Verifiquei seu código por minha conta. - Tudo funciona corretamente.

Variante sem enviar depoisuma ordem de parada:

Opção com o envio de uma ordem de parada:

s.e., o tempo para o ciclo completo foi agradavelmente surpreendido: estável de 60-70 msec. Bom trabalho para os desenvolvedores, eles fizeram um grande trabalho!

Aparentemente, isto é a perda das transações... e, antes de mais nada (trecho da documentação)

E a ordem em que essas transações chegam ao terminal não é garantida

Vasily, isto é um testador ou uma demonstração? Eu tenho uma amostra do testador. Será que existe uma diferença entre a operação da OnTradeTransaction no testador e na conta? Vou verificar na ocasião.


ps; Acontece que após perder uma transação, ela aparece repentinamente na próxima ativação da OnTradeTransaction.

 
AlexeyVik:

Aparentemente, isto é a perda das transações... e, antes de tudo, (trecho da documentação)

Vasily, isto é um testador ou uma demonstração? Eu tenho amostras do testador. Será que existe uma diferença entre a OnTradeTransaction acionando no testador e na conta? Vou verificar na ocasião.


ps; Acontece que após perder uma transação, ela aparece repentinamente quando a OnTradeTransaction é ativada na próxima vez.

Não, as transações não se perdem, elas simplesmente podem não vir em uma determinada seqüência.

Somente TRADE_TRANSACTION_REQUEST vem sempre em primeiro lugar, caso contrário, você não receberia um bilhete para o pedido.

Leia a documentação CARAVEGAMENTE.