Стратегия SuperTrend

Автор:Чао Чжан, Дата: 2024-02-02 11:11:48
Тэги:

img

Обзор

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

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

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

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

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

Стратегия Supertrend основана на следующих ключевых принципах:

  1. Расчет значения ATR: можно выбирать между расчетом SMA или встроенным индикатором ATR. Формула SMA:

    atr2 = sma(tr, Periods)
    
  2. Вычислите верхнюю и нижнюю полосы. Верхняя полоса близка минус ATR умножитель умножить на ATR. Нижняя полоса близка плюс умножитель умножить на ATR.

    up = close - (Multiplier * atr) 
    dn = close + (Multiplier * atr)
    
  3. Определите направление тренда, сравнивая цены с диапазонами. Увеличение тренда, когда цена пересекает нижнюю полосу. Уменьшение тренда, когда цена пересекает верхнюю полосу.

    trend := trend == -1 and close > dn ? 1 : trend == 1 and close < up ? -1 : trend
    
  4. Создавать торговые сигналы при изменении тренда, например, сигнал продажи при переходе от восходящего к нисходящему тренду:

    sellSignal = trend == -1 and trend[1] == 1 
    
  5. Фильтр входа на основе сигналов и дополнительных условий.

  6. Используйте стоп-лосс и прибыль, чтобы зафиксировать прибыль или ограничить риски.

В сочетании с оптимизацией параметров он может привести к хорошим торговым результатам.

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

Стратегия Supertrend имеет несколько преимуществ:

  1. Сам Supertrend эффективно идентифицирует тенденции и обычно используется для отслеживания остановок.

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

  3. Конфигурируемые временные диапазоны обратного теста и торговли в режиме реального времени подходят для различных торговых сессий.

  4. Возможность сразу начать первую торговлю или ждать сигнала рассчитана на различные продукты.

  5. Встроенные стоп-лосс и прибыль помогают улучшить управление рисками или получить больше прибыли.

  6. Настраиваемые торговые оповещения для интеграции с автоматизированными торговыми системами и ботами.

Риски

Также следует учитывать некоторые риски:

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

  2. Неправильные параметры ATR могут привести к чрезмерной торговле или отсутствию трендов. Требуется оптимизация для наилучшего баланса.

  3. Слишком близкая стоп-лосс может привести к преждевременному выходу из прибыльных сделок.

  4. Плохая конфигурация временных рамок может привести к пропуску торговых сессий или неоправданному ограничению маржи.

Эти риски могут быть устранены путем соответствующих корректировок параметров или дополнительных фильтров для повышения надежности.

Возможности оптимизации

Некоторые способы дальнейшей оптимизации стратегии:

  1. Проверьте разные периоды ATR, чтобы найти правильный баланс, обычно 10-20 хорошо работает.

  2. Попробуйте различные значения ATR мультипликатора, обычно 2-5 является подходящим, настроить, чтобы найти оптимальное.

  3. Добавьте такие фильтры, как MACD, RSI и т.д., чтобы уменьшить ложные сигналы.

  4. Оптимизируйте стоп-лосс и уровни прибыли для достижения наилучших результатов.

  5. Проверяйте различные диапазоны времени торговли.

  6. Используйте автоматический выбор символа для отслеживания высокого импульса или волатильности.

Заключение

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


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © REV0LUTI0N

//@version=4

// Strategy
strategy("Supertrend Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
enableentry = input(true, title="Enter First Trade ASAP")
waitentry = input(false, title="Wait To Enter First Trade")

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
Long = (trend == 1 ? up : na)
buySignal = trend == 1 and trend[1] == -1

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
Short = (trend == 1 ? na : dn)
sellSignal = trend == -1 and trend[1] == 1

// Strategy Backtesting
startDate  = input(timestamp("2021-01-01T00:00:00"), type = input.time, title='Backtesting Start Date')
finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time, title='Backtesting End Date')

time_cond  = true

//Time Restriction Settings
startendtime = input("", title='Time Frame To Enter Trades')
enableclose = input(false, title='Enable Close Trade At End Of Time Frame')
timetobuy = (time(timeframe.period, startendtime))
timetoclose = na(time(timeframe.period, startendtime))

// Stop Loss & Take Profit % Based
enablesl = input(false, title='Enable Stop Loss')
enabletp = input(false, title='Enable Take Profit')
stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100
takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100

longStop = strategy.position_avg_price * (1 - stopTick)
shortStop = strategy.position_avg_price * (1 + stopTick)
shortTake = strategy.position_avg_price * (1 - takeTick)
longTake = strategy.position_avg_price * (1 + takeTick)

plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL")
plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit")

// Alert messages
message_enterlong  = input("", title="Long Entry message")
message_entershort = input("", title="Short Entry message")
message_closelong = input("", title="Close Long message")
message_closeshort = input("", title="Close Short message")

// Strategy Execution
if Long and time_cond and timetobuy and enableentry
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if Short and time_cond and timetobuy and enableentry
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if buySignal and time_cond and timetobuy and waitentry
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if sellSignal and time_cond and timetobuy and waitentry
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if strategy.position_size > 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closeshort)
    
if strategy.position_size > 0 and enablesl and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enablesl and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    
if strategy.position_size > 0 and enabletp and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enabletp and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)






Больше