Ознакомьтесь с новой статьей: Разработка мультивалютного эксперта (часть 5): Переменные размеры позиций.
Автор: Юрий Быков
Когда я запускаю советник SimpleVolumesExpert с (3+3+3) и масштабированием 2.18, в логе отображаются открытые виртуальные сделки, но реальных сделок в тестере стратегий нет. Может я что-то упустил?
Когда я запускаю советник 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 и потом применять её постепенное закрытие.
Здравствуйте.
Всё правильно, для торговли переменным лотом необходимо, чтобы экземпляру стратегии задавалось значение параметра m_fittedBalance > 0. Это делают наследники базового класса торговой стратегии. Им предаётся этот параметр, а они его подставляют в вызов конструктора CVirtualStrategy:
При создании экземпляров мы указываем конкретное значение для последнего параметра, чтобы в него не подставлялось значение по умолчанию, равное 0:
В советнике SimpleVolumesExpertSingle.mq5 мы этого не делаем, так как оптимизация выполняется только на фиксированном начальном размере позиций. Обратите внимание, что параметр не m_fixedLot не обязан в стратегии использоваться исключительно как размер всех открываемых виртуальных позиций. Это просто некоторое базовое значение, от которого мы можем вычислять любые другие. В модельной стратегии в статье просто размеры всех позиций одинаковы и этот параметр используется без преобразований. Но ничто не мешает в другой стратегии открыть виртуальную позицию размером 10*m_fixedLot и потом применять её постепенное закрытие.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Разрабатываем мультивалютный советник (Часть 5): Переменный размер позиций:
В предыдущих частях разрабатываемый советник имел возможность использовать только фиксированный размер позиций для торговли. Это допустимо для тестирования, но нежелательно при торговле на реальном счёте. Давайте обеспечим возможность торговли с переменным размером позиций.
В предыдущей части мы добавили возможность восстановления состояния советника после перезапуска. Не важно, в чём была причина — перезагрузка терминала, смена таймфрейма на графике с советником, запуск более свежей версии советника — во всех случаях восстановление состояния позволяло не начинать советнику работу с нуля и не терять уже открытые позиции, а продолжать их обработку.
Однако размер открываемых позиций для каждого экземпляра стратегии оставался на протяжении всего периода тестирования одинаковым. Их размер задавался при старте советника. Если в результате работы советника баланс торгового счёта возрастал, то это позволяло бы использовать увеличенный размер позиций без повышения риска. Такой возможностью желательно воспользоваться, поэтому приступим к реализации использования переменного размера позиций.
Автор: Yuriy Bykov