Эта стратегия использует комбинацию скользящей средней T3, индикатора ATR и Heikin Ashi для идентификации сигналов покупки и продажи, а также использует ATR для расчета стоп-лосса и уровня прибыли для тренда после торговли. Преимущество этой стратегии заключается в быстрой реакции при контроле риска торговли.
Движущаяся средняя T3: рассчитывает сглаженную скользящую среднюю T3 (период 100 по умолчанию) для определения направления тренда.
ATR: рассчитывает средний реальный диапазон, используемый для определения размера стоп-лосса/прибыли
ATR Trailing Stop: рассчитывает стоп-лосс на основе ATR, который корректируется на основе движения цен и волатильности.
Сигнал покупки: запускается, когда закрытие пересекается над ATR trailing stop и находится ниже скользящей средней T3
Сигнал продажи: запускается, когда закрытие пересекается ниже ATR и превышает скользящую среднюю T3.
Стоп-потеря/приобретение прибыли: после ввода цены стоп-потерь и приобретения прибыли, рассчитанные на основе ATR и коэффициента риска/прибыли, определенного пользователем
Длинный вход: Стоп-лосс - это цена входа минус ATR, прибыль - это цена входа плюс ATR * соотношение риск/прибыль
Краткий вход: Стоп-лосс - это цена входа плюс ATR, прибыль - это цена входа минус ATR * соотношение риск/прибыль
Выход, когда цена достигает уровня стоп-лосса или уровень прибыли
Период неплатежеспособности скользящей средней T3 составляет 100, более чувствительный, чем типичные скользящие средние, для более быстрой реакции на изменения цен
ATR отслеживает стоп-движения с волатильностью рынка, чтобы избежать остановки.
АТР отстаивает тенденцию, избегает преждевременного выхода даже во время краткосрочных отступлений.
Периоды как для T3, так и для ATR могут быть оптимизированы для различных рынков для повышения надежности
Сильные движения цены могут проникнуть в стоп-лосс, вызывая убытки. могут расширить период ATR и стоп-дистанцию.
Убытки возможны, если тенденция изменится и цена пересечет отстающую точку.
Оптимизация параметров рискует переустановить ограниченные исторические данные. Необходима надежная оптимизация на рынках / временных рамках.
Испытать различные периоды скользящей средней T3 для поиска оптимального баланса чувствительности и стабильности
Оптимизировать период ATR для поиска наилучшего контроля риска и тенденции после баланса
Включите RSI, MACD, чтобы избежать неправильных сделок в поворотные моменты
Машинное обучение для оптимальных автоматизированных параметров, уменьшение ручной предвзятости
Добавление правил размещения позиций для лучшего контроля риска
Эта стратегия сочетает в себе преимущества T3 и ATR, чтобы обеспечить быструю реакцию с контролем рисков. Дальнейшее улучшение стабильности и эффективности возможно благодаря оптимизации параметров и дополнительным фильтрам.
/*backtest start: 2022-10-31 00:00:00 end: 2023-11-06 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title='UT Bot Alerts (QuantNomad) Strategy w/ NinjaView', 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 ,alert_message=OCOMarketLong) strategy.entry("Short", strategy.short, when=sell , 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')