Artikel ini membincangkan strategi perdagangan berdasarkan purata bergerak mudah. Strategi ini membandingkan harga penutupan dengan purata bergerak 17 tempoh, pergi lama apabila harga penutupan melintasi di atas purata bergerak dan pergi pendek apabila melintasi di bawah.
Strategi menggunakan parameter berikut untuk mengira purata bergerak:
Berdasarkan parameter ini, fungsi getMAType (() dipanggil untuk mengira SMA 17 tempoh harga penutupan.
Kemudian bandingkan hubungan antara harga penutupan dan purata bergerak:
Apabila harga penutupan melintasi di atas purata bergerak dari bawah, isyarat panjang dihasilkan. Apabila melintasi di bawah dari atas, isyarat pendek dihasilkan.
Semasa tempoh backtest, buka kedudukan panjang apabila isyarat panjang muncul dan buka kedudukan pendek apabila isyarat pendek muncul.
Kelebihan terbesar strategi ini adalah bahawa logiknya sangat mudah dan jelas. Dengan hanya satu penunjuk, ia menilai pembalikan trend berdasarkan perubahan arah penunjuk. Strategi ini mudah difahami dan dilaksanakan, sesuai untuk pemula belajar.
Di samping itu, purata bergerak termasuk dalam penunjuk trend, yang dapat dengan berkesan mengesan perubahan trend dan mengelakkan gangguan oleh bunyi pasaran jangka pendek.
Dengan menyesuaikan parameter, ia boleh menyesuaikan diri dengan kitaran yang berbeza dan produk yang berbeza.
Pertama, strategi ini hanya bergantung kepada satu penunjuk, jadi kriteria penilaian agak tunggal, yang boleh menghasilkan lebih banyak isyarat palsu.
Juga, sebagai sistem yang mengikuti trend, ia tidak berfungsi dengan baik di pasaran terhad dan sampingan.
Selain itu, tanpa stop loss atau mengambil keuntungan, terdapat risiko peningkatan kerugian.
Penyelesaian adalah untuk menggabungkan penunjuk lain, mengoptimumkan kombinasi parameter untuk mengurangkan isyarat palsu. Tambah stop loss dan mengambil keuntungan untuk mengawal risiko dan mengoptimumkan drawdowns.
Berikut adalah beberapa idea untuk mengoptimumkan strategi:
Penyesuaian parameter purata bergerak, mengoptimumkan nombor tempoh, contohnya perubahan kepada tempoh 30 atau 50.
Cuba pelbagai jenis purata bergerak, seperti EMA, VIDYA dan lain-lain. Mereka mempunyai sensitiviti yang berbeza terhadap perubahan harga.
Tambah penunjuk lain dalam kombinasi, contohnya MACD untuk menilai kekuatan; RSI untuk mengurangkan isyarat palsu.
Tambah mekanisme stop loss. Tetapkan peratusan tetap atau kehilangan stop trailing berdasarkan ATR untuk mengawal jumlah kerugian perdagangan tunggal.
Tambah mekanisme mengambil keuntungan. Tetapkan peratusan keuntungan sasaran untuk memaksimumkan keuntungan.
Pengoptimuman ini boleh menjadikan prestasi strategi lebih stabil dan mengelakkan pengeluaran yang berlebihan.
Artikel ini menganalisis strategi dagangan yang mudah berdasarkan purata bergerak 17 tempoh. Strategi ini mempunyai sumber isyarat yang mudah difahami dan dilaksanakan, yang tergolong dalam sistem trend berikut yang tipikal. Melalui tafsiran mendalam mengenai strategi, kebaikan dan keburukan ia dianalisis, dan pelbagai dimensi idea pengoptimuman dicadangkan.
/*backtest start: 2023-12-05 00:00:00 end: 2024-01-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Simple 17 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) /////////////// Time Frame /////////////// testStartYear = input(2012, "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) testPeriod() => true ///////////// Moving Average ///////////// source = input(title="MA Source", defval=ohlc4) maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"]) length = input(title="MA Length", defval=17) ///////////// Get MA Function ///////////// getMAType(maType, sourceType, maLen) => res = sma(close, 1) if maType == "ema" res := ema(sourceType, maLen) if maType == "sma" res := sma(sourceType, maLen) if maType == "swma" res := swma(sourceType) if maType == "wma" res := wma(sourceType, maLen) if maType == "vwma" res := vwma(sourceType, maLen) if maType == "rma" res := rma(sourceType, maLen) res MA = getMAType(maType, source, length) /////////////// Strategy /////////////// long = close > MA short = close < MA last_long = 0.0 last_short = 0.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) /////////////// Execution /////////////// if testPeriod() strategy.entry("L", strategy.long, when=long_signal) strategy.entry("S", strategy.short, when=short_signal) /////////////// Plotting /////////////// p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2) p2 = plot(close, linewidth=2) fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)