Rainbow Oscillator backtesting là một chiến lược giao dịch định lượng dựa trên chỉ số Rainbow Oscillator. Chiến lược này đánh giá hướng xu hướng và sức mạnh của thị trường bằng cách tính lệch giữa giá và trung bình động để xác định các vị trí dài và ngắn.
Chỉ số cốt lõi của chiến lược này là Rainbow Oscillator (RO), được tính như sau:
RO = 100 * ((Close - 10-day Moving Average) / (HHV(High, N) - LLV(Low, N)))
Trong đó đường trung bình động 10 ngày là đường trung bình động đơn giản của giá đóng trong 10 giai đoạn qua. Chỉ số này phản ánh độ lệch của giá so với đường trung bình động của nó. Khi RO > 0, điều đó có nghĩa là giá trên đường trung bình động, tín hiệu tăng; khi RO < 0, điều đó có nghĩa là giá dưới đường trung bình động, tín hiệu giảm.
Chiến lược cũng tính toán một chỉ số phụ - Bandwidth (RB), được tính như sau:
RB = 100 * ((Highest value of moving averages - Lowest value of moving averages) / (HHV(High, N) - LLV(Low, N)))
RB phản ánh chiều rộng giữa các đường trung bình động. RB càng lớn, biến động giá càng lớn, và ngược lại, giá ổn định hơn. Chỉ số RB có thể được sử dụng để đánh giá sự ổn định của thị trường.
Theo các giá trị của các chỉ số RO và RB, chiến lược đánh giá mức độ lệch giá và ổn định thị trường, và tạo ra các tín hiệu giao dịch cho các vị trí dài và ngắn.
Những lợi thế của chiến lược này là:
Ngoài ra còn có một số rủi ro với chiến lược này:
Các biện pháp đối phó:
Chiến lược cũng có thể được tối ưu hóa theo những cách sau:
Rainbow Oscillator backtesting chiến lược đánh giá xu hướng thị trường và sự ổn định bằng cách tính toán độ lệch giữa giá và đường trung bình động, và sử dụng thông tin này để đưa ra quyết định giao dịch dài / ngắn. Chiến lược này trực quan, dễ thực hiện và có một số giá trị thực tế.
/*backtest start: 2023-11-25 00:00:00 end: 2023-12-25 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 //////////////////////////////////////////////////////////// // Copyright by HPotter v1.0 18/03/2018 // Ever since the people concluded that stock market price movements are not // random or chaotic, but follow specific trends that can be forecasted, they // tried to develop different tools or procedures that could help them identify // those trends. And one of those financial indicators is the Rainbow Oscillator // Indicator. The Rainbow Oscillator Indicator is relatively new, originally // introduced in 1997, and it is used to forecast the changes of trend direction. // // As market prices go up and down, the oscillator appears as a direction of the // trend, but also as the safety of the market and the depth of that trend. As // the rainbow grows in width, the current trend gives signs of continuity, and // if the value of the oscillator goes beyond 80, the market becomes more and more // unstable, being prone to a sudden reversal. When prices move towards the rainbow // and the oscillator becomes more and more flat, the market tends to remain more // stable and the bandwidth decreases. Still, if the oscillator value goes below 20, // the market is again, prone to sudden reversals. The safest bandwidth value where // the market is stable is between 20 and 80, in the Rainbow Oscillator indicator value. // The depth a certain price has on a chart and into the rainbow can be used to judge // the strength of the move. // // You can change long to short in the Input Settings // WARNING: // - For purpose educate only // - This script to change bars colors. //////////////////////////////////////////////////////////// strategy(title="Rainbow Oscillator Backtest") Length = input(2, minval=1) LengthHHLL = input(10, minval=2, title="HHV/LLV Lookback") reverse = input(false, title="Trade reverse") xMA1 = sma(close, Length) xMA2 = sma(xMA1, Length) xMA3 = sma(xMA2, Length) xMA4 = sma(xMA3, Length) xMA5 = sma(xMA4, Length) xMA6 = sma(xMA5, Length) xMA7 = sma(xMA6, Length) xMA8 = sma(xMA7, Length) xMA9 = sma(xMA8, Length) xMA10 = sma(xMA9, Length) xHH = highest(close, LengthHHLL) xLL = lowest(close, LengthHHLL) xHHMAs = max(xMA1,max(xMA2,max(xMA3,max(xMA4,max(xMA5,max(xMA6,max(xMA7,max(xMA8,max(xMA9,xMA10))))))))) xLLMAs = min(xMA1,min(xMA2,min(xMA3,min(xMA4,min(xMA5,min(xMA6,min(xMA7,min(xMA8,min(xMA9,xMA10))))))))) xRBO = 100 * ((close - ((xMA1+xMA2+xMA3+xMA4+xMA5+xMA6+xMA7+xMA8+xMA9+xMA10) / 10)) / (xHH - xLL)) xRB = 100 * ((xHHMAs - xLLMAs) / (xHH - xLL)) clr = iff(xRBO >= 0, green, red) pos = iff(xRBO > 0, 1, iff(xRBO < 0, -1, nz(pos[1], 0))) possig = iff(reverse and pos == 1, -1, iff(reverse and pos == -1, 1, pos)) if (possig == 1) strategy.entry("Long", strategy.long) if (possig == -1) strategy.entry("Short", strategy.short) barcolor(possig == -1 ? red: possig == 1 ? green : blue ) plot(xRBO, color=clr, title="RO", style= histogram, linewidth=2) p0 = plot(0, color = gray, title="0") p1 = plot(xRB, color=green, title="RB") p2 = plot(-xRB, color=red, title="RB") fill(p1, p0, color=green) fill(p2, p0, color=red)