Перейти к содержанию

(MQL) 2. Перечисления

Last updated on 10.04.2021

перечисления
(MQL) 2. Перечисления 3

Перечисляемый тип (сокращённо перечисле́ния, англ. enumeration, enumerated type) —  тип данных, который является набором идентификаторов, играющих ту же роль, что и обычные именованные константы. В основном все перечисления, используемые в проекте, служат своеобразными указателями, которые говорят о том, какие операции необходимо сделать. Прежде чем перейти к описанию перечислений, стоит рассмотреть такие понятия, как “заявка” и “позиция”.

Позиция и заявка (ордер). В чём отличие?

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

  • Какой финансовый актив покупается / продаётся
  • В каком количестве
  • По какой цене

Брокер на основании переданной информации совершает требуемые действия. В этом случае принято говорить о выставлении биржевой заявки. Биржевые заявки могут ещё носить название ордеров или приказов.

Как только совершена покупка или продажа финансового актива, то говорят об открытии позиции. Позицию можно наращивать или сокращать.

Виды заявок

Все заявки можно условно разделить на:

  • Рыночные — это заявка на покупку/продажу, которая должна быть выполнена брокером по текущей рыночной цене
  • Лимитные — это заявка на покупку / продажу финансового по цене не более / не менее указанной. Обычно лимитная заявка на покупку устанавливается ниже текущей рыночной цены, а заявка на продажу — выше текущей рыночной цены
  • Заявки с условиями — это любая заявка, кроме лимитной заявки, которая требует от брокера выполнения указанных условий. К можно отнести стоп-заявки. Это заявки на покупку / продажу в том случае, если цена финансового инструмента пересекает снизу вверх указанный уровень стоп-цены.
  • Стоп-лимитные заявки – этот тип заявок относится к заявкам с условиями. Такая заявка позволяет выставить лимитную заявку на покупку / продажу финансового актива после достижения определённого ценового уровня
  • Адресные биржевые заявки — заявки на сделку с указанием контрагента, с которым планируется заключение сделки
  • Заявки, ограниченные временем

Виды позиций

Позиции делят на: длинные и короткие.

Длинная позиция – это исполнение заявки на покупку финансового актива.

Короткая позиция – это исполнение заявки на продажу финансового актива.

Один финансовый актив = Одна позиция

Перечисления для обработки заявок

Теперь возвращаемся к перечислениям. Открываем проект торгового фреймворка. В папке “Enums” создаём одноимённый файл с расширением “.mqh”. Открываем его и записываем в него следующие перечисления. Первое перечисление ENUM_CLOSE_TYPE. Это перечисление помогает определить некоторые условия закрытия заявок.

enum ENUM_CLOSE_TYPE
   {
 // Закрытие заявки по имени торговому активу
    CLOSE_TYPE_SYMBOL = 0,
 // Закрытие заявки по её номеру
    CLOSE_TYPE_TICKET ,
 // Закрытие заявки с учётом её типа   
    CLOSE_TYPE_ORDER,
 // Закрытие заявки при условии что сумма объёмов всех открытых заявок превысила некоторое значение     
    CLOSE_TYPE_SUM_LOT,
 // Закрытие заявки при условии что сумма убытка всех открытых заявок
  превысила некоторое значение   
    CLOSE_TYPE_SUM_LOSS ,
 // Закрытие заявки при условии что сумма прибыли всех открытых заявок
  превысила некоторое значение   
    CLOSE_TYPE_SUM_PROFIT ,
 // Закрытие заявки по тейк-профиту   
    CLOSE_TYPE_TAKE_PROFIT,
 // Закрытие заявки по стоп-лоссу   
    CLOSE_TYPE_STOP_LOSS ,
 // Закрытие заявки по истечении времени   
    CLOSE_TYPE_TIME_EXPIRATION
 };  

Следующее перечисление ENUM_CLOSE_ORDER. При помощи этого перечисления мы можем указать какие заявки нам необходимо закрыть.

enum ENUM_CLOSE_ORDER
   {
 // Закрываются все buy, buy_stop и buy_limit заявки
    CLOSE_ALL_LONG,
 // Закрываются все sell, sell_stop и sell_limit заявки
    CLOSE_ALL_SHORT,
 // Закрываются все buy заявки    
    CLOSE_ALL_BUY,
 // Закрываются все buy_stop заявки
    CLOSE_ALL_BUY_STOP,
 // Закрываются все buy_limit заявки
    CLOSE_ALL_BUY_LIMIT,
 // Закрываются все sell заявки
    CLOSE_ALL_SELL,
 // Закрываются все sell_stop заявки
    CLOSE_ALL_SELL_STOP,
 // Закрываются все sell_limit заявки
    CLOSE_ALL_SELL_LIMIT,
 // Закрываются все прибыльные заявки
    CLOSE_ALL_PROFIT_ORDERS,
 // Закрываются все убыточные заявки
    CLOSE_ALL_LOSS_ORDERS,
 // Закрываются все заявки, цена открытия которых равна указанной   
    CLOSE_ALL_EQUAL_PRICE,
 // Закрываются все заявки, объём которых равен указанной     
    CLOSE_ALL_EQUAL_LOT,
 // Закрываются все заявки, с положительным свопом     
    CLOSE_ALL_SWAP_PLUS,
 // Закрываются все заявки, с отрицательным свопом   
    CLOSE_ALL_SWAP_MINUS
   };

Следующее перечисление ENUM_MODIFY_ORDER. При помощи этого перечисления мы можем указать что необходимо изменить в уже открытой или отложенной заявке.

enum ENUM_MODIFY_ORDER
   {
   // Необходимо изменить стоп-лосс
    MODIFY_STOP_LOSS=0,
     // Необходимо изменить тейк-профит
    MODIFY_TAKE_PROFIT,
     // Необходимо изменить цену открытия(только для отложенных заявок)
    MODIFY_PRICE_OPEN,
     // Необходимо изменить время экспирации(время окончания действия заявки)
    MODIFY_TIME_EXPIRATION,
// Необходимо изменить время открытия(выставления) заявки
    MODIFY_TIME_OPEN,
  // Необходимо изменить ценовой  уровень для заявок STOP_LIMIT и STOP_STOP
  MODIFY_PRICE_STOP,  
 };   

Перечисление ENUM_OPEN_ORDER_TYPE. При помощи этого перечисления мы можем указать какие заявки нам необходимо открыть.

enum ENUM_OPEN_ORDER_TYPE
{
// Открываем рыночную buy заявку
ENUM_ORDER_BUY=0,
// Открываем рыночную sell заявку
ENUM_ORDER_SELL,
// Открываем отложенную buy stop заявку
ENUM_ORDER_BUY_STOP,
// Открываем отложенную sell stop заявку
ENUM_ORDER_SELL_STOP,
// Открываем отложенную buy limit заявку
ENUM_ORDER_BUY_LIMIT,
// Открываем отложенную sell limit заявку
ENUM_ORDER_SELL_LIMIT,
// Открываем отложенную buy stop limit заявку
ENUM_ORDER_BUY_STOP_LIMIT,
// Открываем отложенную sell stop limit заявку
ENUM_ORDER_SELL_STOP_LIMIT,
// отложенный buy stop stop заявку
ENUM_ORDER_BUY_STOP_STOP,
// отложенный sell stop stop заявку
ENUM_ORDER_SELL_STOP_STOP,

// Для следующей группы ожидаем наступление указанного времени
// затем открываем(выставляем) необходимые заявки

 // рыночная buy заявка при достижении определённого времени
ENUM_ORDER_BUY_TIME,
// рыночная sell заявка при достижении определённого времени
ENUM_ORDER_SELL_TIME,
// рыночная buy stop заявка при достижении определённого времени
ENUM_ORDER_BUY_STOP_TIME,
// рыночная sell stop заявка при достижении определённого времени
ENUM_ORDER_SELL_STOP_TIME,
// рыночная buy limit заявка при достижении определённого времени
ENUM_ORDER_BUY_LIMIT_TIME,
// рыночная sell limit заявка при достижении определённого времени
ENUM_ORDER_SELL_LIMIT_TIME,
// рыночная buy stop limit заявка при достижении определённого времени
ENUM_ORDER_BUY_STOP_LIMIT_TIME,
// рыночная sell stop limit заявка при достижении определённого времени
ENUM_ORDER_SELL_STOP_LIMIT_TIME,

// Ещё одна группа. Выставляем заявки при достижении определённой суммы профита или убытка или, если общий объём открытых заявок превысил некоторое значение.
// Ордера выставляются те, что указаны выше 

// Общий объём  buy заявок превысил установленное значение
ENUM_ORDER_BUY_SUM_LOT,
// Общий объём  sell заявок превысил установленное значение
ENUM_ORDER_SELL_SUM_LOT,
// Общий убыток  buy заявок превысил установленное значение
ENUM_ORDER_BUY_SUM_LOSS,
// Общий убыток sell заявок превысил установленное значение
ENUM_ORDER_SELL_SUM_LOSS,
// Общий профит buy заявок превысил установленное значение
ENUM_ORDER_BUY_SUM_PROFIT,
// Общий профит sell заявок превысил установленное значение
ENUM_ORDER_SELL_SUM_PROFIT,
};

Далее прописываем ENUM_LOT_CALCULATE. Это перечисление позволяет нам выбрать режим расчёта объёма (лота) открываемой заявки.

enum ENUM_LOT_CALCULATE
{
// Величина объёма заявки берётся из основных настроек робота
LOT_CALCULATE_DEFAULT = 0, // Default
// Величина объёма заявки рассчитывается исходя из размера доли депозита, которой трейдер готов "потерять" 
LOT_CALCULATE_PERCENT, // Percent of Deposit
// В расчёте величины объёма заявки используется классический мартингейл 
LOT_CALCULATE_MARTIN, // Martingale
// В расчёте величины объёма заявки используется изменённый мартингейл 
LOT_CALCULATE_MARTIN_ALTER, // Alternative Martingale
// Восходящая сетка. Данный способ подходит при использовании группы заявок, выставляемых через одинаковые ценовые промежутки. Чем ближе заявка к рыночной цене, тем меньше её объём 
LOT_CALCULATE_GRID_ASCEND, // Ascend Group
// Нисходящая сетка. Данный способ подходит при использовании группы заявок, выставляемых через одинаковые ценовые промежутки. Чем ближе заявка к рыночной цене, тем больше её объём 
LOT_CALCULATE_GRID_DESCEND, // Descend Group
// Пила. Данный способ подходит при использовании группы заявок, выставляемых через одинаковые ценовые промежутки. Заявки с большим и меньшим объёмами чередуются  
LOT_CALCULATE_GRID_SAW, // Saw Group(…max-min-max-min-max…)
};

Перечисление “Тип используемой таблицы”

Так как в будущем торговом роботе предусмотрено использование типов таблиц заявок, то перечисление ENUM_ORDER_TABLE_TYPE помогает определить к какому типу таблицы принадлежит анализируемая заявка.

enum ENUM_ORDER_TABLE_TYPE
{
// Заявка принадлежит к рыночному типу таблицы
ENUM_TABLE_MARKET=0,
// Заявка принадлежит к индикаторному типу таблицы
ENUM_TABLE_INDICATOR
};

Рыночный тип таблицы – это заявки, у которых в качестве значения цены открытия, стоп-лосса или тейк-профита указаны реальные ценовые уровни.

Индикаторный тип таблицы – это заявки, у которых в качестве значения цены открытия, стоп-лосса или тейк-профита указаны значения индикатора.

Языковая поддержка

Последнее перечисление ENUM_LANGUAGE. Определяет все поддерживаемые языки.

enum ENUM_LANGUAGE
{
NONE=0, // None
RUS, // Russian
ENG // English
}

Данный набор перечислений не является конечным. По мере разработки проекта будут добавляться новые.

Опубликовано в рубрике1. ПеречисленияОснову для торговых роботов (MQL)