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.
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 strategi ini termasuk:
Penggunaan garis T3 meningkatkan ketepatan trend menangkap.
Indikator ATR secara dinamik mengira turun naik pasaran, menjadikan tahap stop loss dan mengambil keuntungan lebih munasabah.
Mekanisme hentian trailing ATR membolehkan garis stop loss untuk mengikuti pergerakan harga dalam masa nyata untuk kawalan risiko yang berkesan.
Mengintegrasikan penunjuk dan mekanisme berhenti kerugian untuk mencapai perdagangan pengesanan trend automatik.
Boleh menyambung ke platform dagangan luaran melalui webhook untuk pelaksanaan pesanan automatik.
Terdapat juga beberapa risiko dengan strategi ini:
Tetapan parameter T3 yang tidak betul boleh kehilangan peluang trend yang lebih baik.
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.
Dalam turun naik yang ganas, garis stop loss boleh dilanggar yang mengakibatkan kerugian yang berlebihan.
Pemicu stop loss yang kerap boleh berlaku di pasaran whipsaw.
Strategi ini boleh dioptimumkan dalam aspek berikut:
Mengoptimumkan parameter T3 untuk mencari kitaran pelembap yang paling sesuai.
Uji parameter kitaran ATR yang berbeza untuk mengira nilai ATR yang terbaik mencerminkan turun naik pasaran.
Mengoptimumkan julat fleksibel jarak hentian ATR untuk mengelakkan hentian yang terlalu sensitif.
Tambah penapis yang sesuai untuk mengelakkan perdagangan yang kerap di pasaran whipsaw.
Menggabungkan penanda penilaian trend untuk meningkatkan ketepatan keuntungan arah.
Gunakan kaedah pembelajaran mesin untuk mengoptimumkan parameter secara automatik.
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')