
Стратегия использует комбинацию T3 Moving Averages, ATR Indicators и Hyperforce, чтобы идентифицировать сигналы покупки и продажи, а также, чтобы рассчитать стоп-стоп на основе ATR, чтобы отслеживать тренд. Преимущество стратегии заключается в том, что она быстро реагирует и контролирует торговые риски.
T3 Moving Average: T3 Moving Average с гладким параметром T3 (по умолчанию 100) для определения направления тренда.
ATR: вычисляет ATR (средняя истинная величина колебаний), используемый для определения величины стоп-стоп-позиции.
ATR Mobile Stop: на основе ATR рассчитывается мобильная линия стоп-ложа, которая может быть скорректирована в зависимости от изменения цены и волатильности, что позволяет отслеживать тренд.
Сигнал покупки: Сигнал покупки появляется, когда ATR пересекает линию движущейся потери по цене закрытия и находится ниже средней T3.
Сигнал продажи: Сигнал продажи возникает, когда ATR пересекает линию движущейся потери под ценой закрытия и выше средней T3.
Стоп-стоп: Стоп-стоп и стоп-цены рассчитываются после входа в систему на основе значения ATR и рисково-возвратного соотношения, установленного пользователем.
После покупки цена стоп-лосса составляет цену входа минус ATR, цена стоп-лосса - цену входа плюс ATR, умноженную на коэффициент возврата риска.
После продажи цена стоп-лосса увеличивается на цену входа плюс ATR, цена стоп-лосса уменьшается на цену входа минус ATR и умножается на коэффициент возврата риска.
Когда цена вызывает стоп-лосс или стоп-приз, позиция выходит из строя.
T3 средний параметр по умолчанию 100, более чувствительный к изменению цены, чем обычный скользящий средний.
Мобильные стоп-потери, рассчитываемые с использованием ATR, могут быть сделаны в зависимости от рыночных колебаний цены траль, чтобы избежать риска, что стоп-потери будут пробиты. Позиции стоп-стоп-порогов основаны на ATR и могут контролировать риск-возвратность каждой сделки.
Мобильная стоп-линия ATR может отслеживать тренд, даже если она не будет задействована при кратковременном отклонении цены, что уменьшает ошибочный сигнал.
Циклы средней T3 и ATR могут быть оптимизированы, чтобы скорректировать параметры для различных рынков и повысить стабильность стратегии.
В случае экстремальных ситуаций цена может напрямую прорваться через линию остановки, что приводит к убыткам. Для смягчения можно соответствующим образом расширить циклы ATR и остановку.
При обратном тренде пересечение ценой движущейся стоп-линии может привести к убыткам. Можно объединить это с другими показателями, чтобы оценить тренд и избежать торговли вблизи обратной точки.
Параметровая оптимизация требует поддержки богатыми историческими данными, существует риск переоптимизации. Параметры оптимизации должны использоваться в комбинации с несколькими рынками и несколькими временными циклами, а не полагаться на один набор данных.
Тестирование различных параметров цикла среднего Т3, чтобы найти оптимальную комбинацию параметров, балансирующих чувствительность и устойчивость
Тестирование 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')