Разрешенные объемы торговых операций

В следующих главах, посвященных программированию торговых советников, нам потребуется контролировать множество характеристик символов, от которых зависит успех отправки торговых приказов. В частности, это относится к той части спецификации символа, где оговариваются разрешенные объемы операций. Соответствующие свойства доступны и в MQL5. Все они имеют тип double и запрашиваются функцией SymbolInfoDouble.

Идентификатор

Описание

SYMBOL_VOLUME_MIN

Минимальный объем сделки в лотах

SYMBOL_VOLUME_MAX

Максимальный объем сделки в лотах

SYMBOL_VOLUME_STEP

Минимальный шаг изменения объема сделки в лотах

SYMBOL_VOLUME_LIMIT

Максимально допустимый совокупный объем открытой позиции и отложенных ордеров в одном направлении (покупка или продажа)

SYMBOL_TRADE_CONTRACT_SIZE

Размер торгового контракта = 1 лот

Попытки купить или продать финансовый инструмент объемом меньше минимального, больше максимального или не кратным шагу приведут к ошибке. В главе про торговые API мы реализуем код для унификации необходимых проверок и нормализации объемов перед вызовом торговых функций MQL5 API.

Кроме всего прочего MQL-программе следует проверять и SYMBOL_VOLUME_LIMIT. Например, при ограничении в 5 лотов можно иметь открытую позицию на покупку объемом 5 лотов и выставить отложенный ордер Sell Limit объемом 5 лотов. Но при этом нельзя выставить отложенный ордер Buy Limit (поскольку совокупный объем в одном направлении превысит ограничение) или выставить Sell Limit объемом более 5 лотов.

В качестве вводного примера рассмотрим скрипт SymbolFilterVolumes.mq5, который выводит в журнал значения вышеперечисленных свойств для выбранных символов. Во входные параметры добавим переменную MinimalContractSize, чтобы можно было фильтровать символы по свойству SYMBOL_TRADE_CONTRACT_SIZE: выводим только те, у которых размер контракта больше указанного (по умолчанию, 0, то есть все символы удовлетворяют условию).

#include <MQL5Book/SymbolFilter.mqh>
   
input bool MarketWatchOnly = true;
input double MinimalContractSize = 0;

В начале OnStart определим объект фильтра, выходные массивы для получения списков имен и значений свойств в виде векторов double на 4 поля. Перечень интересующих нас 4-х свойств указываем в массиве volumeIds.

void OnStart()
{
   SymbolFilter f;                      // объект фильтра
   string symbols[];                    // приемный массив с именами
   double volumeLimits[][4];            // приемный массив с векторами данных
   
   // запрашиваемые свойства символов
   ENUM_SYMBOL_INFO_DOUBLE volumeIds[] =
   {
      SYMBOL_VOLUME_MIN,
      SYMBOL_VOLUME_STEP,
      SYMBOL_VOLUME_MAX,
      SYMBOL_VOLUME_LIMIT
   };
   ...

Далее применяем фильтр по размеру контракта (должен быть больше указанного) и получаем поля спецификации, связанные с объемами, для подошедших символов.

   f.let(SYMBOL_TRADE_CONTRACT_SIZEMinimalContractSizeSymbolFilter::IS::GREATER)
   .select(MarketWatchOnlyvolumeIdssymbolsvolumeLimits);
   
   const int n = ArraySize(volumeLimits);
   PrintFormat("===== Volume limits of the symbols (%d) ====="n);
   string title = "";
   for(int i = 0i < ArraySize(volumeIds); ++i)
   {
      title += "\t" + EnumToString(volumeIds[i]);
   }
   Print(title);
   for(int i = 0i < n; ++i)
   {
      Print(symbols[i]);
      ArrayPrint(volumeLimits3NULLi10);
   }
}

Для настроек по умолчанию скрипт может показать примерно следующие результаты (с сокращениями).

===== Volume limits of the symbols (13) =====
SYMBOL_VOLUME_MIN SYMBOL_VOLUME_STEP SYMBOL_VOLUME_MAX SYMBOL_VOLUME_LIMIT
EURUSD
  0.010   0.010 500.000   0.000
GBPUSD
  0.010   0.010 500.000   0.000
USDCHF
  0.010   0.010 500.000   0.000
USDJPY
  0.010   0.010 500.000   0.000
USDCNH
   0.010    0.010 1000.000    0.000
USDRUB
   0.010    0.010 1000.000    0.000
...
XAUUSD
  0.010   0.010 100.000   0.000
BTCUSD
   0.010    0.010 1000.000    0.000
SP500m
 0.100  0.100  5.000 15.000

Некоторые символы могут не иметь ограничений по SYMBOL_VOLUME_LIMIT (значение равно 0). Вы можете сравнить результаты со спецификациями символов: они должны совпасть.