Chiến lược này phát hiện cơ hội đảo ngược giá bằng cách tính toán độ lệch chuẩn của biến động giá. Khi có một biến động giá lớn bất thường, nó được coi là một cơ hội để đảo ngược giá, và các vị trí giao dịch đảo ngược được thực hiện.
Chiến lược 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à biến động giá, sDev là lệch chuẩn, midLine là đường trung bình, lowerBand và upperBand là đường giới hạn dưới và trên. Khi giá vượt quá đường giới hạn trên, nó được coi là 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 chỉ số RSI dưới ngưỡng, nó chỉ ra tình trạng bán quá mức và khả năng phục hồi. Khi chỉ số RSI vượt ngưỡng, nó chỉ ra tình trạng mua quá mức và khả năng rút lui.
Logic vào và ra là:
Nhập dài: Khi giá vượt quá giới hạn trên hoặc biến động vượt quá ngưỡng, và chỉ số RSI dưới một giá trị, mua dài.
Nhập ngắn: Khi giá vượt quá giới hạn trên hoặc biến động vượt quá ngưỡng, và RSI vượt quá một giá trị, đi ngắn.
Exit: Khi hướng cơ thể nến ngược lại với hướng vị trí, vị trí đóng.
Chiến lược này phát hiện biến động giá bất thường thông qua tính toán độ lệch chuẩn của biến động giá, để nắm bắt cơ hội đảo ngược. RSI được kết hợp để đánh giá tình trạng mua quá mức / bán quá mức để cải thiện độ chính xác nhập cảnh. Cách dừng lỗ hướng thân nến đơn giản được sử dụng. Nhìn chung, chiến lược có hiệu quả trong việc sử dụng dữ liệu thống kê để phát hiện biến động bất thường, nhưng cần tối ưu hóa tham số hơn nữa để cải thiện sự ổn định. Nếu cơ chế dừng lỗ có thể được tối ưu hóa hợp lý để giảm lỗ, chiến lược sẽ hoạt động tốt hơn nữa.
/*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()