Chiến lược này tính toán chênh lệch tiêu chuẩn của giá để xác định xem giá có biến động lớn bất thường hay không. Khi giá biến động lớn bất thường, nó được đánh giá là cơ hội để giá đảo ngược và thực hiện hoạt động đảo ngược.
Chiến lược này sử dụng hai chỉ số chính:
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev
upperBand = midLine + sDev
Trong đó, wvf là tỷ lệ biến động của giá, sDev là chênh lệch tiêu chuẩn, midLine là đường trung bình, lowerBand và upperBand là đường giới hạn thấp và đường giới hạn cao. Khi giá vượt quá đường giới hạn cao, thì được coi là có biến động bất thường.
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))
Khi RSI thấp hơn một giá trị, giá có thể bị bán tháo. Khi RSI vượt quá một giá trị, giá có thể bị mua tháo.
Chiến lược này có các logic nhập cảnh và xuất cảnh như sau:
Bước vào nhiều vị trí: Bước vào nhiều vị trí khi giá vượt quá đường giới hạn hoặc biến động vượt quá ngưỡng, và RSI thấp hơn một số.
Bước vào vị trí trống: Khi giá vượt quá đường giới hạn hoặc biến động vượt quá ngưỡng, và RSI vượt quá một số lượng nhất định, hãy làm trống.
Điều kiện ra ngoài: mở vị trí khi vị trí bằng phẳng ngược lại với hướng của thực thể K-line.
Chiến lược này bằng cách tính toán chênh lệch tiêu chuẩn của biến động giá, đánh giá giá cả có biến động bất thường hay không, để nắm bắt cơ hội đảo ngược. Trong lựa chọn thời gian vào thị trường, kết hợp với chỉ số RSI để đánh giá giá quá mua quá bán, tăng độ chính xác. Trong phương pháp dừng lỗ, sử dụng hướng thực tế đơn giản để dừng lỗ. Nói chung, chiến lược sử dụng dữ liệu thống kê để đánh giá biến động bất thường, hiệu quả tốt hơn, nhưng cần tối ưu hóa các tham số hơn nữa để tăng sự ổn định.
/*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()