Адаптивная движущаяся линия остановки

Автор:Чао Чжан, Дата: 2024-02-21 16:07:20
Тэги:

img

Обзор

Основная идея этой стратегии заключается в использовании скользящей средней T3 и адаптивной последующей остановки ATR для захвата точек входа и выхода вдоль тренда.

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

Стратегия состоит из индикатора T3, индикатора ATR и механизма ATR trailing stop.

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

Показатель ATR используется для расчета степени волатильности рынка и установки уровней стоп-лосса. Чем больше значение ATR, тем больше волатильность рынка, и должен быть установлен более широкий стоп-лосс. Чем меньше значение ATR, тем меньше волатильность рынка, и может быть установлен более узкий стоп-лосс.

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

Используя T3 для определения направления, ATR для расчета волатильности и механизм ATR trailing stop, эта стратегия достигает относительно эффективного улавливания тенденций и контроля рисков.

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

Преимущества этой стратегии включают:

  1. Применение линии Т3 улучшает точность отслеживания тенденций.

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

  3. Механизм задержки ATR позволяет линии стоп-лосса отслеживать движение цены в режиме реального времени для эффективного контроля рисков.

  4. Интегрирует индикаторы и механизмы стоп-лосса для достижения автоматизированной торговли отслеживанием трендов.

  5. Может подключаться к внешним торговым платформам через webhook для автоматизированного исполнения ордеров.

Риски и решения

Эта стратегия также сопряжена с некоторыми рисками:

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

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

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

  4. Частое запускание стоп-лосса может возникнуть на рынках випса.

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

Стратегия может быть оптимизирована в следующих аспектах:

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

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

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

  4. Добавьте соответствующие фильтры, чтобы избежать частой торговли на рынках випса.

  5. Включить индикаторы оценки тренда для повышения точности направленной рентабельности.

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

Заключение

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


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

//@version=5
strategy(title='UT Bot Alerts (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')


Больше