Pengenalpastian struktur harga pelbagai peringkat dan sistem perdagangan kuantitatif jurang nilai saksama

CHoCH FVG Pivot Points Risk-Reward Ratio Price Structure SWING POINTS Quantitative Trading
Tarikh penciptaan: 2025-06-03 10:50:29 Akhirnya diubah suai: 2025-06-03 10:50:29
Salin: 0 Bilangan klik: 347
2
fokus pada
319
Pengikut

Pengenalpastian struktur harga pelbagai peringkat dan sistem perdagangan kuantitatif jurang nilai saksama Pengenalpastian struktur harga pelbagai peringkat dan sistem perdagangan kuantitatif jurang nilai saksama

Gambaran keseluruhan

Sistem perdagangan kuantitatif struktur harga bertingkat dan jurang nilai wajar adalah strategi perdagangan automatik berdasarkan tingkah laku harga yang menggabungkan dua konsep perdagangan utama: ciri perubahan (CHoCH, Change of Character) dan jurang nilai wajar (FVG, Fair Value Gap). Strategi ini menangkap peluang perdagangan berkemungkinan tinggi dengan mengenal pasti titik perubahan struktur pasaran dan kawasan ketidakseimbangan, memasuki pasaran ketika harga kembali ke jurang nilai wajar, untuk mengawal masuk dan keluar yang tepat.

Prinsip Strategi

Sistem perdagangan kuantitatif beroperasi berdasarkan prinsip-prinsip utama berikut:

  1. Pengenalan struktur hargaPivot Points: Menggunakan teknik Pivot Points untuk mengenal pasti titik-titik tinggi dan rendah di pasaran, yang merupakan bahagian penting dalam struktur pasaran. Sistem menggunakan panjang pergerakan berparameter (default 5 kitaran) untuk menentukan titik-titik penting ini.

  2. Ciri perubahan ((CHoCH) pengesanan:

    • Multi-headed CHoCH: Harga menembusi paras tertinggi sebelum ini selepas membentuk paras rendah yang lebih rendah
    • Blank CHoCH: Harga menembusi paras rendah sebelum ini selepas membentuk paras tinggi yang lebih tinggi Sistem meminta selang masa untuk pembentukan CHoCH memenuhi keperluan jarak minimum (default 10 kitaran) untuk menyaring isyarat yang tidak sah.
  3. Pengiktirafan jurang nilai wajar (FVG):

    • FVG multi-kepala: rendah pada tahun-tahun semasa lebih tinggi daripada dua tahun-tahun sebelumnya
    • Blank FVG: ketinggian semasa lebih rendah daripada ketinggian dua kitaran sebelumnya Sistem ini menetapkan had saiz minimum FVG (default 2 poin) untuk memastikan hanya ketidakseimbangan harga yang bermakna ditangkap.
  4. Logik input:

    • Kemasukan berbilang mata: Selepas mengesahkan berbilang mata CHoCH, tunggu harga kembali ke kawasan FVG berbilang mata
    • Kemasukan kosong: menunggu harga kembali ke kawasan FVG kosong selepas Kemasukan kosong CHoCH disahkan Harga masuk ditetapkan sebagai titik tengah di kawasan FVG, menyediakan harga masuk yang seimbang.
  5. Mekanisme pengurusan risiko:

    • Stop loss set pada pendaratan rendah terdekat (multicore) atau pendaratan tinggi (blank)
    • Stop-loss berdasarkan nisbah pulangan risiko (default 2.0) atau jumlah sasaran tetap
    • Fungsi penyesuaian automatik kedudukan pilihan, saiz kedudukan yang dikira berdasarkan peratusan risiko akaun dan jarak berhenti

Kelebihan Strategik

Setelah analisis yang mendalam terhadap kod, strategi ini mempunyai kelebihan yang ketara:

  1. Analisis pasaran berstrukturStrategi ini berdasarkan kepada prinsip perubahan struktur harga dan ketidakseimbangan pasaran, dan bukannya penyambungan petunjuk yang mudah, menjadikannya mempunyai kelebihan yang unik dalam mengenal pasti titik-titik perubahan pasaran.

  2. Waktu masuk yang tepatDengan menunggu pembentukan FVG selepas CHoCH, strategi ini dapat masuk pada tahap harga yang menguntungkan, mengelakkan mengejar tinggi dan rendah, dan meningkatkan kualiti masuk.

  3. Pengurusan risiko penyesuaianStrategi: Mengubah kedudukan hentian secara automatik mengikut struktur pasaran sebenar, dan bukannya menggunakan mata tetap, kaedah ini lebih sesuai dengan sifat turun naik pasaran sebenar.

  4. Elemen perdagangan visualStrategi menyediakan ciri visual yang komprehensif, termasuk label Choch, kotak FVG, titik ayunan dan garis perdagangan, yang membolehkan peniaga memahami struktur pasaran dan logik strategi secara langsung.

  5. Pengurusan kedudukan yang fleksibel: Mengubah saiz kedudukan secara automatik melalui peratusan risiko, kedua-dua melindungi dana akaun dan secara automatik menyesuaikan ambang risiko berdasarkan turun naik.

  6. Reka bentuk yang dioptimumkan: Kod ini mengandungi mekanisme untuk membersihkan kotak FVG lama, memastikan prestasi sistem tidak menurun semasa berjalan lama.

  7. Pemantauan prestasi bersepaduStrategi menyediakan jadual prestasi masa nyata, termasuk petunjuk utama seperti keadaan strategi, kemenangan, dan faktor keuntungan, untuk memudahkan peniaga menilai prestasi strategi.

Risiko Strategik

Walaupun strategi ini direka dengan baik, terdapat beberapa risiko dan batasan yang berpotensi:

  1. Risiko penembusan palsuIsyarat: CHoCH boleh menjadi pecah palsu, menyebabkan harga cepat menarik balik dan mencetuskan stop loss. Untuk mengurangkan risiko ini, mekanisme pengesahan boleh dipertimbangkan, seperti menunggu garis K untuk mengesahkan pecah.

  2. Risiko jurang: Dalam pasaran yang bergelombang atau perdagangan semalaman, harga mungkin melompat melebihi kedudukan berhenti, menyebabkan kerugian sebenar melebihi jangkaan. Disarankan untuk menggunakan pesanan berhenti rugi yang dijamin (jika mungkin) atau mengurangkan saiz kedudukan.

  3. Kepekaan ParameterPrestasi strategi sangat bergantung pada parameter yang ditetapkan seperti panjang berayun, jarak CHoCH minimum dan saiz FVG. Pasaran dan jangka masa yang berbeza mungkin memerlukan kombinasi parameter yang berbeza, dan pengoptimuman umpan balik yang menyeluruh disyorkan.

  4. Pergantungan persekitaran pasaranStrategi ini lebih baik dalam pasaran trend, dan boleh menghasilkan isyarat salah yang kerap dalam pasaran yang disusun. Pertimbangkan untuk menambah penapis trend atau mekanisme pengenalan keadaan pasaran.

  5. Kerumitan pengiraanKaedah: Menggunakan pelbagai array dan pemeriksaan syarat, yang boleh menyebabkan masalah prestasi pada peranti yang lebih rendah. Walaupun kod telah mengandungi mekanisme pembersihan, penggunaan sumber yang berpanjangan masih perlu diperhatikan.

  6. Kekurangan pengurusan pengunduran diriStrategi semasa tidak mengambil kira penyesuaian skala kedudukan yang dinamik dalam keadaan pasaran yang berbeza, yang mungkin menyebabkan penarikan balik yang lebih besar dalam keadaan yang tidak menguntungkan yang berterusan.

Arah pengoptimuman strategi

Berdasarkan analisis kod, kami mencadangkan optimasi berikut:

  1. Pengesahan pelbagai kerangka masa: Memperkenalkan analisis struktur pasaran pada bingkai masa yang lebih tinggi, hanya berdagang di arah trend utama. Sebagai contoh, penapis trend garis matahari boleh ditambah, hanya menjalankan perdagangan apabila arah trend garis matahari selaras.

  2. Optimumkan parameter dinamik: mewujudkan sistem parameter yang disesuaikan secara automatik berdasarkan turun naik pasaran, seperti meningkatkan saiz FVG minimum dan keperluan jarak Choch semasa turun naik tinggi dan mengurangkan parameter ini semasa turun naik rendah.

  3. Pengoptimuman kemasukan:

    • Mempunyai strategi kemasukan berjenama, seperti menetapkan beberapa titik kemasukan pada tahap yang berbeza di kawasan FVG
    • Tambah pengesahan kemasukan tambahan, seperti penembusan jumlah atau pengesahan indeks momentum
  4. Pengurusan risiko yang lebih baik:

    • Mempunyai fungsi penjejakan hentian yang menyesuaikan kedudukan hentian secara automatik dengan keuntungan perdagangan
    • Menambah fungsi keuntungan separa dan melonggarkan bahagian kedudukan apabila mencapai tahap keuntungan tertentu
    • Memperkenalkan had pengeluaran maksimum, secara automatik mengurangkan saiz kedudukan atau menangguhkan dagangan apabila pengeluaran akaun mencapai nilai terhad
  5. Keadaan pasaran:

    • Tambahkan pengenalan keadaan pasaran ((trend / setup / turun naik) dan menyesuaikan parameter strategi mengikut keadaan yang berbeza
    • Mengurangkan atau mengelakkan dagangan di pasaran pencatatan
    • Mengambil skala kedudukan yang lebih berhati-hati apabila turun naik secara tiba-tiba
  6. Pembelajaran Mesin: Memperkenalkan algoritma pembelajaran mesin untuk menganalisis sejarah CHoCH dan FVG untuk mengenal pasti ciri-ciri model yang mempunyai kadar kejayaan yang lebih tinggi, dan menyesuaikan berat keputusan kemasukan mengikutnya.

  7. Penapis masa transaksiMenambah penapis masa dagangan, mengelakkan berita utama dan pergerakan yang tinggi semasa pasaran terbuka / ditutup, dan memberi tumpuan kepada masa dagangan yang lebih cair.

ringkaskan

Sistem perdagangan kuantitatif dengan pengenalan struktur harga pelbagai peringkat dan jurang nilai wajar adalah penyelesaian perdagangan lengkap yang menggabungkan teori tingkah laku harga canggih. Ia melindungi modal perdagangan dengan mengenal pasti perubahan struktur pasaran (CHoCH) dan kawasan ketidakseimbangan harga (FVG) pada tahap harga yang ideal dan menggunakan pendekatan pengurusan risiko yang sistematik.

Kelebihan terbesar strategi ini adalah bahawa kaedah analisisnya berdasarkan struktur pasaran sebenar, dan bukan bergantung pada indikator yang tertinggal, yang membolehkannya mengenal pasti titik-titik perubahan pasaran lebih awal. Di samping itu, fungsi visualisasi yang baik dan sistem pemantauan prestasi membolehkan peniaga memahami logik strategi secara intuitif dan menilai keberkesanannya.

Walaupun terdapat risiko seperti penembusan palsu dan sensitiviti parameter, kestabilan dan prestasi strategi dapat ditingkatkan dengan ketara melalui arah pengoptimuman yang dikemukakan, terutamanya pengesahan jangka masa berbilang, penyesuaian parameter dinamik dan fungsi pengurusan risiko yang dipertingkatkan.

Bagi pelabur yang ingin menggunakan kaedah sistematik untuk berdagang, strategi ini menyediakan kerangka yang kukuh, yang menyerap esensi perdagangan tingkah laku harga tradisional, dan memanfaatkan objektif dan disiplin sistem kuantitatif. Dengan pengoptimuman parameter yang berterusan dan penyesuaian untuk menyesuaikan diri dengan pasaran, strategi ini berpotensi untuk mencapai prestasi perdagangan yang stabil dalam pelbagai persekitaran pasaran.

Kod sumber strategi
/*backtest
start: 2024-06-03 00:00:00
end: 2025-06-02 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("ICT CHoCH & FVG Strategy - NQ1!", overlay=true, pyramiding=0, calc_on_every_tick=false, calc_on_order_fills=false, max_boxes_count=500, max_lines_count=100, max_labels_count=100)

// ============================================================================
// INPUT PARAMETERS
// ============================================================================

// Strategy Settings
riskRewardRatio = input.float(2.0, title="Risk:Reward Ratio", minval=0.5, maxval=10.0, group="Strategy Settings")
fixedTarget = input.int(40, title="Fixed Target (Ticks)", minval=5, maxval=200, group="Strategy Settings")
useRRTarget = input.bool(true, title="Use Risk:Reward Target", tooltip="If false, uses fixed target", group="Strategy Settings")
riskPercent = input.float(2.0, title="Risk % of Account", minval=0.1, maxval=10.0, group="Strategy Settings")
useAutoSize = input.bool(false, title="Auto Size Positions", tooltip="Size based on risk % and stop distance", group="Strategy Settings")

// Visual Settings
showCHoCH = input.bool(true, title="Show CHoCH Labels", group="Visual Settings")
showFVG = input.bool(true, title="Show FVG Boxes", group="Visual Settings")
showSwings = input.bool(true, title="Show Swing Points", group="Visual Settings")
showTradeLines = input.bool(true, title="Show Entry/SL/TP Lines", group="Visual Settings")

// CHoCH Detection Settings
swingLength = input.int(5, title="Swing Detection Length", minval=2, maxval=20, group="CHoCH Settings")
minCHoCHDistance = input.int(10, title="Min CHoCH Distance (bars)", minval=5, maxval=50, group="CHoCH Settings")

// FVG Settings
minFVGSize = input.float(2.0, title="Min FVG Size (ticks)", minval=0.25, maxval=10.0, group="FVG Settings")
maxFVGAge = input.int(50, title="Max FVG Age (bars)", minval=10, maxval=200, group="FVG Settings")

// ============================================================================
// VARIABLES AND ARRAYS
// ============================================================================

// Swing point detection
var float lastSwingHigh = na
var float lastSwingLow = na
var int lastSwingHighBar = na
var int lastSwingLowBar = na

// CHoCH tracking
var bool bullishCHoCH = false
var bool bearishCHoCH = false
var float chochLevel = na
var int chochBar = na
var bool waitingForFVG = false

// FVG tracking
var array<box> bullishFVGs = array.new<box>()
var array<box> bearishFVGs = array.new<box>()
var float activeFVGTop = na
var float activeFVGBottom = na
var bool lookingForEntry = false

// Trade management
var float stopLossLevel = na
var float takeProfitLevel = na
var bool inPosition = false

// ============================================================================
// HELPER FUNCTIONS
// ============================================================================

// Convert ticks to price for NQ
ticksToPrice(ticks) => ticks * 0.25

// Calculate position size based on risk
calcPositionSize(stopDistance) =>
    if useAutoSize and strategy.equity > 0
        accountValue = strategy.equity
        riskAmount = accountValue * (riskPercent / 100)
        stopDistancePrice = stopDistance * syminfo.mintick
        math.max(1, math.floor(riskAmount / stopDistancePrice))
    else
        1

// ============================================================================
// SWING POINT DETECTION
// ============================================================================

// Detect swing highs and lows
swingHigh = ta.pivothigh(high, swingLength, swingLength)
swingLow = ta.pivotlow(low, swingLength, swingLength)

// Update swing points
if not na(swingHigh)
    lastSwingHigh := swingHigh
    lastSwingHighBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingHigh, "SH", style=label.style_triangledown, color=color.red, size=size.tiny)

if not na(swingLow)
    lastSwingLow := swingLow
    lastSwingLowBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingLow, "SL", style=label.style_triangleup, color=color.green, size=size.tiny)

// ============================================================================
// CHoCH DETECTION
// ============================================================================

// Check for bullish CHoCH (break above prior swing high after making lower low)
bullishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       high > lastSwingHigh and 
                       lastSwingLow < lastSwingHigh and
                       bar_index - lastSwingHighBar > minCHoCHDistance and
                       strategy.position_size == 0

// Check for bearish CHoCH (break below prior swing low after making higher high)
bearishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       low < lastSwingLow and 
                       lastSwingHigh > lastSwingLow and
                       bar_index - lastSwingLowBar > minCHoCHDistance and
                       strategy.position_size == 0

// Process CHoCH signals
if bullishCHoCHCondition and not bullishCHoCH
    bullishCHoCH := true
    bearishCHoCH := false
    chochLevel := lastSwingHigh
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


if bearishCHoCHCondition and not bearishCHoCH
    bearishCHoCH := true
    bullishCHoCH := false
    chochLevel := lastSwingLow
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


// ============================================================================
// FVG DETECTION
// ============================================================================

// Check for FVG formation (3-candle pattern)
if bar_index >= 2
    // Bullish FVG: low[0] > high[2]
    bullishFVG = low[0] > high[2] and (low[0] - high[2]) >= ticksToPrice(minFVGSize)
    
    // Bearish FVG: high[0] < low[2]  
    bearishFVG = high[0] < low[2] and (low[2] - high[0]) >= ticksToPrice(minFVGSize)
    
    // Process bullish FVG after bullish CHoCH
    if bullishFVG and bullishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[0]
        fvgBottom = high[2]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true
    
    // Process bearish FVG after bearish CHoCH
    if bearishFVG and bearishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[2]
        fvgBottom = high[0]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true

// ============================================================================
// ENTRY LOGIC
// ============================================================================

// Long entry: price touches bullish FVG after bullish CHoCH
longCondition = lookingForEntry and bullishCHoCH and 
               not na(activeFVGTop) and not na(activeFVGBottom) and
               low <= activeFVGTop and high >= activeFVGBottom and
               strategy.position_size == 0

// Short entry: price touches bearish FVG after bearish CHoCH  
shortCondition = lookingForEntry and bearishCHoCH and  not na(activeFVGTop) and not na(activeFVGBottom) and low <= activeFVGTop and high >= activeFVGBottom and  strategy.position_size == 0

// Process long entries
if longCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingLow
    stopDistance = entryPrice - stopLoss
    
    if useRRTarget
        takeProfit := entryPrice + (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice + ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Long", strategy.long, qty=qty)
    strategy.exit("Long Exit", "Long", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bullishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    


// Process short entries
if shortCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingHigh
    stopDistance = stopLoss - entryPrice
    
    if useRRTarget
        takeProfit := entryPrice - (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice - ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Short", strategy.short, qty=qty)
    strategy.exit("Short Exit", "Short", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bearishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    

// ============================================================================
// POSITION MANAGEMENT
// ============================================================================

// Reset position state when trade is closed
if inPosition and strategy.position_size == 0
    inPosition := false
    stopLossLevel := na
    takeProfitLevel := na

// ============================================================================
// VISUAL SIGNALS
// ============================================================================

// Plot entry signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, 
          style=shape.triangleup, size=size.normal)

plotshape(shortCondition, title="Short Entry", location=location.abovebar, color=color.red, 
          style=shape.triangledown, size=size.normal)

// Plot active stop loss and take profit levels
plot(inPosition ? stopLossLevel : na, title="Stop Loss", color=color.red, linewidth=2, style=plot.style_linebr)
plot(inPosition ? takeProfitLevel : na, title="Take Profit", color=color.green, linewidth=2, style=plot.style_linebr)

// ============================================================================
// CLEANUP
// ============================================================================

// Clean up old FVG boxes (helps with performance)
if bar_index % 100 == 0
    while array.size(bullishFVGs) > 20
        box.delete(array.shift(bullishFVGs))
    while array.size(bearishFVGs) > 20
        box.delete(array.shift(bearishFVGs))

// ============================================================================
// ALERTS
// ============================================================================

// Alert conditions
alertcondition(longCondition, title="Long Entry Signal", message="ICT Strategy: Long entry at FVG - SL: {{strategy.position_avg_price}}")
alertcondition(shortCondition, title="Short Entry Signal", message="ICT Strategy: Short entry at FVG - SL: {{strategy.position_avg_price}}")