A Estrutura de um Resultado de Solicitação de Negociação (MqlTradeResult)

Como resultado de uma solicitação de negociação, um servidor de negociação retorna dados sobre o resultado do processamento da solicitação de negociação na forma de uma estrutura predefinida especial de tipo MqlTradeResult.

struct MqlTradeResult
  {
   uint     retcode;          // Código de retorno da operação
   ulong    deal;             // Bilhetagem (ticket) da operação (deal),se ela for realizada
   ulong    order;            // Bilhetagem (ticket) da ordem, se ela for colocada
   double   volume;           // Volume da operação (deal), confirmada pela corretora
   double   price;            // Preço da operação (deal), se confirmada pela corretora
   double   bid;              // Preço de Venda corrente
   double   ask;              // Preço de Compra corrente
   string   comment;          // Comentário da corretora para a operação (por default, ele é preenchido com a descrição código de retorno de um servidor de negociação)
   uint     request_id;       // Identificador da solicitação definida pelo terminal durante o despacho
   int      retcode_external// Código de resposta do sistema de negociação exterior
  };

Descrição dos Campos

Campo

Descrição

retcode

Código de retorno de um servidor de negociação

deal

Bilhetagem (ticket) da operação (deal), caso uma operação tenha sido realizada. É disponível para uma operação de negociação de tipo TRADE_ACTION_DEAL

order

Bilhetagem (ticket) da ordem, caso uma ordem tenha sido colocada. É disponível para uma operação de negociação de tipo TRADE_ACTION_PENDING

volume

Volume de operação (deal), confirmado pela corretora. Depende do tipo de preenchimento da ordem

price

Preço da operação (deal), confirmado pela corretora. Depende da área de desvio da requisição de negócio e/ou sobre operação de negócios

bid

O preço corrente de venda de mercado (preço re-cotado)

ask

O preço corrente de compra de mercado (preço re-cotado)

comment

O comentário da corretora para a operação (por default, ele é preenchido com a descrição código de retorno de um servidor de negociação)

request_id

Identificador da solicitação definida pelo terminal ao enviar para o servidor de negociação

retcode_external

Código de erro retornado pelo sistema de negociação exterior. O uso e tipos destes erros dependerão da corretora e do sistema de negociação exterior a partir do qual são enviadas as operações de negociação

O resultado da operação de negociação é retornado para variável do tipo MqlTradeResult, que é passado como o segundo parâmetro da função OrderSend() para realizar operações de negociação.

O terminal fixa um identificador (ID) de solicitação no campo request_id ao enviar-la para o servidor de negociação usando as funções OrdersSend() e OrderSendAsync(). O terminal recebe mensagens sobre transações realizadas provenientes do servidor de negociação e as submete para processamento através da função OnTradeTransaction() contendo os seguintes componentes como parâmetros:

  • Descrição da transação de negociação na estrutura MqlTradeTransaction;
  • Descrição da solicitação de negociação enviado a partir da função OrderSend() ou OrdersSendAsync(). O ID da solicitação é enviado pelo terminal para o servidor de negociação, enquanto a solicitação em si e seu request_id são armazenados na memória do terminal;
  • O resultado de execução da solicitação de negociação como estrutura MqlTradeResult com o campo request_id contendo o ID desta solicitação.

A função OnTradeTransaction() recebe três parâmetros de entrada mas os últimos dois devem ser analisados somente para transações do tipo TRADE_TRANSACTION_REQUEST. Em todos os outros casos, dados sobre a solicitação de negociação e seu resultado de execução não são preenchidos. Exemplo de análise de parâmetros pode ser encontrado em Estrutura de uma Solicitação de Negociação.

A definição do request_id pelo terminal na solicitação de negociação quando enviá-la para o servidor é introduzido principalmente para trabalhar com a função assíncrona OrderSendAsync(). Este identificador permite associar a ação realizada (chamada a funções OrderSend ou OrderSendAsync) com o resultado desta ação enviada para OnTradeTransaction().

Exemplo:

//+------------------------------------------------------------------+
//| Enviando uma solicitação de negociação com o proc. de resultado  |
//+------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
  {
//--- redefine o último código de erro para zero
   ResetLastError();
//--- envia solicitação
   bool success=OrderSend(request,result);
//--- se o resultado falha - tentar descobrir o porquê
   if(!success)
     {
      int answer=result.retcode;
      Print("TradeLog: Requisição de negociação falhou. Erro = ",GetLastError());
      switch(answer)
        {
         //--- nova cotação
         case 10004:
           {
            Print("TRADE_RETCODE_REQUOTE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- ordem não é aceita pelo servidor
         case 10006:
           {
            Print("TRADE_RETCODE_REJECT");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- preço inválido
         case 10015:
           {
            Print("TRADE_RETCODE_INVALID_PRICE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- SL e/ou TP inválidos
         case 10016:
           {
            Print("TRADE_RETCODE_INVALID_STOPS");
            Print("request.sl = ",request.sl," request.tp = ",request.tp);
            Print("result.ask = ",result.ask," result.bid = ",result.bid);
            break;
           }
         //--- volume inválido
         case 10014:
           {
            Print("TRADE_RETCODE_INVALID_VOLUME");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume);
            break;
           }
         //--- sem dinheiro suficiente para uma operação de negociação
         case 10019:
           {
            Print("TRADE_RETCODE_NO_MONEY");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume,"   result.comment = ",result.comment);
            break;
           }
         //--- alguma outra razão, saída com o código de resposta do servidor
         default:
           {
            Print("Outra resposta = ",answer);
           }
        }
      //--- notifica sobre o resultado sem sucesso da solicitação de negociação retornando false
      return(false);
     }
//--- OrderSend() retorna true - repete a resposta
   return(true);
  }