Почему не стоит полагаться на функцию MarketInfo в MQL4?

Почему не стоит полагаться на функцию MarketInfo в MQL4?

В MQL4 есть MarketInfo, возвращающая массу о состоянии рынка, точнее некоторых параметров, транслируемых в терминал торговым сервером.

MarketInfo используется со следующими идентификаторами запроса: https://docs.mql4.com/ru/constants/environment_state/marketinfoconstants

Частым вариантом использования является вариант с идентификатором MODE_STOPLEVEL. При использовании этого идентификатора в качестве одного из аргументов, функция возвращает значение минимально допустимого значения уровней стоп-лосса и тейк-профита в пунктах.

В частности, в документации к MQL4 такой пример использования:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- получим минимальное значение Stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   double price=Ask;
//--- вычисленные значения цен SL и TP должны быть нормализованы
  double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
  double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- размещаем рыночный ордер на покупку 1 лота
   int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
   if(ticket<0)
     {
      Print("OrderSend завершилась с ошибкой #",GetLastError());
     }
   else
      Print("Функция OrderSend успешно выполнена");
//---
  }

В строке double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); MarketInfo используется по своему прямому назначению, а именно — для вычисления минимального значения величины стоп — лосса. Всё бы хорошо, но в описании параметра MODE_STOPLEVEL говорится буквально следующее: использование этого идентификатора запроса может приводить к возврату функцией нулевого значения в двух случаях — либо отсутствует лимит на минимальные уровни для значений стоп-лосса и тейкпрофита, либо использование на серверной стороне внешних механизмов управления этими уровнями. В этом случае невозможно получить значения минимальной величины для стоп-лосса и тейк-профита.

Вывод: нельзя полагаться целиком и полностью на функцию MarketInfo. При отправке ордеров на сервер с помощью OrderSend нужно обязательно проверять возвращаемые ей значения, а лучше — вообще написать обработчик ошибок. Что касается MarketInfo, то её нужно использовать с особой осторожностью, учитывая, что она может возвращать, по сути, неправильные значения минимальных стопов.

Другим вариантом решения проблемы представляется написание своих функций для вычисления размеров уровней стоп-приказов, и как было сказано выше грамотная обработка значений, возращаемых функцией OrderSend.

Внимание! В гостевых постах отражено личное мнение автора, которое может не совпадать с мнением редакции Rivaforex. Присылайте Ваши материалы на rivaforexsite@gmail.com

Добавить комментарий

Ваш e-mail не будет опубликован.