Strategi Reversi Volatilitas Harga

Penulis:ChaoZhang, Tanggal: 2023-10-11 16:03:36
Tag:

Gambaran umum

Strategi ini mendeteksi peluang pembalikan harga dengan menghitung standar deviasi volatilitas harga.

Prinsip

Strategi ini menggunakan dua indikator utama:

  1. Indikator VixFix: Menghitung standar deviasi harga selama periode tertentu untuk menentukan apakah ada volatilitas harga yang abnormal.
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl) 
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev 
upperBand = midLine + sDev

Di mana wvf adalah volatilitas harga, sDev adalah standar deviasi, midLine adalah garis rata-rata, lowerBand dan upperBand adalah garis batas bawah dan atas.

  1. Indikator RSI: Menghitung Indeks Kekuatan Relatif harga untuk menentukan waktu pembalikan harga.
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7) 
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

Ketika RSI berada di bawah ambang batas, itu menunjukkan status oversold dan potensi bounce back.

Masuk dan Keluar

Logika masuk dan keluar adalah:

Masuk panjang: Ketika harga melebihi batas atas atau volatilitas melebihi ambang batas, dan RSI berada di bawah nilai, pergi panjang.

Masuk pendek: Ketika harga melebihi batas atas atau volatilitas melebihi ambang batas, dan RSI melebihi nilai, pergi pendek.

Keluar: Ketika arah tubuh candlestick bertentangan dengan arah posisi, posisi dekat.

Keuntungan

  • Menggunakan sifat statistik dari volatilitas harga yang tidak normal untuk menentukan pembalikan harga dengan cakupan yang luas.
  • Menggabungkan dengan RSI untuk menilai overbought / oversold meningkatkan presisi entri.
  • Memutus band deviasi bawah sebagai sinyal masuk mengurangi kesempatan yang hilang.
  • Pembalikan tubuh candlestick sebagai stop loss mewujudkan stop loss yang cepat dan mengurangi kerugian.

Risiko

  • Band penyimpangan yang lebih rendah mungkin perlu disesuaikan untuk optimasi parameter.
  • Patah pita bawah tidak menjamin pembalikan, risiko terjebak.
  • Parameter RSI perlu dioptimalkan, nilai yang tidak tepat menyebabkan sinyal yang tidak akurat.
  • Stop loss body candlestick mungkin terlalu agresif, perlu penyesuaian.

Arahan Optimasi

  • Mengoptimalkan periode perhitungan standar deviasi untuk lebih menangkap volatilitas anomali.
  • Mengoptimalkan parameter RSI untuk menemukan kriteria overbought/oversold yang lebih baik.
  • Cobalah menggabungkan indikator lain seperti KDJ, MACD untuk menentukan waktu pembalikan.
  • Mengoptimalkan mekanisme stop loss, menetapkan retracement harga sebagai patokan stop loss.

Kesimpulan

Strategi ini mendeteksi volatilitas harga anomali melalui perhitungan standar deviasi volatilitas harga, untuk menangkap peluang pembalikan. RSI dikombinasikan untuk menilai status overbought/oversold untuk meningkatkan presisi masuk. Stop loss arah tubuh lilin sederhana digunakan. Secara keseluruhan, strategi ini efektif dalam menggunakan data statistik untuk mendeteksi volatilitas anomali, tetapi membutuhkan optimasi parameter lebih lanjut untuk meningkatkan stabilitas. Jika mekanisme stop loss dapat dioptimalkan secara wajar untuk mengurangi kerugian, strategi akan tampil lebih baik lagi.


/*backtest
start: 2022-10-04 00:00:00
end: 2023-10-10 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's VixFix + RSI Strategy v1.0", shorttitle = "VixFix + RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 5)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
leverage = input(1, defval = 1, minval = 1, maxval = 100, title = "leverage")
limit = input(40, defval = 40, minval = 2, maxval = 50, title = "RSI Limit")

pd = input(22, title="LookBack Period Standard Deviation High")
bbl = input(20, title="Bolinger Band Length")
mult = input(2.0, minval = 1, maxval = 5, title = "Bollinger Band Standard Devaition Up")
lb = input(50, title="Look Back Period Percentile High")
ph = input(.85, title="Highest Percentile - 0.90=90%, 0.95=95%, 0.99=99%")
pl = input(1.01, title="Lowest Percentile - 1.10=90%, 1.05=95%, 1.01=99%")
hp = input(false, title="Show High Range - Based on Percentile and LookBack Period?")
sd = input(false, title="Show Standard Deviation Line?")

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Vix Fix
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev
upperBand = midLine + sDev
rangeHigh = (highest(wvf, lb)) * ph
rangeLow = (lowest(wvf, lb)) * pl

col = wvf >= upperBand or wvf >= rangeHigh ? lime : gray

//RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
up = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi < limit and close < open
dn = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi > (100 - limit) and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 3

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * leverage : lot[1]

if up
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Bottom", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Top", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Lebih banyak