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

Автор:Чао Чжан, Дата: 2023-10-08 15:06:28
Тэги:

Обзор

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

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

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

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

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

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

  1. Подумайте об использовании других индикаторов для оказания помощи в выборе раннего входа.
  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)

Больше