Обсуждение статьи "Разрабатываем мультивалютный советник (Часть 2): Переход к виртуальным позициям торговых стратегий"

 

Опубликована статья Разрабатываем мультивалютный советник (Часть 2): Переход к виртуальным позициям торговых стратегий:

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

В прошлой статье мы начали разработку мультивалютного советника, работающего одновременно с различными торговыми стратегиями. На первом этапе различных стратегий было всего две. Они представляли реализацию одной и той же торговой идеи, работали на одинаковом торговом инструменте (символе) и периоде графика (таймфрейме). Отличались же они между собой только числовыми значениями параметров.

Также мы определили оптимальный размер открываемых позиций исходя из желаемого максимального уровня просадки (10% от депозита). Мы сделали это для каждой стратегии по отдельности. Когда мы объединили две стратегии вместе, то для удержания заданного уровня просадки нам пришлось уменьшить размер открываемых позиций. Для двух стратегий уменьшение было небольшим. Но что, если мы захотим объединить десятки или сотни экземпляров стратегий? Вполне может случиться, что у каких-то стратегий придется уменьшить размер позиций до значения, меньшего чем минимальный размер открываемых позиций, позволенный брокером. В этом случае эти стратегии просто не смогут участвовать в торговле. Как же всё-таки заставить их работать?

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

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

Автор: Yuriy Bykov

 

Не дочитал пока. По входным хороший пример получился.

1.

input string      symbol_              = "EURGBP";    // Торговый инструмент (символ)
input ENUM_TIMEFRAMES timeframe_       = PERIOD_H1;   // Период графика

input group "===  Параметры сигнала к открытию"
input int         signalPeriod_        = 13;    // Количество свечей для усреднения объемов
input double      signalDeviation_     = 0.3;   // Относ. откл. от среднего для открытия первого ордера
input double      signaAddlDeviation_  = 1.0;   // Относ. откл. от среднего для открытия второго и последующих ордеров

input group "===  Параметры отложенных ордеров"
input int         openDistance_        = 0;     // Расстояние от цены до отлож. ордера
input double      stopLevel_           = 10500; // Stop Loss (в пунктах)
input double      takeLevel_           = 465;   // Take Profit (в пунктах)
input int         ordersExpiration_    = 1000;  // Время истечения отложенных ордеров (в минутах)

input group "===  Параметры управление капиталом"
input int         maxCountOfOrders_    = 3;     // Макс. количество одновременно отрытых ордеров
2. 
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));
   expert.Add(new CSimpleVolumesStrategy(
                         symbol_, timeframe_,
                         fixedLot_,
                         signalPeriod_, signalDeviation_, signaAddlDeviation_,
                         openDistance_, stopLevel_, takeLevel_, ordersExpiration_,
                         maxCountOfOrders_)
                     );       // Добавляем один экземпляр стратегии

   return(INIT_SUCCEEDED);
}
3.
class CSimpleVolumesStrategy : public CStrategy {
private:
   //---  Параметры сигнала к открытию
   int               m_signalPeriod;       // Количество свечей для усреднения объемов
   double            m_signalDeviation;    // Относ. откл. от среднего для открытия первого ордера
   double            m_signaAddlDeviation; // Относ. откл. от среднего для открытия второго и последующих ордеров

   //---  Параметры отложенных ордеров
   int               m_openDistance;       // Расстояние от цены до отлож. ордера
   double            m_stopLevel;          // Stop Loss (в пунктах)
   double            m_takeLevel;          // Take Profit (в пунктах)
   int               m_ordersExpiration;   // Время истечения отложенных ордеров (в минутах)

   //---  Параметры управление капиталом
   int               m_maxCountOfOrders;   // Макс. количество одновременно отрытых ордеров

4.

public:
   //--- Публичные методы
   CSimpleVolumesStrategy(
      string           p_symbol,
      ENUM_TIMEFRAMES  p_timeframe,
      double           p_fixedLot,
      int              p_signalPeriod,
      double           p_signalDeviation,
      double           p_signaAddlDeviation,
      int              p_openDistance,
      double           p_stopLevel,
      double           p_takeLevel,
      int              p_ordersExpiration,
      int              p_maxCountOfOrders
   ); 

5-6.

//+------------------------------------------------------------------+
//| Конструктор                                                      |
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   double           p_fixedLot,
   int              p_signalPeriod,
   double           p_signalDeviation,
   double           p_signaAddlDeviation,
   int              p_openDistance,
   double           p_stopLevel,
   double           p_takeLevel,
   int              p_ordersExpiration,
   int              p_maxCountOfOrders) :
   // Список инициализации
   CStrategy(p_symbol, p_timeframe, p_fixedLot), // Вызов конструктора базового класса
   m_signalPeriod(p_signalPeriod),
   m_signalDeviation(p_signalDeviation),
   m_signaAddlDeviation(p_signaAddlDeviation),
   m_openDistance(p_openDistance),
   m_stopLevel(p_stopLevel),
   m_takeLevel(p_takeLevel),
   m_ordersExpiration(p_ordersExpiration),
   m_maxCountOfOrders(p_maxCountOfOrders) {
   ArrayResize(m_orders, m_maxCountOfOrders);

   // Загружаем индикатор для получения тиковых объемов
   iVolumesHandle = iVolumes(m_symbol, m_timeframe, VOLUME_TICK);

// Устанавливаем размер массива-приемника тиковых объемов и нужную адресацию
   ArrayResize(volumes, m_signalPeriod);
   ArraySetAsSeries(volumes, true);
}

Каждый входной параметр нужно прописать пять-шесть раз.

 
Сравнивая эти результаты с результатами аналогичного советника, но не использующего виртуальные позиции, можно отметить улучшение некоторых показателей: немного увеличилась прибыль и уменьшилась просадка, подрос коэффициент Шарпа и профит-фактор.
Грубо говоря, перешли от хеджа к неттингу, получив соответствующие стат. "улучшения". Например, уменьшение объемов, на которые начислялись свопы.
 

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


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

Мощное замечание, после которого нет смысла критиковать, а следует сразу переходить к конструктивной части - предлагать.


В статье рассматривается концепция виртуальной торговли с последующей односторонней синхронизацией виртуальной торговли с реальной. В качестве примера для Тестера - пойдет. Но только примера.

На практике такой портфель ТС собирается из EX5 (достаются из Маркета бесплатно для Тестера) - прогнали, получили tst-файлы одиночных проходов, из них сделали совместный одиночный прогон с любыми правилами ММ.


Для Тестера нужна скорость. Попробуйте оценить, насколько изменяется скорость оптимизации для варианта с виртуалкой и без.


Сама концепция хороша для реальной торговли. Но там для синхронизатора придется вести и историю виртуальной торговли. Да много всего. Серьезный путь, мягко говоря.


Архитектурно виртуалку отвязал бы от ТС. У меня только текущий исходник виртуалки 350 Кб. И будет расти.


Тщательно подойдите к выбору торгового API для виртуальной торговли. Повыбирайте из имеющихся. Логично отдать предпочтение тому API, на котором получается максимально легко запрограммировать ТС. Сам не очень понимаю распространенную практику всех торговых платформ изобретать свой велосипед - торговый API. Наделять его ООП-сущностями "из коробки" и т.д. В этом смысле MQ пошли хорошим путем - все API без ООП.

 

Прежде, чем читать подобные статьи, всегда смотрю на результаты тестирования. Хотя бы в тестере. Увидел 19% профита за 5 лет и на душе стало светло и радостно! Это гораздо больше, чем у автора 75 статей по нейросетям! ))

Зато теперь ясно, как гарантированно заработать на форексе. Раньше я думал, только обучать лохов на волнах Эллиота, но оказывается, есть еще отличный способ )).

 
fxsaber #:

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

Спасибо большое за интерес и конструктивные замечания. Я их стараюсь учесть и использовать, насколько возможно. Отвечу более подробно позже, сейчас не успеваю.

 
Alexey Volchanskiy #:

Прежде, чем читать подобные статьи, всегда смотрю на результаты тестирования. Хотя бы в тестере. Увидел 19% профита за 5 лет и на душе стало светло и радостно! Это гораздо больше, чем у автора 75 статей по нейросетям! ))

Зато теперь ясно, как гарантированно заработать на форексе. Раньше я думал, только обучать лохов на волнах Эллиота, но оказывается, есть еще отличный способ )).

Не могу тут удержаться, чтобы не отметить, что 19% прибыли за пять лет на тесте сделаны постоянным лотом в условиях просадки менее $1000, то есть 1%. При ориентировании на максимальную просадку даже в 10% и использовании переменного лота результаты будут выглядеть еще интереснее.

 
//+------------------------------------------------------------------+
//|                                    SimpleVolumesExpertSingle.mq5 |
//|                                      Copyright 2024, Yuriy Bykov |
//|                            https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Yuriy Bykov"
#property link      "https://www.mql5.com/ru/articles/14107"
#property description "Советник отложенный ордер в тот момент, когда тиковый объем свечи превышает средний объем,"
#property description "в направлении текущей свечи."
#property description "Если ордера еще не превратились в позиции, то они удаляются по времени истечения."
#property description "Открытые позиции закрываются только по SL или TP."

#include "Advisor.mqh"
#include "SimpleVolumesStartegy.mqh"

Опечатка.

 
fxsaber #:

Опечатка.

Да, исправлял-исправлял её в нескольких местах, и всё равно кое-где осталась.

 
fxsaber #:

На практике такой портфель ТС собирается из EX5 (достаются из Маркета бесплатно для Тестера) - прогнали, получили tst-файлы одиночных проходов, из них сделали совместный одиночный прогон с любыми правилами ММ.

Такой вариант еще не рассматривал, буду иметь ввиду, что так тоже можно. Правда, если получится подобрать хороший набор готовых советников с маркета, то как потом их использовать совместно? Просто запустить с подобранными параметрами ММ весь набор?

 
fxsaber #:

Для Тестера нужна скорость. Попробуйте оценить, насколько изменяется скорость оптимизации для варианта с виртуалкой и без.

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

Я всё собираюсь более подробно заняться использованием вашей библиотеки Virtual для ускорения тестирования, но пока не дошёл. Основная причина в том, что привык уже к торговым функциям MT5, хотя когда приходилось в свое время переделывать свои советники с MT4 на MT5, тоже было много неудобств с этим связано, а про Virtual я узнал уже позже.

Теперь рассматриваю возможность сделать дочерний класс от CReceiver, который будет использовать виртуальное окружение.

Причина обращения: