
Strategi ini adalah berdasarkan pada indikator bergerak dinamik ((DMI) yang direka untuk strategi garis panjang yang hanya berbilang kepala, dan digabungkan dengan purata gelombang sebenar ((ATR) untuk menghentikan kerugian, untuk mengawal risiko kerugian. Untuk pengoptimuman lanjut, strategi ini juga menggabungkan masa perdagangan dan S&P 500 indeks syarat penapisan bermusim, dengan kelebihan tertentu.
Strategi ini hanya dibuka pada hari perdagangan yang ditetapkan (Isnin hingga Jumaat) dan pada waktu perdagangan (waktu tempatan default 9:30-20:30).
Apabila ADX lebih besar daripada 27, ia menunjukkan bahawa ia kini berada dalam keadaan trend harga. Pada masa ini, jika +DI di atas garis DI, ia akan menghasilkan isyarat ganda.
Selepas membuka kedudukan, set stop loss pada 5.5 kali ATR, dan garis stop loss akan bergerak ke atas dengan kenaikan harga, memastikan keuntungan.
Peraturan bermusim S&P 500 boleh digunakan secara pilihan, hanya membuka kedudukan pada masa prestasi yang lebih baik dalam sejarah.
Gabungan penunjuk trend dan mekanisme hentian kerugian, dapat mengesan trend dengan berkesan dan mengawal kerugian setiap kedudukan.
Menggunakan masa dagangan dan penapisan bermusim, anda boleh mengelakkan turun naik yang luar biasa dalam pasaran dan mengurangkan kadar kesalahan.
DMI dan ATR adalah penunjuk teknikal yang matang, parameter menyesuaikan fleksibel, sesuai untuk pengoptimuman kuantitatif.
Tetapan parameter DMI dan ATR yang tidak betul boleh menyebabkan terlalu banyak atau terlalu sedikit isyarat. Parameter perlu disesuaikan untuk ujian.
Stop loss margin set besar mungkin menyebabkan kerugian yang tidak perlu. Set kecil mungkin tidak dapat mengawal kerugian dengan berkesan.
Waktu perdagangan dan peraturan bermusim mungkin menapis peluang keuntungan. Kesan penyaringan perlu dinilai.
Peraturan masuk dan keluar boleh dipertimbangkan dalam kombinasi dengan petunjuk lain, seperti MACD, Brin Belt dan lain-lain.
Anda boleh menguji pelbagai cara untuk menghentikan perkalian ATR, dan anda juga boleh mempertimbangkan untuk menyesuaikan stop loss secara dinamik.
Anda boleh menguji untuk menyesuaikan tempoh dagangan, atau mengoptimumkan permulaan dan pengakhiran dagangan bermusim.
Anda boleh cuba menggunakan kaedah pembelajaran mesin untuk mengoptimumkan parameter secara automatik.
Strategi ini mengintegrasikan analisis trend dan teknologi kawalan risiko, dan ke tahap tertentu mengatasi masalah perubahan yang teruk dalam strategi trend-following. Di samping itu, penapisan masa perdagangan dan musiman dapat mengurangkan isyarat yang salah. Strategi ini dapat memperoleh keuntungan yang lebih stabil melalui pengoptimuman parameter dan fungsi yang diperluas.
/*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)