Strategi perdagangan reversi rata-rata didasarkan pada penyimpangan harga dari rata-rata bergerak untuk membuat keputusan perdagangan. Ini mengambil keuntungan dari penyimpangan jangka pendek dan pola reversi jangka panjang harga ke rata-rata dengan menetapkan posisi ketika harga jauh di bawah atau di atas rata-rata bergerak dan menutup posisi ketika harga kembali.
Strategi pertama menghitung moving average selama periode tertentu untuk mewakili tren harga jangka panjang. Kemudian menentukan waktu dan ukuran posisi berdasarkan penyimpangan harga dari moving average.
Ketika harga turun di bawah rata-rata bergerak dengan persentase tertentu, itu menandakan harga menyimpang dari tren jangka panjang. Dalam hal ini, posisi panjang secara bertahap dibangun dengan ukuran yang meningkat seiring dengan pergeseran yang meluas. Ketika harga memantul kembali di atas rata-rata bergerak, menunjukkan kemunduran ke rata-rata, posisi panjang ditutup untuk mengambil keuntungan.
Demikian pula, ketika harga naik di atas rata-rata bergerak dengan ambang batas, posisi pendek dibangun.
Menggunakan kemampuan identifikasi tren dari moving average untuk mengikuti tren keseimbangan jangka panjang harga saham dan mengidentifikasi arah tren utama.
Turunkan biaya rata-rata dengan skala ke posisi, mendapatkan harga masuk yang lebih baik.
Mengadopsi mengambil keuntungan bertahap untuk mengamankan keuntungan pada tingkat reversi rata-rata yang berbeda, mengurangi risiko.
Pengukuran posisi kontrol dengan persentase tetap untuk membatasi ukuran kerugian perdagangan tunggal.
Pengaturan parameter yang fleksibel seperti periode rata-rata bergerak dan ukuran posisi tergantung pada produk yang berbeda.
Stop loss yang sering terjadi ketika harga berosilasi.
Tren yang kuat dapat menembus rata-rata bergerak, tidak dapat ditutup pada reversi rata-rata.
Pengaturan parameter yang tidak benar dapat mengakibatkan entri atau berhenti yang terlalu agresif. pengujian backtesting dan penyesuaian yang hati-hati berdasarkan kondisi pasar diperlukan.
Frekuensi perdagangan yang tinggi menyebabkan biaya perdagangan yang substansial. Faktor biaya harus dipertimbangkan dalam optimasi parameter.
Mengoptimalkan periode rata-rata bergerak untuk menyesuaikan dengan karakteristik produk.
Mengoptimalkan ukuran posisi untuk menyeimbangkan risiko dan pengembalian.
Tambahkan filter teknis lainnya untuk menghindari perdagangan yang tidak perlu.
Menggabungkan ukuran volatilitas untuk menyesuaikan ukuran posisi berdasarkan tingkat fluktuasi pasar.
Memperkenalkan skala target keuntungan untuk mengurangi risiko dan meningkatkan pengembalian.
Strategi reversi rata-rata memanfaatkan kecenderungan reversi keseimbangan saham dengan masuk pada penyimpangan dari rata-rata bergerak dan mengambil keuntungan pada reversi. Dengan penyesuaian parameter dan filter yang tepat, strategi ini dapat beradaptasi dengan perubahan pasar dan mencapai pengembalian yang baik di bawah pengendalian risiko. Strategi ini menggabungkan kedua trend berikut dan manajemen risiko, sehingga layak untuk diteliti dan diterapkan untuk investor.
/*backtest start: 2022-10-19 00:00:00 end: 2023-10-25 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("YJ Mean Reversion", overlay=true) //Was designed firstly to work on an index like the S&P 500 , which over time tends to go up in value. //Avoid trading too frequently (e.g. Daily, Weekly), to avoid getting eaten by fees. //If you change the underlying asset, or time frame, tweaking the moving average may be necessary. //Can work with a starting capital of just $1000, optimise the settings as necessary. //Accepts floating point values for the amount of units to purchase (e.g. Bitcoin ). //If price of units exceeds available capital, script will cancel the buy. //Adjusted the input parameters to be more intuitive. //input variables movingAverage = input(title="Moving Average (bars)", type=input.integer, defval=28, minval=1, maxval=1000) //riskPercentage = input(title="Amount to Risk (%)", type=input.integer, defval=1, minval=1, maxval=50) deviation = input(title="Deviation Increment (%)", type=input.float, defval=5, minval=0.01, maxval=100) / 100 unitsLevel1 = input(title="Level 1 (units)", type=input.float, defval=1, minval=0.0001, maxval=10000) unitsLevel2 = input(title="Level 2 (units)", type=input.float, defval=2, minval=0.0001, maxval=10000) unitsLevel3 = input(title="Level 3 (units)", type=input.float, defval=4, minval=0.0001, maxval=10000) unitsLevel4 = input(title="Level 4 (units)", type=input.float, defval=8, minval=0.0001, maxval=10000) unitsLevel5 = input(title="Level 5 (units)", type=input.float, defval=16, minval=0.0001, maxval=10000) //moving average and ma slope (use on weekly chart) ma = sma(close, movingAverage) //sl = ma > ma[4] //units to buy //amount = riskPercentage / 100 * (strategy.initial_capital + strategy.netprofit) //units = floor(amount / close) //mode 1 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (strategy.position_size < 10)) //strategy.order("sell", false, strategy.position_size, when = (close > 1.05 * ma) and (strategy.position_size > 0)) //mode 2 //strategy.order("buy", true, 1, when = close < 0.8 * ma) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 3 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("buy", true, 2, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("buy", true, 4, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("buy", true, 8, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("buy", true, 16, when = (close < 0.75 * ma)) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 4 //strategy.order("buy", true, 1, when = (close < 0.98 * ma) and (close > 0.96 * ma) and (sl)) //strategy.order("buy", true, 2, when = (close < 0.96 * ma) and (close > 0.94 * ma) and (sl)) //strategy.order("buy", true, 4, when = (close < 0.94 * ma) and (close > 0.92 * ma) and (sl)) //strategy.order("buy", true, 8, when = (close < 0.92 * ma) and (close > 0.90 * ma) and (sl)) //strategy.order("buy", true, 16, when = (close < 0.90 * ma) and (sl)) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 5 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("buy", true, 2, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("buy", true, 4, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("buy", true, 8, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("buy", true, 16, when = (close < 0.75 * ma)) //strategy.order("sell", false, 1, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 2, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 4, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 8, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 16, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //mode 6 //strategy.order("B1", true, unitsLevel1 * units, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("B2", true, unitsLevel2 * units, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("B3", true, unitsLevel3 * units, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("B4", true, unitsLevel4 * units, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("B5", true, unitsLevel5 * units, when = (close < 0.75 * ma)) //strategy.order("S1", false, unitsLevel1 * units, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("S2", false, unitsLevel2 * units, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("S3", false, unitsLevel3 * units, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("S4", false, unitsLevel4 * units, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("S5", false, unitsLevel5 * units, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //mode 7 //strategy.order("B1", true, units, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("B2", true, units, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("B3", true, units, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("B4", true, units, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("B5", true, units, when = (close < 0.75 * ma)) //strategy.order("S1", false, units, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("S2", false, units, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("S3", false, units, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("S4", false, units, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("S5", false, units, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //banding calculations aH = 1.0 - deviation aL = aH - deviation bH = aL bL = bH - deviation cH = bL cL = cH - deviation dH = cL dL = dH - deviation eH = dL strategy.initial_capital = 50000 //mode 8 strategy.order("B1", true, unitsLevel1, when = (close < aH * ma) and (close > aL * ma) and (unitsLevel1 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B2", true, unitsLevel2, when = (close < bH * ma) and (close > bL * ma) and (unitsLevel2 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B3", true, unitsLevel3, when = (close < cH * ma) and (close > cL * ma) and (unitsLevel3 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B4", true, unitsLevel4, when = (close < dH * ma) and (close > dL * ma) and (unitsLevel4 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B5", true, unitsLevel5, when = (close < eH * ma) and (unitsLevel5 * close < (strategy.initial_capital + strategy.netprofit))) //banding calculations fL = 1.0 + deviation fH = fL + deviation gL = fH gH = gL + deviation hL = gH hH = hL + deviation iL = hH iH = iL + deviation jL = iH strategy.order("S1", false, unitsLevel1, when = (close > fL * ma) and (close < fH * ma) and (strategy.position_size > 0)) strategy.order("S2", false, unitsLevel2, when = (close > gL * ma) and (close < gH * ma) and (strategy.position_size > 0)) strategy.order("S3", false, unitsLevel3, when = (close > hL * ma) and (close < hH * ma) and (strategy.position_size > 0)) strategy.order("S4", false, unitsLevel4, when = (close > iL * ma) and (close < iH * ma) and (strategy.position_size > 0)) strategy.order("S5", false, unitsLevel5, when = (close > jL * ma) and (strategy.position_size > 0)) plot(ma, color=#666666, linewidth=5)