Động lực Trailing Stop Long Chỉ xu hướng theo chiến lược với bộ lọc mùa

Tác giả:ChaoZhang, Ngày: 2024-02-27 14:01:56
Tags:

img

Tổng quan

Chiến lược này thiết kế một chiến lược chỉ theo xu hướng dài dựa trên Chỉ số chuyển động động động (DMI), với một phạm vi trung bình thực sự (ATR) theo dõi dừng lỗ để kiểm soát rủi ro giảm. Nó cũng kết hợp giờ giao dịch và bộ lọc theo mùa S & P500 để tối ưu hóa hơn nữa và cạnh.

Chiến lược logic

  1. Chiến lược chỉ nhập giao dịch vào các ngày giao dịch được chỉ định (tháng thứ Hai đến thứ Sáu) và giờ giao dịch (bên định 9: 30 - 20: 30 giờ địa phương).

  2. Khi ADX trên 27, nó báo hiệu rằng thị trường đang có xu hướng. Nếu +DI vượt trên -DI, một tín hiệu dài được tạo ra.

  3. Sau khi mở một vị trí, stop loss được thiết lập ở mức 5,5 x ATR từ giá nhập cảnh, và nó tăng lên khi giá tăng để khóa lợi nhuận.

  4. Tùy chọn, các mô hình theo mùa của S&P500 được bật, do đó giao dịch chỉ xảy ra trong các giai đoạn tăng giá lịch sử.

Phân tích lợi thế

  1. Kết hợp các số liệu xu hướng và dừng lỗ giúp vượt qua xu hướng và kiểm soát lỗ trên mỗi giao dịch một cách hiệu quả.

  2. Thời gian giao dịch và bộ lọc theo mùa giúp tránh biến động bất thường và giảm tín hiệu sai.

  3. DMI và ATR là các chỉ số kỹ thuật trưởng thành với tính linh hoạt trong điều chỉnh tham số phù hợp với tối ưu hóa lượng tử.

Phân tích rủi ro

  1. Các thông số DMI và ATR không chính xác có thể dẫn đến quá nhiều hoặc quá ít tín hiệu.

  2. Đặt stop loss quá rộng có thể gây ra dừng không cần thiết. Đặt quá chặt có thể không kiểm soát lỗ.

  3. Thời gian giao dịch và các quy tắc theo mùa có thể lọc một số cơ hội có lợi nhuận.

Hướng dẫn tối ưu hóa

  1. Xem xét kết hợp các chỉ số khác như MACD, Bollinger Bands cho các quy tắc nhập và xuất.

  2. Kiểm tra các nhân ATR khác nhau để dừng lỗ hoặc điều chỉnh năng động thang điểm dừng lỗ.

  3. Kiểm tra điều chỉnh giờ giao dịch, hoặc tối ưu hóa ngày vào và ra theo mùa.

  4. Hãy thử áp dụng phương pháp máy học để tự động điều chỉnh các thông số.

Kết luận

Chiến lược này tích hợp các kỹ thuật theo dõi xu hướng và kiểm soát rủi ro để vượt qua các vấn đề biến động cao với các hệ thống xu hướng.


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


Thêm nữa