Chiến lược đảo ngược biến động giá trung bình

Tác giả:ChaoZhang, Ngày: 2023-10-11 16:03:36
Tags:

Tổng quan

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.

Nguyên tắc

Chiến lược sử dụng hai chỉ số chính:

  1. Chỉ số VixFix: Tính toán độ lệch chuẩn của giá trong một khoảng thời gian nhất định để xác định xem có biến động giá bất thường hay không.
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.

  1. Chỉ số RSI: Tính toán chỉ số sức mạnh tương đối của giá để xác định thời gian đảo ngược giá.
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.

Nhập và ra

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.

Ưu điểm

  • Sử dụng các tính chất thống kê về biến động giá bất thường để xác định sự đảo ngược giá với phạm vi rộng.
  • Kết hợp với chỉ số RSI để đánh giá quá mua / quá bán cải thiện độ chính xác nhập cảnh.
  • Việc phá vỡ dải lệch thấp hơn như là tín hiệu đầu vào làm giảm cơ hội bị bỏ lỡ.
  • Phản hồi thân nến như dừng lỗ nhận ra dừng lỗ nhanh chóng và giảm lỗ.

Rủi ro

  • Phạm vi lệch thấp hơn có thể cần điều chỉnh để tối ưu hóa tham số.
  • Bẻ gãy dải dưới không đảm bảo đảo ngược, có nguy cơ bị mắc kẹt.
  • Các thông số RSI cần tối ưu hóa, các giá trị không chính xác dẫn đến tín hiệu không chính xác.
  • Lỗi dừng chân của thân đèn có thể quá mạnh, cần điều chỉnh.

Hướng dẫn tối ưu hóa

  • Tối ưu hóa thời gian tính toán độ lệch chuẩn để nắm bắt tốt hơn sự biến động bất thường.
  • Tối ưu hóa các thông số RSI để tìm các tiêu chí mua quá mức / bán quá mức tốt hơn.
  • Hãy thử kết hợp các chỉ số khác như KDJ, MACD để xác định thời gian đảo ngược.
  • Tối ưu hóa cơ chế dừng lỗ, thiết lập giá retrace như điểm chuẩn dừng lỗ.

Kết luận

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()

Thêm nữa