Strategi Perdagangan Purata Bergerak yang Disesuaikan Volatiliti

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

img

Ringkasan

Strategi ini menggunakan gabungan purata bergerak T3, penunjuk ATR dan Heikin Ashi untuk mengenal pasti isyarat beli dan jual, dan menggunakan ATR untuk mengira stop loss dan mengambil tahap keuntungan untuk trend selepas perdagangan.

Analisis Prinsip

Pengiraan Indikator

  • T3 Moving Average: Mengira purata bergerak T3 yang diluruskan (periode lalai 100) untuk menentukan arah trend

  • ATR: Mengira Julat Benar Purata, digunakan untuk menentukan saiz Stop Loss/Take Profit

  • ATR Trailing Stop: Mengira stop loss berdasarkan ATR yang disesuaikan berdasarkan pergerakan harga dan turun naik

Logik Perdagangan

  • Isyarat Beli: Dihidupkan apabila penutupan melintasi di atas hentian ATR dan di bawah purata bergerak T3

  • Isyarat Jual: Dihidupkan apabila penutupan melintasi di bawah ATR trailing stop dan di atas purata bergerak T3

  • Stop Loss/Take Profit: Selepas masuk, harga stop loss dan mengambil keuntungan yang dikira berdasarkan ATR dan nisbah risiko / ganjaran yang ditentukan pengguna

Masuk dan Keluar

  • Long Entry: Stop loss adalah harga masuk dikurangkan ATR, mengambil keuntungan adalah harga masuk ditambah ATR * nisbah risiko / ganjaran

  • Entry pendek: Stop loss adalah harga masuk ditambah ATR, mengambil keuntungan adalah harga masuk dikurangkan ATR * nisbah risiko / ganjaran

  • Keluar apabila harga mencapai paras stop loss atau mengambil keuntungan

Analisis Kelebihan

Tanggapan Cepat

Tempoh lalai purata bergerak T3 adalah 100, lebih sensitif daripada purata bergerak biasa untuk bertindak balas lebih cepat terhadap perubahan harga

Kawalan Risiko

ATR bergerak dengan turun naik pasaran untuk mengelakkan berhenti. Stop loss / mengambil keuntungan berdasarkan ATR mengawal risiko / ganjaran setiap perdagangan

Trend Berikutan

Hentian pengangkut ATR mengikuti trend, mengelakkan keluar lebih awal walaupun semasa penarikan jangka pendek

Pengoptimuman Parameter

Tempoh untuk kedua-dua T3 dan ATR boleh dioptimumkan untuk pasaran yang berbeza untuk meningkatkan ketahanan

Analisis Risiko

Stop Loss Breakeven

Pergerakan harga yang teruk boleh menembusi stop loss menyebabkan kerugian.

Pembalikan Trend

Kemungkinan kerugian jika trend berbalik dan harga melintasi penangguhan.

Pengoptimuman Overfitting

Pengoptimuman parameter berisiko terlalu sesuai dengan data sejarah yang terhad. Perlu pengoptimuman yang kukuh di seluruh pasaran / jangka masa.

Peluang Peningkatan

  • Uji tempoh purata bergerak T3 yang berbeza untuk mencari keseimbangan sensitiviti dan kestabilan yang optimum

  • Mengoptimumkan tempoh ATR untuk mencari kawalan risiko terbaik dan trend selepas keseimbangan

  • Menggabungkan RSI, MACD untuk mengelakkan perdagangan yang salah pada titik perubahan

  • Pembelajaran mesin untuk parameter automatik yang optimum, mengurangkan bias manual

  • Tambah peraturan saiz kedudukan untuk mengawal risiko yang lebih baik

Ringkasan

Strategi ini menggabungkan kelebihan T3 dan ATR untuk membolehkan tindak balas cepat dengan kawalan risiko. Penambahbaikan lebih lanjut dalam kestabilan dan kecekapan mungkin melalui pengoptimuman parameter dan penapis tambahan. Tetapi peniaga masih harus melihat risiko pembalikan dan impas, dan mengelakkan terlalu bergantung pada hasil backtest.


/*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 lanjut