Ini adalah strategi trend berikut yang mengenal pasti arah bullish dan bearish menggunakan penunjuk MACD. Ia menjana garis utama MACD dengan mengira perbezaan antara purata bergerak cepat dan perlahan. Strategi ini menggunakan salib emas garis utama MACD dan garis isyarat untuk menjana isyarat beli, dan salib kematian untuk menjana isyarat jual, mencapai penjejakan trend yang seimbang.
Kod pertama menetapkan jangka masa backtesting untuk menguji prestasi sejarah strategi.
Indikator MACD kemudiannya dikira, termasuk tetapan panjang untuk purata bergerak pantas, purata bergerak perlahan, dan purata bergerak MACD. Garis pantas bertindak balas lebih sensitif dan garis perlahan bertindak balas lebih mantap. Perbezaannya membentuk garis utama MACD, yang kemudiannya dilansir oleh purata bergerak untuk membentuk garis isyarat MACD. Apabila perbezaan melintasi di atas garis sifar, isyarat menaik dihasilkan. Apabila melintasi di bawah, isyarat menurun dihasilkan.
Berdasarkan isyarat menaik dan menurun, rakam kali terakhir isyarat dihasilkan. Apabila garis cepat dan perlahan bersilang, mengesahkan dan merakam isyarat beli / jual, maka kedudukan boleh dibuka.
Selepas memasuki kedudukan, terus-menerus mengesan harga tertinggi dan terendah kedudukan. Tetapkan peratusan stop loss, apabila kerugian mencapai peratusan ini, keluar dengan stop loss.
Indikator MACD dapat mengenal pasti trend dengan berkesan dan merupakan salah satu penunjuk teknikal klasik.
Perbezaan antara purata bergerak cepat dan perlahan boleh menangkap pergerakan harga dan perubahan arah pada peringkat awal.
Kesan penapisan purata bergerak membantu menapis beberapa isyarat palsu.
Strategi ini menggabungkan mekanisme stop loss untuk mengawal risiko.
MACD cenderung menghasilkan isyarat palsu dengan ruang pengoptimuman yang terhad.
Penempatan stop loss yang tidak betul boleh terlalu aktif atau konservatif, memerlukan pengoptimuman individu di seluruh produk.
Ukuran kedudukan tetap boleh dengan mudah membawa kepada leverage yang berlebihan, pertimbangkan saiz kedudukan berdasarkan saiz akaun.
Rasional untuk jangka masa backtest perlu disahkan untuk mengelakkan pemasangan berlebihan.
Mengoptimumkan kombinasi purata bergerak pantas dan perlahan untuk mencari parameter terbaik yang sesuai dengan produk yang berbeza.
Tambah penunjuk lain seperti lilin, Bollinger Bands, RSI untuk menapis isyarat.
Menilai tahap stop loss yang berbeza berdasarkan pengeluaran, nisbah Sharpe.
Terokai teknik stop loss seperti trailing stop loss, limit order.
Uji saiz kedudukan dinamik berdasarkan ekuiti, turun naik.
Strategi penyeimbangan trend MACD adalah berdasarkan penunjuk MACD klasik. Ia mempunyai keupayaan untuk menangkap momentum harga dengan sensitif dan boleh disesuaikan dengan baik dengan produk yang berbeza melalui pengoptimuman parameter. Penambahbaikan lanjut pada isyarat penapisan, teknik hentian kerugian dan saiz kedudukan dinamik dapat terus meningkatkan kestabilan dan keuntungan.
/*backtest start: 2023-09-16 00:00:00 end: 2023-10-16 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("MACD BF", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Component Code Start /////////////// testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) // A switch to control background coloring of the test period testPeriodBackground = input(title="Color Background?", type=bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true /////////////// MACD Component - Default settings for one day. /////////////// fastLength = input(12) // 72 for 4hr slowlength = input(26) // 156 for 4 hr MACDLength = input(12) // 12 for 4hr MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD long = crossover(delta, 0) short = crossunder(delta, 0) last_long = long ? time : nz(last_long[1]) last_short = short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = long_signal ? time : nz(last_long_signal[1]) last_short_signal = short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low = not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) sl_inp = input(5.0, title='Stop Loss %', type=float)/100 /////////////// Strategy Component /////////////// // Strategy Entry if testPeriod() strategy.entry("Long Entry", strategy.long, when=long_signal) strategy.entry("Short Entry", strategy.short, when=short_signal) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na slShort = strategy.position_avg_price * (1 + sl_inp) long_sl = in_long_signal ? slLong : na short_sl = in_short_signal ? slShort : na // Strategy SL Exit if testPeriod() strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1) strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1) //plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)