SPARK Pengukuran Posisi Dinamik dan Strategi Dagangan Indikator Berdua

Penulis:ChaoZhang, Tarikh: 2024-04-12 17:22:47
Tag:supertrendRSIATR

img

Ringkasan

Strategi SPARK adalah strategi perdagangan kuantitatif yang menggabungkan pengukuran kedudukan dinamik dengan pengesahan penunjuk berganda. Strategi ini menggunakan penunjuk SuperTrend dan Indeks Kekuatan Relatif (RSI) untuk mengenal pasti titik masuk dan keluar yang berpotensi sambil menggunakan mekanisme pengukuran kedudukan dinamik untuk mengoptimumkan peruntukan modal. Strategi ini juga menawarkan tetapan keuntungan dan hentian kerugian yang fleksibel, serta parameter yang boleh disesuaikan seperti kekerapan perdagangan minimum dan keutamaan arah.

Prinsip Strategi

Inti strategi SPARK terletak pada aplikasi gabungan penunjuk SuperTrend dan penunjuk RSI. Penunjuk SuperTrend menentukan arah trend dengan membandingkan harga penutupan dengan tahap sokongan dan rintangan dinamik, sementara penunjuk RSI digunakan untuk mengenal pasti keadaan pasaran yang terlalu banyak dibeli dan terlalu banyak dijual. Apabila kedua-dua penunjuk SuperTrend dan RSI secara serentak memenuhi kriteria tertentu, strategi menghasilkan isyarat kemasukan.

Strategi ini menggunakan mekanisme saiz kedudukan dinamik untuk mengoptimumkan peruntukan modal untuk setiap perdagangan. Dengan menetapkan peratusan portfolio dan nisbah leverage, strategi secara automatik mengira saiz kedudukan yang optimum berdasarkan keadaan pasaran semasa dan baki akaun. Di samping itu, strategi ini menawarkan fleksibel mengambil keuntungan dan menghentikan kerugian tetapan, membolehkan pengguna memilih antara peratusan tetap atau tahap yang dikira secara dinamik.

Kelebihan Strategi

  1. Pengesahan Indikator Dual: Dengan menggabungkan penunjuk SuperTrend dan RSI, strategi SPARK dapat mengenal pasti titik masuk dan keluar yang berpotensi dengan lebih tepat, mengurangkan kemungkinan isyarat palsu.
  2. Pengukuran Posisi Dinamik: Strategi ini menggunakan mekanisme pengukuran kedudukan dinamik yang secara automatik mengoptimumkan peruntukan modal untuk setiap perdagangan berdasarkan peratusan portfolio dan nisbah leverage, meningkatkan kecekapan modal.
  3. Pengurusan Risiko Fleksibel: Strategi ini menawarkan tetapan mengambil keuntungan dan menghentikan kerugian yang fleksibel, yang membolehkan pengguna memilih antara peratusan tetap atau tahap yang dikira secara dinamik berdasarkan pilihan risiko mereka, yang membolehkan kawalan risiko yang tepat.
  4. Parameter yang boleh disesuaikan: Strategi ini membolehkan pengguna menyesuaikan pelbagai parameter input, seperti panjang ATR, pengganda, dan ambang RSI, untuk menyesuaikan diri dengan keadaan pasaran dan keutamaan perdagangan yang berbeza.

Risiko Strategi

  1. Risiko Pasaran: Walaupun strategi SPARK telah disahkan dengan dua indikator dan mekanisme saiz kedudukan dinamik, ia masih boleh menghadapi risiko kerugian dalam keadaan pasaran yang melampau.
  2. Risiko Pengoptimuman Parameter: Prestasi strategi sangat bergantung kepada pemilihan parameter input. Tetapan parameter yang tidak sesuai boleh menyebabkan prestasi strategi yang kurang optimum.
  3. Risiko Overfitting: Jika parameter strategi terlalu dioptimumkan, ia boleh mengakibatkan prestasi yang buruk dalam keadaan pasaran masa depan.

Arahan Pengoptimuman Strategi

  1. Memasukkan Penunjuk Tambahan: Pertimbangkan untuk memasukkan penunjuk teknikal lain, seperti MACD, Bollinger Bands, dan lain-lain, untuk meningkatkan lebih lanjut ketepatan pengesahan isyarat.
  2. Mengoptimumkan Mekanisme Ambil Keuntungan dan Hentikan Kerugian: Jelajahi strategi mengambil keuntungan dan menghentikan kerugian yang lebih maju, seperti hentian, tahap mengambil keuntungan dinamik, dan lain-lain, untuk melindungi keuntungan dengan lebih baik dan mengehadkan kerugian.
  3. Penyesuaian Parameter Penyesuaian: Membangunkan mekanisme penyesuaian yang secara dinamik menyesuaikan parameter strategi berdasarkan keadaan pasaran untuk menyesuaikan diri dengan persekitaran pasaran yang sentiasa berubah.

Ringkasan

Strategi SPARK menyediakan peniaga dengan penyelesaian perdagangan kuantitatif yang komprehensif dengan menggabungkan penunjuk SuperTrend dan RSI, menggunakan mekanisme ukuran kedudukan dinamik, dan menawarkan alat pengurusan risiko yang fleksibel. Walaupun strategi mungkin menghadapi risiko tertentu, dengan pengoptimuman dan penyempurnaan berterusan, strategi SPARK mempunyai potensi untuk memberikan prestasi yang konsisten di pelbagai keadaan pasaran.


/*backtest
start: 2024-03-12 00:00:00
end: 2024-04-11 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SPARK", shorttitle="SPARK", overlay=true)

// Choose whether to activate the minimal bars in trade feature
minBarsEnabled = input(true, title="Activate Minimal Bars in Trade")
portfolioPercentage = input(10, title="Portfolio Percentage", minval=1, maxval=100)
// Leverage Input
leverage = input(1, title="Leverage", minval=1)

// Calculate position size according to portfolio percentage and leverage
positionSizePercent = portfolioPercentage / 100 * leverage
positionSize = (strategy.initial_capital / close) * positionSizePercent

// Take Profit and Stop Loss settings
useFixedTPSL = input(1, title="Use Fixed TP/SL", options=[1, 0])
tp_sl_step = 0.1
fixedTP = input(2.0, title="Fixed Take Profit (%)", step=tp_sl_step)
fixedSL = input(1.0, title="Fixed Stop Loss (%)", step=tp_sl_step)

// Calculate Take Profit and Stop Loss Levels
takeProfitLong = close * (1 + fixedTP / 100)
takeProfitShort = close * (1 - fixedTP / 100)
stopLossLong = close * (1 - fixedSL / 100)
stopLossShort = close * (1 + fixedSL / 100)

// Plot TP and SL levels on the chart
plotshape(series=takeProfitLong, title="Take Profit Long", color=color.green, style=shape.triangleup, location=location.abovebar)
plotshape(series=takeProfitShort, title="Take Profit Short", color=color.red, style=shape.triangledown, location=location.belowbar)
plotshape(series=stopLossLong, title="Stop Loss Long", color=color.red, style=shape.triangleup, location=location.abovebar)
plotshape(series=stopLossShort, title="Stop Loss Short", color=color.green, style=shape.triangledown, location=location.belowbar)

// Minimum Bars Between Trades Input
minBarsBetweenTrades = input(5, title="Minimum Bars Between Trades")

// Inputs for selecting trading direction
tradingDirection = input("Both", "Choose Trading Direction", options=["Long", "Short", "Both"])

// SuperTrend Function
trendFlow(src, atrLength, multiplier) =>
    atr = atr(atrLength)
    up = hl2 - (multiplier * atr)
    dn = hl2 + (multiplier * atr)
    trend = 1
    trend := nz(trend[1], 1)
    up := src > nz(up[1], 0) and src[1] > nz(up[1], 0) ? max(up, nz(up[1], 0)) : up
    dn := src < nz(dn[1], 0) and src[1] < nz(dn[1], 0) ? min(dn, nz(dn[1], 0)) : dn
    trend := src > nz(dn[1], 0) ? 1 : src < nz(up[1], 0)? -1 : nz(trend[1], 1)
    [up, dn, trend]

// Inputs for SuperTrend settings
atrLength1 = input(7, title="ATR Length for Trend 1")
multiplier1 = input(4.0, title="Multiplier for Trend 1")
atrLength2 = input(14, title="ATR Length for Trend 2")
multiplier2 = input(3.618, title="Multiplier for Trend 2")
atrLength3 = input(21, title="ATR Length for Trend 3")
multiplier3 = input(3.5, title="Multiplier for Trend 3")
atrLength4 = input(28, title="ATR Length for Trend 4")
multiplier4 = input(3.382, title="Multiplier for Trend 4")

// Calculate SuperTrend
[up1, dn1, trend1] = trendFlow(close, atrLength1, multiplier1)
[up2, dn2, trend2] = trendFlow(close, atrLength2, multiplier2)
[up3, dn3, trend3] = trendFlow(close, atrLength3, multiplier3)
[up4, dn4, trend4] = trendFlow(close, atrLength4, multiplier4)

// Entry Conditions based on SuperTrend and Elliott Wave-like patterns
longCondition = trend1 == 1 and trend2 == 1 and trend3 == 1 and trend4 == 1
shortCondition = trend1 == -1 and trend2 == -1 and trend3 == -1 and trend4 == -1

// Calculate bars since last trade
barsSinceLastTrade = barssince(tradingDirection == "Long" ? longCondition : shortCondition)

// Strategy Entry logic based on selected trading direction and minimum bars between trades
if tradingDirection == "Long" or tradingDirection == "Both"
    if longCondition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades)
        strategy.entry("Long", strategy.long, qty=positionSize)
        strategy.exit("TP/SL Long", from_entry="Long", stop=stopLossLong, limit=takeProfitLong)

if tradingDirection == "Short" or tradingDirection == "Both"
    if shortCondition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades)
        strategy.entry("Short", strategy.short, qty=positionSize)
        strategy.exit("TP/SL Short", from_entry="Short", stop=stopLossShort, limit=takeProfitShort)

// Color bars based on position
var color barColor = na
barColor := strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : na

// Plot colored bars
plotcandle(open, high, low, close, color=barColor)

// Plot moving averages
plot(sma(close, 50), color=color.blue)
plot(sma(close, 200), color=color.orange)

// More customizable trading bot - adding a new indicator
// This indicator is the RSI (Relative Strength Index)

// RSI Inputs
rsi_length = input(14, title="RSI Length")
rsi_oversold = input(30, title="RSI Oversold")
rsi_overbought = input(70, title="RSI Overbought")

// Calculate RSI
rsi = rsi(close, rsi_length)

// Plot RSI
plot(rsi, color=color.purple, title="RSI")

// Entry Conditions based on RSI
rsi_long_condition = rsi < rsi_oversold
rsi_short_condition = rsi > rsi_overbought

// Strategy Entry logic based on RSI
if tradingDirection == "Long" or tradingDirection == "Both"
    if rsi_long_condition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades)
        strategy.entry("Long_RSI", strategy.long, qty=positionSize)
        strategy.exit("TP/SL Long_RSI", from_entry="Long_RSI", stop=stopLossLong, limit=takeProfitLong)

if tradingDirection == "Short" or tradingDirection == "Both"
    if rsi_short_condition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades)
        strategy.entry("Short_RSI", strategy.short, qty=positionSize)
        strategy.exit("TP/SL Short_RSI", from_entry="Short_RSI", stop=stopLossShort, limit=takeProfitShort)


Berkaitan

Lebih lanjut