Strategi Pembalikan Rata-rata Volatiliti Harga

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

Ringkasan

Strategi ini mengesan peluang pembalikan harga dengan mengira penyimpangan standard turun naik harga. Apabila terdapat turun naik harga yang luar biasa besar, ia dianggap sebagai peluang untuk pembalikan harga, dan kedudukan perdagangan terbalik diambil.

Prinsip

Strategi ini menggunakan dua penunjuk utama:

  1. Penunjuk VixFix: Mengira penyesuaian standard harga dalam tempoh tertentu untuk menentukan sama ada terdapat turun naik harga yang tidak normal.
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 turun naik harga, sDev adalah penyimpangan standard, midLine adalah garis purata, lowerBand dan upperBand adalah garis had bawah dan atas.

  1. Penunjuk RSI: Mengira Indeks Kekuatan Relatif harga untuk menentukan masa pembalikan harga. Pengiraan adalah:
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))

Apabila RSI berada di bawah ambang, ia menunjukkan status oversold dan potensi bounce back. Apabila RSI melebihi ambang, ia menunjukkan status overbought dan potensi pullback.

Masuk dan Keluar

Logik masuk dan keluar adalah:

Masuk panjang: Apabila harga melebihi had atas atau turun naik melebihi ambang, dan RSI di bawah nilai, pergi panjang.

Masuk pendek: Apabila harga melebihi had atas atau turun naik melebihi ambang, dan RSI melebihi nilai, pergi pendek.

Keluar: Apabila arah badan candlestick bertentangan dengan arah kedudukan, kedudukan dekat.

Kelebihan

  • Menggunakan sifat statistik turun naik harga yang tidak normal untuk menentukan pembalikan harga dengan liputan yang luas.
  • Menggabungkan dengan RSI untuk menilai overbought / oversold meningkatkan ketepatan kemasukan.
  • Melanggar jalur penyimpangan bawah sebagai isyarat masuk mengurangkan peluang yang hilang.
  • Pembalikan badan candlestick sebagai stop loss merealisasikan stop loss yang cepat dan mengurangkan kerugian.

Risiko

  • Julat penyimpangan bawah mungkin memerlukan penyesuaian untuk pengoptimuman parameter.
  • Pecahkan jalur bawah tidak menjamin pembalikan, risiko terperangkap.
  • Parameter RSI perlu dioptimumkan, nilai yang tidak betul membawa kepada isyarat yang tidak tepat.
  • Stop loss badan lilin mungkin terlalu agresif, memerlukan penyesuaian.

Arahan pengoptimuman

  • Mengoptimumkan tempoh pengiraan penyimpangan standard untuk menangkap volatiliti yang tidak normal dengan lebih baik.
  • Mengoptimumkan parameter RSI untuk mencari kriteria overbought / oversold yang lebih baik.
  • Cuba menggabungkan penunjuk lain seperti KDJ, MACD untuk menentukan masa pembalikan.
  • Mengoptimumkan mekanisme stop loss, menetapkan retracement harga sebagai penanda aras stop loss.

Kesimpulan

Strategi ini mengesan turun naik harga yang tidak normal melalui pengiraan penyimpangan standard turun naik harga, untuk menangkap peluang pembalikan. RSI digabungkan untuk menilai status overbought / oversold untuk meningkatkan ketepatan kemasukan. Stop loss arah lilin yang mudah digunakan. Secara keseluruhan, strategi ini berkesan dalam menggunakan data statistik untuk mengesan turun naik yang tidak normal, tetapi memerlukan pengoptimuman parameter lebih lanjut untuk meningkatkan kestabilan. Jika mekanisme stop loss dapat dioptimumkan dengan munasabah untuk mengurangkan kerugian, strategi akan berfungsi 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 lanjut