
Strategi perdagangan berlainan indikator adalah kaedah perdagangan kuantitatif yang menggabungkan analisis teknikal indikator dan tingkah laku harga untuk menangkap dua jenis peluang perdagangan utama di pasaran: perubahan harga dan trend. Strategi ini mengintegrasikan pelbagai indikator teknikal seperti purata bergerak, indeks RSI yang agak lemah, rentang sebenar rata-rata, ATR, dan harga purata yang dipertanggungjawabkan dengan jumlah perdagangan, VWAP, sambil memperkenalkan mekanisme penembusan jarak terbuka (ORB) untuk meningkatkan kebolehpercayaan isyarat masuk.
Prinsip utama strategi ini adalah untuk mengenal pasti tiga kategori peluang perdagangan yang berpotensi menguntungkan melalui penapisan dan pengesahan pelbagai indikator:
Isyarat perdagangan terbalik:
Isyarat trend pecah:
Isyarat ORB:
Strategi menggunakan indikator ATR untuk mengira kedudukan stop loss dinamik, yang ditetapkan dengan membalikkan harga minimum / harga tertinggi untuk tempoh tertentu (default 7) dan menambah kelipatan nilai ATR yang dikurangkan (default 0.5). Setelah masuk, strategi menetapkan dua sasaran stop loss:
Apabila sasaran berhenti pertama dicapai, strategi secara automatik akan menyesuaikan stop loss ke harga masuk (titik keseimbangan kerugian), dengan berkesan melindungi keuntungan yang telah diperoleh.
Isyarat kemasukan yang pelbagaiDengan mengintegrasikan tiga jenis isyarat masuk yang berbeza iaitu reversal, breakout, dan breakout pada masa bukaan, strategi ini dapat menyesuaikan diri dengan pelbagai keadaan pasaran, meningkatkan peluang perdagangan dengan berkesan, dan mengekalkan kualiti isyarat yang tinggi.
Pengurusan risiko yang baikStrategi ini menggunakan mekanisme hentian bertingkat, yang membolehkan sebahagian keuntungan diperoleh sambil mengekalkan potensi keuntungan yang lebih besar. Apabila sasaran hentian pertama dicapai, hentian kerugian akan disesuaikan secara automatik ke titik keseimbangan keuntungan dan kerugian, mewujudkan “biarkan keuntungan berjalan” sambil melindungi modal.
Pengiraan Hentian DinamikMenggunakan ATR untuk mengira kedudukan stop loss, membolehkan tahap stop loss disesuaikan dengan dinamik turun naik pasaran, mencerminkan keadaan pasaran semasa dengan lebih tepat, dan mengelakkan tetapan stop loss yang terlalu ketat atau terlalu longgar.
Pengesahan jumlah transaksi: Memperkenalkan mekanisme pengesahan jumlah transaksi khusus dalam isyarat ORB, yang memerlukan jumlah transaksi pada waktu penembusan mesti melebihi kelipatan tertentu jumlah transaksi rata-rata dalam ruang terbuka, untuk menyaring penembusan berkualiti rendah.
Penapis trendUntuk menentukan arah trend jangka panjang melalui purata bergerak mudah 200 tempoh ((SMA200), pastikan arah perdagangan selaras dengan trend utama, meningkatkan kadar kejayaan perdagangan.
Pengurusan kewangan bersepaduStrategi: Mekanisme pengurusan dana terbina dalam, hadkan peratusan dana yang digunakan untuk setiap urus niaga (default 50% modal), memastikan pembahagian dana yang pelbagai, mengurangkan risiko untuk satu urus niaga.
Penyelesaian: Pertimbangkan untuk menambah indikator prospektif seperti mengenal pasti corak tingkah laku harga, atau mengurangkan parameter untuk purata bergerak jangka panjang, meningkatkan kepekaan terhadap perubahan pasaran.
Penyelesaian: Menggunakan kaedah pengoptimuman parameter yang sesuai, seperti pengesahan ke hadapan, simulasi Monte Carlo, untuk mengelakkan pengoptimuman berlebihan; atau menggunakan parameter tetap, memberi tumpuan kepada reka bentuk peraturan yang lebih mantap.
Penyelesaian: Menubuhkan sistem keutamaan isyarat yang lebih ketat, atau memperkenalkan mekanisme pengesahan tambahan untuk memastikan transaksi hanya dijalankan dalam keadaan kebarangkalian yang tinggi.
Penyelesaian: Pertimbangkan untuk menggunakan strategi perlindungan opsyen, atau meningkatkan jarak hentian dalam keadaan pasaran yang tidak menentu, atau bahkan mengurangkan saiz kedudukan sementara.
Penyelesaian: melaksanakan kawalan risiko global, mengehadkan saiz kedudukan keseluruhan, atau menyebarkan perdagangan di antara kelas aset yang berbeza, mengurangkan risiko hubungan.
Alasan pengoptimuman: Kombinasi penunjuk berat tetap tradisional sukar untuk disesuaikan dengan tahap pasaran yang berbeza, dan pembelajaran mesin dapat secara automatik mempelajari model kombinasi penunjuk yang optimum dari data sejarah.
Alasan pengoptimuman: Sentimen pasaran mempunyai pengaruh yang ketara terhadap pergerakan harga jangka pendek, integrasi indikator seperti ini dapat menangkap titik-titik perubahan pasaran lebih awal, mengoptimumkan masa masuk dan keluar.
Alasan pengoptimuman: Pendapatan risiko tetap mungkin tidak fleksibel dalam keadaan pasaran yang berbeza, dan penyesuaian dinamik membolehkan sasaran yang lebih jauh ditetapkan dalam pasaran yang bergelombang tinggi dan sasaran yang lebih konservatif ditetapkan dalam pasaran yang bergelombang rendah.
Alasan pengoptimuman: Aktiviti pasaran menunjukkan perbezaan yang ketara pada waktu yang berbeza dalam sehari, penapis masa dapat membantu strategi untuk memberi tumpuan kepada masa perdagangan yang paling menguntungkan.
Alasan pengoptimuman: Risiko berkaitan langsung dengan turun naik pasaran, dan pengurusan kedudukan dinamik dapat mengekalkan tahap risiko yang lebih konsisten dan meningkatkan pulangan yang disesuaikan dengan risiko jangka panjang.
Strategi dagangan penembusan dan pembalikan pelbagai indikator adalah sistem dagangan kuantitatif yang komprehensif yang menggabungkan pelbagai kaedah analisis teknikal, dengan mengintegrasikan pembalikan, penembusan trend dan isyarat penembusan dalam tempoh terbuka, digabungkan dengan mekanisme pengurusan risiko dan pengurusan wang yang baik, bertujuan untuk menangkap peluang perdagangan dalam pelbagai persekitaran pasaran. Kelebihan utama strategi ini adalah kepelbagaian isyarat, kawalan risiko yang baik dan parameter penyesuaian yang kuat, terutama untuk perdagangan jangka pendek.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-03-31 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Reversal & Breakout Strategy with ORB", overlay=true, pyramiding=2, initial_capital=50000)
// --- Inputs ---
ema9Length = input.int(9, "9 EMA Length", minval=1)
ema20Length = input.int(20, "20 EMA Length", minval=1)
sma50Length = input.int(50, "50 SMA Length", minval=1)
sma200Length = input.int(200, "200 SMA Length", minval=1)
rsiLength = input.int(14, "RSI Length", minval=1)
rsiOverbought = input.int(70, "RSI Overbought", minval=0, maxval=100)
rsiOversold = input.int(30, "RSI Oversold", minval=0, maxval=100)
atrLength = input.int(14, "ATR Length", minval=1)
stopMulti = input.float(0.5, "Stop Loss ATR Multiplier", minval=0.1, step=0.1)
stopLookback = input.int(7, "Stop Loss Lookback", minval=1)
rr1 = input.float(0.5, "Risk:Reward Target 1", minval=0.1, step=0.1)
rr2 = input.float(1.1, "Risk:Reward Target 2", minval=0.1, step=0.1)
target1Percent = input.float(25, "Profit % Target 1", minval=0, maxval=100)
orbBars = input.int(15, "Opening Range Bars", minval=1, tooltip="Number of bars to define the opening range (e.g., 15 bars = 30 min on 2-min chart)")
volThreshold = input.float(1.5, "Volume Threshold Multiplier", minval=1.0, step=0.1, tooltip="Volume must be this multiple of the opening range average")
// --- Indicators ---
// Moving Averages
ema9 = ta.ema(close, ema9Length)
ema20 = ta.ema(close, ema20Length)
sma50 = ta.sma(close, sma50Length)
sma200 = ta.sma(close, sma200Length)
// VWAP
vwapValue = ta.vwap(close)
// RSI
rsi = ta.rsi(close, rsiLength)
// ATR
atr = ta.atr(atrLength)
// --- Opening Range Breakout ---
var float openingRangeHigh = na
var float openingRangeLow = na
var float openingRangeAvgVol = na
if bar_index < orbBars
openingRangeHigh := na
openingRangeLow := na
openingRangeAvgVol := na
else if bar_index == orbBars
openingRangeHigh := ta.highest(high, orbBars)
openingRangeLow := ta.lowest(low, orbBars)
openingRangeAvgVol := ta.sma(volume, orbBars)
orbLong = not na(openingRangeHigh) and ta.crossover(close, openingRangeHigh) and volume > openingRangeAvgVol * volThreshold
orbShort = not na(openingRangeLow) and ta.crossunder(close, openingRangeLow) and volume > openingRangeAvgVol * volThreshold
// --- Trend Detection ---
trendUp = close > sma200
trendDown = close < sma200
// --- Reversal Conditions ---
reversalLong = ta.crossover(close, sma50) and rsi < rsiOversold and close < vwapValue and trendUp
reversalShort = ta.crossunder(close, sma50) and rsi > rsiOverbought and close > vwapValue and trendDown
// --- Range Breakout Conditions ---
breakoutLong = ta.crossover(ema9, ema20) and close > vwapValue and trendUp
breakoutShort = ta.crossunder(ema9, ema20) and close < vwapValue and trendDown
// Combine conditions
longCondition = (reversalLong or breakoutLong or orbLong)
shortCondition = (reversalShort or breakoutShort or orbShort)
// --- Calculate Position Size ---
equityPerPosition = 25000.0 // $50,000 / 2 positions
positionSizeLong = math.floor(equityPerPosition / close)
positionSizeShort = math.floor(equityPerPosition / close)
// --- Stop Loss Calculation ---
longStop = ta.lowest(low, stopLookback) - (atr * stopMulti)
shortStop = ta.highest(high, stopLookback) + (atr * stopMulti)
// --- Variables to Store Trade Levels ---
var float tradeStop = na
var float tradeTarget1 = na
var float tradeTarget2 = na
var float initialPositionSize = na
var bool breakEvenSet = false // Track if stop has been moved to break-even
var float stopLevel = na // Dedicated variable for stop loss in exits
var float target1Level = na // Dedicated variable for first take profit
var float target2Level = na // Dedicated variable for second take profit
var float qtyTotal = na // Track total quantity
// --- Reset Levels Before New Trade ---
var bool newTrade = false
if longCondition or shortCondition
newTrade := true
else
newTrade := false
if strategy.position_size == 0 and newTrade
tradeStop := na
tradeTarget1 := na
tradeTarget2 := na
stopLevel := na
target1Level := na
target2Level := na
initialPositionSize := na
qtyTotal := na
breakEvenSet := false
// --- Strategy Entries ---
if longCondition and strategy.position_size == 0
strategy.entry("Long", strategy.long, qty=positionSizeLong * 2)
tradeStop := longStop
stopLevel := longStop
stopDistance = close - tradeStop
tradeTarget1 := close + (stopDistance * rr1)
tradeTarget2 := close + (stopDistance * rr2)
target1Level := tradeTarget1
target2Level := tradeTarget2
initialPositionSize := positionSizeLong * 2
qtyTotal := positionSizeLong * 2
breakEvenSet := false // Reset break-even flag
if shortCondition and strategy.position_size == 0
strategy.entry("Short", strategy.short, qty=positionSizeShort * 2)
tradeStop := shortStop
stopLevel := shortStop
stopDistance = tradeStop - close
tradeTarget1 := close - (stopDistance * rr1)
tradeTarget2 := close - (stopDistance * rr2)
target1Level := tradeTarget1
target2Level := tradeTarget2
initialPositionSize := positionSizeShort * 2
qtyTotal := positionSizeShort * 2
breakEvenSet := false // Reset break-even flag
// --- Trade Exits ---
if strategy.position_size > 0
qty_tp1 = qtyTotal * (target1Percent / 100)
qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
strategy.exit("Long Exit 1", "Long", qty=qty_tp1, stop=stopLevel, limit=target1Level)
strategy.exit("Long Exit 2", "Long", qty=qty_tp2, stop=stopLevel, limit=target2Level)
if strategy.position_size < 0
qty_tp1 = qtyTotal * (target1Percent / 100)
qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
strategy.exit("Short Exit 1", "Short", qty=qty_tp1, stop=stopLevel, limit=target1Level)
strategy.exit("Short Exit 2", "Short", qty=qty_tp2, stop=stopLevel, limit=target2Level)
// --- Move Stop to Break-even ---
if strategy.position_size != 0 and not na(initialPositionSize) and not breakEvenSet
if math.abs(strategy.position_size) < math.abs(initialPositionSize)
tradeStop := strategy.position_avg_price
stopLevel := strategy.position_avg_price
tradeTarget1 := na // Clear first target for plotting
breakEvenSet := true // Mark break-even as set
// --- Manual Close Fallback ---
if strategy.position_size > 0
if close >= target2Level or close <= stopLevel
strategy.close("Long", qty=qtyTotal, comment="Manual Close")
if strategy.position_size < 0
if close <= target2Level or close >= stopLevel
strategy.close("Short", qty=qtyTotal, comment="Manual Close")
// --- Reset Levels When No Position ---
if strategy.position_size == 0 and not newTrade
tradeStop := na
tradeTarget1 := na
tradeTarget2 := na
stopLevel := na
target1Level := na
target2Level := na
initialPositionSize := na
qtyTotal := na
breakEvenSet := false
// --- Plotting ---
plot(tradeStop, title="Stop Loss", color=color.red, linewidth=1, style=plot.style_linebr)
plot(tradeTarget1, title="Take Profit 1", color=color.green, linewidth=1, style=plot.style_linebr)
plot(tradeTarget2, title="Take Profit 2", color=color.blue, linewidth=1, style=plot.style_linebr)