Beberapa indikator teknis strategi perdagangan berjangka stop loss dinamis

EMA ATR FVG BOS HTF ORDER BLOCK Liquidity Sweep
Tanggal Pembuatan: 2025-04-02 09:41:48 Akhirnya memodifikasi: 2025-04-02 09:41:48
menyalin: 0 Jumlah klik: 381
2
fokus pada
319
Pengikut

Beberapa indikator teknis strategi perdagangan berjangka stop loss dinamis Beberapa indikator teknis strategi perdagangan berjangka stop loss dinamis

Tinjauan Strategi

Strategi ini merupakan sistem perdagangan berjangka yang canggih, yang menggabungkan beberapa kondisi teknis dan analisis jangka waktu yang lebih tinggi untuk mengidentifikasi peluang perdagangan probabilitas tinggi. Strategi ini menggunakan pendekatan yang didasarkan pada kombinasi beberapa kondisi teknis, yang mengharuskan beberapa kondisi teknis untuk dipenuhi secara bersamaan sebelum masuk ke perdagangan. Ini mengintegrasikan beberapa konsep teknis canggih, termasuk gap nilai wajar (FVG), blok pesanan (Order Blocks), pemindaian likuiditas (Liquidity Sweeps), dan sinyal struktural (BOS), sambil memanfaatkan indikator untuk mengkonfirmasi arah tren dalam periode waktu yang berbeda.

Prinsip Strategi

Inti dari strategi ini adalah menggunakan kombinasi dari beberapa metode analisis teknis untuk memastikan bahwa perdagangan hanya masuk ketika beberapa indikator memberi sinyal pada saat yang sama. Secara khusus, strategi ini mencakup beberapa komponen kunci berikut:

  1. Kesenjangan nilai wajar (FVG)- Diidentifikasi ketika ada kesenjangan harga yang signifikan antara dua pipa, yang menunjukkan kemungkinan ruang yang belum terisi di pasar.
  2. Blok pesanan- Ini adalah area-area penting di mana harga berbalik, yang biasanya muncul sebagai pilar penolakan yang kuat, yang kemudian menjadi area dukungan atau resistensi.
  3. Pemindaian likuiditas- Identifikasi situasi di mana pasar membalik setelah melewati titik tinggi atau rendah di awal periode, yang biasanya merupakan indikasi bahwa lembaga besar mengumpulkan likuiditas.
  4. Terobosan struktural (BOS)- Ketika harga menembus struktur awal, membentuk titik tinggi yang lebih tinggi atau titik rendah yang lebih rendah.
  5. Konfirmasi tren siklus waktu tinggi- Menggunakan EMA (index moving average) pada periode waktu 15 menit dan 60 menit untuk mengkonfirmasi arah tren keseluruhan.

Strategi hanya akan menghasilkan sinyal masuk jika ada setidaknya dua kondisi dasar (satu di mode debug) ditambah sinyal struktural yang terobosan dan konsisten dengan tren periode waktu yang lebih tinggi.

Dalam manajemen risiko, strategi ini menggunakan ATR (Average True Range) untuk mengatur posisi stop loss yang dinamis, dengan jarak stop loss yang biasanya 1,5 kali lebih besar dari nilai ATR. Metode ini meningkatkan jarak stop loss pada saat volatilitas tinggi dan mengurangi jarak pada saat volatilitas rendah, membuat stop loss lebih cerdas.

Untuk keuntungan yang berakhir, strategi ini menggunakan metode keuntungan batch, mengambil keuntungan 50% dari posisi pada saat mencapai keuntungan yang setara dengan risiko ((1R)), sambil memindahkan sisa posisi stop loss ke posisi yang dilindungi, sehingga menciptakan kesempatan untuk perdagangan tanpa risiko. Selain itu, ada juga mekanisme keluar berbasis waktu, jika perdagangan tidak bergerak ke arah yang menguntungkan dalam waktu yang ditentukan (default 30 menit), akan ditutup secara otomatis.

Selain itu, strategi ini juga menyertakan fitur manajemen akun, yang secara otomatis keluar dari semua posisi ketika akun mencapai target profit yang ditetapkan (sekitar \(3000) atau memicu stop loss yang diikuti (sekitar \)2500).

Keunggulan Strategis

Setelah menganalisis kode secara mendalam, kita dapat menyimpulkan beberapa keuntungan yang jelas:

  1. Multiple Authentication System (MAS)- Memenuhi beberapa persyaratan teknis yang diperlukan untuk masuk secara bersamaan, secara efektif mengurangi sinyal palsu dan meningkatkan kualitas transaksi.
  2. Manajemen Risiko yang Cerdas- Menggunakan stop loss dinamis berbasis ATR, lebih mampu beradaptasi dengan perubahan volatilitas pasar daripada stop loss titik atau persentase tetap.
  3. Filter tren siklus waktu tinggi- Menggunakan arah tren dari periode waktu yang lebih tinggi, hanya berdagang di arah tren, menghindari perdagangan kontra.
  4. Strategi untuk mendapatkan keuntungan secara bertahap- Mengamankan sebagian dari keuntungan dengan mengambil keuntungan secara batch dan memindahkan stop loss ke posisi aman, dan memberikan kesempatan bebas risiko untuk sisa posisi.
  5. Mekanisme penarikan berbasis waktu- Keluar secara otomatis dari transaksi yang tidak valid, menghindari dana yang terjebak dalam transaksi yang tidak termotivasi untuk waktu yang lama.
  6. Manajemen akun secara keseluruhan- Mengamankan profitabilitas akun secara keseluruhan dan manajemen dana yang solid dengan menetapkan target laba dan penghentian kerugian.
  7. Sangat mudah beradaptasi- Memberikan tingkat fleksibilitas yang tinggi melalui beberapa parameter yang dapat disesuaikan dengan situasi pasar yang berbeda dan gaya perdagangan.
  8. Integrasi Indikator Teknologi Profesional- Menggabungkan berbagai konsep analisis teknologi canggih yang biasanya hanya digunakan oleh pedagang profesional.

Risiko Strategis

Meskipun strategi ini dirancang dengan baik, masih ada beberapa risiko potensial, termasuk:

  1. Risiko Optimasi Parameter- Strategi bergantung pada beberapa pengaturan parameter, dan jika over-optimisasi dapat menyebabkan over-fitting, tidak akan bekerja dengan baik dalam kondisi pasar di masa depan. Solusi adalah menggunakan siklus pengujian yang cukup panjang dan melakukan pengujian ke depan.
  2. Ketergantungan lingkungan pasar- Strategi ini mungkin bekerja dengan baik di pasar tren, tetapi dapat menghasilkan lebih banyak sinyal palsu di pasar bergoyang. Solusinya adalah dengan menambahkan filter lingkungan pasar, menyesuaikan frekuensi perdagangan atau berhenti berdagang sama sekali ketika diidentifikasi sebagai pasar bergoyang.
  3. Mengeksekusi risiko slippoint- Pada saat volatilitas tinggi, harga masuk dan keluar mungkin berbeda jauh dari yang diharapkan, mempengaruhi kinerja strategi. Solusinya adalah mensimulasikan titik slippage yang sebenarnya dalam pengembalian, dan menggunakan penawaran harga batas daripada penawaran harga pasar dalam perdagangan aktual.
  4. Risiko kegagalan teknis- Sistem perdagangan otomatis mungkin menghadapi kegagalan teknis atau gangguan jaringan. Solusi adalah membangun sistem cadangan dan mekanisme intervensi manual.
  5. Manajemen kompleksitasKompleksitas strategi dapat menyebabkan kesulitan dalam mendiagnosis masalah atau memahami mengapa beberapa transaksi gagal. Solusinya adalah dengan menyimpan catatan transaksi yang terperinci dan menganalisis kinerja strategi secara teratur.
  6. Risiko likuiditas pasar- Dalam kondisi pasar tertentu, seperti sebelum dan sesudah siaran berita penting, likuiditas dapat menurun dengan cepat, menyebabkan slippage yang lebih besar atau ketidakmampuan untuk keluar dari posisi. Solusinya adalah menghindari perdagangan pada saat siaran data ekonomi penting, atau mengurangi ukuran posisi pada saat ini.

Arah optimasi strategi

Berdasarkan analisis kode, berikut adalah beberapa arah optimasi potensial:

  1. Meningkatkan Identifikasi Tren- Strategi saat ini menggunakan EMA simplistic crossover untuk menentukan tren, dan pertimbangkan untuk menambahkan indikator tren lainnya seperti ADX (Average Directional Index) untuk mengkonfirmasi kekuatan tren, karena pasar tren yang kuat biasanya menawarkan peluang perdagangan yang lebih baik.
  2. Adaptasi kondisi pasar- Menambahkan mekanisme identifikasi status pasar, secara otomatis menyesuaikan parameter strategi dalam berbagai lingkungan pasar (trend, interval, volatilitas tinggi, volatilitas rendah). Ini dapat membuat strategi lebih fleksibel dan beradaptasi dengan kondisi pasar yang berbeda.
  3. Optimalkan waktu masuk- Pertimbangkan untuk menambahkan indikator momentum seperti RSI atau indikator acak untuk memastikan bahwa ketika masuk ke arah tren, Anda juga menghindari masuk dengan overbought atau oversold yang berlebihan, sehingga mengurangi risiko reversal.
  4. Meningkatkan Strategi Pendapatan- Pendapatan 1R yang saat ini tetap mungkin terlalu konservatif atau terlalu radikal, dan dapat dipertimbangkan untuk menyesuaikan target keuntungan secara dinamis berdasarkan volatilitas atau tingkat dukungan / resistensi, dengan tujuan yang lebih jauh ketika volatilitas lebih besar.
  5. Manajemen Risiko yang Lebih Rinci- Memperkenalkan mekanisme penyesuaian ukuran posisi dinamis yang secara otomatis menyesuaikan celah risiko berdasarkan kinerja strategi baru-baru ini dan volatilitas pasar, meningkatkan risiko jika strategi berkinerja baik dan mengurangi risiko jika berkinerja buruk.
  6. Tambahkan filter waktu dalam sehari- Pasar berjangka memiliki karakteristik yang berbeda pada periode waktu yang berbeda, menambahkan filter waktu dapat menghindari periode kurang likuiditas atau tidak berorientasi.
  7. Mengintegrasikan indikator sentimen pasar- Menambahkan indikator sentimen pasar seperti VIX, menyesuaikan parameter strategi atau menghentikan perdagangan jika ada sentimen ekstrem.
  8. Optimalkan efisiensi kode- Ada beberapa operasi loop dalam kode saat ini yang dapat mempengaruhi efisiensi eksekusi, terutama pada kerangka waktu yang lebih kecil. Mengoptimalkan loop ini dapat meningkatkan kecepatan respons strategi.

Meringkaskan

Ini adalah strategi perdagangan berjangka multi-indikator yang dirancang dengan baik, menggabungkan berbagai konsep analisis teknis yang canggih, dan memiliki manajemen risiko dan manajemen dana yang baik. Ini mengurangi sinyal palsu dengan meminta beberapa kondisi untuk memenuhi dan mengkonfirmasi tren periode waktu yang tinggi secara bersamaan, sambil menggunakan stop loss dan batch profit strategi dinamis berbasis ATR untuk mengoptimalkan rasio risiko-pengembalian.

Keunggulan utama dari strategi ini adalah sistem konfirmasi bertingkat dan manajemen risiko cerdas yang memungkinkannya untuk menangkap peluang perdagangan dengan probabilitas tinggi sambil mempertahankan risiko yang lebih rendah. Namun, kompleksitas strategi ini juga menimbulkan tantangan dalam pengoptimalan parameter dan adaptasi pasar yang perlu dijaga agar tetap efektif melalui pemantauan terus menerus dan penyesuaian berkala.

Strategi ini memiliki potensi untuk mempertahankan kinerja yang stabil di berbagai lingkungan pasar dengan menerapkan langkah-langkah optimasi yang disarankan, terutama meningkatkan kemampuan adaptasi kondisi pasar dan memperbaiki sistem manajemen risiko. Secara keseluruhan, ini adalah strategi canggih yang cocok untuk digunakan oleh pedagang berpengalaman, dan dengan pemantauan dan penyesuaian yang tepat, dapat menjadi alat yang kuat dalam sistem perdagangan.

Kode 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}}")