Стоп и разворот против сложных выходов: 378 000 бэктестов

 

Кевин Дж. Дэйви сравнивает простой выход по противоположному сигналу с трейлинг-стопами, ATR-стопами и другими способами закрытия позиции. Историческая выборка: 2010–2020 годы.

В предыдущем исследовании я провёл более 500 000 бэктестов алгоритмических стратегий, чтобы выяснить, какой способ выхода показывает лучшие результаты. Я рассмотрел следующие варианты.

Простые выходы

1. Выход «стоп и разворот»

2. Выход, основанный на времени

3. Стоп-лосс, выраженный в фиксированной сумме в долларах

4. Тейк-профит, выраженный в фиксированной сумме в долларах

5. Стоп-лосс и тейк-профит, выраженные в фиксированной сумме в долларах

6. Стоп-лосс, основанный на ATR

7. Тейк-профит, основанный на ATR

8. Стоп-лосс и тейк-профит, основанные на ATR

Выходы средней сложности

9. Скользящий стоп-лосс

10. Стоп-лосс на уровне безубыточности

Сложные стопы

11. Параболический стоп-лосс

12. Chandelier стоп-лосс

13. Стоп-лосс Yo-Yo

14. Выход, основанный на канале

15. Выход, основанный на скользящей средней

Комбинированные выходы

16. Тейк-профит, выраженный в фиксированной сумме в долларах, + стоп-лосс на уровне безубыточности

17. Тейк-профит, выраженный в фиксированной сумме в долларах, + скользящий стоп-лосс

18. Стоп-лосс, выраженный в фиксированной сумме в долларах, + выход на уровне безубыточности

19. Стоп-лосс, выраженный в фиксированной сумме в долларах, + скользящий стоп-лосс

20. Стоп-лосс/тейк-профит, выраженный в фиксированной сумме в долларах, + выход на уровне безубыточности

21. Стоп-лосс/тейк-профит, выраженный в фиксированной сумме в долларах, + скользящий стоп-лосс

Каждый из этих выходов я протестировал с 5 разными входами:

1. Простой импульсный вход

If close>close[InputVar2] then buy next bar at market;
If close<close[InputVar2] then sell short next bar at market;

2. Вход на следующем баре после пробоя

If high=highest(high,InputVar2) then buy next bar at market;
If low=lowest(low,InputVar2) then sell short next bar at market;

3. Вход при пересечении скользящей средней

If close crosses above average(close,InputVar2) then buy next bar at market;
If close crosses below average(close,InputVar2) then sell short next bar at market;

4. Вход по полосам Боллинджера

If close crosses above BollingerBand(close, InputVar2, -2) then buy next bar at market;
If close crosses below BollingerBand(close, InputVar2, +2) then sell short next bar at market;

5. Вход по волатильности

If Close> close[1] + AvgTrueRange(InputVar2) * 1.5 then buy next bar at market;
If Close< close[1] – AvgTrueRange(InputVar2) * 1.5 then sellshort next bar at market;

Из 21 способа выхода лучшим оказался простой «стоп и разворот» — Stop & Reverse. При таком подходе противоположный сигнал закрывает текущую позицию и открывает позицию в другую сторону.

Я ожидал другого результата. Судя по комментариям, многие читатели тоже были удивлены.

В конце исследования я объявил конкурс Exit Challenge: предложил читателям прислать варианты выхода, которые, по их мнению, могли бы превзойти простой «стоп и разворот».

Отклик был хорошим: заявки поступили со всего мира. Я добавил несколько собственных вариантов и в итоге протестировал 13 новых способов выхода.

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

Скользящие стопы

Стопы, основанные на ATR

Стопы в виде фиксированной суммы в долларах

Хорош ли трейлинг-стоп?

Трейлинг-стоп следует за ценой: для длинной позиции защитный уровень располагается ниже текущей цены. Если рынок достаточно сильно движется против позиции, стоп закрывает её.

Такой стоп используют для ограничения убытка или защиты накопленной прибыли.

Например, в длинной позиции можно подтягивать стоп на $500 ниже последнего минимума. По мере роста цены и появления более высоких минимумов стоп тоже поднимается, сохраняя заданный отступ. Так можно защитить часть накопленной прибыли. Примечание редакции: отступ $500 от минимума сам по себе не означает риск ровно $500 от цены входа; фактический риск зависит от положения входа, размера позиции и исполнения.

Трейлинг-стоп популярен и психологически комфортен. Однако по финансовому результату он не обязательно лучше простого выхода «стоп и разворот».

Что такое ATR-стоп?

В TradeStation стоп на основе ATR с периодом 14 можно записать так:

SetStopLoss(X * AvgTrueRange(14)* BigPointValue);

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

Один из вариантов — ограничить ATR-стоп минимальной или максимальной суммой в долларах. Тогда он сохраняет реакцию на волатильность, но в заданных пределах.

Стоп с фиксированной суммой в долларах

В TradeStation такой стоп задаётся следующим образом:

SetStopLoss(DollarAmount);

DollarAmount — выбранная сумма, обычно на один контракт; возможен и расчёт на всю позицию.

Многим трейдерам не нравится, что фиксированный денежный стоп не зависит от волатильности. Однако в моих тестах он во многих случаях работал лучше ATR-стопа.

Имеет смысл проверить оба варианта и сравнить их применительно к своей стратегии.

Теперь вернёмся к Exit Challenge.

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

Участники Exit Challenge

Выход №1: PP8175

Этот выход подтягивает защиту позиции, меняя долю сохраняемой прибыли по мере роста её максимума. Пример: после достижения максимальной открытой прибыли $1 000 позиция закрывается, если текущая открытая прибыль опускается ниже 50% этого максимума.

При максимуме $2 000 в примере защищается 65%, а при $3 000 — 80%. Пороговые значения и доли задаются параметрами. Значения по умолчанию в листинге отличаются от этого иллюстративного примера.

Примечание редакции. Листинги ниже — фрагменты исходного исследования, а не готовая торговая система. Они требуют проверки синтаксиса, объявлений переменных и порядка исполнения в вашей версии платформы. Отдельные фрагменты в источнике содержат незавершённые конструкции; они не должны запускаться без проверки.

//Exit Challenge Submittal
//Catchy Exit Name: PP8175
//Code:
//Inputs, ranges:
//ppfloor1 = 1000 to 3000, step 1000 (3 values)
//ppratio1 = .50 to .70, step .10 (3 values)
//set ppfloor and ppratio values to protect profit
Input: ppfloor1(1000); //don’t invoke exit 1 until $1000 profit level is reached
Var: ppfloor2(0); //don’t invoke exit 2 until ppfloor2 profit level is reached
Var: ppfloor3(0); //don’t invoke exit 3 until ppfloor3 profit level is reached
ppfloor2=2*ppfloor1;
ppfloor3=3*ppfloor1;
Var:ppratio(0); //depends on maxpositionprofit
Input:ppratio1(.60); //profit exit 1 keep ratio – keep 60% of maximum profit
Var:ppratio2(0); //profit exit 2 keep ratio – keep ppratio2 of maximum profit
Var:ppratio3(0); //profit exit 3 keep ratio – keep ppratio3 of maximum profit
ppratio2=ppratio1+.15;
ppratio3=ppratio2+.15;
If maxpositionprofit>=ppfloor1 then ppratio=ppratio1;
If maxpositionprofit>=ppfloor2 then ppratio=ppratio2;
If maxpositionprofit>=ppfloor3 then ppratio=ppratio3;
If maxpositionprofit>=ppfloor1 then begin
if (openpositionprofit/maxpositionprofit)<ppratio then begin
if marketposition=1 then Sell next bar at market;
if marketposition=-1 then Buy To Cover Next bar at market;
End;
End;

Выход №2: SetPerReplace — замена SetPercentTrailing в TradeStation

Почти каждый начинающий пользователь TradeStation пробует встроенный выход SetPercentTrailing и удивляется результатам. Кривая капитала нередко выглядит примерно так — иногда даже лучше:

Кривая капитала SetPercentTrailing: пример потенциально неточного бэктеста

 

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

По словам автора, TradeStation предложила замену SetPercentTrailing, которая даёт корректные результаты при использовании Look Inside Bar Backtesting (LIBB) с минутной детализацией внутри основного бара.

//Inputs, ranges:
//FloorAmt = 500 to 2500, step 1000 (3 values)
//TrailingPct = 20 to 60, step 20 (3 values)
inputs:
PositionBasis(false),
FloorAmt(1),
TrailingPct(20) ;
variables:BSE(0), HH(0), LL(0), HighProfit(0), CalcFloor(0), Trail(0), MyStopPrice(0) ;
if MarketPosition <> 0 then
begin
BSE = BarsSinceEntry(0) ;
CalcFloor = FloorAmt ;
if PositionBasis then
HighProfit = MaxPositionProfit(0)
else
HighProfit = MaxContractProfit(0) ;
end;
if MarketPosition = 1 then
begin
HH = Highest(High, BSE) ;
if HighProfit >= CalcFloor then
begin
Trail = (TrailingPct * .01) * (HH - EntryPrice(0)) ;
MyStopPrice = HH - Trail ;
end;
end;
if MarketPosition = -1 then
begin
LL = Lowest(Low, BSE) ;
if HighProfit >= CalcFloor then
begin
Trail = (TrailingPct * .01) * (EntryPrice(0) - LL) ;
MyStopPrice = LL + Trail ;
end;
end;
if MarketPosition <> 0 and MaxPositionProfit > FloorAmt and MyStopPrice <> 0 then
begin
if MarketPosition = 1 then
Sell ("Alt%Trl LX") Next Bar at MyStopPrice Stop ;
if MarketPosition = -1 then
BuytoCover ("Alt%Trl SX") Next Bar at MyStopPrice Stop ;
end ;

Выход №3: BoBo

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

Код не опубликован: это закрытая разработка.

Выход №4: MeowMeow — процентный трейлинг-стоп с тейк-профитом

В этом варианте процентный трейлинг-стоп сочетается с целью по прибыли.

Код не опубликован: это закрытая разработка.

Выход №5: LogExit

Ещё одна небольшая вариация трейлинг-стопа.

Код не опубликован: это закрытая разработка.

Выход №6: ConsecCloses

Всё хорошее когда-нибудь заканчивается. Если X последовательных закрытий баров прошли в пользу позиции, возможно, пора выйти — пока всё идёт хорошо. Джордж Костанза из сериала «Сайнфелд» называл это «уйти на высокой ноте».

//calculate the number of consecutive up and down closes
input:InputVar2(3),InputVar4(3); //both go 3 to 5
var: upclose01(0),upclose02(0),upclose03(0),upclose04(0),upclose05(0),upclose06(0),upclose07(0),upclose08(0),upclose09(0),upclose10(0);
var:br(" ");
upclose01=0;upclose02=0;upclose03=0;upclose04=0;upclose05=0;
If (close[0]>close[1] and close[1]<=close[2]) then upclose01=upclose01+1;
If close[0]>close[1] and close[1]>close[2] and close[2]<=close[3] then upclose02=upclose02+1;
If close[0]>close[1] and close[1]>close[2] and close[2]>close[3] and close[3]<=close[4] then upclose03=upclose03+1;
If close[0]>close[1] and close[1]>close[2] and close[2]>close[3] and close[3]>close[4] and close[4]<=close[5] then upclose04=upclose04+1;
If close[0]>close[1] and close[1]>close[2] and close[2]>close[3] and close[3]>close[4] and close[4]>close[5] and close[5]<=close[6] then upclose05=upclose05+1;
//commented out, in case you want to look at more than 5 consec closes
//If close[0]>close[1] and close[1]>close[2] and close[2]>close[3] and close[3]>close[4] and close[4]>close[5] and close[5]>close[6] and close[6]<=close[7] then upclose06=upclose06+1;
//If close[0]>close[1] and close[1]>close[2] and close[2]>close[3] and close[3]>close[4] and close[4]>close[5] and close[5]>close[6] and close[6]>close[7] and close[7]<=close[8] then upclose07=upclose07+1;
//If close[0]>close[1] and close[1]>close[2] and close[2]>close[3] and close[3]>close[4] and close[4]>close[5] and close[5]>close[6] and close[6]>close[7] and close[7]>close[8] and close[8]<=close[9] then upclose08=upclose08+1;
//If close[0]>close[1] and close[1]>close[2] and close[2]>close[3] and close[3]>close[4] and close[4]>close[5] and close[5]>close[6] and close[6]>close[7] and close[7]>close[8] and close[8]>close[9] and close[9]<=close[10] then upclose09=upclose09+1;
//If close[0]>close[1] and close[1]>close[2] and close[2]>close[3] and close[3]>close[4] and close[4]>close[5] and close[5]>close[6] and close[6]>close[7] and close[7]>close[8] and close[8]>close[9] and close[9]>close[10] and close[10]<=close[11] then upclose10=upclose10+1;
//if lastbaronchart then print("up",br,upclose01,br,upclose02,br,upclose03,br,upclose04,br,upclose05,br,upclose06,br,upclose07,br,upclose08,br,upclose09,br,upclose10);
If InputVar2=3 and upclose03=1 then sell next bar at market;
If InputVar2=4 and upclose04=1 then sell next bar at market;
If InputVar2=5 and upclose05=1 then sell next bar at market;
var: dnclose01(0),dnclose02(0),dnclose03(0),dnclose04(0),dnclose05(0),dnclose06(0),dnclose07(0),dnclose08(0),dnclose09(0),dnclose10(0);
//var:br("");
dnclose01=0;dnclose02=0;dnclose03=0;dnclose04=0;dnclose05=0;
If (close[0]<close[1] and close[1]>=close[2]) then dnclose01=dnclose01+1;
If close[0]<close[1] and close[1]<close[2] and close[2]>=close[3] then dnclose02=dnclose02+1;
If close[0]<close[1] and close[1]<close[2] and close[2]<close[3] and close[3]>=close[4] then dnclose03=dnclose03+1;
If close[0]<close[1] and close[1]<close[2] and close[2]<close[3] and close[3]<close[4] and close[4]>=close[5] then dnclose04=dnclose04+1;
If close[0]<close[1] and close[1]<close[2] and close[2]<close[3] and close[3]<close[4] and close[4]<close[5] and close[5]>=close[6] then dnclose05=dnclose05+1;
//If close[0]<close[1] and close[1]<close[2] and close[2]<close[3] and close[3]<close[4] and close[4]<close[5] and close[5]<close[6] and close[6]>=close[7] then dnclose06=dnclose06+1;
//If close[0]<close[1] and close[1]<close[2] and close[2]<close[3] and close[3]<close[4] and close[4]<close[5] and close[5]<close[6] and close[6]<close[7] and close[7]>=close[8] then dnclose07=dnclose07+1;
//If close[0]<close[1] and close[1]<close[2] and close[2]<close[3] and close[3]<close[4] and close[4]<close[5] and close[5]<close[6] and close[6]<close[7] and close[7]<close[8] and close[8]>=close[9] then dnclose08=dnclose08+1;
//If close[0]<close[1] and close[1]<close[2] and close[2]<close[3] and close[3]<close[4] and close[4]<close[5] and close[5]<close[6] and close[6]<close[7] and close[7]<close[8] and close[8]<close[9] and close[9]>=close[10] then dnclose09=dnclose09+1;
//If close[0]<close[1] and close[1]<close[2] and close[2]<close[3] and close[3]<close[4] and close[4]<close[5] and close[5]<close[6] and close[6]<close[7] and close[7]<close[8] and close[8]<close[9] and close[9]<close[10] and close[10]>=close[11] then dnclose10=dnclose10+1;
//if lastbaronchart then print("dn",br,dnclose01,br,dnclose02,br,dnclose03,br,dnclose04,br,dnclose05,br,dnclose06,br,dnclose07,br,dnclose08,br,dnclose09,br,dnclose10);
If InputVar4=3 and dnclose03=1 then buytocover next bar at market;
If InputVar4=4 and dnclose04=1 then buytocover next bar at market;
If InputVar4=5 and dnclose05=1 then buytocover next bar at market;

Выходы №7–11: 200ATR Crew

Идею предложил трейдер из Хьюстона, штат Техас. Он предположил, что ATR с периодами 10–20, использованный в предыдущем исследовании, меняется слишком резко, и предложил период 200 — примерно десять месяцев для дневных баров.

Для сопоставимости с предыдущим анализом я разбил идею на отдельные варианты: стопы, цели и их сочетания.

InputVar52 will be varied as part of test.
// Exit #7
SetStopLoss(BigPointValue*InputVar52*AverageTrueRange(200);
// Exit #8
SetProfitTarget(BigPointValue*InputVar52*AverageTrueRange(200);
// Exit #9
SetStopLoss(BigPointValue*InputVar52*AverageTrueRange(200);
SetProfitTarget(BigPointValue*InputVar52*AverageTrueRange(200);
// Exit #10 – Trailing exits
If marketposition=1 and openpositionprofit<maxpositionprofit-InputVar52*AvgTrueRange(200)*BigPointValue then sell next bar at market;
If marketposition=-1 and openpositionprofit<maxpositionprofit- InputVar52*AvgTrueRange(200)*BigPointValue then buytocover next bar at market;
// Exit #11
SetBreakEven(BigPointValue*InputVar52*AverageTrueRange(200);

Выходы №12–13: Ratch — ступенчатый стоп

Это ещё один трейлинг-стоп: он перемещается ступенями по мере движения рынка в пользу позиции. Вариант №12 использует суммы в долларах, №13 — ATR с периодом 100.

IP=Marketposition;
If IP<>IP[1] then MaxPP=0;
If OpenPositionProfit>MaxPP then MaxPP=OpenPositionProfit;
if MaxPP<1*InputVar44 then begin
SellP=Avgentryprice-InputVar52/BigPointValue +0*InputVar44/BigPointValue;
BuyTP=Avgentryprice+InputVar52/BigPointValue -0*InputVar44/BigPointValue;
End
else if MaxPP<2*InputVar44 then begin
SellP=Avgentryprice-InputVar52/BigPointValue +1*InputVar44/BigPointValue;
BuyTP=Avgentryprice+InputVar52/BigPointValue -1*InputVar44/BigPointValue;
End
else if MaxPP<3*InputVar44 then begin
SellP=Avgentryprice-InputVar52/BigPointValue +2*InputVar44/BigPointValue;
BuyTP=Avgentryprice+InputVar52/BigPointValue -2*InputVar44/BigPointValue;
End
else if MaxPP<4*InputVar44 then begin
SellP=Avgentryprice-InputVar52/BigPointValue +3*InputVar44/BigPointValue;
BuyTP=Avgentryprice+InputVar52/BigPointValue -3*InputVar44/BigPointValue;
End;
If marketposition=1 then sell next bar SellP stop;
If marketposition=-1 then buytocover next bar BuyTP stop;
​*************

Условия тестирования

Рынки

Выходы проверялись на 40 фьючерсных рынках. Ниже приведены обозначения непрерывных контрактов TradeStation.

Валюты

@AD, @BP, @CD, @DX, @EC, @JY, @SF

Сельскохозяйственные товары и soft commodities

@BO, @C, @CC, @CT, @FC, @KC, @KW, @LC, @LH, @O, @OJ, @RR, @S, @SB, @SM, @W

Металлы

@GC, @HG, @PL, @SI

Энергоносители

@CL, @HO, @NG, @RB

Процентные ставки

@FV, @TY, @US

Фондовые индексы

@ES.D (дневная сессия), @ES, @NK, @NQ, @RTY, @YM

Размеры баров

Результат может существенно зависеть от размера бара. Поэтому я проверил пять вариантов:

60-минутном

120-минутном

360-минутном

720-минутном

1440-минутном (дневном)

Период

Во всех тестах использовались десять лет исторических данных: с 1 января 2010 года по 1 января 2020 года.

Комиссии, проскальзывание и внутрибарная детализация

В исследовании учтены комиссии и проскальзывание. Для каждого рынка величина проскальзывания зависела от ликвидности и объёма торгов. Я использовал оценки из собственного опыта торговли реальными деньгами и подробного анализа цен bid/ask. Сами приведённые далее результаты являются историческими бэктестами.

Как сравнивать результаты

При сравнении 378 000 тестов неизбежно возникает вопрос: что считать лучшим результатом?

Я выбрал два показателя:

ROA (Return on Account) = общая чистая прибыль / максимальная просадка. Здесь ROA — отношение результата к просадке, а не доходность счёта в процентах. В таблице и диаграмме показано среднее значение ROA по тестам.

Число тестовых комбинаций с общей чистой прибылью свыше $10 000. Это количество бэктестов, а не количество отдельных сделок.

Выбор метрик можно обсуждать отдельно: кто-то предпочтёт другие показатели эффективности.

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

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

Объём тестирования

40 рынков × 5 размеров бара × 5 способов входа × 3 периода для каждого входа × 14 выходов (13 новых и «стоп и разворот») × 9 наборов настроек выхода = 378 000 уникальных тестов.

Выполнять столько тестов вручную в TradeStation было бы крайне утомительно.

Мне помог Multi-Opt — инструмент, автоматизирующий значительную часть тестирования. Например, он избавляет от необходимости вручную запускать отдельную оптимизацию для каждого рынка и размера бара. Для ускорения используется OOEL — Object Oriented EasyLanguage.

На момент описанного исследования Multi-Opt не был общедоступен: его получали участники Strategy Factory.

Даже с этим инструментом и многопоточностью все прогоны заняли около 100 часов непрерывного тестирования.

Важная оговорка

Я показываю результаты, полученные при моих условиях. Ваши тесты могут привести к другим результатам и выводам — например, из-за иной реализации входов и выходов или других диапазонов параметров.

Если выход A лучше выхода Б в среднем, это не означает, что он лучше на каждом рынке и размере бара. В отдельных случаях преимущество может быть у Б.

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

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

Результаты

Большой сюрприз — или уже нет: «стоп и разворот» вновь оказался лучшим в сравнении.

Среднее ROA по типам выхода

 

Сравнение среднего ROA

 

Среднее ROA по типам выхода. Английские обозначения сохранены как имена вариантов из исследования: Breakeven — безубыток, Targ — тейк-профит, Trail — трейлинг-стоп, Doll — денежная величина.

Примечание редакции. Все средние ROA в этой таблице отрицательны, включая −7,9 у Stop&Reverse. «Лучший» здесь означает лучший среди сравниваемых вариантов, а не положительный средний результат или гарантию прибыльности.

Сравним также число тестов с общей чистой прибылью выше $10 000 и число тестов с убытком больше $10 000, уже после комиссий и проскальзывания. Желательны больше высокоприбыльных комбинаций, меньше глубоко убыточных и более высокое отношение первого числа ко второму. Это снова результаты целых тестов, не отдельных сделок.

Число прибыльных и убыточных тестов

 

По этому критерию «стоп и разворот» тоже заметно впереди остальных вариантов.

Заключение

В этом конкурсе и предыдущем исследовании я рассмотрел около двух десятков техник выхода, охватывающих разные подходы.

Среди протестированных вариантов простой «стоп и разворот» показал лучший результат, причём отрыв оказался большим.

Как использовать результаты при разработке стратегии

1. Начните с простого. Используйте «стоп и разворот» как базовый вариант для сравнения. У него меньше дополнительных параметров оптимизации; обычно это полезно.

2. Добавляйте выходы умеренно. Не стоит перебрать десять способов и автоматически выбрать лучший. Для начала можно отдельно проверить перенос в безубыток или тейк-профит. Мои тесты не показали необходимости усложнять систему без оснований.

3. Продолжайте искать. Преимущество «стопа и разворота» в моих тестах не означает, что он всегда будет лучшим. Вы можете найти более подходящий вариант — я призываю проверять новые идеи.

В своих дальнейших тестах я планирую начинать со «стопа и разворота», добавляя другие выходы только при необходимости.

Надеюсь, это исследование оказалось полезным. Спасибо всем участникам!

Об авторе

Кевин Дж. Дэйви — трейдер и исследователь алгоритмических стратегий, автор книги Building Algorithmic Trading Systems и других книг о системной торговле.

Как проверить идею на своей системе

Начните с одного вопроса: улучшает ли дополнительный выход вашу систему при тех же входах, издержках и правилах расчёта? Для сравнения ATR-стопа и денежного стопа пригодится разбор TLAP; затем проверьте результат вне выборки. Если вы оцениваете ручные сценарии выхода на графике, можно использовать симулятор рынка TLAP — он помогает воспроизводить ситуации, но не заменяет автоматические 378 000 прогонов. Поделитесь в теме: какой выход выдержал такую проверку у вас и по какой метрике?

Переведено для TLAP