OrderCheck

La funzione OrderCheck() controlla se ci sono abbastanza soldi per eseguire un' operazione di traderichiesta. I risultati del controllo sono posti ai campi della struttura MqlTradeCheckResult.

bool  OrderCheck(
   MqlTradeRequest&       request,      // struttura della richiesta
   MqlTradeCheckResult&   result        // struttura del risultato
   );

Parametri

request

[in] Puntatore alla struttura del tipo MqlTradeRequest, che descrive l'azione di trade richiesta.

result

[in,out] Puntatore alla struttura del tipo MqlTradeCheckResult, in cui verrà posizionato il risultato del controllo.

Valore restituito

Se i fondi non sono sufficienti per l'operazione o i parametri sono compilati in modo errato, la funzione restituisce il valore false. In caso di un controllo di base di successo delle strutture (controllo di puntatori), restituisce true. Tuttavia, questo non significa che l'operazione di trade richiesta, è sicuro che venga eseguita con successo. Per una descrizione più dettagliata del risultato dell'esecuzione della funzione, analizzare i campi della struttura result .

Al fine di ottenere informazioni sull' errore, chiamare la funzione GetLastError().

Esempio:

#define   DEVIATION     5              // deviazione consentita dal prezzo
#define   VOLUME        1.0            // volume dell'ordine
#define   EXPERT_MAGIC  123            // MagicNumber
#define   DIRECTION     ORDER_TYPE_BUY // direzione della posizione aperta (ORDER_TYPE_BUY o ORDER_TYPE_SELL)
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- dichiarare e inizializzare le strutture di richiesta, verifica e risultato
   MqlTradeRequest     request={};
   MqlTradeCheckResult check  ={};
   MqlTradeResult      result ={};
   
//--- parametri di richiesta di trade
   PrepareRequest(_SymbolDIRECTIONVOLUMErequest);
   
//--- controllare i parametri della richiesta di trade
   ResetLastError();
   bool res=OrderCheck(requestcheck);
   if(!res)
     {
      PrintFormat("Trade request verification completed with error %d\nServer retcode: %u, comment: %s"GetLastError(), check.retcodecheck.comment);
      return;
     }
     
//--- la richiesta di controllo del trade è stata eseguita con successo - visualizzare la descrizione dei campi della struttura di verifica della richiesta di trade
   Print("Trade request verification completed successfully");
   MqlTradeCheckResultPrint(check14);
   
//--- inviare una richiesta di trade
   if(!OrderSend(requestresult))
      Print("OrderSend error "GetLastError());    // se non è possibile inviare la richiesta, visualizzare il codice di errore
      
//--- informazioni sull'operazione
   PrintFormat("Trade request result: retcode=%u, deal=%I64u, order=%I64u"result.retcoderesult.dealresult.order);
   /*
   risultato con auto trading disattivato nel terminale client:
   Trade request verification completed with error 4752
   Server retcode10027commentAutoTrading disabled by client
   
   enable auto trading and check again on a closed market:
   Experts   automated trading is enabled
   Trade request verification completed successfully
   Retcode:      0
   Balance:      10779.50 USD
   Equity:       10779.50 USD
   Profit:       0.00 USD
   Margin:       1104.79 USD
   Margin free:  9674.71 USD
   Margin level975.71 %
   Comment:      Done
   OrderSend error 4756
   Trade request resultretcode=10018deal=0order=0
   
   Controllo del mercato aperto:
   Trade request verification completed successfully
   Retcode:      0
   Balance:      10779.50 USD
   Equity:       10779.50 USD
   Profit:       0.00 USD
   Margin:       110.46 USD
   Margin free:  10669.04 USD
   Margin level9758.74 %
   Comment:      Done
   Trade request resultretcode=10009deal=2777010968order=2802818813
   */
  }
//+------------------------------------------------------------------+
//| Preparare i parametri per una richiesta di trade                 |
//+------------------------------------------------------------------+
void PrepareRequest(const string symbolconst ENUM_ORDER_TYPE order_typeconst double volumeMqlTradeRequest &request)
  {
   ENUM_ORDER_TYPE type=(DIRECTION !=ORDER_TYPE_BUY ? ORDER_TYPE_SELL : DIRECTION);
   double price=(DIRECTION==ORDER_TYPE_BUY ? SymbolInfoDouble(Symbol(), SYMBOL_ASK) : SymbolInfoDouble(Symbol(), SYMBOL_BID));
//-- parametri della richiesta
   request.action    = TRADE_ACTION_DEAL// tipo di operazione di trade
   request.symbol    = symbol;            // simbolo
   request.volume    = volume;            // volume
   request.type      = type;              // tipo di ordine
   request.price     = price;             // prezzo di apertura
   request.deviation = DEVIATION;         // deviazione consentita dal prezzo
   request.magic     = EXPERT_MAGIC;      // MagicNumber dell'ordine
  }
//+------------------------------------------------------------------+
//| Stampare nel journal i campi del |
//| risultato della verifica di richiesta di trade             |
//+------------------------------------------------------------------+
void MqlTradeCheckResultPrint(const MqlTradeCheckResult &checkconst uint header_width=0)
  {
//--- ottenere la valuta del conto e il numero di decimali per la valuta del conto
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
   int    digits  =(int)AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS);
   
//--- definire il testo dell'intestazione e la larghezza del campo dell'intestazione
//--- se la larghezza dell'intestazione viene passata alla funzione uguale a zero, allora la larghezza sarà la dimensione della riga dell'intestazione + 1
   string header="Retcode:";
   uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- visualizzare nel journal il codice di ritorno con l'intestazione della larghezza specificata
   PrintFormat("%-*s%-u"wheadercheck.retcode);
   
//--- visualizzare nel journal il valore del saldo dopo l'esecuzione di un'operazione di trading
   header="Balance:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.balancecurrency);
   
//--- visualizzare il valore del capitale dopo l'esecuzione di un'operazione di trading nel journal
   header="Equity:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.equitycurrency);
      
//--- visualizzare il valore di profitto flottante dopo l'esecuzione di un'operazione di trading nel journal
   header="Profit:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.profitcurrency);      
      
//--- visualizzare l'importo del margine, richiesto per la necessaria operazione di trading, nel journal
   header="Margin:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.margincurrency);      
      
//--- visualizzare nel journal il valore del capitale che deve essere lasciato dopo aver condotto un'operazione di trading
   header="Margin free:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.margin_freecurrency);      
      
//--- visualizzare nel journal il livello di margine da impostare dopo aver completato l'operazione di trading richiesta
   header="Margin level:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.2f %%"wheadercheck.margin_level);      
      
//--- visualizzare il commento sul codice di risposta e la descrizione dell'errore nel journal
   header="Comment:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-s"wheadercheck.comment);      
  }

Vedi anche

OrderSend(), Tipi di Operazione di Trade, Struttura delle Richieste di Trade, Struttura dei Risultati del Controllo della Richiesta, Struttura del Risultato della Richiesta di Trade