OrderCheck

Функция OrderCheck() проверяет достаточность средств для совершения требуемой торговой операции. Результаты проверки помещаются в поля структуры MqlTradeCheckResult.

bool  OrderCheck(
   MqlTradeRequest&       request,      // структура запроса
   MqlTradeCheckResult&   result        // структура ответа
   );

Параметры

request

[in]  Указатель на структуру типа MqlTradeRequest, которая описывает требуемое торговое действие.

result

[in,out]  Указатель на структуру типа MqlTradeCheckResult, в которую будет помещен результат проверки.

Возвращаемое значение

В случае нехватки средств или ошибочно заполненных параметров функция возвращает false. В случае успешной базовой проверки структур (проверка указателей) возвращается true – это не является свидетельством того, что запрашиваемая торговая операция непременно выполнится успешно. Для получения подробного описания результата выполнения функции следует анализировать поля структуры result.

Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

#define   DEVIATION     5              // допустимое отклонение от цены
#define   VOLUME        1.0            // объем ордера
#define   EXPERT_MAGIC  123            // MagicNumber
#define   DIRECTION     ORDER_TYPE_BUY // направление открываемой позиции (ORDER_TYPE_BUY или ORDER_TYPE_SELL)
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявление и инициализация структур запроса, проверки и результата
   MqlTradeRequest     request={};
   MqlTradeCheckResult check  ={};
   MqlTradeResult      result ={};
   
//--- подготовим параметры торгового запроса
   PrepareRequest(_SymbolDIRECTIONVOLUMErequest);
   
//--- проверим параметры торгового запроса
   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;
     }
     
//--- проверка торгового запроса прошла успешно - выведем в журнал описание полей структуры проверки торгового запроса
   Print("Trade request verification completed successfully");
   MqlTradeCheckResultPrint(check14);
   
//--- отправка торгового запроса
   if(!OrderSend(requestresult))
      Print("OrderSend error "GetLastError());    // если отправить запрос не удалось, выведем код ошибки
      
//--- информация об операции
   PrintFormat("Trade request result: retcode=%u, deal=%I64u, order=%I64u"result.retcoderesult.dealresult.order);
   /*
   результат с отключенной автоторговлей в клиентском терминале:
   Trade request verification completed with error 4752
   Server retcode10027commentAutoTrading disabled by client
   
   включим автоторговлю и проверим ещё раз на закрытом рынке:
   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
   
   проверим на открытом рынке:
   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
   */
  }
//+------------------------------------------------------------------+
//| Подготовка параметров для торгового запроса                      |
//+------------------------------------------------------------------+
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));
//--- параметры запроса
   request.action    = TRADE_ACTION_DEAL// тип торговой операции
   request.symbol    = symbol;            // символ
   request.volume    = volume;            // объем
   request.type      = type;              // тип ордера
   request.price     = price;             // цена для открытия
   request.deviation = DEVIATION;         // допустимое отклонение от цены
   request.magic     = EXPERT_MAGIC;      // MagicNumber ордера
  }
//+------------------------------------------------------------------+
//| Распечатывает в журнале поля структуры                           |
//| результата проверки торгового запроса                            |
//+------------------------------------------------------------------+
void MqlTradeCheckResultPrint(const MqlTradeCheckResult &checkconst uint header_width=0)
  {
//--- получаем валюту счёта и количество знаков после запятой для валюты счета
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
   int    digits  =(int)AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS);
   
//--- определяем текст заголовка и ширину поля заголовка
//--- если ширина заголовка передана в функцию равной нулю, то шириной будет размер строки заголовка + 1
   string header="Retcode:";
   uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- выводим в журнал код возврата с заголовком установленной ширины
   PrintFormat("%-*s%-u"wheadercheck.retcode);
   
//--- выводим в журнал значение баланса, которое будет после выполнения торговой операции
   header="Balance:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.balancecurrency);
   
//--- выводим в журнал значение собственных средств, которое будет после выполнения торговой операции
   header="Equity:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.equitycurrency);
      
//--- выводим в журнал значение плавающей прибыли, которое будет после выполнения торговой операции
   header="Profit:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.profitcurrency);      
      
//--- выводим в журнал размер маржи, необходимый для требуемой торговой операции
   header="Margin:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.margincurrency);      
      
//--- выводим в журнал размер свободных собственных средств, которые останутся после выполнения требуемой торговой операции
   header="Margin free:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.*f %s"wheaderdigitscheck.margin_freecurrency);      
      
//--- выводим в журнал уровень маржи, который установится после выполнения  требуемой торговой операции
   header="Margin level:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-.2f %%"wheadercheck.margin_level);      
      
//--- выводим в журнал комментарий к коду ответа, описание ошибки
   header="Comment:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   PrintFormat("%-*s%-s"wheadercheck.comment);      
  }

Смотри также

OrderSend(), Типы торговых операций, Структура торгового запроса, Структура результатов проверки торгового запроса, Структура результата торгового запроса