Эта стратегия использует индикатор Supertrend для определения ценовых тенденций и вводит длинные или короткие позиции при изменении тенденций. Стратегия позволяет корректировать период ATR и мультипликатор для оптимизации параметров. Она также предоставляет возможность изменить метод расчета ATR для немного различных результатов.
Стратегия имеет встроенные диапазоны дат обратного тестирования и возможность торговать только в определенное время суток и закрывать все сделки в конце этого временного периода. Это особенно полезно для дневных торговых акций. Когда опция временного периода включена, вы можете выбрать, чтобы войти в текущую позицию сразу после начала временного периода, или ждать изменения тренда, чтобы войти в первую позицию.
Стратегия также позволяет задать уровни стоп-лосса и прибыли на основе процента. В большинстве случаев стоп-стоп на основе ATR, предоставляемый самим Supertrend, делает дополнительную стоп-лосс ненужной. Таким образом, вы можете включить только прибыль для оптимизации механизма выхода.
Наконец, существуют пользовательские поля оповещения для сообщений о входе и выходе, которые должны использоваться с автоматизированными торговыми услугами.
Стратегия Supertrend основана на следующих ключевых принципах:
Расчет значения ATR: можно выбирать между расчетом SMA или встроенным индикатором ATR. Формула SMA:
atr2 = sma(tr, Periods)
Вычислите верхнюю и нижнюю полосы. Верхняя полоса близка минус ATR умножитель умножить на ATR. Нижняя полоса близка плюс умножитель умножить на ATR.
up = close - (Multiplier * atr)
dn = close + (Multiplier * atr)
Определите направление тренда, сравнивая цены с диапазонами. Увеличение тренда, когда цена пересекает нижнюю полосу. Уменьшение тренда, когда цена пересекает верхнюю полосу.
trend := trend == -1 and close > dn ? 1 : trend == 1 and close < up ? -1 : trend
Создавать торговые сигналы при изменении тренда, например, сигнал продажи при переходе от восходящего к нисходящему тренду:
sellSignal = trend == -1 and trend[1] == 1
Фильтр входа на основе сигналов и дополнительных условий.
Используйте стоп-лосс и прибыль, чтобы зафиксировать прибыль или ограничить риски.
В сочетании с оптимизацией параметров он может привести к хорошим торговым результатам.
Стратегия Supertrend имеет несколько преимуществ:
Сам Supertrend эффективно идентифицирует тенденции и обычно используется для отслеживания остановок.
Настраиваемые параметры ATR могут быть оптимизированы для различных продуктов для наилучшего соответствия.
Конфигурируемые временные диапазоны обратного теста и торговли в режиме реального времени подходят для различных торговых сессий.
Возможность сразу начать первую торговлю или ждать сигнала рассчитана на различные продукты.
Встроенные стоп-лосс и прибыль помогают улучшить управление рисками или получить больше прибыли.
Настраиваемые торговые оповещения для интеграции с автоматизированными торговыми системами и ботами.
Также следует учитывать некоторые риски:
Супертенд может производить ложные сигналы, которые необходимо отфильтровать с помощью дополнительных условий.
Неправильные параметры ATR могут привести к чрезмерной торговле или отсутствию трендов. Требуется оптимизация для наилучшего баланса.
Слишком близкая стоп-лосс может привести к преждевременному выходу из прибыльных сделок.
Плохая конфигурация временных рамок может привести к пропуску торговых сессий или неоправданному ограничению маржи.
Эти риски могут быть устранены путем соответствующих корректировок параметров или дополнительных фильтров для повышения надежности.
Некоторые способы дальнейшей оптимизации стратегии:
Проверьте разные периоды ATR, чтобы найти правильный баланс, обычно 10-20 хорошо работает.
Попробуйте различные значения ATR мультипликатора, обычно 2-5 является подходящим, настроить, чтобы найти оптимальное.
Добавьте такие фильтры, как MACD, RSI и т.д., чтобы уменьшить ложные сигналы.
Оптимизируйте стоп-лосс и уровни прибыли для достижения наилучших результатов.
Проверяйте различные диапазоны времени торговли.
Используйте автоматический выбор символа для отслеживания высокого импульса или волатильности.
В целом это довольно распространенная и практичная стратегия следования трендам. Он эффективно отслеживает тенденции с настраиваемыми параметрами, но также имеет присущие риски для управления. С оптимизацией и дополнительными условиями он может быть усовершенствован в надежную квантовую торговую систему с последовательной альфой.
/*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)