Sumber daya yang dimuat... Pemuatan...

Penarikan Zona Multi-SMA dengan Strategi Perdagangan Kuantitatif Gembok Keuntungan Dinamis

Penulis:ChaoZhang, Tanggal: 2024-12-20 16:28:54
Tag:SMA

img

Gambaran umum

Ini adalah strategi perdagangan yang dinamis mengikuti tren berdasarkan indikator SMA, menggabungkan zona harga, indikator stokastik, dan beberapa mekanisme perlindungan keuntungan. Strategi ini memantau pergerakan harga di berbagai zona, mengintegrasikan sinyal crossover rata-rata bergerak jangka pendek dan jangka panjang, dan menggunakan indikator stokastik untuk menentukan kondisi pasar dan kekuatan tren untuk menangkap tren yang efisien. Strategi ini menggabungkan mekanisme pengambilan keuntungan berbasis persentase dan titik tetap untuk secara efektif menyeimbangkan pengembalian dan risiko.

Prinsip Strategi

Logika inti mencakup beberapa komponen utama:

  1. Menggunakan SMA 19 periode dan 74 periode untuk membangun kerangka tren
  2. Menggunakan indikator stokastik 60 periode untuk menilai kondisi pasar, mengkategorikan warna SMA ke dalam keadaan kuning, hijau, merah, dan oranye
  3. Membagi zona harga menjadi 5 tingkat penting untuk menentukan kekuatan harga
  4. Syarat masuk membutuhkan:
    • SMA dalam kondisi hijau atau kuning
    • Penembusan harga di atas zona oranye
    • Harga penutupan di atas SMA jangka pendek
  5. Mengimplementasikan dua mekanisme mengambil keuntungan:
    • Perlindungan penarikan berdasarkan persentase dari harga tertinggi
    • Kekuatan penguncian keuntungan

Keuntungan Strategi

  1. Mekanisme konfirmasi ganda mengurangi sinyal palsu
  2. Pembagian zona dinamis beradaptasi dengan lingkungan pasar yang berbeda
  3. Mekanisme pengambilan laba ganda memberikan kontrol risiko yang lebih baik
  4. Klasifikasi kondisi pasar yang jelas membantu menangkap irama pasar
  5. Pemantauan status perdagangan secara real-time memfasilitasi debugging strategi
  6. Menggabungkan indikator teknis dengan analisis aksi harga

Risiko Strategi

  1. Dapat menghasilkan perdagangan yang berlebihan di berbagai pasar
  2. Mengambil keuntungan titik tetap mungkin melewatkan tren yang lebih besar
  3. Optimasi parameter dapat menyebabkan overfit
  4. Potensi kerugian laba selama pembalikan pasar yang cepat
  5. Beberapa kondisi konfirmasi mungkin kehilangan beberapa peluang perdagangan Solusi:
  • Tambahkan filter volatilitas
  • Mengatur secara dinamis parameter pengambilan keuntungan
  • Meningkatkan pengakuan lingkungan pasar
  • Optimalkan keputusan waktu keluar

Arah Optimasi Strategi

  1. Memperkenalkan indikator volatilitas untuk penyesuaian parameter dinamis
  2. Sesuaikan kondisi pengambilan keuntungan berdasarkan kondisi pasar
  3. Tambahkan mekanisme konfirmasi volume
  4. Masukkan filter kekuatan tren
  5. Mengoptimalkan metode pembagian zona dengan mempertimbangkan karakteristik pasar
  6. Meningkatkan mekanisme manajemen risiko, termasuk:
    • Stop loss harian
    • Kontrol pengambilan maksimum
    • Batas waktu penyimpanan posisi

Ringkasan

Strategi ini membangun sistem perdagangan yang komprehensif melalui penggunaan terpadu dari beberapa indikator teknis dan metode analisis aksi harga. Kekuatannya terletak pada beberapa mekanisme konfirmasi dan sistem pengambilan keuntungan yang fleksibel, sementara perhatian harus diberikan pada dampak lingkungan pasar pada kinerja strategi. Melalui optimalisasi terus menerus dan peningkatan manajemen risiko, strategi menunjukkan potensi untuk mempertahankan kinerja yang stabil di berbagai kondisi pasar.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="SMA Color Strategy", 
     overlay=true, 
     initial_capital=10000,
     max_bars_back=5000,
     max_labels_count=500,
     max_boxes_count=500,
     default_qty_type=strategy.fixed,
     default_qty_value=1,
     currency=currency.NONE,
     process_orders_on_close=true)

// === INPUTS ===
zoneLength = input.int(20, "Price Zone Length", minval=5)
profitLockPct = input.float(50, "Profit Lock Percentage", minval=1, maxval=100, step=5) / 100
ticksToLock = input.int(12, "Ticks to Activate Lock", minval=1, tooltip="Number of ticks price must move up to activate tick-based lock")
ticksToSecure = input.int(10, "Ticks to Secure", minval=1, tooltip="Number of ticks to lock in once activated")

// Calculate tick values
tickSize = syminfo.mintick
ticksToLockPoints = ticksToLock * tickSize
ticksToSecurePoints = ticksToSecure * tickSize

// Calculate price zones
h = ta.highest(high, zoneLength)
l = ta.lowest(low, zoneLength)
priceRange = h - l
lvl5 = h
lvl4 = l + (priceRange * 0.75)  // Orange line
lvl3 = l + (priceRange * 0.50)  // Yellow line
lvl2 = l + (priceRange * 0.25)  // Green line
lvl1 = l

// Calculate SMAs
sma19 = ta.sma(close, 19)
sma74 = ta.sma(close, 74)

// Stochastic calculation for color logic
k = ta.stoch(close, high, low, 60)
d = ta.sma(k, 10)

// SMA Color Logic with state tracking
var color currentSMAColor = color.orange
var color previousSMAColor = color.orange
var string currentColorName = "ORANGE"
var string previousColorName = "ORANGE"

smaColor = if d >= 80 or d <= 20
    color.rgb(255, 215, 0)
else if d > d[1]
    color.green
else if d < d[1]
    color.red
else
    color.orange

// Update color state and names
if smaColor != currentSMAColor
    previousSMAColor := currentSMAColor
    currentSMAColor := smaColor
    previousColorName := currentColorName
    currentColorName := if smaColor == color.rgb(255, 215, 0)
        "YELLOW"
    else if smaColor == color.green
        "GREEN"
    else if smaColor == color.red
        "RED"
    else
        "ORANGE"

// Color logic for SMA74
sma74Color = if smaColor == color.rgb(255, 215, 0)
    color.rgb(255, 215, 0)                          
else if sma74 < sma19                               
    color.green
else                                                
    color.red

// === ENTRY CONDITIONS ===
smaIsGreen = smaColor == color.green
greenCandle = close > open
candleAboveOrange = close > lvl4
candleAboveSMA = close > sma19
crossedAboveOrange = ta.crossover(close, lvl4)
smaIsYellow = smaColor == color.rgb(255, 215, 0)

longCondition1 = smaIsGreen and greenCandle and candleAboveOrange and candleAboveSMA and crossedAboveOrange
longCondition2 = smaIsYellow and crossedAboveOrange and candleAboveSMA

// === PROFIT LOCK SYSTEM ===
var float entryPrice = na
var float maxPrice = na
var float profitLockLevel = na
var bool tickLockActivated = false
var float tickBasedLockLevel = na

// Reset variables on new trade entry
if (longCondition1 or longCondition2)
    entryPrice := close
    maxPrice := close
    profitLockLevel := close * (1 - profitLockPct)
    tickLockActivated := false
    tickBasedLockLevel := na

// Update maximum price and profit locks when in a trade
if strategy.position_size > 0
    maxPrice := math.max(maxPrice, high)
    profitLockLevel := math.max(profitLockLevel, maxPrice * (1 - profitLockPct))
    
    // Check if price has moved up enough to activate tick-based lock
    if not tickLockActivated and (maxPrice - entryPrice) >= ticksToLockPoints
        tickLockActivated := true
        tickBasedLockLevel := entryPrice + ticksToSecurePoints

// === EXIT CONDITIONS ===
exitOnYellowLine = close < lvl3
exitOnProfitLock = low < profitLockLevel and strategy.position_size > 0
exitOnTickLock = tickLockActivated and low < tickBasedLockLevel

// === TRADE MANAGEMENT ===
if (longCondition1 or longCondition2)
    strategy.entry("Long", strategy.long)

if strategy.position_size > 0
    if exitOnYellowLine
        strategy.close("Long", comment="Close below yellow")
    if exitOnProfitLock
        strategy.close("Long", comment="Profit lock triggered")
    if exitOnTickLock
        strategy.close("Long", comment="Tick-based lock triggered")

// Plot indicators
plot(sma19, "SMA 19", color=smaColor, linewidth=2)
plot(sma74, "SMA 74", color=sma74Color, linewidth=2)
plot(lvl5, "Upper Zone Top", color=color.red, linewidth=2)
plot(lvl4, "Upper Zone Bottom", color=color.orange, linewidth=2)
plot(lvl3, "Middle Line", color=color.yellow, linewidth=2)
plot(lvl2, "Lower Zone Top", color=color.green, linewidth=2)
plot(lvl1, "Lower Zone Bottom", color=color.blue, linewidth=2)

// Plot profit lock levels
plot(strategy.position_size > 0 ? profitLockLevel : na, "Profit Lock Level", color=color.purple, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 and tickLockActivated ? tickBasedLockLevel : na, "Tick Lock Level", color=color.fuchsia, style=plot.style_linebr, linewidth=2)

// Fill zones
var p1 = plot(lvl5, display=display.none)
var p2 = plot(lvl4, display=display.none)
var p3 = plot(lvl2, display=display.none)
var p4 = plot(lvl1, display=display.none)
fill(p1, p2, color=color.new(color.red, 90))
fill(p3, p4, color=color.new(color.green, 90))

// Debug Table
if barstate.islast
    var table debugTable = table.new(position.top_right, 2, 13, bgcolor=color.new(color.black, 70), frame_width=1)
    
    table.cell(debugTable, 0, 0, "Current Color", text_color=color.white)
    table.cell(debugTable, 1, 0, currentColorName, text_color=currentSMAColor)
    
    table.cell(debugTable, 0, 1, "Previous Color", text_color=color.white)
    table.cell(debugTable, 1, 1, previousColorName, text_color=previousSMAColor)
    
    table.cell(debugTable, 0, 2, "Entry 1 (Green)", text_color=color.white)
    table.cell(debugTable, 1, 2, str.tostring(longCondition1), text_color=color.white)
    
    table.cell(debugTable, 0, 3, "Entry 2 (Yellow)", text_color=color.white)
    table.cell(debugTable, 1, 3, str.tostring(longCondition2), text_color=color.white)
    
    table.cell(debugTable, 0, 4, "Current Position", text_color=color.white)
    table.cell(debugTable, 1, 4, str.tostring(strategy.position_size), text_color=color.white)
    
    table.cell(debugTable, 0, 5, "Entry Price", text_color=color.white)
    table.cell(debugTable, 1, 5, str.tostring(entryPrice), text_color=color.white)
    
    table.cell(debugTable, 0, 6, "Max Price", text_color=color.white)
    table.cell(debugTable, 1, 6, str.tostring(maxPrice), text_color=color.white)
    
    table.cell(debugTable, 0, 7, "Profit Lock Level", text_color=color.white)
    table.cell(debugTable, 1, 7, str.tostring(profitLockLevel), text_color=color.white)
    
    table.cell(debugTable, 0, 8, "Tick Lock Active", text_color=color.white)
    table.cell(debugTable, 1, 8, str.tostring(tickLockActivated), text_color=color.white)
    
    table.cell(debugTable, 0, 9, "Tick Lock Level", text_color=color.white)
    table.cell(debugTable, 1, 9, str.tostring(tickBasedLockLevel), text_color=color.white)
    
    table.cell(debugTable, 0, 10, "Price Move (Ticks)", text_color=color.white)
    table.cell(debugTable, 1, 10, str.tostring(strategy.position_size > 0 ? (maxPrice - entryPrice) / tickSize : 0), text_color=color.white)
    
    table.cell(debugTable, 0, 11, "Locked Profit %", text_color=color.white)
    table.cell(debugTable, 1, 11, str.tostring(strategy.position_size > 0 ? ((maxPrice - entryPrice) / entryPrice * 100) : 0.0) + "%", text_color=color.white)
    
    table.cell(debugTable, 0, 12, "Exit Signals", text_color=color.white)
    table.cell(debugTable, 1, 12, "Y:" + str.tostring(exitOnYellowLine) + " P:" + str.tostring(exitOnProfitLock) + " T:" + str.tostring(exitOnTickLock), text_color=color.white)

Berkaitan

Lebih banyak