Основная идея этой стратегии заключается в использовании скользящей средней T3 и адаптивной последующей остановки ATR для захвата точек входа и выхода вдоль тренда.
Стратегия состоит из индикатора T3, индикатора ATR и механизма ATR trailing stop.
Движущаяся средняя T3 - это сглаженная скользящая средняя, которая может уменьшить отставание кривой и сделать ее быстрее реагировать на изменения цены. Сигнал покупки генерируется, когда цена прорывается через движущуюся среднюю снизу. Сигнал продажи генерируется, когда цена прорывается сверху.
Показатель ATR используется для расчета степени волатильности рынка и установки уровней стоп-лосса. Чем больше значение ATR, тем больше волатильность рынка, и должен быть установлен более широкий стоп-лосс. Чем меньше значение ATR, тем меньше волатильность рынка, и может быть установлен более узкий стоп-лосс.
Механизм остановки ATR регулирует позицию линии остановки на основе значений ATR в режиме реального времени, так что линия остановки может следовать за движением цены и оставаться в разумном диапазоне.
Используя T3 для определения направления, ATR для расчета волатильности и механизм ATR trailing stop, эта стратегия достигает относительно эффективного улавливания тенденций и контроля рисков.
Преимущества этой стратегии включают:
Применение линии Т3 улучшает точность отслеживания тенденций.
Показатель ATR динамически рассчитывает волатильность рынка, что делает уровни стоп-лосса и прибыли более разумными.
Механизм задержки ATR позволяет линии стоп-лосса отслеживать движение цены в режиме реального времени для эффективного контроля рисков.
Интегрирует индикаторы и механизмы стоп-лосса для достижения автоматизированной торговли отслеживанием трендов.
Может подключаться к внешним торговым платформам через webhook для автоматизированного исполнения ордеров.
Эта стратегия также сопряжена с некоторыми рисками:
Неправильные настройки параметров T3 могут упустить лучшие возможности тренда. Различные параметры цикла могут быть протестированы, чтобы найти оптимальные значения.
Неточный расчет значения ATR может привести к тому, что расстояние стоп-лосса будет слишком большим или слишком малым для эффективного контроля риска.
При сильных колебаниях линия стоп-лосса может быть нарушена, что приводит к чрезмерным потерям.
Частое запускание стоп-лосса может возникнуть на рынках випса.
Стратегия может быть оптимизирована в следующих аспектах:
Оптимизировать параметр T3, чтобы найти наиболее подходящий цикл сглаживания.
Испытать различные параметры цикла ATR для вычисления значения ATR, наилучшим образом отражающего волатильность рынка.
Оптимизировать гибкий диапазон дистанции остановки ATR для предотвращения чрезмерной чувствительности остановок.
Добавьте соответствующие фильтры, чтобы избежать частой торговли на рынках випса.
Включить индикаторы оценки тренда для повышения точности направленной рентабельности.
Используйте методы машинного обучения для автоматической оптимизации параметров.
Эта стратегия объединяет использование линии 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')