Dinamis Trailing Stop Long Only Trend Mengikuti Strategi dengan Filter Musim

Penulis:ChaoZhang, Tanggal: 2024-02-27 14:01:56
Tag:

img

Gambaran umum

Strategi ini mendesain strategi tren panjang berdasarkan Indeks Gerakan Dinamis (DMI), dengan Rata-rata Jangkauan Benar (ATR) menyusul stop loss untuk mengendalikan risiko penurunan.

Logika Strategi

  1. Strategi ini hanya memasuki perdagangan pada hari perdagangan tertentu (Mon-Fri) dan jam perdagangan (default 9:30am - 8:30pm waktu lokal).

  2. Ketika ADX berada di atas 27, itu menandakan bahwa pasar berada dalam tren. Jika +DI melintasi di atas -DI, sinyal panjang dihasilkan.

  3. Setelah membuka posisi, stop loss ditetapkan pada 5,5 x ATR dari harga masuk, dan naik naik saat harga naik untuk mengunci keuntungan.

  4. Secara opsional, pola musiman S&P500 diaktifkan, sehingga perdagangan hanya terjadi selama periode bullish secara historis.

Analisis Keuntungan

  1. Mengkombinasikan metrik tren dan stop loss membantu secara efektif mengendarai tren dan mengendalikan kerugian per perdagangan.

  2. Jam perdagangan dan filter musiman membantu menghindari volatilitas yang tidak normal dan mengurangi sinyal palsu.

  3. DMI dan ATR adalah indikator teknis yang matang dengan fleksibilitas dalam penyesuaian parameter yang cocok untuk pengoptimalan kuantum.

Analisis Risiko

  1. Parameter DMI dan ATR yang tidak tepat dapat menyebabkan terlalu banyak atau terlalu sedikit sinyal.

  2. Set stop loss terlalu lebar dapat menyebabkan stop yang tidak perlu. Set terlalu ketat mungkin gagal untuk mengendalikan kerugian.

  3. Waktu perdagangan dan aturan musim dapat menyaring beberapa peluang yang menguntungkan.

Arahan Optimasi

  1. Pertimbangkan untuk menggabungkan indikator lain seperti MACD, Bollinger Bands untuk aturan masuk dan keluar.

  2. Uji kali ATR yang berbeda untuk stop loss, atau penyesuaian dinamis skala stop loss.

  3. Uji menyesuaikan jam perdagangan, atau mengoptimalkan tanggal masuk dan keluar musiman.

  4. Cobalah menerapkan metode pembelajaran mesin untuk pengaturan otomatis parameter.

Kesimpulan

Strategi ini mengintegrasikan teknik mengikuti tren dan pengendalian risiko untuk mengatasi masalah volatilitas tinggi dengan sistem tren. Menambahkan jam perdagangan dan filter musiman lebih mengurangi sinyal palsu. Dengan penyesuaian parameter dan perluasan fitur, strategi ini dapat mencapai keuntungan yang lebih stabil.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="DMI Strategy with ADX and ATR-based Trailing SL (Long Only) and Seasonality", shorttitle="MBV-SP500-CLIMBER", overlay=true)

// Eingabeparameter für Long-Positionen
len = input.int(14, minval=1, title="DI Length")
lensig = input.int(14, title="ADX Smoothing", minval=1, maxval=50)
adxLongThreshold = input.float(27.0, title="ADX Threshold for Long", minval=0)
atrLength = input.int(14, title="ATR Length")
atrLongMultiplier = input.float(5.5, title="ATR Multiplier for Trailing SL (Long)")

startTimeHH = input.int(09, title="startTime hh")
startTimeMM = input.int(30, title="startTime mm")

endTimeHH = input.int(20, title="endTime hh")
endTimeMM = input.int(30, title="endTime mm")

// Zeitzone des Nutzers als Eingabeparameter
timezoneOffset = input.int(1, title="Timezone Offset (Hours from UTC)", minval=-12, maxval=14)


// Zusätzliche Einstellung für SP500-Saisonalität
enableSeasonality = input.bool(false, title="Enable SP500 Seasonality")
seasonColor = color.new(color.blue, 90)
activeTimeColor = color.new(color.yellow, 90) // Farbe für aktive Handelszeiten

// Handelstage und -zeiten
tradeMonday = input.bool(true, title="Trade on Monday")
tradeTuesday = input.bool(true, title="Trade on Tuesday")
tradeWednesday = input.bool(true, title="Trade on Wednesday")
tradeThursday = input.bool(true, title="Trade on Thursday")
tradeFriday = input.bool(true, title="Trade on Friday")

// Konvertierung der Uhrzeit in Unix-Zeitstempel
getUnixTime(hour, minute) =>
    adjustedHour = hour - timezoneOffset
    sessionDate = timestamp(year, month, dayofmonth, 0, 0)
    sessionDate + adjustedHour * 60 * 60000 + minute * 60000

// Start- und Endzeit als Unix-Zeitstempel
// + 1 Stunde wegen UTC
startTime = getUnixTime(startTimeHH, startTimeMM)
endTime = getUnixTime(endTimeHH, endTimeMM)


// Überprüfen, ob der aktuelle Zeitpunkt innerhalb der Handelszeit liegt
isTradingTime() => true

// Saisonale Zeiträume definieren
isSeason(time) =>
    m = month(time)
    d = dayofmonth(time)
    (m == 1 and d >= 1) or (m == 2 and d <= 15) or (m == 3 and d >= 23) or (m == 4 and d <= 17) or (m == 5 and d >= 12) or (m == 6 and d >= 27 and d <= 8) or (m == 7 and d <= 29) or (m == 10 and d >= 15) or (m == 11 and d >= 1) or (m == 12 and d <= 2) or (m == 12 and d >= 20 and d <= 27)

// Hintergrundfarbe für saisonale Bereiche und aktive Handelszeiten
bgcolor(enableSeasonality and isSeason(time) ? seasonColor : na)
bgcolor(isTradingTime() ? color.new(activeTimeColor, 90) : na)

// Berechnung von +DM, -DM, ATR
up = ta.change(high)
down = -ta.change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = ta.rma(ta.tr, len)
atr = ta.atr(atrLength)

// Berechnung von +DI, -DI und ADX
plus = fixnan(100 * ta.rma(plusDM, len) / trur)
minus = fixnan(100 * ta.rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)

// Logik für LONG Signale unter Berücksichtigung der Saisonalität und Zeitfilter
longSignal = ta.crossover(adx, adxLongThreshold) and plus > minus and isTradingTime()
longSignal := longSignal and (not enableSeasonality or (enableSeasonality and isSeason(time)))


// Variable für Trailing Stop-Loss
var float longTrailingSL = na

// Variablen für die Eröffnungszeit und den Eröffnungspreis der Position
var int openBarIndex = na
var float openPrice = na

// Handelslogik für Long-Positionen
// ohne strategy.position_size == 0 gilt die Kondition für ALLE Signale und nicht nur für das erste
if (longSignal and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)
    openBarIndex := bar_index
    openPrice := close
    longTrailingSL := close - atr * atrLongMultiplier

//if (longSignal)
   //longTrailingSL := close - atr * atrLongMultiplier

// Aktualisierung des Trailing Stop-Loss
if strategy.position_size > 0
    longTrailingSL := math.max(longTrailingSL, close - atr * atrLongMultiplier)

// Ausstieg aus Long-Positionen
strategy.exit("Close Long", "Long", stop=longTrailingSL)

// Anzeige des ATR-basierten Trailing Stops für Long-Positionen
//plot(strategy.position_size > 0 ? longTrailingSL : na, color=color.red, title="ATR Trailing Stop Long")

// Anzeige des ATR-basierten Trailing Stops für Long-Positionen
plot(strategy.position_size > 0 ? longTrailingSL : na, color=color.new(color.red, 75), style=plot.style_circles, linewidth=1, title="Trailing Stop-Loss")


// Wenn eine Position geschlossen wird, zeichnen Sie die Linie
// if strategy.position_size[1] > 0 and strategy.position_size == 0
//     lineColor = longTrailingSL > openPrice ? color.new(color.green, 50) : color.new(color.red, 50) // Hellgrün für Gewinne, Hellrot für Verluste
//     line.new(openBarIndex, openPrice, bar_index, longTrailingSL, width=3, color=lineColor)


Lebih banyak