Когда вы начинаете торговать более чем одним алгоритмом на своём счете, встает вопрос “а какие риски задать этим алгоритмам” ? Обычный подход предполагает установку лотности, исходя из максимальной исторической просадки. Но что если эти алгоритмы уходят в просадку в одно время? Получается что просадка удваивается. Когда алгоритмов становится много, задачу оптимизации распределения рисков по системам становится слишком объемной и сложной для простого визуального анализа.
Для решения этой задачи нет стандартного инструмента внутри самого TSLab. Поэтому мы поступим радикально – объединим все системы на одном инструменте в одну и построим общий график доходности и получим общие параметры для портфеля систем.
Какие это даёт преимущества
- Минимизация общей просадки
- Увеличение доходности и фактора восстановления за счёт более эффективной загрузки капитала
- Визуализация работы портфеля на истории, прогнозирование и сравнение общей доходности портфеля
- Возможность подобрать алгоритмы для более ровной эквити
Думаю, очевидно, что данный подход поможет увеличить доход, уменьшив просадку за чет оптимизации долей на истории.
Перейдем к реализации
В целом, процесс объединения нескольких алгоритмов не сложен. Берем любой из них и добавляем остальные через копировать-вставить. Переносить общие блоки не нужно. Такими блоками могут быть: Источник, Комиссия, OHLC, Время и т.д.
Если алгоритмы используют разные тайм-фреймы, то это может внести сложность в реализацию портфеля. При использовании блока Сжатие мы сможем настроить работу сигналов на разные тайм-фреймы, но стопы будут выставляться по пересчету на наименьшем тайм-фрейме, то есть может возникнуть ситуация, что в алгоритме на 15м стоп должен выставиться через 15м, а при базовом тайм-фрейме 1м и сжатии в 15м будет выставлен через 1м.
После того, как перенесены алгоритмы, нужно добавить константы для задания лотности каждой системы. Эти константы подсоединяем к блокам открытия позиции (вход Количество). Если в системе задание лотности происходит через рассчет, в зависимости от величины депозита, то задаём величину депозита через константу, а оптимизировать будем процент риска. В параметрах алгоритма задаем общий размер депозита.
После того, как вы перенесли все блоки, встаёт еще одна задача – запретить открытие разнонаправленных позиций внутри каждой отдельной системы. Если в отдельной системе мы могли на условие входа подать проверку на наличие открытых позиций, то в случае, когда на одном Источнике несколько систем, такая проверка будет действовать на все системы и не даст открыть вторую позицию, если она открыта в другой системе. Нашей задачей является независимый учёт позиций между системами. Решается эта задача с помощью хитрости. Нужно собрать вот такой блок.
В данном блоке мы записываем в Обновляемое значение 1 цену входа лонга, в Обновляемое значение 2 цену входа шорта при открытии противоположной позиции проверяем наличие этой позиции через проверку ОЗ при открытии позы. Надеюсь, не запутались. Смотрите скрин. Очищаем ОЗ, когда обе позы закрыты, то есть сумма цен открытия равна нулю. Почему так сложно? Потому что простую проверку типа ЦенаВхода1 лонга нельзя подать на условия входа для шорта и при этом ЦенаВхода2 шорта подать на условие для лонга.
Такой блок нужно подсоединить к каждой системе.
Оптимизация и результаты портфеля роботов
Теперь проверяем как работает каждая система внутри портфеля роботов. Заходим в Оптимизацию, переносим все параметры из оригинальных систем. Затем по-очереди ставим все лотности кроме одной системы равными нулю и смотрим как работает каждая система, сравниваем с оригиналом. Если все сходится, тогда уже выбираем все параметры лотностей систем и оптимизируем на истории. В итоге получим оптимальную лотность для каждой системы в портфеле. В результатах оптимизации сможете выбрать что вам нравится больше – низкая просадка или высокая прибыль. Или, может быть, самая гладкая эквити.
Вот мой результат объединения 3 систем на фьючерсе Si в портфель 500 000 руб.