Стратегия адаптивного стоп-трейлинга


Дата создания: 2023-10-08 15:06:28 Последнее изменение: 2023-10-08 15:06:28
Копировать: 0 Количество просмотров: 771
1
Подписаться
1617
Подписчики

Обзор

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

Стратегический принцип

  1. Вычислить показатель ATR, установив значение ATR, умноженное на параметр a, как предельный уровень nLoss.
  2. Вычислить среднюю линию EMA.
  3. Когда цена выше средней линии EMA, она становится больше, а когда она ниже средней линии EMA, она становится больше.
  4. Применяя адаптивный алгоритм остановки для автоматической корректировки остановки xATRTrailingStop, правила следующие:
    • Когда цена выходит за пределы Stop Loss, Stop Loss корректируется до уровня Stop Loss минус nLoss.
    • Когда цена снижается и превышает пределы стоп-лосса, то стоп-лосса корректируется на цене плюс пределы nLoss.
    • В остальных случаях остается неизменной стоп-страх.
  5. Прекращение позиции, когда цена наступает на точку остановки.

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

  1. Реализован механизм адаптивного остановки убытков, который может автоматически корректировать величину остановки убытков в зависимости от степени волатильности рынка, эффективно контролируя риск.
  2. Сравните ATR с расчетом разумных пределов убытков, чтобы избежать слишком больших или слишком маленьких убытков.
  3. Использование EMA для создания торговых сигналов позволяет уменьшить количество бесполезных сделок и фильтровать рыночный шум.
  4. Стратегия проста и понятна, код понятен, его легко проверить и оптимизировать.
  5. Вводные параметры могут быть скорректированы в зависимости от рыночной ситуации.

Риски и улучшения

  1. EMA может задерживать торговые сигналы, что может привести к задержке входа. Можно рассмотреть возможность использования других показателей для раннего входа.
  2. Время удержания позиции неопределено, невозможно контролировать размер единого стоп-лосса. Можно установить целевую прибыль или максимальное время удержания позиции, чтобы избежать слишком больших потерь.
  3. В значительно трендовых рынках стоп-лосс может быть слишком часто задействован. Можно рассмотреть возможность корректировки параметров в зависимости от состояния тренда или добавления фильтрующих условий.
  4. Параметры должны быть скорректированы в соответствии с характеристиками разных сортов, например, циклом ATR, стоп-парамиром и т. д. Нельзя слепо использовать значения по умолчанию.

Направление оптимизации

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

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-09-07 00:00:00
end: 2023-10-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay = true)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 

// Inputs
a = input(1,     title = "Key Vaule. 'This changes the sensitivity'")
c = input(10,    title = "ATR Period")
h = input(false, title = "Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// 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 = 2019, 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 = true
 
////////////////////////////////////////////////////////////////////////////////


xATR  = atr(c)
nLoss = a * xATR

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = false) : close

xATRTrailingStop = 0.0
xATRTrailingStop := iff(src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), src - nLoss),
   iff(src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), src + nLoss), 
   iff(src > nz(xATRTrailingStop[1], 0), src - nLoss, src + nLoss)))
 
pos = 0   
pos :=	iff(src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema   = ema(src,1)
above = crossover(ema, xATRTrailingStop)
below = crossover(xATRTrailingStop, ema)

buy  = src > xATRTrailingStop and above 
sell = src < xATRTrailingStop and below

barbuy  = src > xATRTrailingStop 
barsell = src < xATRTrailingStop 

plotshape(buy,  title = "Buy",  text = 'Buy',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny)
plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, transp = 0, size = size.tiny)

barcolor(barbuy  ? color.green : na)
barcolor(barsell ? color.red   : na)

strategy.entry("long",   true, when = buy  and time_cond)
strategy.entry("short", false, when = sell and time_cond)