Скачать MetaTrader 5

OrderCheck - функция осуществляет проверки в терминале или отсылает запрос на торговый сервер?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
49199
Vladimir Karputov 2016.08.05 06:53 

Вопрос по функции OrderCheck - данная функция осуществляет проверки в терминале или запрос уходит на торговый сервер?

Для чего нужно: можно ли этой функцию вызывать несколько раз за тик?

Dennis Kirichenko
11378
Dennis Kirichenko 2016.08.05 07:34  
Karputov Vladimir:

Вопрос по функции OrderCheck - данная функция осуществляет проверки в терминале или запрос уходит на торговый сервер?

Для чего нужно: можно ли этой функцию вызывать несколько раз за тик?

Зайду с другой стороны.

Владимир, прикиньте, если функция OrderCheck() будет обращаться к серверу. Вырастет ли нагрузка на торговый сервер? :-) 

Брокеры и так создают некоторые ограничения по обращениям к серверу, а тут ещё и эта проверка...

Ihor Herasko
9252
Ihor Herasko 2016.08.05 08:30  
Karputov Vladimir:

Вопрос по функции OrderCheck - данная функция осуществляет проверки в терминале или запрос уходит на торговый сервер?

Для чего нужно: можно ли этой функцию вызывать несколько раз за тик?

Чисто логически: если бы функция отправляла запрос на сервер, то это приводило бы к большому времени ее исполнения (даже 100 мс - это много). За такое время рынок может уже 10 раз изменить свое состояние. И какой тогда толк будет от успешного или неудачного исполнения этой функции? Конечно же, эта функция исполняется чисто локально, используя текущее рыночное окружение. В противном случае функция никакого практического смысла не имела бы.
Vladimir Karputov
Модератор
49199
Vladimir Karputov 2016.08.05 08:58  
Ihor Herasko:
Чисто логически: если бы функция отправляла запрос на сервер, то это приводило бы к большому времени ее исполнения (даже 100 мс - это много). За такое время рынок может уже 10 раз изменить свое состояние. И какой тогда толк будет от успешного или неудачного исполнения этой функции? Конечно же, эта функция исполняется чисто локально, используя текущее рыночное окружение. В противном случае функция никакого практического смысла не имела бы.

Почти согласен, но ещё осталось немного сомнения. OrderCheck иногда точно обращается к серверу. Например, если запустить этот код

//+------------------------------------------------------------------+
//|                                                   OrderCheck.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(3);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int count=0;
//---
   MqlTradeRequest      request={0};   // структура запроса 
   MqlTradeCheckResult  result={0};    // структура ответа 
//--- параметры запроса
   request.action   =TRADE_ACTION_DEAL;                     // тип торговой операции
   request.symbol   =Symbol();                              // символ
   request.volume   =0.01;                                  // объем в 0.01 лот
   request.type     =ORDER_TYPE_BUY;                        // тип ордера
   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
   request.deviation=5;                                     // допустимое отклонение от цены
   request.magic    =0;                                     // MagicNumber ордера
//---
   string text="Error: ";
   ResetLastError();
   bool res=OrderCheck(request,result);
   if(!res)
      text=IntegerToString(GetLastError());
//--- выведем на график ответ сервера   
   text+="\nask="+DoubleToString(request.price,Digits())+
         "\ncount: "+IntegerToString(count)+", OrderCheck: "+res+
         ", comment:"+result.comment+", retcode:"+IntegerToString(result.retcode)+
         ", margin:"+DoubleToString(result.margin,Digits());
   Comment(text);
   count++;
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   OnTick();
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---

  }
//+------------------------------------------------------------------+

и отключить интернет (в Windows 10 просто выбрать "Режим в Самолёте"), то для некоторых инструментов будет выдаваться ошибка.

Файлы:
MetaQuotes
Админ
25027
Renat Fatkhullin 2016.08.05 09:13  
Функция не обращается на сервер, но ей нужно точное рыночное окружение, которое в наличии только при коннекте к серверу.
Vladimir Karputov
Модератор
49199
Vladimir Karputov 2016.08.05 09:49  
Renat Fatkhullin:
Функция не обращается на сервер, но ей нужно точное рыночное окружение, которое в наличии только при коннекте к серверу.

Спасибо!

Значит всякие разнообразные способы расчёта вроде "узнать маржу при таком-то лоте" или "узнать размер депозита при таком-то уровне маржи" могут решаться простым (несложным перебором).

Самый простой пример - десять раз увеличиваем лот (начиная с минимально возможного) и смотрим маржу, свободную маржу и уровень маржи:

//+------------------------------------------------------------------+
//|                                                   OrderCheck.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.001"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int count=0;
//---
   MqlTradeRequest      request={0};   // структура запроса 
   MqlTradeCheckResult  result={0};    // структура ответа 
//--- параметры запроса
   request.action   =TRADE_ACTION_DEAL;                     // тип торговой операции
   request.symbol   =Symbol();                              // символ
   request.volume   =0.00;                                  // объем в 0.00 лот
   request.type     =ORDER_TYPE_BUY;                        // тип ордера
   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
   request.deviation=5;                                     // допустимое отклонение от цены
   request.magic    =0;                                     // MagicNumber ордера
//---
   string text=NULL;
   for(int i=0;i<10;i++)
     {
      static double addend=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
      request.volume+=addend;
      ResetLastError();
      if(OrderCheck(request,result))
        {
         text+="volume: "+DoubleToString(request.volume,2)+
               ", margin: "+DoubleToString(result.margin,2)+
               ", margin_free: "+DoubleToString(result.margin_free,2)+
               ", margin_level: "+DoubleToString(result.margin_level,2)+"%\n";
        }
      else
         text+="Error "+IntegerToString(GetLastError())+"\n";
     }
   Comment(text);

  }
//+------------------------------------------------------------------+

Вот результат работы кода:

маржа, свободная маржа и уровень маржи 

Файлы:
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий