
Strategi EMA crossover dan Bollinger Bands Double Entry adalah sistem perdagangan kuantitatif yang menggabungkan trend tracking dan pergerakan pergerakan. Strategi ini menggunakan crossover rata-rata bergerak indeks (EMA) untuk menilai trend pasaran, dan menggunakan Bollinger Bands (Bollinger Bands) untuk mengenal pasti peluang penembusan yang berpotensi.
EMA silang: strategi menggunakan EMA 12 kitaran dan 26 kitaran untuk menentukan arah trend. Apabila EMA (12 kitaran) yang cepat melintasi EMA ((26 kitaran) yang perlahan, ia menghasilkan isyarat melakukan lebih banyak; sebaliknya ia menghasilkan isyarat melakukan lebih sedikit.
Brinband: Strategi menggunakan 55 kitaran, 0.9 standard deviasi Brinbandsetting. Apabila harga menembusi rel, peluang masuk tambahan disediakan jika sudah berada dalam trend berbilang arah.
Logik input:
Logik keluar:
Tetapan Stop Loss:
Pengurusan Risiko:
Analisis multi-dimensi: menggabungkan strategi trend-tracking (EMA) dan volatility breakout (Burin Belt) untuk meningkatkan kebolehpercayaan isyarat perdagangan.
Mekanisme kemasukan yang fleksibel: Selain daripada isyarat persilangan EMA utama, peluang tambahan untuk kemasukan disediakan dengan menggunakan penembusan Burin, meningkatkan fleksibiliti strategi.
Pengurusan risiko dinamik: menggunakan ATR untuk menetapkan stop loss dan menyesuaikan saiz kedudukan, supaya strategi dapat menyesuaikan diri dengan lebih baik dengan turun naik dalam keadaan pasaran yang berbeza.
Persepsi keadaan pasaran: menilai keadaan pasaran melalui Bollinger Bands dan memilih untuk menghentikan perdagangan dalam keadaan yang tidak menguntungkan untuk mengurangkan risiko.
Pengurusan wang yang dioptimumkan: Pengendalian wang yang lebih halus dicapai dengan pengendalian risiko peratusan dan penyesuaian saiz kedudukan ATR secara dinamik.
Kustomisasi yang kuat: Pelbagai parameter boleh disesuaikan, seperti kitaran EMA, tetapan Brinband, kelipatan ATR, dan sebagainya, yang membolehkan strategi menyesuaikan diri dengan pelbagai jenis perdagangan dan persekitaran pasaran.
Risiko trend reversal: Berkesan baik dalam pasaran trend yang kuat, tetapi mungkin sering muncul isyarat pecah palsu dalam pasaran yang bergolak.
Risiko perdagangan berlebihan: Penembusan Bollinger Bands boleh menyebabkan terlalu banyak isyarat perdagangan, meningkatkan kos perdagangan.
Risiko slippage: Dalam pasaran yang sangat tidak menentu, harga masuk dan keluar mungkin jauh dari jangkaan.
Sensitiviti parameter: Prestasi strategi mungkin sensitif kepada perubahan parameter seperti kitaran EMA, tetapan Brinband, dan lain-lain yang memerlukan pengoptimuman dan pengujian semula yang teliti.
Ketergantungan kepada keadaan pasaran: Strategi mungkin tidak konsisten dalam pelbagai kitaran pasaran dan persekitaran turun naik.
Risiko pengurusan wang: Walaupun menggunakan pengurusan risiko peratusan, anda mungkin menghadapi penarikan balik akaun yang besar jika kerugian berturut-turut berlaku.
Analisis bingkai masa berbilang: memperkenalkan pengesahan trend yang lebih lama, seperti EMA garis pusingan atau garis bulan, untuk mengurangkan isyarat palsu.
Penapis turun naik: menyesuaikan parameter Brin atau menghentikan perdagangan dalam keadaan turun naik yang rendah untuk mengelakkan perdagangan berlebihan di pasaran terbalik.
Tambahkan penunjuk momentum: seperti RSI atau MACD, untuk mengesahkan kekuatan trend dan isyarat pembalikan yang berpotensi.
Optimumkan mekanisme keluar: pertimbangkan untuk menggunakan tracking stop loss atau sasaran keuntungan dinamik berasaskan ATR untuk lebih mengunci keuntungan.
Klasifikasi keadaan pasaran: membangunkan sistem klasifikasi persekitaran pasaran yang menggunakan parameter yang berbeza dalam keadaan pasaran yang berbeza.
Pengoptimuman pembelajaran mesin: menggunakan algoritma pembelajaran mesin untuk menyesuaikan parameter strategi secara dinamik untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Analisis hubungan: Apabila berdagang dalam pelbagai jenis, pertimbangkan hubungan antara jenis untuk mengoptimumkan ciri-ciri risiko dan keuntungan portfolio keseluruhan.
Masukkan faktor asas: Untuk saham atau komoditi, pertimbangkan untuk memasukkan indikator asas yang berkaitan, meningkatkan kualiti isyarat masuk.
Strategi EMA Cross vs Bolling Belt Dual Entry adalah sistem perdagangan kuantitatif yang menggabungkan trend tracking dan idea penembusan turun naik. Ia menangkap trend utama melalui EMA Cross dan menggunakan penembusan Bolling Belt untuk memberikan peluang masuk tambahan, sambil menggunakan kaedah pengurusan risiko dinamik untuk mengoptimumkan penggunaan dana.
Strategi ini masih mempunyai ruang yang besar untuk pengoptimuman melalui analisis pelbagai kerangka masa, penapisan kadar turun naik, penambahan penunjuk momentum, dan sebagainya. Terutama, pengenalan algoritma pembelajaran mesin dan sistem klasifikasi keadaan pasaran mungkin meningkatkan daya serap dan kestabilan strategi dengan ketara. Walau bagaimanapun, dalam aplikasi praktikal, pengukuran dan pengujian ke hadapan yang komprehensif masih diperlukan, dan penyesuaian parameter yang halus berdasarkan jenis perdagangan dan keadaan pasaran tertentu.
Secara keseluruhannya, ini adalah kerangka strategi perdagangan kuantitatif yang direka dengan baik dan berpotensi. Dengan pengoptimuman berterusan dan pengurusan yang teliti, ia berpotensi menjadi sistem perdagangan yang mantap, sesuai untuk pelabur yang mencari untuk mengawal risiko sambil menangkap trend.
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("EMA Crossover with BB Double Entry", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=100)
// Input parameters
fastLength = input.int(12, "Fast EMA Length")
slowLength = input.int(26, "Slow EMA Length")
atrPeriod = input.int(14, "ATR Period")
atrMultiplier = input.float(1.0, "ATR Multiplier")
useATRStopLoss = input.bool(true, "Use ATR Stop Loss")
stopLossDays = input.int(5, "Number of days for stop loss", minval=1, maxval=50)
riskPerTrade = input.float(3.0, "Risk per trade (%)", minval=0.1, maxval=5, step=0.1)
bbRiskPerTrade = input.float(1.5, "Risk for BB breakout trade (%)", minval=0.1, maxval=5, step=0.1)
// Bollinger Bands parameters
bbLength = input.int(55, "BB Length")
bbMult = input.float(0.9, "BB Standard Deviation")
useBBPauseResume = input.bool(false, "Use BB for Pause/Resume trading")
// Backtesting dates
startDate = input(timestamp("2020-01-01"), "Start Date")
endDate = input(timestamp("9999-12-31"), "End Date")
// Calculate EMAs
fastEMA = ta.ema(close, fastLength)
slowEMA = ta.ema(close, slowLength)
// Calculate ATR
atr = ta.atr(atrPeriod)
// Calculate Bollinger Bands
bbBasis = ta.sma(close, bbLength)
bbDev = bbMult * ta.stdev(close, bbLength)
bbUpper = bbBasis + bbDev
bbLower = bbBasis - bbDev
// Define trading conditions
longCondition = ta.crossover(fastEMA, slowEMA)
shortCondition = ta.crossunder(fastEMA, slowEMA)
bullish = fastEMA > slowEMA
bearish = fastEMA < slowEMA
// Bollinger Bands breakout
bbBreakout = close > bbUpper and close[1] <= bbUpper[1]
// Calculate lowest low for stop loss
lowestLow = ta.lowest(low, stopLossDays)
// Variables to store entry price and stop loss
var float entryPrice = na
var float stopLoss = na
var bool inPosition = false
var bool pauseTrading = false
// Entry logic
entryConditions = (longCondition or (bbBreakout and bullish)) and
(not useBBPauseResume or close > bbBasis) and
not pauseTrading
if entryConditions and not inPosition
entryPrice := close
atrStopLoss = close - (atr * atrMultiplier)
lowStopLoss = lowestLow
stopLoss := useATRStopLoss ? atrStopLoss : lowStopLoss
riskAmount = strategy.equity * (riskPerTrade / 100)
positionSize = riskAmount / (close - stopLoss)
strategy.entry("Long", strategy.long, qty=positionSize)
inPosition := true
pauseTrading := false
alert("BUY," + syminfo.ticker + ",EntryPrice=" + str.tostring(close) + ",StopLoss=" + str.tostring(stopLoss) + ",PositionSize=" + str.tostring(positionSize), alert.freq_once_per_bar_close)
// Additional entry on BB breakout
if inPosition and bbBreakout and bullish and (not useBBPauseResume or close > bbBasis)
bbRiskAmount = strategy.equity * (bbRiskPerTrade / 100)
bbPositionSize = bbRiskAmount / (close - stopLoss)
strategy.entry("Long_BB", strategy.long, qty=bbPositionSize)
alert("ADD," + syminfo.ticker + ",EntryPrice=" + str.tostring(close) + ",StopLoss=" + str.tostring(stopLoss) + ",PositionSize=" + str.tostring(bbPositionSize), alert.freq_once_per_bar_close)
// Exit logic
if shortCondition or (useBBPauseResume and inPosition and close < bbBasis)
if shortCondition
strategy.close_all(comment="EMA Crossdown")
inPosition := false
pauseTrading := false
alert("SELL," + syminfo.ticker + ",Reason=EMA_Crossdown", alert.freq_once_per_bar_close)
else if useBBPauseResume
strategy.close_all(comment="Close under BB basic")
pauseTrading := true
alert("SELL," + syminfo.ticker + ",Reason=Below_BB_Basic", alert.freq_once_per_bar_close)
entryPrice := na
stopLoss := na
// Resume trading if price closes above BB basic
if useBBPauseResume and pauseTrading and close > bbBasis
pauseTrading := false
alert("RESUME," + syminfo.ticker, alert.freq_once_per_bar_close)
// Stop loss
if strategy.position_size > 0
strategy.exit("Stop Loss", "Long", stop=stopLoss)
strategy.exit("Stop Loss", "Long_BB", stop=stopLoss)
if close <= stopLoss
alert("SELL," + syminfo.ticker + ",Reason=Stop_Loss", alert.freq_once_per_bar_close)
// Plotting
plot(fastEMA, color=color.new(color.blue, 0), title="Fast EMA")
plot(slowEMA, color=color.new(color.red, 0), title="Slow EMA")
plot(bbUpper, color=color.new(color.green, 50), title="BB Upper")
plot(bbLower, color=color.new(color.green, 50), title="BB Lower")
plot(bbBasis, color=color.new(color.yellow, 50), title="BB Basic")
plot(strategy.position_size > 0 ? stopLoss : na, color=color.red, style=plot.style_cross, linewidth=2, title="Stop Loss")
// Alert conditions
alertcondition(entryConditions, title="Buy Alert", message="Buy {{ticker}}")
alertcondition(bbBreakout and inPosition and bullish and (not useBBPauseResume or close > bbBasis), title="Add Position Alert", message="Add Position {{ticker}}")
alertcondition(shortCondition, title="Sell Alert (EMA)", message="Sell {{ticker}} (EMA crossdown)")
alertcondition(useBBPauseResume and inPosition and close < bbBasis, title="Pause Alert", message="Pause trading {{ticker}} (Close under BB basic)")
alertcondition(useBBPauseResume and pauseTrading and close > bbBasis, title="Resume Alert", message="Resume trading {{ticker}} (Close above BB basic)")