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

 

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

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

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

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

Автор: Yuriy Bykov

 

Когда я запускаю советник SimpleVolumesExpert с (3+3+3) и масштабированием 2.18, в логе отображаются открытые виртуальные сделки, но реальных сделок в тестере стратегий нет. Может я что-то упустил?

 
Nigel Philip J Stephens #:

Когда я запускаю советник SimpleVolumesExpert с (3+3+3) и масштабированием 2.18, в логе отображаются открытые виртуальные сделки, но реальных сделок в тестере стратегий нет. Может я что-то упустил?

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

Есть ли реальные сделки, если советник запускать с другими вариантами группировки стратегий?

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

Добрый день. Спасибо за Ваш труд. Меня очень заинтересовала Ваша архитектура, и я, стараюсь поэтапно в ней разобраться. Я изменил лишь класс стратегии - использую свой. Но на этом этапе возникли трудности с масштабированием стратегии. Для чистоты эксперимента я использовал один экземпляр стратегии и два варианта множителя scale_ 1 и 2 (fixedBalance_ = 0;). В обоих случаях результат одинаков - размер лота не меняется. Место в коде, где определяется размер лота

//+------------------------------------------------------------------+
//| Определение реального размера виртуальной позиции                |
//+------------------------------------------------------------------+
double CMoney::Volume(CVirtualOrder *p_order) {
   // Запрашиваем нормированный баланс стретегии для этой виртуальной позиции 
   double fittedBalance = p_order.FittedBalance();
   
   // Если он равен 0, то реальный объем равен виртуальному
   if(fittedBalance == 0.0) {
      return p_order.Volume();
   }
   
   // Иначе находим величину общего баланса для торговли
   double totalBalance = s_fixedBalance > 0 ? s_fixedBalance : AccountInfoDouble(ACCOUNT_BALANCE);
   
   // Возвращаем вычисленный реальный объем по виртуальному
   return p_order.Volume() * totalBalance * s_depoPart / fittedBalance ;
}
//+------------------------------------------------------------------+

однако в конструкторе виртуальной стратегии параметры m_fittedBalance и m_fixedLot заданы по умолчанию

//+------------------------------------------------------------------+
//| Конструктор                                                      |
//+------------------------------------------------------------------+
CVirtualStrategy::CVirtualStrategy(double p_fittedBalance = 0,
                                   double p_fixedLot = 0.01) :
   m_fittedBalance(p_fittedBalance),
   m_fixedLot(p_fixedLot) {}

поэтому размер лота не меняется

// Если он равен 0, то реальный объем равен виртуальному
   if(fittedBalance == 0.0) {
      return p_order.Volume();
   }

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

 

Здравствуйте.

Всё правильно, для торговли переменным лотом необходимо, чтобы экземпляру стратегии задавалось значение параметра m_fittedBalance > 0. Это делают наследники базового класса торговой стратегии. Им предаётся этот параметр, а они его подставляют в вызов конструктора CVirtualStrategy:

class CSimpleVolumesStrategy : public CVirtualStrategy {
...

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

   ...
};

...

//+------------------------------------------------------------------+
//| Конструктор                                                      |
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   ...
   int              p_maxCountOfOrders,
   double           p_fittedBalance = 0) :
// Список инициализации
   CVirtualStrategy(p_fittedBalance, 0.01),
   m_symbol(p_symbol),
   m_timeframe(p_timeframe),
   ...
}

При создании экземпляров мы указываем конкретное значение для последнего параметра, чтобы в него не подставлялось значение по умолчанию, равное 0:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   // Устанавливаем параметры в классе управления капиталом
   CMoney::DepoPart(expectedDrawdown_ / 10.0);
   CMoney::FixedBalance(fixedBalance_);

   // Создаем эксперта, работающего с виртуальными позициями
   expert = new CVirtualAdvisor(magic_, "SimpleVolumes_" + EnumToString(group_));

   // Создаем и наполняем массив из всех экземпляров стратегий
   CVirtualStrategy *strategies[] = {
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  13, 0.3, 1.0, 0, 10500,  465,  1000, 3, 1600),
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  17, 1.7, 0.5, 0, 16500,  220,  1000, 3,  900),
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  51, 0.5, 1.1, 0, 19500,  370, 22000, 3, 1600),

     ...
   };

   ...

   return(INIT_SUCCEEDED);
}

В советнике SimpleVolumesExpertSingle.mq5 мы этого не делаем, так как оптимизация выполняется только на фиксированном начальном размере позиций. Обратите внимание, что параметр не m_fixedLot не обязан в стратегии использоваться исключительно как размер всех открываемых виртуальных позиций. Это просто некоторое базовое значение, от которого мы можем вычислять любые другие. В модельной стратегии в статье просто размеры всех позиций одинаковы и этот параметр используется без преобразований. Но ничто не мешает в другой стратегии открыть виртуальную позицию размером 10*m_fixedLot и потом применять её постепенное закрытие.

 
Yuriy Bykov #:

Здравствуйте.

Всё правильно, для торговли переменным лотом необходимо, чтобы экземпляру стратегии задавалось значение параметра m_fittedBalance > 0. Это делают наследники базового класса торговой стратегии. Им предаётся этот параметр, а они его подставляют в вызов конструктора CVirtualStrategy:

При создании экземпляров мы указываем конкретное значение для последнего параметра, чтобы в него не подставлялось значение по умолчанию, равное 0:

В советнике SimpleVolumesExpertSingle.mq5 мы этого не делаем, так как оптимизация выполняется только на фиксированном начальном размере позиций. Обратите внимание, что параметр не m_fixedLot не обязан в стратегии использоваться исключительно как размер всех открываемых виртуальных позиций. Это просто некоторое базовое значение, от которого мы можем вычислять любые другие. В модельной стратегии в статье просто размеры всех позиций одинаковы и этот параметр используется без преобразований. Но ничто не мешает в другой стратегии открыть виртуальную позицию размером 10*m_fixedLot и потом применять её постепенное закрытие.

Здравствуйте. Спасибо за быстрый ответ. Разобрался. Не сразу зметил, что последний параметр добавлен, так как я использовал свой класс стратегии - а там немного другой набор параметров.