Sumber daya yang dimuat... Pemuatan...

Strategi SuperTrend Dinamis Berbagai Tahap yang Disesuaikan dengan Volatilitas

Penulis:ChaoZhang, Tanggal: 2024-11-29 16:57:19
Tag:ATRSMAPenyakit menularTP

img

Gambaran umum

Multi-Step Volatility-Adjusted Dynamic SuperTrend Strategy adalah sistem perdagangan inovatif yang menggabungkan indikator Vegas Channel dan SuperTrend. Keunikan strategi ini terletak pada kemampuannya untuk beradaptasi secara dinamis dengan volatilitas pasar dan mekanisme mengambil keuntungan multi-langkahnya untuk mengoptimalkan rasio risiko-balasan. Dengan menggabungkan analisis volatilitas Vegas Channel dengan kemampuan mengikuti tren SuperTrend, strategi secara otomatis menyesuaikan parameternya seiring perubahan kondisi pasar, memberikan sinyal perdagangan yang lebih akurat.

Prinsip Strategi

Strategi ini beroperasi pada tiga komponen inti: perhitungan saluran Vegas, deteksi tren, dan mekanisme mengambil keuntungan multi-langkah. Saluran Vegas menggunakan Rata-rata Bergerak Sederhana (SMA) dan Penyimpangan Standar (STD) untuk menentukan rentang volatilitas harga, sementara indikator SuperTrend menentukan arah tren berdasarkan nilai ATR yang disesuaikan. Sinyal perdagangan dihasilkan ketika tren pasar berubah. Mekanisme mengambil keuntungan multi-langkah memungkinkan keluar parsial pada tingkat harga yang berbeda, metode yang mengunci keuntungan dan memungkinkan posisi yang tersisa untuk menangkap potensi keuntungan. Keunikan strategi terletak pada faktor penyesuaian volatilitasnya, yang secara dinamis menyesuaikan pengganda SuperTrend berdasarkan lebar Saluran Vegas.

Keuntungan Strategi

  1. Adaptabilitas Dinamis: Strategi secara otomatis beradaptasi dengan kondisi pasar yang berbeda melalui faktor penyesuaian volatilitas.
  2. Manajemen Risiko: Mekanisme mengambil keuntungan multi-langkah memberikan pendekatan sistematis untuk realisasi keuntungan.
  3. Kustomisasi: Menawarkan beberapa pengaturan parameter untuk mengakomodasi gaya perdagangan yang berbeda.
  4. Cakupan pasar yang komprehensif: Mendukung perdagangan panjang dan pendek.
  5. Umpan Balik Visual: Menyediakan antarmuka grafis yang jelas untuk analisis dan pengambilan keputusan.

Risiko Strategi

  1. Sensitivitas parameter: Kombinasi parameter yang berbeda dapat menyebabkan variasi kinerja yang signifikan.
  2. Lag: Indikator yang didasarkan pada moving average memiliki lag yang melekat.
  3. Risiko pecah palsu: Dapat menghasilkan sinyal palsu di pasar yang berbeda.
  4. Take-Profit Trade-offs: Take-profit awal mungkin melewatkan tren utama, take-profit terlambat berisiko kehilangan keuntungan yang terkumpul.

Arah Optimasi Strategi

  1. Memperkenalkan filter lingkungan pasar untuk menyesuaikan parameter strategi di bawah kondisi pasar yang berbeda.
  2. Tambahkan analisis volume untuk meningkatkan keandalan sinyal.
  3. Mengembangkan mekanisme adaptatif mengambil keuntungan yang secara dinamis menyesuaikan tingkat keuntungan berdasarkan volatilitas pasar.
  4. Mengintegrasikan indikator teknis tambahan untuk konfirmasi sinyal.
  5. Menerapkan ukuran posisi dinamis berdasarkan risiko pasar.

Ringkasan

Multi-Step Volatility-Adjusted Dynamic SuperTrend Strategy merupakan pendekatan perdagangan kuantitatif yang canggih, menggabungkan beberapa indikator teknis dan mekanisme mengambil keuntungan inovatif untuk menyediakan pedagang dengan sistem perdagangan yang komprehensif.


/*backtest
start: 2024-10-01 00:00:00
end: 2024-10-31 23:59:59
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Multi-Step Vegas SuperTrend - strategy [presentTrading]", shorttitle="Multi-Step Vegas SuperTrend - strategy [presentTrading]", overlay=true, precision=3, commission_value=0.1, commission_type=strategy.commission.percent, slippage=1, currency=currency.USD)

// Input settings allow the user to customize the strategy's parameters.
tradeDirectionChoice = input.string(title="Trade Direction", defval="Both", options=["Long", "Short", "Both"]) // Option to select the trading direction
atrPeriod = input(10, "ATR Period for SuperTrend") // Length of the ATR for volatility measurement
vegasWindow = input(100, "Vegas Window Length") // Length of the moving average for the Vegas Channel
superTrendMultiplier = input(5, "SuperTrend Multiplier Base") // Base multiplier for the SuperTrend calculation
volatilityAdjustment = input.float(5, "Volatility Adjustment Factor") // Factor to adjust the SuperTrend sensitivity to the Vegas Channel width

// User inputs for take profit settings
useTakeProfit = input.bool(true, title="Use Take Profit", group="Take Profit Settings")
takeProfitPercent1 = input.float(3.0, title="Take Profit % Step 1", group="Take Profit Settings")
takeProfitPercent2 = input.float(6.0, title="Take Profit % Step 2", group="Take Profit Settings")
takeProfitPercent3 = input.float(12.0, title="Take Profit % Step 3", group="Take Profit Settings")
takeProfitPercent4 = input.float(21.0, title="Take Profit % Step 4", group="Take Profit Settings")

takeProfitAmount1 = input.float(25, title="Take Profit Amount % Step 1", group="Take Profit Settings")
takeProfitAmount2 = input.float(20, title="Take Profit Amount % Step 2", group="Take Profit Settings")
takeProfitAmount3 = input.float(10, title="Take Profit Amount % Step 3", group="Take Profit Settings")
takeProfitAmount4 = input.float(15, title="Take Profit Amount % Step 4", group="Take Profit Settings")

numberOfSteps = input.int(4, title="Number of Take Profit Steps", minval=1, maxval=4, group="Take Profit Settings")

// Calculate the Vegas Channel using a simple moving average and standard deviation.
vegasMovingAverage = ta.sma(close, vegasWindow)
vegasChannelStdDev = ta.stdev(close, vegasWindow)
vegasChannelUpper = vegasMovingAverage + vegasChannelStdDev
vegasChannelLower = vegasMovingAverage - vegasChannelStdDev

// Adjust the SuperTrend multiplier based on the width of the Vegas Channel.
channelVolatilityWidth = vegasChannelUpper - vegasChannelLower
adjustedMultiplier = superTrendMultiplier + volatilityAdjustment * (channelVolatilityWidth / vegasMovingAverage)

// Calculate the SuperTrend indicator values.
averageTrueRange = ta.atr(atrPeriod)
superTrendUpper = hlc3 - (adjustedMultiplier * averageTrueRange)
superTrendLower = hlc3 + (adjustedMultiplier * averageTrueRange)
var float superTrendPrevUpper = na
var float superTrendPrevLower = na
var int marketTrend = 1

// Update SuperTrend values and determine the current trend direction.
superTrendPrevUpper := nz(superTrendPrevUpper[1], superTrendUpper)
superTrendPrevLower := nz(superTrendPrevLower[1], superTrendLower)
marketTrend := close > superTrendPrevLower ? 1 : close < superTrendPrevUpper ? -1 : nz(marketTrend[1], 1)
superTrendUpper := marketTrend == 1 ? math.max(superTrendUpper, superTrendPrevUpper) : superTrendUpper
superTrendLower := marketTrend == -1 ? math.min(superTrendLower, superTrendPrevLower) : superTrendLower
superTrendPrevUpper := superTrendUpper
superTrendPrevLower := superTrendLower

// Enhanced Visualization
// Plot the SuperTrend and Vegas Channel for visual analysis.
plot(marketTrend == 1 ? superTrendUpper : na, "SuperTrend Upper", color=color.green, linewidth=2)
plot(marketTrend == -1 ? superTrendLower : na, "SuperTrend Lower", color=color.red, linewidth=2)
plot(vegasChannelUpper, "Vegas Upper", color=color.purple, linewidth=1)
plot(vegasChannelLower, "Vegas Lower", color=color.purple, linewidth=1)

// Apply a color to the price bars based on the current market trend.
barcolor(marketTrend == 1 ? color.green : marketTrend == -1 ? color.red : na)

// Detect trend direction changes and plot entry/exit signals.
trendShiftToBullish = marketTrend == 1 and marketTrend[1] == -1
trendShiftToBearish = marketTrend == -1 and marketTrend[1] == 1

plotshape(series=trendShiftToBullish, title="Enter Long", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=trendShiftToBearish, title="Enter Short", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")

// Define conditions for entering long or short positions, and execute trades based on these conditions.
enterLongCondition = marketTrend == 1
enterShortCondition = marketTrend == -1

// Check trade direction choice before executing trade entries.
if enterLongCondition and (tradeDirectionChoice == "Long" or tradeDirectionChoice == "Both")
    strategy.entry("Long Position", strategy.long)

if enterShortCondition and (tradeDirectionChoice == "Short" or tradeDirectionChoice == "Both")
    strategy.entry("Short Position", strategy.short)

// Close all positions when the market trend changes.
if marketTrend != marketTrend[1]
    strategy.close_all()

// Multi-Stage Take Profit Logic
if (strategy.position_size > 0)
    entryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1)
    if numberOfSteps >= 1
        strategy.exit("Take Profit 1", from_entry="Long Position", qty_percent=takeProfitAmount1, limit=entryPrice * (1 + takeProfitPercent1 / 100))
    if numberOfSteps >= 2
        strategy.exit("Take Profit 2", from_entry="Long Position", qty_percent=takeProfitAmount2, limit=entryPrice * (1 + takeProfitPercent2 / 100))
    if numberOfSteps >= 3
        strategy.exit("Take Profit 3", from_entry="Long Position", qty_percent=takeProfitAmount3, limit=entryPrice * (1 + takeProfitPercent3 / 100))
    if numberOfSteps >= 4
        strategy.exit("Take Profit 4", from_entry="Long Position", qty_percent=takeProfitAmount4, limit=entryPrice * (1 + takeProfitPercent4 / 100))

if (strategy.position_size < 0)
    entryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1)
    if numberOfSteps >= 1
        strategy.exit("Take Profit 1", from_entry="Short Position", qty_percent=takeProfitAmount1, limit=entryPrice * (1 - takeProfitPercent1 / 100))
    if numberOfSteps >= 2
        strategy.exit("Take Profit 2", from_entry="Short Position", qty_percent=takeProfitAmount2, limit=entryPrice * (1 - takeProfitPercent2 / 100))
    if numberOfSteps >= 3
        strategy.exit("Take Profit 3", from_entry="Short Position", qty_percent=takeProfitAmount3, limit=entryPrice * (1 - takeProfitPercent3 / 100))
    if numberOfSteps >= 4
        strategy.exit("Take Profit 4", from_entry="Short Position", qty_percent=takeProfitAmount4, limit=entryPrice * (1 - takeProfitPercent4 / 100))


Berkaitan

Lebih banyak