
Strategi ini didasarkan pada indikator bergerak dinamis (DMI) yang dirancang untuk strategi garis panjang yang hanya melakukan beberapa head, dan digabungkan dengan rata-rata gelombang riil (ATR) untuk melakukan stop loss untuk mengendalikan risiko kerugian. Untuk optimasi lebih lanjut, strategi ini juga mengintegrasikan waktu perdagangan dan S&P 500 indeks kondisi penyaringan musiman, dengan keuntungan tertentu.
Strategi ini hanya berlaku pada hari perdagangan yang ditentukan (Monday to Friday) dan pada waktu perdagangan (default 9:30-20:30 waktu setempat).
Ketika ADX lebih besar dari 27, berarti saat ini berada dalam kondisi tren harga. Pada saat ini jika + DI di garis melewati - DI garis, menghasilkan sinyal melakukan lebih banyak.
Setelah membuka posisi, set stop loss dengan 5,5 kali ATR, dan stop loss line akan bergerak ke atas seiring kenaikan harga, memastikan keuntungan.
Aturan musiman S&P 500 dapat diterapkan secara opsional, hanya membuka posisi pada periode kinerja terbaik dalam sejarah.
Kombinasi indikator tren dan mekanisme stop loss, memungkinkan untuk secara efektif melacak tren, dan mengendalikan kerugian masing-masing posisi.
Menggunakan waktu perdagangan dan kondisi penyaringan musiman, dapat menghindari periode fluktuasi pasar yang tidak biasa dan mengurangi tingkat kesalahan laporan.
DMI dan ATR adalah indikator teknis yang matang, parameter yang disesuaikan dengan fleksibilitas, cocok untuk pengoptimalan kuantitatif.
Setting parameter DMI dan ATR yang salah dapat menyebabkan sinyal terlalu banyak atau terlalu sedikit. Parameter perlu disesuaikan untuk pengujian.
Stop loss margin lebih besar dari stop loss yang mungkin tidak diperlukan. Stop loss margin lebih kecil dari stop loss yang mungkin tidak dapat dikontrol secara efektif.
Waktu perdagangan dan aturan musiman dapat memfilter beberapa peluang keuntungan. Efek filter harus dievaluasi.
Peraturan masuk dan keluar dapat dipertimbangkan dalam kombinasi dengan indikator lain, seperti MACD, Brin Belt, dan lain-lain.
Anda dapat menguji berbagai stop loss ATR, atau mempertimbangkan untuk menyesuaikan stop loss secara dinamis.
Anda dapat melakukan tes untuk menyesuaikan periode transaksi, atau mengoptimalkan waktu awal dan akhir transaksi musiman.
Parameter yang dioptimalkan secara otomatis dapat dicoba dengan menggunakan metode pembelajaran mesin.
Strategi ini mengintegrasikan analisis tren dengan teknologi pengendalian risiko, untuk sebagian mengatasi masalah fluktuasi yang drastis dari strategi pelacakan tren. Selain itu, menambahkan waktu perdagangan dan penyaringan musiman dapat mengurangi sinyal yang salah. Dengan optimasi parameter dan fungsionalitas yang diperluas, strategi ini dapat memperoleh 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)