Berbilang penunjuk teknikal strategi dagangan niaga hadapan henti rugi dinamik

EMA ATR FVG BOS HTF ORDER BLOCK Liquidity Sweep
Tarikh penciptaan: 2025-04-02 09:41:48 Akhirnya diubah suai: 2025-04-02 09:41:48
Salin: 0 Bilangan klik: 383
2
fokus pada
319
Pengikut

Berbilang penunjuk teknikal strategi dagangan niaga hadapan henti rugi dinamik Berbilang penunjuk teknikal strategi dagangan niaga hadapan henti rugi dinamik

Gambaran Keseluruhan Strategi

Strategi ini adalah sistem perdagangan niaga hadapan yang canggih yang menggabungkan pelbagai syarat teknikal dan analisis jangka masa yang lebih tinggi untuk mengenal pasti peluang perdagangan yang berkemungkinan tinggi. Strategi ini menggunakan pendekatan berdasarkan gabungan pelbagai syarat, yang memerlukan beberapa syarat teknikal untuk dipenuhi secara serentak sebelum memasuki perdagangan. Ia menggabungkan beberapa konsep teknikal yang canggih, termasuk celah nilai wajar (FVG), blok pesanan (Order Blocks), imbasan kecairan (Liquidity Sweeps) dan isyarat penembusan struktur (BOS), sambil menggunakan petunjuk untuk mengukuhkan arah trend dalam tempoh masa yang berbeza.

Prinsip Strategi

Di tengah-tengah strategi ini adalah penggunaan gabungan pelbagai kaedah analisis teknikal untuk memastikan perdagangan hanya dimulakan apabila beberapa petunjuk memberi isyarat pada masa yang sama. Secara khusus, strategi ini merangkumi beberapa komponen utama:

  1. Celah nilai wajar (FVG)- Diiktiraf apabila terdapat jurang harga yang ketara antara dua kerang, yang menunjukkan kemungkinan ruang yang belum dipenuhi di pasaran.
  2. Blok pesanan- Ini adalah kawasan-kawasan utama di mana harga berbalik, biasanya ditunjukkan sebagai tanda penolakan yang kuat, yang kemudiannya menjadi zon sokongan atau rintangan.
  3. Imbasan kecairan- mengenal pasti keadaan di mana pasaran berbalik selepas menembusi tahap tinggi atau rendah awal, yang biasanya menunjukkan bahawa institusi besar sedang mengumpul kecairan.
  4. Penembusan struktur (BOS)- Ia berlaku apabila harga menembusi struktur awal, membentuk titik tinggi yang lebih tinggi atau titik rendah yang lebih rendah.
  5. Pengesahan trend jangka masa tinggi- Menggunakan EMA (indices moving averages) pada tempoh masa 15 minit dan 60 minit untuk mengesahkan arah trend keseluruhan.

Strategi hanya akan menghasilkan isyarat masuk jika terdapat sekurang-kurangnya dua syarat asas (satu dalam mod pengaturcaraan) ditambah dengan isyarat penembusan struktur dan selaras dengan trend kitaran masa yang lebih tinggi.

Dari segi pengurusan risiko, strategi ini menggunakan ATR (Average True Range) untuk menetapkan kedudukan hentian dinamik dengan jarak hentian yang biasanya 1.5 kali nilai ATR. Kaedah ini meningkatkan jarak hentian apabila turun naik tinggi dan mengurangkan jarak apabila turun naik rendah, menjadikan hentian lebih pintar.

Untuk keuntungan yang berakhir, strategi menggunakan kaedah keuntungan berfluktuasi, mengambil keuntungan 50% kedudukan apabila mencapai keuntungan yang setara dengan risiko ((1R), sambil memindahkan kerugian yang tersisa ke kedudukan yang dilindungi, sehingga mewujudkan peluang perdagangan tanpa risiko. Di samping itu, terdapat mekanisme keluar berdasarkan masa, yang akan ditutup secara automatik jika perdagangan tidak bergerak ke arah yang menguntungkan dalam masa yang ditetapkan ((30 minit default).

Selain itu, strategi ini juga merangkumi fungsi pengurusan akaun yang secara automatik menarik diri dari semua kedudukan apabila keuntungan akaun mencapai sasaran yang ditetapkan (<\(3000) atau mencetuskan hentian susulan (<\)2500 akaun bermula setelah keuntungan melebihi).

Kelebihan Strategik

Setelah menganalisis kod secara mendalam, kami dapat menyimpulkan beberapa kelebihan yang jelas:

  1. Sistem pengesahan berganda- Memerlukan beberapa syarat teknikal untuk masuk, mengurangkan isyarat palsu dan meningkatkan kualiti transaksi.
  2. Pengurusan Risiko Pintar- Menggunakan hentian dinamik berasaskan ATR, lebih sesuai dengan perubahan dalam turun naik pasaran daripada hentian titik tetap atau peratusan.
  3. Penapisan trend jangka masa tinggi- Menggunakan arah trend pada kitaran masa yang lebih tinggi, hanya berdagang di arah trend, mengelakkan perdagangan berlawanan arah.
  4. Strategi untuk mendapatkan keuntungan secara bergilir-gilir- Dengan mengambil keuntungan secara berturut-turut dan memindahkan stop loss ke kedudukan perlindungan, ia memastikan sekatan sebahagian keuntungan dan memberi peluang tanpa risiko untuk baki kedudukan.
  5. Mekanisme keluar berasaskan masa- Keluar secara automatik dari perdagangan yang tidak sah, mengelakkan dana anda terkurung dalam perdagangan yang tidak bermotivasi untuk jangka masa yang lama.
  6. Pengurusan Akaun Keseluruhan- Menjaga keuntungan akaun keseluruhan dan pengurusan wang yang kukuh dengan menetapkan sasaran keuntungan dan berhenti kerugian.
  7. Sangat boleh menyesuaikan diri- Membolehkan fleksibiliti yang tinggi melalui pelbagai parameter yang boleh disesuaikan dengan keadaan pasaran dan gaya perdagangan yang berbeza.
  8. Integrasi penunjuk teknikal profesional- Menggabungkan pelbagai konsep analisis teknologi canggih yang biasanya hanya digunakan oleh peniaga profesional.

Risiko Strategik

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

  1. Risiko Pengoptimuman Parameter- Strategi bergantung kepada pelbagai parameter, dan jika terlalu optimasi mungkin menyebabkan overfit, ia tidak akan berfungsi dengan baik dalam keadaan pasaran masa depan. Penyelesaian adalah dengan menggunakan kitaran ujian yang cukup lama dan melakukan ujian ke hadapan.
  2. Pergantungan persekitaran pasaran- Strategi ini mungkin berfungsi dengan baik dalam pasaran yang sedang tren, tetapi mungkin menghasilkan lebih banyak isyarat palsu dalam pasaran yang bergolak. Penyelesaian adalah dengan menambahkan penapis keadaan pasaran, menyesuaikan frekuensi perdagangan atau menghentikan perdagangan sama sekali apabila ia dikenali sebagai pasaran yang bergolak.
  3. Risiko pelaksanaan slip- Semasa turun naik yang tinggi, harga masuk dan keluar mungkin berbeza dengan yang dijangkakan, yang mempengaruhi prestasi strategi. Penyelesaian adalah dengan mensimulasikan titik slippage sebenar dalam pengesanan semula, dan menggunakan borang harga terhad dan bukannya borang harga pasaran dalam perdagangan sebenar.
  4. Risiko kerosakan- Sistem perdagangan automatik mungkin menghadapi masalah teknikal atau gangguan rangkaian. Penyelesaian adalah dengan mewujudkan sistem sandaran dan mekanisme intervensi manual.
  5. Pengurusan kerumitan- Kerumitan strategi boleh menyebabkan masalah yang sukar untuk didiagnosis atau memahami mengapa sesetengah perdagangan gagal. Penyelesaian adalah dengan menyimpan catatan transaksi terperinci dan menganalisis prestasi strategi secara berkala.
  6. Risiko kecairan pasaran- Dalam keadaan pasaran tertentu, seperti sebelum dan selepas pengumuman berita penting, kecairan boleh menurun dengan cepat, menyebabkan penurunan yang lebih besar atau ketidakupayaan untuk keluar dari kedudukan. Penyelesaian adalah untuk mengelakkan perdagangan pada masa pengumuman data ekonomi penting, atau mengurangkan saiz kedudukan pada masa-masa tersebut.

Arah pengoptimuman strategi

Berdasarkan analisis kod, berikut adalah beberapa arah pengoptimuman yang berpotensi:

  1. Meningkatkan trend pengesanan- Strategi semasa menggunakan simpulan EMA untuk menentukan trend, dan pertimbangkan untuk menambah indikator trend lain seperti ADX (Indeks Arah Purata) untuk mengesahkan kekuatan trend, kerana pasaran yang kuat biasanya menawarkan peluang perdagangan yang lebih baik.
  2. Keadaan pasaran- Menambah mekanisme pengenalan keadaan pasaran, menyesuaikan parameter strategi secara automatik dalam keadaan pasaran yang berbeza (trend, interval, turun naik tinggi, turun naik rendah). Ini membolehkan strategi menjadi lebih fleksibel dan menyesuaikan diri dengan keadaan pasaran yang berbeza.
  3. Optimumkan masa kemasukan- Pertimbangkan untuk menambah indikator momentum seperti RSI atau penunjuk rawak untuk memastikan bahawa apabila memasuki arah trend, anda juga akan mengelakkan masuk ke dalam keadaan overbought atau oversold yang berlebihan, yang akan mengurangkan risiko kebalikan.
  4. Meningkatkan strategi keuntungan- Keuntungan 1R yang tetap pada masa ini mungkin terlalu konservatif atau terlalu radikal, dan penyesuaian sasaran keuntungan secara dinamik berdasarkan turun naik atau tahap sokongan / rintangan boleh dipertimbangkan, menetapkan sasaran yang lebih jauh apabila turun naiknya lebih besar.
  5. Pengurusan risiko yang lebih baik- Memperkenalkan mekanisme penyesuaian saiz kedudukan dinamik yang secara automatik menyesuaikan celah risiko mengikut prestasi strategi terkini dan turun naik pasaran, meningkatkan risiko apabila strategi berfungsi dengan baik dan mengurangkan risiko apabila ia tidak berfungsi.
  6. Tambah penapis masa harian- Pasaran niaga hadapan mempunyai ciri-ciri yang berbeza dalam tempoh masa yang berbeza, penambahan penapis masa dapat mengelakkan tempoh yang kurang cair atau tidak berorientasikan.
  7. Menyatakan sentimen pasaran- Menambah indikator sentimen pasaran seperti VIX, menyesuaikan parameter strategi atau menangguhkan perdagangan apabila sentimen melampau.
  8. Optimumkan kecekapan kod- Terdapat beberapa operasi pusingan dalam kod semasa yang mungkin menjejaskan kecekapan pelaksanaan, terutamanya pada jangka masa yang lebih kecil. Mengoptimumkan pusingan ini dapat meningkatkan kelajuan tindak balas strategi.

ringkaskan

Ini adalah strategi perdagangan berjangka pelbagai indikator yang dirancang dengan baik, menggabungkan pelbagai konsep analisis teknikal yang canggih, dan mempunyai fungsi pengurusan risiko dan pengurusan wang yang baik. Ia mengurangkan isyarat palsu dengan meminta beberapa syarat untuk dipenuhi dan mengesahkan trend jangka masa yang tinggi, sambil menggunakan strategi stop loss dan keuntungan berganda yang dinamik berdasarkan ATR untuk mengoptimumkan nisbah pulangan risiko.

Kelebihan utama strategi ini adalah sistem pengesahan bertingkat dan pengurusan risiko pintar yang membolehkannya menangkap peluang perdagangan berkemungkinan tinggi sambil mengekalkan risiko yang lebih rendah. Walau bagaimanapun, kerumitan strategi ini juga membawa cabaran pengoptimuman parameter dan kesesuaian pasaran yang memerlukan pemantauan berterusan dan penyesuaian berkala untuk mengekalkan keberkesanannya.

Strategi ini mempunyai potensi untuk mengekalkan prestasi yang stabil dalam pelbagai keadaan pasaran dengan melaksanakan langkah-langkah pengoptimuman yang disyorkan, terutamanya untuk meningkatkan kemampuan untuk menyesuaikan diri dengan keadaan pasaran dan memperbaiki sistem pengurusan risiko. Secara keseluruhan, ini adalah strategi canggih yang sesuai untuk digunakan oleh peniaga yang berpengalaman dan, dengan pemantauan dan penyesuaian yang sesuai, boleh menjadi alat yang kuat dalam sistem perdagangan.

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

// @version=5
strategy("NQ Futures Trading Strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.cash, default_qty_value=5000)

// ==========================================
// Parameters
// ==========================================

// Account Parameters
accountSize = 50000
profitGoal = 3000
trailingThreshold = 2500
stopsTrailing = 52650

// Trading Parameters
atrLength = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for SL", minval=0.5, maxval=3.0, step=0.1)
timeoutPeriod = input.int(30, "Exit after X minutes if trade doesn't move favorably", minval=5, maxval=120)

// FVG (Fair Value Gap) Parameters
fvgLength = input.int(5, "FVG Look-back Period", minval=2, maxval=20)
fvgThreshold = input.float(0.1, "FVG Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Order Block Parameters
obLength = input.int(5, "Order Block Look-back Period", minval=2, maxval=20)
obThreshold = input.float(0.1, "Order Block Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Liquidity Sweep Parameters
sweepLength = input.int(5, "Liquidity Sweep Look-back Period", minval=2, maxval=20)
sweepThreshold = input.float(0.05, "Sweep Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Break of Structure Parameters
bosLength = input.int(5, "BOS Look-back Period", minval=2, maxval=20)
bosThreshold = input.float(0.05, "BOS Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Debug Mode
debugMode = input.bool(false, "Debug Mode (more signals)")

// Higher Timeframe Trend Parameters
htfPeriod1 = input.timeframe("15", "First Higher Timeframe")
htfPeriod2 = input.timeframe("60", "Second Higher Timeframe")

// ==========================================
// Indicators & Calculations
// ==========================================

// ATR Calculation
atr = ta.atr(atrLength)

// Higher Timeframe EMAs for Trend Determination
htf1_ema20 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf1_ema50 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema20 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema50 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)

// Higher Timeframe Trend
htf1_bullish = htf1_ema20 > htf1_ema50
htf1_bearish = htf1_ema20 < htf1_ema50
htf2_bullish = htf2_ema20 > htf2_ema50
htf2_bearish = htf2_ema20 < htf2_ema50

// ==========================================
// Entry Conditions
// ==========================================

// 1. Fair Value Gap (FVG)
bullishFVG = false
bearishFVG = false

for i = 1 to fvgLength
    if low[i] > high[i+2] and (low[i] - high[i+2]) / high[i+2] > fvgThreshold
        bullishFVG := true
    if high[i] < low[i+2] and (low[i+2] - high[i]) / high[i] > fvgThreshold
        bearishFVG := true

// 2. Inverse Fair Value Gap
inverseBullishFVG = false
inverseBearishFVG = false

for i = 1 to fvgLength
    if high[i+1] < low[i+2] and close[i] > open[i] and close[i] > high[i+1]
        inverseBullishFVG := true
    if low[i+1] > high[i+2] and close[i] < open[i] and close[i] < low[i+1]
        inverseBearishFVG := true

// 3. Order Block / Breaker Block
bullishOrderBlock = false
bearishOrderBlock = false

for i = 1 to obLength
    if close[i+1] < open[i+1] and (open[i+1] - close[i+1]) / close[i+1] > obThreshold and close[i] > open[i]
        bullishOrderBlock := true
    if close[i+1] > open[i+1] and (close[i+1] - open[i+1]) / open[i+1] > obThreshold and close[i] < open[i]
        bearishOrderBlock := true

// 4. Liquidity Sweep
bullishSweep = false
bearishSweep = false

lowestLow = ta.lowest(low, sweepLength+1)
highestHigh = ta.highest(high, sweepLength+1)

if low[1] < lowestLow[2] and close > open
    bullishSweep := true
if high[1] > highestHigh[2] and close < open
    bearishSweep := true

// 5. Break of Structure (BOS)
bullishBOS = false
bearishBOS = false

prevHigh = high[2]
prevLow = low[2]

if high > prevHigh and low[1] < low[2]
    bullishBOS := true
if low < prevLow and high[1] > high[2]
    bearishBOS := true

// Simpler version for debug mode
if debugMode
    bullishBOS := close > open and close > close[1]
    bearishBOS := close < open and close < close[1]

// ==========================================
// Signal Generation
// ==========================================

// Count valid entry conditions
bullishConditions = bullishFVG ? 1 : 0
bullishConditions := bullishConditions + (inverseBullishFVG ? 1 : 0)
bullishConditions := bullishConditions + (bullishOrderBlock ? 1 : 0)
bullishConditions := bullishConditions + (bullishSweep ? 1 : 0)

bearishConditions = bearishFVG ? 1 : 0
bearishConditions := bearishConditions + (inverseBearishFVG ? 1 : 0)
bearishConditions := bearishConditions + (bearishOrderBlock ? 1 : 0)
bearishConditions := bearishConditions + (bearishSweep ? 1 : 0)

// Entry signals (need at least 2 conditions + BOS confirmation)
// In debug mode, require only 1 condition
minConditions = debugMode ? 1 : 2
longSignal = bullishConditions >= minConditions and bullishBOS and (htf1_bullish or htf2_bullish)
shortSignal = bearishConditions >= minConditions and bearishBOS and (htf1_bearish or htf2_bearish)

// Debug mode override for testing
if debugMode
    longSignal := longSignal or (bullishBOS and htf1_bullish)
    shortSignal := shortSignal or (bearishBOS and htf1_bearish)

// ==========================================
// Risk Management
// ==========================================

// Calculate dynamic stop loss based on ATR
longStopDistance = atr * atrMultiplier
shortStopDistance = atr * atrMultiplier

// Default fixed values for testing
if debugMode
    longStopDistance := close * 0.01  // 1% stop
    shortStopDistance := close * 0.01  // 1% stop

// Calculate position size based on risk
nqPointValue = 20  // Each point is $20 for NQ
longPositionSize = math.floor(2000 / (longStopDistance * nqPointValue))
shortPositionSize = math.floor(2000 / (shortStopDistance * nqPointValue))

// Ensure at least 1 contract
longPositionSize := math.max(longPositionSize, 1)
shortPositionSize := math.max(shortPositionSize, 1)

// Variables to track entry time
var int entryTime = 0
var float equityCurve = accountSize

// ==========================================
// Strategy Execution
// ==========================================

// Make sure we don't get multiple signals on the same bar
var longEnteredThisBar = false
var shortEnteredThisBar = false

longEnteredThisBar := false
shortEnteredThisBar := false

// Entry conditions
if longSignal and not longEnteredThisBar and strategy.position_size <= 0
    strategy.close_all()
    strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEnteredThisBar := true
    entryTime := time

if shortSignal and not shortEnteredThisBar and strategy.position_size >= 0
    strategy.close_all()
    strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEnteredThisBar := true
    entryTime := time

// Take profit and stop loss orders
if strategy.position_size > 0
    stopPrice = strategy.position_avg_price - longStopDistance
    takeProfitPrice1 = strategy.position_avg_price + longStopDistance
    strategy.exit("Long TP1", "Long", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if high >= takeProfitPrice1
        strategy.exit("Long BE", "Long", stop=strategy.position_avg_price)

if strategy.position_size < 0
    stopPrice = strategy.position_avg_price + shortStopDistance
    takeProfitPrice1 = strategy.position_avg_price - shortStopDistance
    strategy.exit("Short TP1", "Short", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if low <= takeProfitPrice1
        strategy.exit("Short BE", "Short", stop=strategy.position_avg_price)

// Time-based exit
if strategy.position_size != 0
    currentTime = time
    if (currentTime - entryTime) >= timeoutPeriod * 60000  // Convert minutes to milliseconds
        strategy.close_all(comment="Time Exit")

// ==========================================
// Trailing Stop for Account Management
// ==========================================

// Update equity curve
equityCurve := strategy.equity

// Check if profit target is reached or trailing stop is hit
if strategy.equity >= accountSize + profitGoal
    strategy.close_all(comment="Profit Goal")

if strategy.equity >= accountSize + trailingThreshold
    trailingStop = math.max(accountSize, strategy.equity - trailingThreshold)
    if strategy.equity <= trailingStop
        strategy.close_all(comment="Trailing Stop")

// Stop trailing if account reaches the stop trailing threshold
if strategy.equity >= stopsTrailing
    strategy.close_all(comment="Stop Trailing")

// ==========================================
// Plotting
// ==========================================

// Plot entry conditions
plotshape(longSignal, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortSignal, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot current position
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)

// Alert conditions
alertcondition(longSignal, title="Long Entry Signal", message="NQ LONG ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(shortSignal, title="Short Entry Signal", message="NQ SHORT ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and high >= strategy.position_avg_price + longStopDistance, title="Long Take Profit", message="NQ LONG TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and low <= strategy.position_avg_price - shortStopDistance, title="Short Take Profit", message="NQ SHORT TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and low <= strategy.position_avg_price - longStopDistance, title="Long Stop Loss", message="NQ LONG SL: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and high >= strategy.position_avg_price + shortStopDistance, title="Short Stop Loss", message="NQ SHORT SL: {{ticker}}, Price: {{close}}")