OrderCheck

A função OrderCheck() verifica se há fundos suficientes para executar a respectiva operação de negociação. Os resultados da verificação são colocadas nos campos da estrutura MqlTradeCheckResult.

bool  OrderCheck(
   MqlTradeRequest&       request,      // estrutura solicitada
   MqlTradeCheckResult&   result        // resultado da estrutura
   );

Parâmetros

request

[in]  Ponteiro para a estrutura do tipo MqlTradeRequest que descreve a ação de negociação requerida.

result

[in,out]  Ponteiro para a estrutura do tipo MqlTradeCheckResult onde o resultado da verificação é colocada.

Valor retornado

Se os fundos não são suficientes ou os parâmetros são preenchidos incorretamente, a função retorna false. Em caso de verificação de estruturas (ponteiros) bem sucedida, ele retorna true. No entanto, isto não indica que a operação solicitada não seja executada com sucesso. Para uma descrição mais detalhada do resultado da execução da função, analise os campos do resultado da estrutura.

Para obter informações sobre o erro, chame a função GetLastError().

Exemplo:

#define   DEVIATION     5              // desvio permitido do preço
#define   VOLUME     1.0   // // volume da ordem
#define   EXPERT_MAGIC  123            // MagicNumber
#define   DIRECTION     ORDER_TYPE_BUY // direção da posição aberta (ORDER_TYPE_BUY ou ORDER_TYPE_SELL)
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- declaração e inicialização das estruturas de solicitação, verificação e resultado
   MqlTradeRequest     request={};
   MqlTradeCheckResult check  ={};
   MqlTradeResult      result ={};
   
//--- preparamos os parâmetros da solicitação de negociação
   PrepareRequest(_SymbolDIRECTIONVOLUMErequest);
   
//--- verificamos os parâmetros da solicitação de negociação
   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;
     }
     
//--- a verificação da solicitação de negociação foi bem-sucedida, imprimimos no log a descrição dos campos da estrutura de verificação da solicitação de negociação
   Print("Trade request verification completed successfully");
   MqlTradeCheckResultPrint(check14);
   
//--- envio da solicitação de negociação
   if(!OrderSend(requestresult))
      Print("OrderSend error "GetLastError());    // se não for possível enviar a solicitação, imprimimos o código de erro
      
//--- informações sobre a operação
   PrintFormat("Trade request result: retcode=%u, deal=%I64u, order=%I64u"result.retcoderesult.dealresult.order);
   /*
   resultado com a negociação automática desativada no terminal do cliente:
   Trade request verification completed with error 4752
   Server retcode10027commentAutoTrading disabled by client
   
   ativamos a negociação automática e verificamos novamente no mercado fechado:
   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
   
   verificamos no mercado aberto:
   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
   */
  }
//+------------------------------------------------------------------+
//| Preparação de parâmetros para a solicitação de negociação        |
//+------------------------------------------------------------------+
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));
//--- parâmetros da solicitação
   request.action    = TRADE_ACTION_DEAL// tipo de operação de negociação
   request.symbol    = symbol;            // símbolo
   request.volume    = volume;            // volume
   request.type      = type;              // tipo de ordem
   request.price     = price;             // preço para abertura
   request.deviation = DEVIATION;         // desvio permitido em relação ao preço
   request.magic     = EXPERT_MAGIC;      // MagicNumber da ordem
  }
//+------------------------------------------------------------------+
//| Imprime no log os campos da estrutura                            |
//| do resultado da verificação da solicitação de negociação         |
//+------------------------------------------------------------------+
void MqlTradeCheckResultPrint(const MqlTradeCheckResult &checkconst uint header_width=0)
  {
//--- obtemos a moeda da conta e o número de dígitos após a vírgula para a moeda da conta
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
   int    digits  =(int)AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS);
   
//--- definimos o texto do cabeçalho e a largura do campo de cabeçalho
//--- se a largura do cabeçalho for passada para a função igual a zero, a largura será o tamanho da linha do cabeçalho + 1
   string header="Retcode:";
   uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- imprimimos no log o código de retorno com um cabeçalho de largura definida
   PrintFormat("%-*s%-u"wheadercheck.retcode);
   
//--- imprimimos no log o valor do saldo que estará disponível após a execução da operação de negociação
   header="Balance:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.balancecurrency);
   
//--- imprimimos no log o valor dos fundos próprios que estarão disponíveis após a execução da operação de negociação
   header="Equity:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.equitycurrency);
      
//--- imprimimos no log o valor do lucro flutuante que estará disponível após a execução da operação de negociação
   header="Profit:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.profitcurrency);      
      
//--- imprimimos no log o tamanho da margem necessária para a operação de negociação requerida
   header="Margin:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.margincurrency);      
      
//--- imprimimos no log o valor dos fundos próprios disponíveis que permanecerão após a execução da operação de negociação necessária
   header="Margin free:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.margin_freecurrency);      
      
//--- imprimimos no log o nível de margem que será estabelecido após a execução da operação de negociação necessária
   header="Margin level:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.2f %%"wheadercheck.margin_level);      
      
//--- imprimimos no log o comentário sobre o código de resposta, descrição do erro
   header="Comment:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-s"wheadercheck.comment);      
  }

Também Veja

OrderSend(), Tipos de operações de negociação, Pedido de Estrutura de Comércio, Estrutura do Pedido pelos resultados, Estrutura de um Pedido do resultado de negociação