Strategi perdagangan rata-rata bergerak yang disesuaikan dengan volatilitas

Penulis:ChaoZhang, Tanggal: 2023-11-07 17:18:05
Tag:

img

Gambaran umum

Strategi ini menggunakan kombinasi dari rata-rata bergerak T3, indikator ATR dan Heikin Ashi untuk mengidentifikasi sinyal beli dan jual, dan menggunakan ATR untuk menghitung stop loss dan mengambil tingkat keuntungan untuk tren setelah perdagangan. Keuntungan dari strategi ini adalah respon cepat sambil mengendalikan risiko perdagangan.

Analisis Prinsip

Perhitungan Indikator

  • T3 Moving Average: Menghitung rata-rata bergerak T3 yang dihaluskan (periode default 100) untuk menentukan arah tren

  • ATR: Menghitung rentang rata-rata yang sebenarnya, digunakan untuk menentukan ukuran stop loss/take profit

  • ATR Trailing Stop: Menghitung stop loss berdasarkan ATR yang disesuaikan berdasarkan pergerakan harga dan volatilitas

Logika Perdagangan

  • Buy Signal: Diaktifkan ketika close melintasi ATR trailing stop dan berada di bawah T3 moving average

  • Sinyal Jual: Diaktifkan ketika penutupan melintasi di bawah ATR trailing stop dan di atas rata-rata bergerak T3

  • Stop Loss/Take Profit: Setelah masuk, harga stop loss dan take profit yang dihitung berdasarkan ATR dan rasio risiko/manfaat yang ditentukan pengguna

Masuk dan Keluar

  • Long Entry: Stop loss adalah harga masuk dikurangi ATR, take profit adalah harga masuk ditambah ATR * rasio risiko / imbalan

  • Short Entry: Stop loss adalah harga masuk ditambah ATR, take profit adalah harga masuk dikurangi ATR * rasio risiko / imbalan

  • Keluar saat harga mencapai level stop loss atau take profit

Analisis Keuntungan

Tanggapan Cepat

Periode default rata-rata bergerak T3 adalah 100, lebih sensitif daripada rata-rata bergerak khas untuk reaksi yang lebih cepat terhadap perubahan harga

Pengendalian Risiko

ATR trailing stop bergerak dengan volatilitas pasar untuk menghindari dihentikan. Stop loss / take profit berdasarkan ATR mengendalikan risiko / imbalan per perdagangan

Tren Mengikuti

ATR trailing stop mengikuti tren, menghindari awal keluar bahkan selama jangka pendek pullbacks

Optimasi Parameter

Periode untuk T3 dan ATR dapat dioptimalkan untuk pasar yang berbeda untuk meningkatkan ketahanan

Analisis Risiko

Stop Loss Breakeven

Gerakan harga yang parah dapat menembus stop loss menyebabkan kerugian. dapat memperluas periode ATR dan jarak stop.

Pembalikan Tren

Kemungkinan kerugian jika tren berbalik dan harga melintasi trailing stop. Dapat menggabungkan indikator lain untuk mengidentifikasi pembalikan.

Optimalisasi Overfitting

Optimasi parameter berisiko terlalu sesuai dengan data sejarah yang terbatas.

Peluang Peningkatan

  • Uji periode rata-rata bergerak T3 yang berbeda untuk menemukan keseimbangan sensitivitas dan stabilitas yang optimal

  • Mengoptimalkan periode ATR untuk menemukan kontrol risiko terbaik dan tren setelah keseimbangan

  • Mengintegrasikan RSI, MACD untuk menghindari perdagangan yang salah pada titik balik

  • Pembelajaran mesin untuk parameter otomatis optimal, mengurangi bias manual

  • Tambahkan aturan ukuran posisi untuk mengontrol risiko dengan lebih baik

Ringkasan

Strategi ini menggabungkan keuntungan dari T3 dan ATR untuk memungkinkan respons cepat dengan pengendalian risiko. Peningkatan lebih lanjut dalam stabilitas dan efisiensi mungkin melalui optimasi parameter dan filter tambahan.


/*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')


Lebih banyak