Стратегия SuperTrend

Автор:Чао Чжан, Дата: 2023-10-13 17:03:55
Тэги:

Обзор

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

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

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

atr = mult * atr(length)

longStop = hl2 - atr 

shortStop = hl2 + atr

где длина - это период для расчета ATR, а mult - это коэффициент масштабирования для ATR.

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

dir := dir == -1 and close > shortStopPrev ? 1 :  
         dir == 1 and close < longStopPrev ? -1 : dir

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

В соответствии с изменением направления тренда генерируются сигналы покупки и продажи:

buySignal = dir == 1 and dir[1] == -1

sellSignal = dir == -1 and dir[1] == 1 

Наконец, соответствующие торговые действия предпринимаются при появлении сигналов покупки или продажи.

Преимущества

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

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

  3. Использование прорыва линии стоп-лосса для определения изменения направления тренда может эффективно контролировать риски и своевременно останавливать потерю.

  4. Конфигурируемый для длинной или двунаправленной торговли в соответствии с различными стилями торговли.

  5. Может использоваться в любом периоде времени и для различных торговых инструментов.

Риски

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

  2. Оптимальная комбинация параметров неопределена. Период ATR и мультипликатор требуют оптимизации на основе рыночных условий.

  3. Оптимальные сроки для каждого торгового инструмента неизвестны и должны быть проверены.

  4. Лучшее время входа неясно и существует некоторое отставание.

  5. Есть риск не быть на рынке, когда тенденция слабая.

  6. Существуют риски, что стоп-лосс может быть достигнут.

Улучшение

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

  2. Для поиска оптимальных наборов параметров можно использовать машинное обучение или генетические алгоритмы.

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

  4. Показатели объема могут быть использованы для определения лучшего времени входа и предотвращения преждевременного входа.

  5. Подумайте о использовании стратегий блокировки, чтобы держать позиции, когда вы не на рынке.

  6. Ширина стоп-лосса может быть расслаблена и оптимизирована с помощью индикаторов силы тренда.

Заключение

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


/*backtest
start: 2023-09-12 00:00:00
end: 2023-10-12 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// strategy("SuperTrend Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000)

LongOnly = input(title="Long Only ?", type=input.bool, defval=true)
length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=true)

////////////////////////////////////////////////////////////////////////////////
// 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=2020, 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

////////////////////////////////////////////////////////////////////////////////


atr = mult * atr(length)

longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 : 
   dir == 1 and close < longStopPrev ? -1 : dir

longColor = color.green
shortColor = color.red


plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)

plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)

if LongOnly
    if buySignal and time_cond
        strategy.entry("Long", strategy.long, comment="Long")
    
    if(sellSignal and time_cond)
        strategy.close("Long")
else
    if buySignal and time_cond
        strategy.entry("Long", strategy.long, comment="Long")
    else
        strategy.cancel("Long")
    
    
    if sellSignal and time_cond
        strategy.entry("Short", strategy.short, comment="Short")
    else
        strategy.cancel("Short")

if not time_cond
    strategy.close_all()


Больше