Estructura de resultado de solicitud comercial (MqlTradeResult)

Respondiendo a una solicitud comercial acerca de colocación de una orden en el sistema comercial, el servidor comercial devuelve los datos que contienen la información sobre el resultado de procesamiento de la solicitud comercial en forma de la estructura especial predefinida MqlTradeResult.

struct MqlTradeResult
  {
   uint     retcode;          // Código del resultado de operación
   ulong    deal;             // Ticket de transacción, si está concluida
   ulong    order;            // Ticket de la orden, si está colocada
   double   volume;           // Volumen de la transacción confirmado por el corredor
   double   price;            // Precio en la transacción confirmada por el corredor
   double   bid;              // Precio actual de la oferta en el mercado (precios recuota)
   double   ask;              // Precio actual de la demanda en el mercado (precios recuota)
   string   comment;          // Comentarios del corredor acerca de la operación (por defecto se rellena con la descripción código de retorno del servidor comercial)
   uint     request_id;       // El terminal pone el identificador de la solicitud a la hora de enviarla 
   int      retcode_external// Código de respuesta del sistema de comercio exterior
  };

Descripción de campos

Campo

Descripción

retcode

Código de retorno del servidor comercial

deal

Ticket de la transacción, si está concluida. Se comunica al ejecutar la operación comercial TRADE_ACTION_DEAL

order

Ticket de la orden, si está colocada. Se comunica al ejecutar la operación comercial TRADE_ACTION_PENDING

volume

Volumen de la transacción confirmado por el corredor. Depende del tipo de ejecución de la orden

price

Precio en la transacción confirmada por el corredor. Depende del campo deviation en la solicitud comercial y/o del tipo de la operación comercial

bid

Precio actual de la oferta en el mercado (precios recuota)

ask

Precio actual de la demanda en el mercado (precios recuota)

comment

Comentarios del corredor acerca de la operación (por defecto se rellena con la descripción código de retorno del servidor comercial)

request_id

Identificador de solicitud puesto por el terminal al inviarla al servidor de trading

retcode_external

Código de error que es retornado por el sistema de comercio exterior. El uso y tipos de estos errores van a depender del bróker y del sistema de comercio exterior a partir del cual son enviadas las operaciones de negociación

El resultado de la operación comercial se devuelve en una variable del tipo MqlTradeResult la que se pasa como segundo parámetro a la función OrderSend() para realizar las operaciones comerciales.

El terminal registra el identificador de la solicitud en el campo request_id a la hora de enviarla al servidor de trading por medio de las funciones OrdersSend() y OrderSendAsync(). El terminal recibe los mensajes de parte del servidor de trading sobre las transacciones comerciales realizadas y las pasa para el procesamiento a la función OnTradeTransaction() que contiene como parámetro:

  • descripción de la misma transacción comercial en la estructura MqlTradeTransaction;
  • descripción de la solicitud comercial que ha sido enviada desde la función OrderSend() o OrdersSendAsync(). El terminal envía el identificador de la solicitud al servidor de trading, mientras que la misma solicitud y su request_id se guardan en la memoria del terminal;
  • resultado de la ejecución de la solicitud comercial en forma de la estructura MqlTradeResult donde el campo request_id contiene el identificador de esta solicitud.

La función OnTradeTransaction() obtiene tres parámetros de entrada, pero los dos últimos parámetros tiene sentido analizarlos sólo para las transacciones comerciales que tienen el tipo TRADE_TRANSACTION_REQUEST. En todos los demás casos, los datos sobre la solicitud comercial y el resultado de su ejecución no se rellenan. El ejemplo del análisis de los parámetros se muestra en el apartado Estructura de transacción comercial.

La puesta del identificador request_id para la solicitud comercial por parte del terminal a la hora de enviarla al servidor está destinada en primer lugar para el trabajo con la función asincrónica OrderSendAsync(). Este identificador permite vincular la acción ejecutada (llamada a la función OrderSend o OrderSendAsync) con el resultado de esta acción que se traspasa en OnTradeTransaction().

Ejemplo:

//+------------------------------------------------------------------+
//|  Envío de una solicitud comercial con el procesamiento del resultado     |
//+------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
  {
//--- pongamos el código del último error a cero
   ResetLastError();
//--- enviamos la solicitud
   bool success=OrderSend(request,result);
//--- si ha fallado, vamos a intentar averiguar porqué
   if(!success)
     {
      int answer=result.retcode;
      Print("TradeLog:Trade request failed. Error = ",GetLastError());
      switch(answer)
        {
         //--- recuota
         case 10004:
           {
            Print("TRADE_RETCODE_REQUOTE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- la orden no ha sido aceptada por el servidor
         case 10006:
           {
            Print("TRADE_RETCODE_REJECT");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- precio incorrecto
         case 10015:
           {
            Print("TRADE_RETCODE_INVALID_PRICE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //---  SL y/o TP incorrecto(s)
         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;
           }
         //--- volumen incorrecto
         case 10014:
           {
            Print("TRADE_RETCODE_INVALID_VOLUME");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume);
            break;
           }
         //--- falta dinero para esta operación comercial
         case 10019:
           {
            Print("TRADE_RETCODE_NO_MONEY");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume,"   result.comment = ",result.comment);
            break;
           }
         //--- alguna otra razón, mostramos el código de respuesta del servidor
         default:
           {
            Print("Other answer = ",answer);
           }
        }
      //--- notificamos devolviendo false sobre el resultado fallido de la solicitud comercial
      return(false);
     }
//--- OrderSend() ha devuelto true - repetimos la respuesta
   return(true);
  }