Динамическая стратегия остановки потерь и получения прибыли на основе двойного ATR-трейлинга

Автор:Чао Чжан, Дата: 2024-03-22 13:52:59
Тэги:

img

Обзор

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

Принципы стратегии

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

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

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

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

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

  1. На рынках с ограниченным диапазоном частота торгов может привести к высоким затратам на транзакции и повлиять на рентабельность.
  2. Настройки параметров линии стоп-лосса и мультипликаторов прибыли должны быть оптимизированы в соответствии с различными характеристиками рынка и продукта; неправильные параметры могут привести к плохой эффективности стратегии.
  3. Стратегия в основном опирается на ценовые прорывы динамических линий стоп-лосса для генерации сигналов, которые могут производить ложные сигналы в некоторых крупных фаллификационных прорывах.

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

  1. Для рынков с ограниченным диапазоном следует рассмотреть возможность введения дополнительных индикаторов или условий для фильтрации торговых сигналов, таких как RSI и MACD.
  2. Для различных продуктов и рынков можно использовать историческое обратное тестирование и оптимизацию параметров для поиска оптимальных параметров линии стоп-лосса и мультипликаторов прибыли.
  3. Рассмотреть возможность внедрения модулей управления позициями и контроля рисков для динамической корректировки размера позиций на основе волатильности рынка и риска счета.
  4. Добавить больше показателей оценки тренда для повышения надежности и точности сигналов.

Резюме

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


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
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 = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

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

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

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

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)

Больше