La struttura di un risultato di Richiesta di Trade (MqlTradeResult)

Come risultato di una richiesta di trade, un trade server restituisce i dati relativi al risultato dell'elaborazione della richiesta di trade come una speciale struttura predefinita di tipo MqlTradeResult.

struct MqlTradeResult
  {
   uint     retcode;          // Codice di ritorno dell'operazione
   ulong    deal;             // Ticket dell'Affare, se è stato eseguito
   ulong    order;            // Ticket dell'Ordine, se è stato piazzato
   double   volume;           // Volume dell'Affare, confermato dal broker
   double   price;            // Prezzo dell'affare, confermato dal broker
   double   bid;              // Prezzo Bid Corrente
   double   ask;              // Prezzo Ask Corrente
   string   comment;          // Commento del Broker all'operazione (per impostazione predefinita è riempito dalla descrizione il codice di ritorno del trade server)
   int      request_id;       // ID della Richiesta impostato dal terminale durante l'invio
  };

Descrizione dei Campi

Campo

Descrizione

retcode

Il codice di ritorno del trade server

deal

Ticket Affare, se un affare è stata eseguito. E' disponibile per un'operazione di trade di tipo TRADE_ACTION_DEAL

ordine

Ticket Ordine, se il ticket è stato piazzato. E' disponibile per un'operazione di trade di tipo TRADE_ACTION_PENDING

volume

Volume Deal, confermato dal broker. Dipende dal tipo di riempimento dell'ordine

price

Prezzo Deal, confermato dal broker. Dipende dal campo deviazione della richiesta di trade e/o sull'operazione di trade

bid

L'attuale prezzo di mercato Bid (prezzo riquotazione)

ask

Il corrente prezzo Ask di mercato (prezzo riquotazione)

riga

Il commento del broker all'operazione (per impostazione predefinita è riempito dalla descrizione Il codice di ritorno del trade server)

request_id

ID richiesta impostato dal terminale per l'invio trade server

Il risultato dell'operazione di trade viene restituito ad una variabile di tipo MqlTradeResult, che viene passata come secondo parametro ad OrderSend() per effettuare operazioni di trade.

Il terminale fissa la richiesta ID nel campo request_id quando si invia al trade server usando le funzioni OrdersSend() e OrderSendAsync(). Il terminale riceve i messaggi sulle operazioni effettuate dal trade server e li sottopone per l'elaborazione della funzione OnTradeTransaction() contenente i seguenti componenti come parametri:

  • descrizione dell'operazione di trade nella struttura MqlTradeTransaction;
  • descrizione della richiesta di trade inviata dalla funzione OrderSend() o OrdersSendAsync(). L' ID richiesta viene inviato dal terminale al trade server, mentre la stessa richiesta e la sua request_id sono memorizzate nella memoria del terminale;
  • il risultato della richiesta di esecuzione come nella struttura MqlTradeResult con il campo request_id contenente l'ID della richiesta.

La funzione OnTradeTransaction() riceve tre parametri di input, ma gli ultimi due devono essere analizzati solo per le operazioni aventi tipo TRADE_TRANSACTION_REQUEST. In tutti gli altri casi, i dati sulla richiesta di trade ed il suo risultato dell'esecuzione non vengono riempiti. Esempio di analisi dei parametri può essere trovato nella Struttura di una Richiesta di Trade.

L'impostazione di request_id dal terminale per la richiesta di trade, quando si al trade server è principalmente introdotta per lavorare con la funzione asincrona OrderSendAsync(). Questo identificatore consente di associare l'azione eseguita (chiamate di funzioni OrderSend o OrderSendAsync) con il risultato di questa azione inviato ad OnTradeTransaction().

Esempio:

//+--------------------------------------------------------------------------------+
//| Invia una richiesta di trade con il risultato dell'esecuzione                  |
//+--------------------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
  {
//--- resetta l'ultimo codice dell'errore, a zero
   ResetLastError();
//--- invia richiesta
   bool success=OrderSend(request,result);
//--- se il risultato fallisce - prova a cercare il perchè
   if(!success)
     {
      int answer=result.retcode;
      Print("TradeLog: Richiesta di trade fallita. Error = ",GetLastError());
      switch(answer)
        {
         //--- requote
         case 10004:
           {
            Print("TRADE_RETCODE_REQUOTE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- l'ordine non è accettato dal server
         case 10006:
           {
            Print("TRADE_RETCODE_REJECT");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- prezzo non valido
         case 10015:
           {
            Print("TRADE_RETCODE_INVALID_PRICE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- SL e/o TP non validi
         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 non valido
         case 10014:
           {
            Print("TRADE_RETCODE_INVALID_VOLUME");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume);
            break;
           }
         //--- non ci sono soldi a sufficienza per l'operazione di trade
         case 10019:
           {
            Print("TRADE_RETCODE_NO_MONEY");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume,"   result.comment = ",result.comment);
            break;
           }
         //--- alcune altre ragioni, in output il codice di risposta del server
         default:
           {
            Print("Altra risposta = ",answer);
           }
        }
      //--- notifica circa il risultato non riuscito della richiesta di trade, restituendo false
      return(false);
     }
//--- OrderSend() restituisce true - ripete la risposta
   return(true);
  }