Strategi ini menjana isyarat panjang dan pendek melalui purata bergerak berganda dan melaksanakan pemantauan stop loss.
Strategi ini menggunakan hl2 sebagai harga sumber dan mengira ATR dari tempoh tertentu sebagai julat stop loss. Band atas dan bawah dikira berdasarkan ATR didarabkan dengan faktor tertentu. Apabila harga memecahkan di atas band atas, isyarat beli dihasilkan untuk pergi panjang. Apabila harga memecahkan di bawah band bawah, isyarat jual dihasilkan untuk pergi pendek.
Selepas membuka kedudukan, stop loss diselaraskan dalam masa nyata berdasarkan perubahan dalam ATR untuk mencapai rintangan stop loss. Khususnya, selepas pergi lama, band bawah dinaikkan secara progresif berdasarkan tahap terendah terkini untuk mengesan stop loss. Selepas pergi pendek, band atas diturunkan secara progresif berdasarkan tahap tertinggi terkini untuk mengesan stop loss.
Dengan cara ini, strategi ini memanfaatkan sepenuhnya keupayaan purata bergerak untuk menentukan arah trend, dan juga menggabungkan mekanisme pengesanan stop loss berdasarkan ATR untuk memastikan arah perdagangan dan kawalan risiko.
Kelebihan terbesar strategi ini terletak pada kawalan risiko. Strategi purata bergerak tradisional hanya mempertimbangkan penghakiman arah dan dengan mudah boleh meletupkan akaun. Dengan menggabungkan ATR untuk mengesan stop loss, strategi ini dapat menyesuaikan stop loss secara dinamik berdasarkan turun naik pasaran untuk mengawal risiko perdagangan dengan berkesan.
Di samping itu, strategi ini menggabungkan perdagangan dua arah. Berbanding dengan strategi satu arah, ia dapat dengan cepat menyesuaikan arah kedudukan apabila trend berbalik, mengelakkan terperangkap dalam satu arah dan meningkatkan keuntungan strategi.
Risiko utama strategi ini berasal dari tetapan parameter tempoh ATR dan pengganda. Jika tempoh ATR terlalu pendek atau pengganda terlalu besar, julat stop loss akan terlalu kecil untuk mengawal risiko dengan berkesan. Jika tempoh ATR terlalu lama atau pengganda terlalu kecil, stop loss akan terlalu longgar untuk keuntungan. Juga, terdapat risiko pecah palsu apabila harga menembusi purata bergerak.
Risiko boleh dikendalikan dengan mengoptimumkan tempoh ATR dan pengganda untuk mengimbangi antara sasaran stop loss dan keuntungan, dan menggabungkan penunjuk lain untuk menapis pecah palsu dan meningkatkan kualiti isyarat.
Strategi ini boleh ditingkatkan dari aspek berikut:
Mengoptimumkan tempoh purata bergerak untuk mencari kombinasi parameter terbaik.
Tambah penunjuk lain seperti MACD, KDJ dll untuk menapis isyarat dan meningkatkan kualiti.
Menggabungkan saiz kedudukan seperti pecahan tetap, Martingale dan lain-lain untuk meningkatkan keuntungan.
Penyelidikan parameter perbezaan antara pelbagai produk untuk pengoptimuman.
Gunakan pembelajaran mesin seperti algoritma genetik untuk latihan parameter dan pengoptimuman.
Strategi ini sepenuhnya mempertimbangkan penghakiman trend dan kawalan risiko, mengejar keuntungan sambil mengurangkan pengeluaran. Penambahbaikan lanjut melalui pengoptimuman parameter dan kaedah portfolio dapat membantu meningkatkan keuntungan strategi. Ringkasnya, ini adalah strategi perdagangan kuantitatif yang kukuh dan stabil dengan logik yang jelas dan pelaksanaan yang mudah.
/*backtest start: 2022-11-09 00:00:00 end: 2023-11-15 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © KivancOzbilgic //@version=4 strategy("Trenbolone Strategy", overlay = true) Periods = input(title="ATR Period", type=input.integer, defval=10) src = input(hl2, title="Source") Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true) showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false) highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true) barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true) atr2 = sma(tr, Periods) atr= changeATR ? atr(Periods) : atr2 up=src-(Multiplier*atr) up1 = nz(up[1],up) up := close[1] > up1 ? max(up,up1) : up dn=src+(Multiplier*atr) dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green) buySignal = trend == 1 and trend[1] == -1 plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0) plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0) dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red) sellSignal = trend == -1 and trend[1] == 1 plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0) plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0) mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0) longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor) fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor) FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 999) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 999) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish ? true : false longCondition = buySignal if (longCondition) strategy.entry("BUY", strategy.long, when = window()) shortCondition = sellSignal if (shortCondition) strategy.entry("SELL", strategy.short, when = window()) buy1 = barssince(buySignal) sell1 = barssince(sellSignal) color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na barcolor(barcoloring ? color1 : na)