Hentikan Pengangkutan Dinamik Hanya Trend Berikut Strategi dengan Penapis Musim

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

img

Ringkasan

Strategi ini merekabentuk strategi trend panjang berdasarkan Indeks Pergerakan Dinamik (DMI), dengan Julat Benar Purata (ATR) menyusul stop loss untuk mengawal risiko penurunan. Ia juga menggabungkan jam dagangan dan penapis bermusim S&P500 untuk pengoptimuman dan kelebihan lanjut.

Logika Strategi

  1. Strategi ini hanya memasuki dagangan pada hari dagangan tertentu (Isnin-Ini) dan waktu dagangan (default 9:30am - 8:30pm waktu tempatan).

  2. Apabila ADX melebihi 27, ia menandakan bahawa pasaran berada dalam trend.

  3. Selepas membuka kedudukan, stop loss ditetapkan pada 5.5 x ATR dari harga kemasukan, dan ia bergerak ke atas apabila harga meningkat untuk mengunci keuntungan.

  4. Secara pilihan, corak bermusim S&P500 diaktifkan, supaya dagangan hanya berlaku semasa tempoh kenaikan bersejarah.

Analisis Kelebihan

  1. Menggabungkan metrik trend dan stop loss membantu menunggang trend dengan berkesan dan mengawal kerugian setiap perdagangan.

  2. Waktu dagangan dan penapis bermusim membantu mengelakkan turun naik yang tidak normal dan mengurangkan isyarat palsu.

  3. DMI dan ATR adalah penunjuk teknikal yang matang dengan fleksibiliti dalam penyesuaian parameter yang sesuai untuk pengoptimuman kuant.

Analisis Risiko

  1. Parameter DMI dan ATR yang tidak betul boleh menyebabkan terlalu banyak atau terlalu sedikit isyarat.

  2. Tetapan stop loss terlalu luas boleh menyebabkan berhenti yang tidak perlu. Tetapan terlalu ketat mungkin gagal untuk mengawal kerugian.

  3. Waktu dagangan dan peraturan bermusim mungkin menapis beberapa peluang yang menguntungkan.

Arahan pengoptimuman

  1. Pertimbangkan untuk menggabungkan penunjuk lain seperti MACD, Bollinger Bands untuk peraturan kemasukan dan keluar.

  2. Uji kelipatan ATR yang berbeza untuk stop loss, atau pelarasan dinamik skala stop loss.

  3. Uji menyesuaikan waktu dagangan, atau mengoptimumkan tarikh masuk dan keluar bermusim.

  4. Cuba menggunakan kaedah pembelajaran mesin untuk menyesuaikan parameter automatik.

Kesimpulan

Strategi ini mengintegrasikan teknik mengikuti trend dan kawalan risiko untuk mengatasi isu-isu turun naik yang tinggi dengan sistem trend. Menambah jam perdagangan dan penapis bermusim mengurangkan isyarat palsu. Dengan penyesuaian parameter dan pengembangan ciri, strategi ini dapat mencapai keuntungan yang lebih mantap.


/*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 lanjut