Chiến lược đảo ngược biến động giá bất thường


Ngày tạo: 2023-10-11 16:03:36 sửa đổi lần cuối: 2023-10-11 16:03:36
sao chép: 1 Số nhấp chuột: 689
1
tập trung vào
1617
Người theo dõi

Tổng quan

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.

Nguyên tắc

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

  1. Chỉ số VixFix: tính toán chênh lệch tiêu chuẩn của giá trong một chu kỳ nhất định, để xác định xem giá có biến động bất thường hay không. Cách tính toán cụ thể là:
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.

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

Vào và ra sân

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.

Ưu điểm

  • Sử dụng các tính năng thống kê của biến động giá bất thường để xác định thời gian biến đổi giá, bao phủ rộng.
  • Kết hợp với chỉ số RSI để đánh giá tình trạng quá mua quá bán, bạn có thể cải thiện độ chính xác của việc nhập vào.
  • Sử dụng mức chênh lệch chuẩn phá vỡ như một tín hiệu đầu vào để giảm cơ hội bị bỏ lỡ.
  • Sử dụng thực thể đảo ngược như là một phương pháp dừng lỗ, có thể dừng lỗ nhanh chóng, giảm tổn thất.

Rủi ro

  • Giới hạn thấp nhất của độ lệch chuẩn có thể được điều chỉnh và cần phải tối ưu hóa các tham số.
  • Bị phá vỡ mức chênh lệch tiêu chuẩn thấp không nhất thiết phải có sự đảo ngược, có nguy cơ bị mắc kẹt.
  • Các tham số RSI cần được tối ưu hóa, nếu không phù hợp có thể dẫn đến tín hiệu không chính xác.
  • Định hướng thực thể có thể quá quyết liệt trong việc xác định lỗ hổng và cần điều chỉnh các tham số.

Tối ưu hóa tư duy

  • Tối ưu hóa tính toán các tham số chu kỳ chênh lệch tiêu chuẩn, giúp nó nắm bắt được sự biến động bất thường của giá cả.
  • Tối ưu hóa các tham số của RSI để tìm ra các tiêu chuẩn đánh giá tốt hơn.
  • Thử kết hợp các chỉ số khác, như KDJ, MACD, để đánh giá thời gian đảo ngược.
  • Tối ưu hóa phương thức dừng lỗ, thiết lập mức độ điều chỉnh giá làm tiêu chuẩn dừng lỗ.

Tóm tắt

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.

Mã nguồn chiến lược
/*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()