
Strategi ini membina isyarat berlubang melalui purata bergerak dua arah untuk mencapai penghentian pengesanan. Ideanya adalah menggunakan purata bergerak untuk menentukan arah trend, melakukan lebih banyak shorting ke arah trend, dan menggunakan ATR untuk mengira titik berhenti untuk mencapai penghentian pengesanan.
Strategi ini menggunakan hl2 sebagai harga sumber, dan mengira ATR untuk satu kitaran sebagai margin stop loss. Mengambil nilai ATR dengan mengalikannya dengan kelipatan tertentu, ia mengira atas dan bawah.
Selepas membuka kedudukan, anda boleh menyesuaikan titik hentian anda mengikut perubahan masa nyata ATR, untuk mencapai pelacakan hentian. Secara khusus, apabila anda melakukan lebih banyak, anda boleh terus menaikkan tren bawah anda mengikut titik rendah terkini, untuk mencapai pelacakan hentian. Apabila anda melakukan kosong, anda boleh terus menaikkan tren atas anda mengikut titik tinggi terkini, untuk mencapai pelacakan hentian.
Dengan cara ini, strategi ini memanfaatkan sepenuhnya fungsi rata-rata bergerak untuk menentukan arah trend, dan menambah mekanisme pengesanan berhenti berdasarkan ATR, yang memastikan kebenaran arah perdagangan dan mengawal risiko perdagangan.
Kelebihan terbesar strategi ini adalah kawalan risiko. Strategi purata bergerak tradisional hanya mempertimbangkan penilaian arah, mudah untuk pecah kedudukan. Strategi ini menambah tracking stop loss yang dikira ATR, dapat menyesuaikan stop loss secara dinamik mengikut keluasan turun naik pasaran, dan mengawal risiko perdagangan dengan berkesan.
Di samping itu, strategi ini menggabungkan perdagangan dua hala yang berbilang. Berbanding dengan strategi satu arah, ia dapat menyesuaikan arah kedudukan dengan tepat pada masa perubahan trend, mengelakkan terjebak dalam satu arah, dan meningkatkan keuntungan strategi.
Risiko utama strategi ini terletak pada pengaturan kitaran dan kelipatan ATR. Jika kitaran ATR terlalu pendek atau kelipatan terlalu besar, stop loss akan terlalu kecil untuk mengawal risiko dengan berkesan; jika kitaran ATR terlalu panjang atau kelipatan terlalu kecil, stop loss terlalu longgar dan sukar untuk mendapat keuntungan. Selain itu, risiko pecah palsu mungkin berlaku apabila harga menembusi purata bergerak yang mencetuskan isyarat binaan.
Anda boleh mengimbangi keuntungan henti rugi dengan mengoptimumkan kitaran parameter dan kelipatan; menggabungkan penapisan penipuan palsu dengan penunjuk lain, meningkatkan kualiti isyarat dan mengurangkan risiko.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Mengoptimumkan kitaran purata bergerak untuk mencari kombinasi parameter terbaik
Menambah penapis untuk penunjuk lain seperti MACD, KDJ dan lain-lain untuk meningkatkan kualiti isyarat
Menambah strategi pengurusan kedudukan, seperti saham tetap, Martingale dan lain-lain, meningkatkan keuntungan strategi
Perbezaan parameter yang boleh dikaji dalam pelbagai jenis untuk pengoptimuman parameter
Pengoptimuman parameter yang boleh dilatih dengan menggunakan kaedah pembelajaran mesin seperti algoritma genetik
Strategi ini mempertimbangkan penilaian trend dan kawalan risiko secara menyeluruh, dengan memberi tumpuan kepada mengurangkan pulangan semasa mengejar keuntungan. Dengan kaedah seperti pengoptimuman parameter dan kombinasi, keuntungan strategi dapat ditingkatkan lagi. Secara keseluruhan, strategi ini jelas, mudah dilaksanakan, dan merupakan strategi perdagangan kuantitatif yang stabil dan dipercayai.
/*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)