Strategi ini mendeteksi peluang pembalikan harga dengan menghitung standar deviasi volatilitas harga.
Strategi ini menggunakan dua indikator utama:
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.
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.
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.
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()