Главный враг всех алготрейдеров, как известно, просадка. Чего они только не делают, чтобы ее избежать!
— диверсифицируют свою стратегию по 30 инструментам на 10 таймфреймах с 15 наборами параметров
— мучают оптимизатор миллиардами прогонов до тех пор, пока все убыточные сделки не исчезнут
— убирают стопы, включают сетку и добавляют мартина, чтобы просадок не было видно ну хотя бы по балансу
— ну и продолжают, конечно же, поиск Грааля, который обязательно должен расти под 45 градусов вверх 365 дней в году...
Полагаю, все (или почти все) эти приемы либо очень сильно мешают им зарабатывать, либо ведут к неизбежному сливу. Потому что стратегия, которая будет стабильно прибыльной из года в год и имеет ограничение мах. убытка, НЕ МОЖЕТ быть без просадок. Чем сильнее пытаешься от них избавиться, тем выше подгонка под историю, и, как следствие, вероятность слива.
Полагаю, что проблема просадок заключается не в несовершенстве торгового алгоритма, а в неправильном управлении капиталом. Что делает типичный алготрейдер, когда его счет растет? Разумеется, постепенно повышает торговый объем. А что обычно случается со всеми системами (особенно трендовыми) после того, как они дают существенную прибыль? Конечно же, они уходят в просадку! Потому что после любого сильного движения на рынке наступает консолидация, в которой система теряет.
Что получаем в итоге:
период хорошего для системы рынка --> рост счета --> повышение объема --> период плохого рынка --> заход в просадку на повышенном объеме --> повышенный размер просадки --> снижение размера счета --> снижение объема --> более длительный выход из просадки на малом объеме.
Этому подходу можно было бы противопоставить торговлю фиксированным объемом, которая почти всегда дает менее глубокие просадки и более быстрые выходы из них (т.е. более высокий фактор восстановления). Но как тогда вообще повышать объем с ростом депозита?
И здесь конечно же вспоминается нетленная картинка:

Ведь ее можно применять не только к торговле, но и… к управлению капиталом в алготрейдинге!
Например, так:
1. Начнем торговлю фиксированным лотом.
2. Как только будет достигнута минимальная величина просадки, поднимем лот до нового значения баланса (максимального, до начала просадки)
3. Если просадка еще значительно углубится, поднимем лот еще раз.
Тогда сценарий полностью поменяется:
период хорошего для системы рынка --> рост счета --> период плохого рынка --> заход в просадку на малом объеме --> сниженный размер просадки --> снижение размера счета --> повышение объема --> более быстрый выход из просадки на повышенном объеме.
Ладно, хватит болтать, давайте проверим все это на цифрах! Берем вот такую систему за 6 лет (2018-2024) на крипте, начинаем с депозита 8000$ и торгуем фиксированный лот=4 (фикс. размер позиции, если быть точнее, потому что лот конечно же нормируется на цену, иначе риск будет плавать с изменением цены):

1205 сделок. Получаем с учетом комиссий
115 000$ прибыли при просадке
4000$, ФВ=
28.5. Фикс.лот — это своего рода эталон для анализа торговых систем. Любой метод реинвестирования повысит прибыль, но ухудшит отношение прибыли к просадке (ФВ).
Начнем с классического метода, % от депозита. Будем торговать 4 лота на каждые 20 000$ баланса:
Прибыль: 1 686 000 $
Мах просадка: 162 000 $
ФВ: 10.4
Прибыли конечно больше, но фактор резко упал. Качество снизилось.
Что если мы
не будем снижать объем на просадке, чтобы выйти из нее быстрее? Т.е. лот зависит от мах.баланса, а не от текущего:

Это конечно более агрессивный подход, поэтому, чтобы адекватно сравнить его с предыдущим, я снизил стартовый риск таким образом, чтобы получить в итоге такую же прибыль. Тогда мы можем сравнить, какой подход даст меньшую просадку.
Прибыль: 1 690 000 $
Мах просадка: 159 000 $
ФВ: 10.6
Просадка совсем чуть-чуть ниже. Получше, но не убедительно. Давайте попробуем теперь повышать объем до заданного при достижении определенного уровня просадки. Какого? Посмотрим на график просадок фикс.лота (просадки умножены на 10 для масштаба):
Мы видим, что уровень в 800$ захватит подавляющую часть заметных просадок. А уровень 1500$ мог бы быть дополнительным, т.к. он захватывает бОльшую часть более глубоких. Пробуем повышать лот на просадке 800 (для этого мы, разумеется, виртуально считаем эквити на фикс.лоте), опять нормируя риск, чтобы добиться одинаковой прибыли:
Прибыль: 1 680 000 $
Мах просадка: 148 000 $
ФВ: 11.4
Совсем другое дело! Видим значительно повышение ФВ и заметное снижение мах. просадки.
Попробуем повышать риск на просадке в 1000:
Прибыль: 1 680 000 $
Мах просадка: 153 000 $
ФВ: 11
Результат похуже. Пробуем повышать на 1200:
Прибыль: 1 682 000 $
Мах просадка: 156 000 $
ФВ: 10.8
Еще хуже. На 1500:
Прибыль: 1 687 000 $
Мах просадка: 166 000 $
ФВ: 10.2
Снова ухудшение! Очень похоже, что излишняя консервативность не позволяет использовать потенциал стратегии. В последнем варианте частота реинвестирования получается 1-2 раза в год. Видимо, это слишком мало.
А что если на первом значении просадки (800) повышать риск только до половины мах.баланса, а на втором (1500) до максимального? Пробуем:
Прибыль: 1 685 000 $
Мах просадка: 151 000 $
ФВ: 11.1
Тоже хороший результат, очень близкий к лучшему (1 просадка на 800), но все же слабее.
Сведем все результаты в таблицу:

Как видим, лучший результат при разовом реинвесте на просадке 800. Он заметно обходит стандартный. Ближайший к нему на просадках 800 и 1500.
На практике я решил использовать второй результат, потому что он психологически комфортнее (ты знаешь, что если уйдет глубже, тебе есть, что докинуть) и потому что, конечно же, просадки в будущем всегда больше, чем они были в прошлом :) (даже если бы не было переподгонки, а она в какой-то степени всегда неизбежна).
А сейчас оставлю вам код во включаемом файле MQL5, чтобы вы могли попробовать эти стратегии в своих советниках. В самом файле BalanceIncOnDD.mqh (его разумеется в папку /include) выберите из списка нужный вам режим ММ и задайте значения для 1й и 2й просадок:
enum LotCalcMode{AdjLotByBalance, AdjLotByMaxBalance, AdjLotIn1DD, AdjLotIn2DDs}; //варианты ММ
LotCalcMode MMmode=AdjLotByBalance; //режим ММ
#define DDsize1 800 //просадка для первого увеличения лота
#define DDsize2 1500 //для второго
Включите его в код своего советника:
#include <BalanceIncOnDD.mqh>
В функцию OnTick() добавьте расчет ММ по текущему балансу:
void OnTick()
{
LookForBalanceDDs(BalanceNorm);
}
где BalanceNorm — величина баланса, на которую нормируется ваш лот (при Lot=4 торгуется по 4 лота на каждые BalanceNorm баланса, в моем случае +-20k).
Лот для сделки установите следующим выражением:
double currlot=NormalizeDouble(Lot*PriceNorm/Bid, 2);
if(AdjustLotByBalance)currlot=NormalizeDouble(currlot*BalanceToCalcLot/BalanceNorm, 2);
где AdjustLotByBalance это режим роста лота с ростом баланса, а PriceNorm — цена актива, по которой нормируется лот (у меня 3000 для Эфира).
Наконец, в функцию OnTester() добавьте отрисовку графиков с просадками (будет в визуализаторе) и вывод всех случаев появления просадок (в логах) указанных размеров:
double OnTester()
{
OnTesterBalance(!AdjustLotByBalance);
}
Файл с кодом оставляю в блоге mql, здесь нельзя прикрепить его к посту.
В следующей записи я расскажу, как этот подход показал себя в реальной торговле.
С уважением