Стратегия отмены потерь после остановки

Автор:Чао Чжан, Дата: 2023-12-01 13:41:41
Тэги:

img

Обзор

Это очень простая стратегия. Она состоит только из одного последующего стоп-лосса. Когда стоп-лосс запускается, позиция обращается и для новой позиции устанавливается последующий стоп-лосс.

Логика стратегии

Стратегия построена на основе одного из трех типов стоп-лосса: процентный стоп-лосс, стоп-лосс ATR, абсолютный стоп-лосс.

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

Анализ преимуществ

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

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

Анализ рисков

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

Другим риском является неточное направленное суждение после запуска стоп-лосса при изменении позиции, что приводит к потере шансов на изменение цены или увеличению потерь.

Руководство по оптимизации

Стратегия может быть оптимизирована в следующих аспектах:

  1. Добавить суждение о тенденциях, чтобы избежать торговли против тенденций
  2. Оптимизировать расчет стоимости стоп-лосса, чтобы он более динамично отслеживал рынок
  3. Увеличить валидацию прорыва для сигналов с более высокой вероятностью обращения
  4. Включить меры волатильности для определения оптимального времени реверсии

Заключение

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


/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50)

////////////
// Inputs //

sl_type    = input("%", options = ["%", "ATR", "Absolute"])

sl_perc    = input(4,     title = "% SL",        type = input.float)
atr_length = input(10,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)
sl_absol   = input(10,    title = "Absolute SL", type = input.float)

// BACKTESTING RANGE
// From Date Inputs
fromDay   = input(defval = 1,    title = "From Day",   minval = 1, maxval = 31)
fromMonth = input(defval = 1,    title = "From Month", minval = 1, maxval = 12)
fromYear  = input(defval = 2016, title = "From Year",  minval = 1970)
 
// To Date Inputs
toDay   = input(defval = 1,    title = "To Day",   minval = 1, maxval = 31)
toMonth = input(defval = 1,    title = "To Month", minval = 1, maxval = 12)
toYear  = input(defval = 2100, title = "To Year",  minval = 1970)
 
// Calculate start/end date and time condition
startDate  = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear,   toMonth,   toDay,   00, 00)

time_cond = time >= startDate and time <= finishDate

//////////////////
// CALCULATIONS //

// SL values
sl_val = sl_type == "ATR"      ? atr_mult * atr(atr_length) : 
         sl_type == "Absolute" ? sl_absol : 
         close * sl_perc / 100
         
// Init Variables
pos         = 0
trailing_sl = 0.0

// Signals
long_signal  = nz(pos[1]) !=  1 and high > nz(trailing_sl[1])
short_signal = nz(pos[1]) != -1 and low  < nz(trailing_sl[1]) 

// Calculate SL
trailing_sl := short_signal     ? high + sl_val : 
               long_signal      ? low  - sl_val : 
               nz(pos[1]) ==  1 ? max(low  - sl_val, nz(trailing_sl[1])) :  
               nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : 
               nz(trailing_sl[1])
               
// Position var               
pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 

//////////////
// PLOTINGS //

plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)

//////////////
// STRATEGY //

if (time_cond and pos != 1)
    strategy.entry("long",  true, stop = trailing_sl)
  
if (time_cond and pos != -1) 
    strategy.entry("short", false, stop = trailing_sl)

Больше