Автоматическая стратегия следования за трендом на основе T3 и ATR


Дата создания: 2024-01-03 11:58:25 Последнее изменение: 2024-01-03 11:58:25
Копировать: 1 Количество просмотров: 698
1
Подписаться
1621
Подписчики

Автоматическая стратегия следования за трендом на основе T3 и ATR

Обзор

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

Стратегический принцип

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

Чтобы отфильтровать ложные сигналы, стратегия дополнительно требует, чтобы цена также должна была преодолеть движущуюся среднюю T3 для подтверждения сигнала. Кроме того, стратегия использует значения ATR для расчета стоп-лосса и стоп-опасов для управления рисками.

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

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

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

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

Эта стратегия основана на вычислении показателей, и существует риск, что она будет использоваться в качестве арбитража. Кроме того, есть проблемы с задержкой T3 Smooth Moving Average и ATR Dynamic Stop, которые могут упустить возможность быстрого изменения цены. Параметры могут быть адаптированы соответствующим образом или оптимизированы в сочетании с другими показателями.

При реверсии трендовых колебаний, стоп-стопы могут быть нарушены, что приводит к увеличению убытков. Можно соответствующим образом расширить пределы стоп-стопов или использовать другие параметры, такие как значение Handle, в качестве основы для стоп-стопов.

Направление оптимизации

  • Можно настроить параметры индикатора T3 для оптимизации его чувствительности.

  • Можно тестировать различные параметры цикла ATR, чтобы найти оптимальные значения.

  • Можно попробовать различные коэффициенты риска и отдачи, чтобы определить оптимальные параметры.

  • Можно добавить другие индикаторы фильтрации сигналов, например, Money Flow Index.

  • Параметры могут быть автоматически оптимизированы с помощью методов машинного обучения.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='NinjaView Example 1 (UTBA "QuantNomad" Strategy)', overlay=true)
T3 = input(100)//600
// Input for Long Settings
// Input for Long Settings


xPrice3 = close
xe1 = ta.ema(xPrice3, T3)
xe2 = ta.ema(xe1, T3)
xe3 = ta.ema(xe2, T3)
xe4 = ta.ema(xe3, T3)
xe5 = ta.ema(xe4, T3)
xe6 = ta.ema(xe5, T3)

b3 = 0.7
c1 = -b3*b3*b3
c2 = 3*b3*b3+3*b3*b3*b3
c3 = -6*b3*b3-3*b3-3*b3*b3*b3
c4 = 1+3*b3+b3*b3*b3+3*b3*b3
nT3Average = c1 * xe6 + c2 * xe5 + c3 * xe4 + c4 * xe3

//plot(nT3Average, color=color.white, title="T3")

// Buy Signal - Price is below T3 Average
buySignal3 = xPrice3 < nT3Average
sellSignal3 = xPrice3 > nT3Average
// Inputs
a = input(1, title='Key Value. "This changes the sensitivity"')
c = input(50, title='ATR Period')
h = input(true, title='Signals from Heikin Ashi Candles')
riskRewardRatio = input(1, title='Risk Reward Ratio')

xATR = ta.atr(c)
nLoss = a * xATR

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossunder(ema, xATRTrailingStop)

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.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(sell, title='Sell', text='Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

barcolor(barbuy ? color.new(color.green, 90) : na)
barcolor(barsell ? color.new(color.red, 90) : na)

var float entryPrice = na
var float takeProfitLong = na
var float stopLossLong = na
var float takeProfitShort = na
var float stopLossShort = na

if buy and buySignal3
    entryPrice := src
    takeProfitLong := entryPrice + nLoss * riskRewardRatio
    stopLossLong := entryPrice - nLoss
    takeProfitShort := na
    stopLossShort := na

if sell and sellSignal3
    entryPrice := src
    takeProfitShort := entryPrice - nLoss * riskRewardRatio
    stopLossShort := entryPrice + nLoss
    takeProfitLong := na
    stopLossLong := na

// Strategy order conditions
acct = "Sim101"
ticker = "ES 12-23"
qty = 1

OCOMarketLong = '{ "alert": "OCO Market Long", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '", "qty": "' + str.tostring(qty) + '", "take_profit_price": "' + str.tostring(takeProfitLong) + '", "stop_price": "' + str.tostring(stopLossLong) + '", "tif": "DAY" }'
OCOMarketShort = '{ "alert": "OCO Market Short", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '", "qty": "' + str.tostring(qty) + '", "take_profit_price": "' + str.tostring(takeProfitShort) + '", "stop_price": "' + str.tostring(stopLossShort) + '", "tif": "DAY" }'
CloseAll = '{ "alert": "Close All", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '" }'

strategy.entry("Long", strategy.long, when=buy and buySignal3, alert_message=OCOMarketLong)
strategy.entry("Short", strategy.short, when=sell and sellSignal3, alert_message=OCOMarketShort)

// Setting the take profit and stop loss for long trades
strategy.exit("Take Profit/Stop Loss", "Long", stop=stopLossLong, limit=takeProfitLong,alert_message=CloseAll)

// Setting the take profit and stop loss for short trades
strategy.exit("Take Profit/Stop Loss", "Short", stop=stopLossShort, limit=takeProfitShort,alert_message=CloseAll)

// Plot trade setup boxes
bgcolor(buy ? color.new(color.green, 90) : na, transp=0, offset=-1)
bgcolor(sell ? color.new(color.red, 90) : na, transp=0, offset=-1)

// longCondition = buy and not na(entryPrice)
// shortCondition = sell and not na(entryPrice)

// var line longTakeProfitLine = na
// var line longStopLossLine = na
// var line shortTakeProfitLine = na
// var line shortStopLossLine = na

// if longCondition
//     longTakeProfitLine := line.new(bar_index, takeProfitLong, bar_index + 1, takeProfitLong, color=color.green, width=2)
//     longStopLossLine := line.new(bar_index, stopLossLong, bar_index + 1, stopLossLong, color=color.red, width=2)
//     label.new(bar_index + 1, takeProfitLong, str.tostring(takeProfitLong, "#.#####"), color=color.green, style=label.style_none, textcolor=color.green, size=size.tiny)
//     label.new(bar_index + 1, stopLossLong, str.tostring(stopLossLong, "#.#####"), color=color.red, style=label.style_none, textcolor=color.red, size=size.tiny)

// if shortCondition
//     shortTakeProfitLine := line.new(bar_index, takeProfitShort, bar_index + 1, takeProfitShort, color=color.green, width=2)
//     shortStopLossLine := line.new(bar_index, stopLossShort, bar_index + 1, stopLossShort, color=color.red, width=2)
//     label.new(bar_index + 1, takeProfitShort, str.tostring(takeProfitShort, "#.#####"), color=color.green, style=label.style_none, textcolor=color.green, size=size.tiny)
//     label.new(bar_index + 1, stopLossShort, str.tostring(stopLossShort, "#.#####"), color=color.red, style=label.style_none, textcolor=color.red, size=size.tiny)

alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')