EMA Crossover with Bollinger Bands Double Entry Strategy adalah sistem perdagangan kuantitatif yang menggabungkan trend berikut dan metodologi breakout turun naik. Strategi ini terutamanya menggunakan crossover Exponential Moving Average (EMA) untuk menentukan trend pasaran, sementara menggunakan Bollinger Bands (BB) untuk mengenal pasti peluang breakout yang berpotensi. Pendekatan ini bertujuan untuk menangkap trend pasaran yang kuat sambil menyediakan titik masuk tambahan melalui breakout Bollinger Band, dengan itu meningkatkan peluang perdagangan dan mengoptimumkan pengurusan modal.
EMA Crossover: Strategi ini menggunakan EMA 12 tempoh dan 26 tempoh untuk menentukan arah trend. Isyarat beli dihasilkan apabila EMA cepat (12-periode) melintasi di atas EMA perlahan (26-periode), dan sebaliknya untuk isyarat jual.
Bollinger Bands: Strategi ini menggunakan Bollinger Band 55 tempoh dengan penyimpangan standard 0.9. Apabila harga memecahkan band atas semasa sudah dalam trend menaik, ia memberikan peluang masuk tambahan.
Logika kemasukan:
Logik Keluar:
Tetapkan Stop Loss:
Pengurusan Risiko:
Analisis Berbilang Dimensi: Menggabungkan strategi trend berikut (EMA) dan volatility breakout (Bollinger Bands), meningkatkan kebolehpercayaan isyarat perdagangan.
Mekanisme Masuk Fleksibel: Sebagai tambahan kepada isyarat silang EMA utama, ia menggunakan penembusan Bollinger Band untuk peluang masuk tambahan, meningkatkan fleksibiliti strategi.
Pengurusan Risiko Dinamik: Menggunakan ATR untuk menetapkan stop loss dan menyesuaikan saiz kedudukan, yang membolehkan strategi menyesuaikan diri dengan lebih baik dengan turun naik dalam keadaan pasaran yang berbeza.
Kesedaran Keadaan Pasaran: Menggunakan garis tengah Bollinger Band untuk menilai keadaan pasaran, dengan pilihan untuk menghentikan perdagangan di bawah keadaan yang tidak baik, mengurangkan risiko.
Pengurusan Modal yang Dioptimumkan: Mencapai kawalan modal yang lebih halus melalui pengurusan risiko berasaskan peratusan dan saiz kedudukan dinamik berasaskan ATR.
Keupayaan yang tinggi: Pelbagai parameter yang boleh disesuaikan, seperti tempoh EMA, tetapan Bollinger Band, dan pengganda ATR, membolehkan strategi menyesuaikan diri dengan instrumen perdagangan dan persekitaran pasaran yang berbeza.
Risiko Pembalikan Trend: Berprestasi baik di pasaran yang mempunyai trend yang kuat tetapi boleh menghasilkan isyarat pecah palsu yang kerap di pasaran yang terhad.
Risiko Perdagangan Terlalu: Penembusan Bollinger Band boleh menyebabkan isyarat perdagangan yang berlebihan, meningkatkan kos transaksi.
Risiko tergelincir: Di pasaran yang sangat tidak menentu, harga kemasukan dan keluar mungkin menyimpang dengan ketara daripada jangkaan.
Sensitiviti Parameter: Prestasi strategi mungkin sensitif terhadap perubahan dalam tempoh EMA, tetapan Bollinger Band, dan lain-lain, yang memerlukan pengoptimuman dan pengujian semula yang teliti.
Kebergantungan persekitaran pasaran: Prestasi strategi mungkin tidak konsisten di dalam kitaran pasaran yang berbeza dan persekitaran turun naik.
Risiko Pengurusan Modal: Walaupun menggunakan pengurusan risiko berasaskan peratusan, akaun masih boleh menghadapi pengeluaran yang signifikan sekiranya kerugian berturut-turut.
Analisis pelbagai jangka masa: Memperkenalkan pengesahan trend jangka panjang, seperti EMA mingguan atau bulanan, untuk mengurangkan isyarat palsu.
Penapisan Volatiliti: Sesuaikan parameter Bollinger Band atau hentikan perdagangan dalam persekitaran turun naik yang rendah untuk mengelakkan perdagangan berlebihan di pasaran sampingan.
Menggabungkan Indikator Momentum: Tambah RSI atau MACD untuk mengesahkan kekuatan trend dan isyarat pembalikan yang berpotensi.
Mengoptimumkan Mekanisme Keluar: Pertimbangkan untuk menggunakan hentian penghujung atau sasaran keuntungan dinamik berasaskan ATR untuk mengunci keuntungan dengan lebih baik.
Klasifikasi Negara Pasaran: Membangunkan sistem klasifikasi persekitaran pasaran untuk menggunakan tetapan parameter yang berbeza dalam negara pasaran yang berbeza.
Pengoptimuman Pembelajaran Mesin: Gunakan algoritma pembelajaran mesin untuk menyesuaikan parameter strategi secara dinamik untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Analisis korelasi: Pertimbangkan korelasi antara instrumen apabila berdagang pelbagai aset untuk mengoptimumkan ciri risiko-pengembalian portfolio secara keseluruhan.
Menggabungkan Faktor-faktor Dasar: Untuk stok atau komoditi, pertimbangkan untuk menambah penunjuk asas yang relevan untuk meningkatkan kualiti isyarat kemasukan.
EMA Crossover with Bollinger Bands Double Entry Strategy adalah sistem perdagangan kuantitatif yang menggabungkan konsep trend berikut dan volatility breakout. Ia menangkap trend utama melalui crossover EMA dan menyediakan peluang kemasukan tambahan menggunakan breakout Bollinger Band, sambil menggunakan kaedah pengurusan risiko dinamik untuk mengoptimumkan penggunaan modal.
Terdapat ruang yang signifikan untuk pengoptimuman melalui analisis pelbagai jangka masa, penapisan turun naik, penggabungan penunjuk momentum, dan kaedah lain. Khususnya, pengenalan algoritma pembelajaran mesin dan sistem klasifikasi keadaan pasaran dapat meningkatkan fleksibiliti dan kestabilan strategi dengan ketara. Walau bagaimanapun, dalam aplikasi praktikal, pengujian backtesting dan uji maju yang komprehensif masih diperlukan, dan penyesuaian parameter yang teliti diperlukan berdasarkan instrumen perdagangan dan persekitaran pasaran tertentu.
Secara keseluruhan, ini adalah rangka kerja strategi perdagangan kuantitatif yang direka dengan baik dan menjanjikan. Melalui pengoptimuman berterusan dan pengurusan yang teliti, ia berpotensi menjadi sistem perdagangan yang kukuh yang sesuai untuk pelabur yang ingin menangkap trend sambil mengawal risiko.
/*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)")