Стратегия торговли скорректированной по волатильности скользящей средней

Автор:Чао Чжан, Дата: 2023-11-07 17:18:05
Тэги:

img

Обзор

Эта стратегия использует комбинацию скользящей средней 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')


Больше