Virtual Order Manager для управления ордерами в позициях терминала MetaTrader 5

Paul | 14 мая, 2010


1. Введение

Возможно, самым большим изменением в переходе от MetaTrader 4 к MetaTrader 5 является изменение подхода к торговле с точки зрения совокупных позиций. В каждый момент времени по каждому инструменту может быть открыта только одна позиция, ее размер увеличивается или уменьшается каждый раз при исполнении брокером торговых приказов. Этот подход аналогичен правилу FIFO NFA 2-43(b), введенному в США, и соответствует правилам торговли многих других инструментов, таких как фьючерсные контракты и контракты на разницу (CFD).

Ярким примером отличия является ситуация,  когда два советника, торгующие на одном символе, открывают ордера в противоположных направлениях. Такая ситуация является обычной для торговых советников, работающих на различных временных масштабах, например, для советника, торгующего по скальперской стратегии и советника, использующего следование за трендом. В таких случаях в MetaTrader 4 в списке открытых ордеров будут показаны два противоположно направленных ордера с нулевой суммой задействованных залоговых средств (маржей), а в MetaTrader 5 не будет открытых позиций.

Код, подобный приведенной ниже функции OpenOrders советника на MQL4 (или похожий вариант), при переходе на MQL5, не будет работать так, как ожидается.

int OpenOrders()  // MT4 - код для подсчета полного количества открытых ордеров этим советником
{
  int nOpenOrders=0;
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber()==magic)
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
        if (OrderSymbol()==Symbol())
          nOpenOrders++;
  }
  return(nOpenOrders);
}

Таким образом, работа с совокупной позицией представляет сложности для программиста, который при работы с ордерами использует подход, реализованный в MetaTrader 4. Простые функции управления ордерами MetaTrader 4 становятся более сложными, когда возможны случаи объединения нескольких ордеров в одну совокупную позицию, при торговле нескольких советников на одном символе или для случаев торговли советника на одном инструменте несколькими ордерами.


2. Способы работы с позициями в MetaTrader 5

Есть несколько способов управления торговлей в рамках позиционно-ориентированного подхода, реализованного в MetaTrader 5, зависящих от сложности торговых стратегий.

Во-первых, отметим, что обработка отложенных ордеров выполняется так же, как и в MetaTrader 4, поэтому код MQL5, использующий только отложенные ордера, может быть относительно просто перенесен с кода, написанного на MQL4.

2.1 Простой советник; один советник, торгующий на одном инструменте

Самый простой подход - использовать в торговле один простой советник на одном символе. "Простой советник" в данном случае означает торговлю одним ордером, это общий метод, но он исключает возможность использования стратегий "pyramiding" и "grid trading". Такой советник может быть просто переписан с MQL4, возможно, используя класс CTrade стандартной библиотеки.

2.2 Сложный советник; один советник, торгующий на одном инструменте
Для сложных советников, торгующих по стратегиям "pyramiding" или "grid trading", в которых требуется открытие более одного ордера на инструменте, все что требуется - это добавление в стратегию некоторого относительно простого кода отслеживания ордеров. Это будет возможно лишь в случае, если советник работает только со своими позициями и не затрагивает позиции, открытые другим советником, торгующим на данном инструменте.

2.3 Более чем один советник, торгующий на нескольких инструментах
Этот случай требует создания сложных алгоритмов программирования и торговли и является причиной создания библиотеки Virtual Order Manager (VOM). Предназначение библиотеки - значительно упростить создание надежного кода советника, который будет прозрачен и не будет конфликтовать с другими советниками.

Далее в статье мы более подробно рассмотрим библиотеку Virtual Order Manager.


3. Цели архитектуры, преимущества и недостатки Virtual Order Manager

При проектировании библиотеки VOM преследовались четыре цели:

  1. Прозрачность: поведение советников, написанных корректно с использованием торговых функций VOM, изолировано от деятельности других советников.
  2. Робастность: элегантная обработка исключительных событий, таких как ошибки потери соединения с торговым сервером и неполное исполнение ордеров.
  3. Легкость в использовании: предоставление простых и хорошо документированных торговых функций
  4. Возможность использования в тестере стратегий терминала
Эти цели были реализованы следующим образом:

Подход, реализованный в библиотеке VOM, предоставляет следующие возможности для программиста советников на языке MQL5:

Также следует отметить, что побочным эффектом подхода VOM является то, что используемые виртуальные ордера Stop Loss, Take Profit, и отложенные ордера по своей природе являются "невидимыми", т.е. они не видны на стороне брокера. По мнению некоторых трейдеров, прятать уровни Stop Loss необходимо для того, чтобы предотвратить возможность охоты за стопами.

У библиотеки VOM также есть и недостатки. Рисковый капитал в торговле увеличивается при сбоях компьютера или сбоях соединения с Интернет за счет зависимости от более удаленных стопов, установленных на торговом сервере. В моменты большой волатильности, например, при выходе новостей, величина проскальзывания при исполнении виртуальных отложенных ордеров, ордеров Take Profit и Stop Loss может быть значительно выше, чем у стандартных, установленных на торговом сервере.

Влияние этих недостатков может быть минимизировано, если советники на базе VOM будут размещены на высоконадежных виртуальных компьютерах (VPS) с коротким временем пинга до сервера брокера.


4. Практическое использование VOM – пример простого советника

Прежде чем двигаться дальше, рассмотрим пример советника, использующего Virtual Order Manager. Мы напишем простого советника, торгующего при пересечении скользящих средних. Начнем с шаблона советника, который находится в прилагаемом к статье архиве. Мы будем использовать фрактальную скользящую среднюю (Fractal Moving Average), она потенциально способна снизить количество бессмысленных сделок на рынках, где использование стратегий пересечения обычных средних неэффективно. Нужно подчеркнуть, что этот советник представлен в качестве простого примера и не рекомендуется его использование в реальной торговле, по результатам тестирования он прибыльный, однако небольшое число торгов означает, что этот вывод не является статистически значимым.

Советник находится в папке MQL5\Experts\Virtual Order Manager\VOM EAs.

//+------------------------------------------------------------------+
//|                                           FraMA Cross EA VOM.mq5 |
//+------------------------------------------------------------------+
#property copyright "Paul Hampton-Smith"
#property link      "http://paulsfxrandomwalk.blogspot.com"
#property version   "1.00"

// это единственный файл, который нужно включить.
// он находится в родительской папке
#include "..\VirtualOrderManager.mqh"

input double   Lots=0.1;
input int      Fast_MA_Period=2;
input int      Slow_MA_Period=58;
/* 
Поскольку брокеры бывают с 3/5 знаками, уровни Stop Loss и Take Profit должны быть умножены на 10.
Похоже, что все брокеры, которые будут поддерживать MT5, будут работать с 3/5-значными котировками.
Но если такого не будет, без проблем можно добавить определение точности котировок.
 */
input int      Stop_Loss=5000;
input int      Take_Profit=0;
/*
Мы также можем изменить уровень логирования. Самым подробным является уровень LOG_VERBOSE. 
После того, как советник полностью отлажен, можно изменить уровень на LOG_MAJOR.
Файлы логов записываются в каталог files\EAlogs и автоматически удаляются после 30 дней.
 */
input ENUM_LOG_LEVEL Log_Level=LOG_VERBOSE;

// Следующие глобальные переменные будут хранить хэндлы и значения скользящих средних 
double g_FastFrAMA[];
double g_SlowFrAMA[];
int g_hFastFrAMA;
int g_hSlowFrAMA;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   LogFile.LogLevel(Log_Level);

   // Эту строку необходимо включать во все эксперты, которые используют CVirtualOrderManager  
   VOM.Initialise();
   Comment(VOM.m_OpenOrders.SummaryList());

   g_hFastFrAMA = iFrAMA(_Symbol,_Period,Fast_MA_Period,0,PRICE_CLOSE);
   g_hSlowFrAMA = iFrAMA(_Symbol,_Period,Slow_MA_Period,0,PRICE_CLOSE);
   ArraySetAsSeries(g_FastFrAMA,true);
   ArraySetAsSeries(g_SlowFrAMA,true);

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   // Эту строку необходимо включать во все эксперты, использующие CVirtualOrderManager  
   VOM.OnTick();
   Comment(VOM.m_OpenOrders.SummaryList());

   // Теперь получим копии свежих значений двух скользящих средних FrAMA 
   // в массивы g_FastFrAMA и g_SlowFrAMA. 
   if(CopyBuffer(g_hFastFrAMA,0,Shift,2,g_FastFrAMA)!=2) || 
      CopyBuffer(g_hSlowFrAMA,0,Shift,2,g_SlowFrAMA)!=2)
     {
      Print("Недостаточно загруженной истории");
      return;
     }

   // Теперь мы определяем факт пересечения быстрой FrAMA через медленную FrAMA,
   // закрываем все ордера, открытые в противоположном направлении и открываем один новый на покупку
   if(g_FastFrAMA[0]>g_SlowFrAMA[0] && g_FastFrAMA[1]<=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_SELL);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Buy(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }

   // Обратная ситуация для продажи
   if(g_FastFrAMA[0]<g_SlowFrAMA[0] && g_FastFrAMA[1]>=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_BUY);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Sell(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }
  }
//+------------------------------------------------------------------+

Теперь, с выходом тестера стратегий, он может быть протестирован в терминале, результат изображен на рис. 1:

 Figure 1. FrAMA Cross EA backtest

Рисунок 1. Результат тестирования советника FrAMA Cross EA

На рис. 2 приведены записи логов журнала тестера:

 Figure 2. Strategy test log

Рисунок 2. Записи в журнале тестера стратегий

 

5. Структура VOM

На рис. 4, приведенном ниже, показана схема использования VOM в нескольких советниках:

Figure 3. Multiple VOM EAs

Рисунок 3. Несколько советников, торгующих с использованием VOM

С точки зрения внутренней структуры, основные компоненты VOM выглядят следующим образом (рис. 4):

Figure 4. VOM internal structure

Рисунок 4. Внутренняя структура VOM

Описание элементов структуры VOM, приведенных на рис. 4:

Советники, которые используют VOM, взаимодействуют с библиотекой по схеме, представленной ниже на рис. 5:

 Figure 5. EA interaction with the VOM library

Рисунок 5. Схема взаимодействия советника с библиотекой VOMy


6. Подробнее о защитных стоп-лоссах

Для советников, написанных на MQL4, весьма распространенным является использование виртуальных стопов. Если значение стопа сохраняется только на уровне клиентского терминала, стоп невидим для брокера, часто стратегии разрабатываются с учетом этого момента для предотвращения охоты за стопами. Такие виртуальные стопы значительно увеличивают риск в торговле, поскольку требуют постоянного соединения с брокером для своего исполнения.

Virtual Order Manager контролирует этот риск установкой стопов на сервере на значительном расстоянии от самого близкого виртуального стопа. Эти стопы можно назвать защитными стопами на крайний случай (DPSL-стопы, disaster protection stoploss), поскольку они будут исполнены только в случае потери соединения с брокером на некоторое время, это могут быть ситуации разрыва соединения с Интернет или сбой компьютера.

Поскольку виртуальные ордера открываются и закрываются, превращаясь в позицию на сервере, поддержание на правильном уровне DPSL-стопов не является простой задачей. Рассмотрим пример.

Виртуальные
ордера
Цена
открытия
Виртуальный
 SL
Позиция
на сервере
Stop loss
на сервере
Комментарий
0.1 lots BUY #1 2.00000 1.99000 0.1 lots BUY 1.98500 DPSL установлена на 50 пипсов ниже виртуального SL #1
0.1 lots BUY #2 2.00000 1.99500 0.2 lots BUY 1.99000 Виртуальный ордер #2 имеет близкий SL, поэтому
DPSL делается ближе на 50 пипсов выше виртуального SL #2
Close #2     0.1 lots BUY 1.98500 Вернуться к старому DPSL
0.1 lots SELL #3 2.00000 2.00500 нет нет Виртуальные ордера #1 и #3 как противоположные
"компенсируют" друг друга на сервере

Close #1     0.1 lots SELL 2.01000 Виртуальный ордер #3 остается открытым,
DPSL теперь на 50 пипсов выше виртуального SL #3


7. Тестируем Virtual Order Manager

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

На рис. 6, представленном ниже, показана ситуация с виртуальными ордерами buy 0.1 лота для двух советников, открытых в окнах EURUSD M5 и EURUSD H4. Во вкладке "Торговля" правильно отображается одна позиция buy объемом 0.2 лота, открытая на сервере. Поскольку результирующая позиция длинная, защитный стоп DPSL, как видно, находится ниже стопа в 20 пунктов.

Figure 6. Two EAs agreeing on direction

Рисунок 6. Работа двух советников, открывших позицию в одном направлении

На рис. 7 показаны два тестовых советника, открывших противоположные виртуальные ордера, при этом суммарная позиция нулевая:

Figure 7. Two EAs with opposing virtual orders and no position is open at the broker

Рисунок 7. Работают два советника с противоположно направленными позициями, результирующая позиция у брокера нулевая


8. Очень простое отображение всех ордеров, открытых VOM

Поскольку каждый советник может видеть свои собственные ордера, поэтому я написать очень простого советника, который собирает открытые ордера со всех VOM. Отображение очень простое, если позволит время, напишу улучшенную версию, возможно с кнопками, при помощи которых можно будет модифицировать, удалять или закрывать каждый из ордеров. Этот советник VOM_OrderDisplay.mq5 включен в поставку.


9. Выводы

На момент написания данной статьи - это бета-версия Virtual Order Manager, как и терминала MetaTrader 5, время покажет, станет ли концепция VOM популярной, или же это окажется всего лишь интересным применением языка MQL5.

Еще раз вернемся к целям, которые были упомянуты в разделе 3:

  1. Прозрачность: поведение советников, написанных корректно с использованием торговых функций VOM, изолировано от деятельности других советников.
    • Результат - да, цель достигнута в рамках подхода VOM.
  2. Робастность: элегантная обработка исключительных событий, таких как ошибки потери соединения с торговым сервером и неполное исполнение ордеров.
    • Результат - некоторая надежность очевидна, однако, возможно, могут понадобиться улучшения - нужно анализировать ситуации, которые могут возникнуть в реальной торговле
  3. Легкость в использовании: предоставление простых и хорошо документированных торговых функций.
    • Результат - см. ниже описание файлов поставки, также включена подробная документация в виде файла справки vom-doc.chm
  4. Возможность использования в тестере стратегий терминала
    • Результат - предварительные испытания, проведенные с помощью недавно выпущенного тестера стратегий, показывают, что в тестере VOM работает правильно, хотя и значительно замедляет процесс тестирования. Вероятно, понадобится определенная работа для ускорения этого процесса.

Улучшения, которые желательно сделать в будущих версиях:

  • При разработке любого достаточно сложного программного обеспечения в коде бывают ошибки, возможно, они еще остались.
  • С выходом каждого нового билда MetaTrader 5, для сохранения совместимости, возможно, понадобится модификация кода VOM.
  • Реализовать функции VomGetLastError() и VomErrorDescription().
  • Возможность читать конфигурацию из файла.
  • Реализовать различные типы трейлинга стопов.

10. Файлы поставки, прилагаемые в архиве

Поставка библиотеки Virtual Order Manager включает несколько .mqh-файлов, которые должны быть в папке  \Experts\каталог Virtual Order Manager\:

  • ChartObjectsTradeLines.mqh - классы CEntryPriceLine, CStopLossLine, CTakeProfitLine;
  • StringUtilities.mqh - полезные функции, такие как ErrorDescription();
  • Log.mqh - класс CLog;
  • GlobalVirtualStopList.mqh - класс CGlobalVirtualStopList;
  • SimpleChartObject.mqh - CButton, CLabel and CEdit;
  • VirtualOrder.mqh - CVirtualOrder;
  • GlobalVariable.mqh - CGlobalVariable;
  • VirtualOrderArray.mqh - CVirtualOrderArray;
  • VirtualOrderManager.mqh - CVirtualOrderManager;
  • VirtualOrderManagerConfig.mqh - CConfig;
  • VirtualOrderManagerEnums.mqh - различные перечисления, определяемые для VOM
  • VOM_manual.mqh - для файла справки по библиотеке
  • VOM_doc.chm - файл справки ***

В каталог Experts\Virtual Order Manager\VOM EAs также включены пять советников в виде .mq5 файлов:

  • VOM_template_EA.mq5 - шаблон для создания советников с VOM, создайте его копию и поместите в каталог Experts\Virtual Order Manage\VOM EAs
  • VirtualOrderManagerTester.mq5
  • Support_Resistance_EA_VOM.mq5
  • FrAMA_Cross_EA_VOM.mq5
  • VOM_OrderDisplay.mq5 

***Возможно, для чтения документации понадобится разблокировать файл VOM_doc.chm: