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

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

Last updated on 29.05.2021

перечисления

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

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

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

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

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

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

Виды заявок

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

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

В дальнейшем вместо слова «Заявка» будет использоваться словосочетание «Неактивная заявка».

Виды позиций

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

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

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

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

Для удобства дальнейшего изложения вместо слова «Позиция» будет использоваться словосочетание «Исполненная заявка» или «Активная заявка».

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

Теперь возвращаемся к перечислениям. Открываем проект торгового фреймворка. В папке «Enums» создаём одноимённый файл с расширением «.mqh». Открываем его и записываем в него следующие перечисления. Первое перечисление ENUM_EVENTS_TYPE. Это перечисление нам потребуется при использовании прослушивателя событий (не путать с функцией OnChartEvent() ).

enum ENUM_EVENTS_TYPE
   {
// Проверяем появление нового тика  
    CHECK_NEW_TICK=0,
 // Проверяем появление нового бара    
    CHECK_NEW_BAR,
 // Проверяем обновление времени (для таймеров)   
    CHECK_NEW_TIME,
 // Проводим некоторые манипуляции над активными заявками при условии    что сумма убытка всех активных заявок превысила некоторое значение   
    CHECK_SUM_LOSS ,
 // Проводим некоторые манипуляции над активными заявками при условии что сумма прибыли всех активных заявок превысила некоторое значение   
    CHECK_SUM_PROFIT ,
 // Проводим проверку всех активных заявок   
    CHECK_ORDERS
 };  

Следующее перечисление 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,
// Закрываются все buy stop limit заявки
    CLOSE_ALL_BUY_STOP_LIMIT,
// Закрываются все sell stop limit заявки
    CLOSE_ALL_SELL_STOP_LIMIT,
// Закрываются все buy stop stop заявки
    CLOSE_ALL_BUY_STOP_STOP,
// Закрываются все sell stop stop заявки
    CLOSE_ALL_SELL_STOP_STOP,
// Закрываются все buy заявки при достижении определенного времени
    CLOSE_ALL_BUY_TIME,
// Закрываются все sell заявки при достижении определенного времени
    CLOSE_ALL_SELL_TIME,
// Закрываются все buy stop заявки при достижении определенного времени
    CLOSE_ALL_BUY_STOP_TIME,
// Закрываются все sell stop заявки при достижении определенного времени
    CLOSE_ALL_SELL_STOP_TIME,
// Закрываются все buy limit заявки при достижении определенного времени
    CLOSE_ALL_BUY_LIMIT_TIME,
// Закрываются все sell limit заявки при достижении определенного времени
    CLOSE_ALL_SELL_LIMIT_TIME,
// Закрываются все buy stop limit заявки при достижении определенного времени
    CLOSE_ALL_BUY_STOP_LIMIT_TIME,
// Закрываются все sell stop limit заявки при достижении определенного времени
    CLOSE_ALL_SELL_STOP_LIMIT_TIME,
 // закрываем все заявки (buy, sell) при достижении определённой суммы профита или убытка
    CLOSE_ALL_BUY_SUM_LOSS,
//
    CLOSE_ALL_SELL_SUM_LOSS,
//  
    CLOSE_ALL_BUY_SUM_PROFIT,
//
    CLOSE_ALL_SELL_SUM_PROFIT,
 // Закрываются все прибыльные заявки
    CLOSE_ALL_PROFIT_ORDERS,
 // Закрываются все убыточные заявки
    CLOSE_ALL_LOSS_ORDERS,
 // Закрываются все заявки, цена открытия которых равна указанной   
    CLOSE_ALL_EQUAL_PRICE,
 // Закрываются все заявки, объём которых равен указанной     
    CLOSE_ALL_EQUAL_LOT,
 // Закрываются все заявки, с положительным свопом     
    CLOSE_ALL_SWAP_PLUS,
 // Закрываются все заявки, с отрицательным свопом   
    CLOSE_ALL_SWAP_MINUS,
 // Закрываются все заявки с определённым тикетом
    CLOSE_ALL_TICKET,
 // Закрываются все заявки для указанного торгового инструмента
    CLOSE_ALL_SYMBOL,
 // Закрываются все заявки с указанным именем
    CLOSE_ALL_NAME
   };

Следующее перечисление 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,
 // Меняем объём неактивной заявки  
  MODIFY_LOT  
 };   

Перечисление 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_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)