Strategi Perdagangan Garis Henti Bergerak Beradaptasi

Penulis:ChaoZhang, Tarikh: 2024-02-21 16:07:20
Tag:

img

Ringkasan

Idea utama strategi ini adalah untuk menggunakan purata bergerak T3 dan hentian mengikut adaptif ATR untuk menangkap titik masuk dan keluar di sepanjang trend. Ia tergolong dalam strategi trend berikut. Isyarat dagangan dihasilkan apabila harga memecahkan garis T3, dan tahap hentian kerugian dan mengambil keuntungan ditetapkan menggunakan nilai ATR pada titik pecah untuk mencapai hentian kerugian automatik dan mengambil keuntungan.

Prinsip Strategi

Strategi ini terdiri daripada penunjuk T3, penunjuk ATR dan mekanisme menghentikan trailing ATR.

Purata bergerak T3 adalah purata bergerak yang halus yang dapat mengurangkan kelewatan kurva dan membuatnya bertindak balas lebih cepat terhadap perubahan harga. Isyarat beli dihasilkan apabila harga memecahkan purata bergerak dari bawah. Isyarat jual dihasilkan apabila harga memecahkan dari atas.

Indikator ATR digunakan untuk mengira tahap turun naik pasaran dan menetapkan tahap stop loss. Semakin besar nilai ATR, semakin besar turun naik pasaran, dan kerugian berhenti yang lebih luas harus ditetapkan. Semakin kecil nilai ATR, semakin kecil turun naik pasaran, dan kerugian berhenti yang lebih sempit boleh ditetapkan.

Mekanisme hentian trailing ATR menyesuaikan kedudukan garis stop loss berdasarkan nilai ATR dalam masa nyata, supaya garis stop loss dapat mengikuti pergerakan harga dan kekal dalam julat yang munasabah. Ini menghalang stop loss daripada terlalu dekat dan tersingkir dengan mudah, dan juga menghalang stop loss daripada terlalu luas untuk mengawal risiko dengan berkesan.

Dengan menggunakan T3 untuk menentukan arah, ATR untuk mengira turun naik dan mekanisme berhenti trailing ATR, strategi ini mencapai menangkap trend dan kawalan risiko yang agak cekap.

Kelebihan

Kelebihan strategi ini termasuk:

  1. Penggunaan garis T3 meningkatkan ketepatan trend menangkap.

  2. Indikator ATR secara dinamik mengira turun naik pasaran, menjadikan tahap stop loss dan mengambil keuntungan lebih munasabah.

  3. Mekanisme hentian trailing ATR membolehkan garis stop loss untuk mengikuti pergerakan harga dalam masa nyata untuk kawalan risiko yang berkesan.

  4. Mengintegrasikan penunjuk dan mekanisme berhenti kerugian untuk mencapai perdagangan pengesanan trend automatik.

  5. Boleh menyambung ke platform dagangan luaran melalui webhook untuk pelaksanaan pesanan automatik.

Risiko dan Penyelesaian

Terdapat juga beberapa risiko dengan strategi ini:

  1. Tetapan parameter T3 yang tidak betul boleh kehilangan peluang trend yang lebih baik.

  2. Pengiraan nilai ATR yang tidak tepat boleh menyebabkan jarak stop loss terlalu besar atau terlalu kecil untuk mengawal risiko dengan berkesan. Parameter kitaran ATR boleh diselaraskan dengan ciri-ciri turun naik pasaran.

  3. Dalam turun naik yang ganas, garis stop loss boleh dilanggar yang mengakibatkan kerugian yang berlebihan.

  4. Pemicu stop loss yang kerap boleh berlaku di pasaran whipsaw.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Mengoptimumkan parameter T3 untuk mencari kitaran pelembap yang paling sesuai.

  2. Uji parameter kitaran ATR yang berbeza untuk mengira nilai ATR yang terbaik mencerminkan turun naik pasaran.

  3. Mengoptimumkan julat fleksibel jarak hentian ATR untuk mengelakkan hentian yang terlalu sensitif.

  4. Tambah penapis yang sesuai untuk mengelakkan perdagangan yang kerap di pasaran whipsaw.

  5. Menggabungkan penanda penilaian trend untuk meningkatkan ketepatan keuntungan arah.

  6. Gunakan kaedah pembelajaran mesin untuk mengoptimumkan parameter secara automatik.

Kesimpulan

Strategi ini mengintegrasikan penggunaan garis T3 untuk menentukan arah trend, penunjuk ATR untuk mengira berhenti / sasaran dan mekanisme berhenti trailing ATR untuk menyesuaikan jarak berhenti. Ia mencapai penjejakan trend automatik dan kawalan risiko yang cekap. Ini adalah strategi trend yang boleh dipercayai. Dalam aplikasi praktikal, ujian dan pengoptimuman berterusan masih diperlukan untuk mencari kombinasi parameter yang paling sesuai untuk keadaan pasaran semasa, dengan itu mendapatkan hasil strategi yang lebih baik.


/*backtest
start: 2024-01-21 00:00:00
end: 2024-02-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='UT Bot Alerts (QuantNomad) Strategy', 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 and buySignal3, alert_message=OCOMarketLong)
strategy.entry("Short", strategy.short, when=sell and sellSignal3, 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