Strategi ini direka berdasarkan penunjuk teknikal purata bergerak dan jumlah dagangan untuk strategi kuantitatif trend jangka panjang. Apabila harga penutupan berada di atas garis purata bergerak 20 hari dan jumlah pembelian hari itu lebih besar daripada jumlah jualan dan jumlah perdagangan purata selama n hari yang lalu, pasaran dianggap berada dalam keadaan menaik dan sudah tiba masanya untuk membeli. Apabila harga penutupan melanggar bawah rel bawah dan jumlah jualan hari ini lebih besar daripada jumlah pembelian dan jumlah perdagangan purata selama n hari yang lalu, pasaran dianggap berada dalam keadaan menurun dan sudah tiba masanya untuk menjual.
Strategi ini terutamanya berdasarkan dua petunjuk untuk penilaian:
Garis purata bergerak berganda: Hitung garis 20 hari dan garis 60 hari. Apabila garis 20 hari melintasi di atas garis 60 hari, pasaran dianggap berada dalam trend menaik. Apabila garis 20 hari melintasi di bawah garis 60 hari, pasaran dianggap berada dalam trend menurun.
Volume dagangan: Hitung jumlah pembelian harian dan jumlah jualan. Jika jumlah pembelian lebih besar daripada jumlah jualan dan lebih besar daripada jumlah perdagangan purata selama n hari yang lalu, ia ditentukan bahawa pasaran adalah bullish. Jika jumlah penjualan lebih besar daripada jumlah pembelian dan lebih besar daripada jumlah perdagangan purata selama n hari yang lalu, ia ditentukan bahawa pasaran adalah bearish.
Strategi perdagangan dan logik tertentu adalah seperti berikut:
Pergi panjang: Apabila harga penutupan berada di atas garis purata bergerak 20 hari dan jumlah pembelian hari ini lebih besar daripada jumlah penjualan dan jumlah purata dagangan selama n hari yang lalu, pasaran dianggap bullish.
Pergi pendek: Apabila harga penutupan di bawah rel bawah dan jumlah jualan hari ini lebih besar daripada jumlah pembelian dan jumlah perdagangan purata selama n hari yang lalu, pasaran dianggap menurun.
Mengambil keuntungan dan menghentikan kerugian: Tetapkan tahap mengambil keuntungan dan menghentikan kerugian yang munasabah untuk mengunci keuntungan atau mengurangkan kerugian. Sebagai contoh, apabila harga meningkat 5% di atas harga kemasukan, ambil keuntungan; apabila kerugian mencapai 10%, hentikan kerugian; atau apabila harga mencapai tahap tertinggi baru-baru ini dan kemudian menarik kembali ke tahap tertentu, ambil keuntungan.
Strategi ini mempunyai kelebihan berikut:
Menggabungkan dua garis purata bergerak dan penunjuk jumlah dagangan mengelakkan titik buta penilaian penunjuk teknikal tunggal.
Menggunakan Bollinger Bands dengan parameter yang berbeza menentukan harga kemasukan yang lebih tepat.
Strategi mengambil keuntungan dan menghentikan kerugian adalah munasabah, yang membantu mengunci keuntungan dan mengawal risiko.
Hasil backtesting yang baik dengan pulangan yang stabil, yang sebenarnya boleh digunakan untuk perdagangan kuantitatif.
Strategi ini juga mempunyai beberapa risiko:
Strategi purata bergerak berganda cenderung menghasilkan isyarat palsu dan perlu disaring oleh penunjuk jumlah.
Tetapan parameter Bollinger Bands yang tidak betul boleh menyebabkan entri yang terlalu kerap atau jarang berlaku.
Nilai keuntungan tetap yang tidak betul dan titik stop loss boleh mempengaruhi pulangan strategi.
Sejumlah besar data sejarah diperlukan untuk backtesting, dan kerugian yang tidak dijangka masih boleh berlaku dalam perdagangan langsung.
Strategi ini boleh dioptimumkan dalam aspek berikut:
Mengoptimumkan parameter sistem purata bergerak untuk mencari kombinasi purata bergerak yang optimum.
Mengoptimumkan parameter Bollinger Bands untuk kemasukan yang lebih tepat.
Sesuaikan secara dinamik titik mengambil keuntungan dan berhenti kerugian mengikut keadaan pasaran untuk menetapkan nisbah risiko-balasan yang munasabah.
Meningkatkan penilaian penunjuk teknikal lain seperti MACD, KD, dan lain-lain untuk meningkatkan ketepatan strategi.
Gunakan kaedah pembelajaran mesin untuk mencari parameter optimum secara automatik untuk menjadikan strategi lebih kukuh.
Secara keseluruhan, ini adalah strategi perdagangan kuantitatif yang sangat praktikal dengan prestasi backtesting yang baik. Ia mudah dilaksanakan, dengan risiko yang boleh dikawal, dan merupakan strategi yang stabil yang sesuai untuk perdagangan langsung, yang bernilai dipelajari untuk pedagang kuantitatif.
/*backtest start: 2023-12-21 00:00:00 end: 2023-12-28 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © KAIST291 //@version=4 strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true) // SETTING // length1=input(1) length3=input(3) length7=input(7) length14=input(14) length20=input(20) length60=input(60) length120=input(120) ma1= sma(close,length1) ma3= sma(close,length3) ma7= sma(close,length7) ma14=sma(close,length14) ma20=sma(close,length20) ma60=sma(close,length60) ma120=sma(close,length120) rsi=rsi(close,14) // BUYING VOLUME AND SELLING VOLUME // BV = iff( (high==low), 0, volume*(close-low)/(high-low)) SV = iff( (high==low), 0, volume*(high-close)/(high-low)) vol = iff(volume > 0, volume, 1) dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100) weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100) //----------------------------------------------------------- Davgvol = sma(volume, dailyLength) Wavgvol = sma(volume, weeklyLength) //----------------------------------------------------------- length = input(20, minval=1) src = input(close, title="Source") mult = input(2.0, minval=0.001, maxval=50, title="StdDev") mult2= input(1.5, minval=0.001, maxval=50, title="exp") mult3= input(1.0, minval=0.001, maxval=50, title="exp1") basis = sma(src, length) dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev dev2= mult2 * stdev(src, length) Supper= basis + dev2 Slower= basis - dev2 dev3= mult3 * stdev(src, length) upper1= basis + dev3 lower1= basis - dev3 offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500) plot(basis, "Basis", color=#FF6D00, offset = offset) p1 = plot(upper, "Upper", color=#2962FF, offset = offset) p2 = plot(lower, "Lower", color=#2962FF, offset = offset) fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95)) //---------------------------------------------------- exit=(close-strategy.position_avg_price / strategy.position_avg_price*100) bull=(close>Supper and BV>SV and BV>Davgvol) bull2=(close>ma20 and BV>SV and BV>Davgvol) bux =(close<Supper and close>Slower and volume<Wavgvol) bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol) hi=highest(exit,10) imInATrade = strategy.position_size != 0 highestPriceAfterEntry = valuewhen(imInATrade, high, 0) // STRATEGY LONG // if (bull and close>ma3 and ma20>ma60 and rsi<70) strategy.entry("Long",strategy.long,0.1) if (strategy.position_avg_price*1.05<close) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (strategy.openprofit < strategy.position_avg_price*0.9-close) strategy.close("Long",0.1) ////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////