
Chiến lược này được gọi là chiến lược đảo ngược số lượng của tín hiệu xu hướng kép. Nó kết hợp hai loại tín hiệu chiến lược khác nhau, một là tín hiệu đảo ngược ngắn hạn dựa trên chỉ số ngẫu nhiên và một là tín hiệu xu hướng dài hạn dựa trên số lượng giao dịch, cả hai kết hợp để tạo ra tín hiệu đầu vào ổn định.
Chiến lược này bao gồm hai phần. Phần đầu tiên sử dụng chỉ số Stoch ngày 9 để tạo ra tín hiệu đảo ngược ngắn hạn. Cụ thể, nếu giá đóng cửa cao hơn một ngày trước đó, đồng thời làm nhiều khi đường nhanh ngày 9 thấp hơn 50 và đường chậm cao hơn 50; nếu giá đóng cửa thấp hơn một ngày trước đó, đồng thời đường nhanh ngày 9 cao hơn 50 và đường chậm thấp hơn 50.
Phần thứ hai sử dụng chỉ số khối lượng giao dịch âm (NVI) để tạo ra tín hiệu xu hướng dài hạn. Công thức tính toán của NVI là nếu khối lượng giao dịch trong ngày ít hơn ngày trước, thì sẽ tích lũy tỷ lệ biến động giá đóng cửa trong ngày; nếu khối lượng giao dịch trong ngày lớn hơn hoặc bằng ngày trước, thì giá trị của ngày trước sẽ không thay đổi.
Cuối cùng, chiến lược này kết hợp hai loại tín hiệu. Chỉ khi tín hiệu đảo ngược ngắn hạn và tín hiệu xu hướng dài hạn đồng bộ, tín hiệu nhập sẽ được tạo ra. Điều này giúp lọc các tín hiệu giả và tăng sự ổn định.
Lợi thế lớn nhất của chiến lược này là tín hiệu ổn định. Tín hiệu đảo ngược ngắn hạn có thể nắm bắt được sự điều chỉnh ngắn hạn của thị trường, tín hiệu xu hướng dài hạn đảm bảo không thay đổi xu hướng lớn. Sự kết hợp của cả hai làm tăng đáng kể sự ổn định của tín hiệu và có thể lọc hiệu quả tín hiệu ngắn hạn có tỷ lệ báo cáo sai lệch cao.
Ngoài ra, các tham số của chiến lược này ít hơn và dễ dàng tối ưu hóa. Người dùng chỉ cần điều chỉnh các tham số của NVI để thích ứng với các đặc điểm của thị trường khác nhau.
Rủi ro lớn nhất của chiến lược này là có thể có sự chênh lệch thời gian giữa hai tín hiệu. Có thể có một sự chậm trễ nhất định giữa tín hiệu đảo ngược ngắn hạn và tín hiệu xu hướng dài hạn, điều này sẽ dẫn đến sự không nhất quán của hai tín hiệu trong một khoảng thời gian và không thể tạo ra một tín hiệu đầu vào ổn định.
Ngoài ra, chỉ số NVI cũng nhạy cảm với sự thay đổi khối lượng giao dịch lớn bất thường, điều này có thể dẫn đến phán đoán xu hướng dài hạn sai.
Để giảm những rủi ro này, các tham số chỉ số NVI có thể được điều chỉnh thích hợp, hoặc tăng stop loss để kiểm soát tổn thất đơn lẻ.
Chiến lược này có thể được tối ưu hóa từ các khía cạnh sau:
Tối ưu hóa các tham số của chỉ số Stoch để cải thiện khả năng quay ngược.
Tối ưu hóa chu kỳ chiều dài của chỉ số NVI, tăng khả năng nhận diện xu hướng dài hạn.
Tăng điều kiện lọc số lượng giao dịch để loại bỏ các tín hiệu giả về số lượng giao dịch bất thường.
Tăng chiến lược dừng lỗ, kiểm soát tổn thất đơn lẻ.
Chiến lược này được thiết kế dựa trên suy nghĩ về xu hướng ngắn hạn và xu hướng dài hạn để thiết kế cơ chế nhập cảnh ổn định, có thể kiểm soát hiệu quả tỷ lệ báo cáo sai và tăng cường sự ổn định của tín hiệu. Bước tiếp theo có thể được tối ưu hóa từ việc điều chỉnh tham số, thêm điều kiện lọc, v.v. để nâng cao sự ổn định của chiến lược.
/*backtest
start: 2023-12-18 00:00:00
end: 2023-12-21 05:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
////////////////////////////////////////////////////////////
// Copyright by HPotter v1.0 29/03/2021
// This is combo strategies for get a cumulative signal.
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50.
// The strategy sells at market, if close price is lower than the previous close price
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// The theory behind the indexes is as follows: On days of increasing
// volume, you can expect prices to increase, and on days of decreasing
// volume, you can expect prices to decrease. This goes with the idea of
// the market being in-gear and out-of-gear. Both PVI and NVI work in similar
// fashions: Both are a running cumulative of values, which means you either
// keep adding or subtracting price rate of change each day to the previous day`s
// sum. In the case of PVI, if today`s volume is less than yesterday`s, don`t add
// anything; if today`s volume is greater, then add today`s price rate of change.
// For NVI, add today`s price rate of change only if today`s volume is less than
// yesterday`s.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
vFast = sma(stoch(close, high, low, Length), KSmoothing)
vSlow = sma(vFast, DLength)
pos = 0.0
pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0)))
pos
NVI(EMA_Len) =>
pos = 0.0
nRes = 0.0
xROC = roc(close, EMA_Len)
nRes := iff(volume < volume[1], nz(nRes[1], 0) + xROC, nz(nRes[1], 0))
nResEMA = ema(nRes, EMA_Len)
pos := iff(nRes > nResEMA, 1,
iff(nRes < nResEMA, -1, nz(pos[1], 0)))
pos
strategy(title="Combo Backtest 123 Negative Volume Index", shorttitle="Combo", overlay = true)
line1 = input(true, "---- 123 Reversal ----")
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
line2 = input(true, "---- Negative Volume Index ----")
EMA_Len = input(50, minval=1)
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posNVI = NVI(EMA_Len)
pos = iff(posReversal123 == 1 and posNVI == 1 , 1,
iff(posReversal123 == -1 and posNVI == -1, -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)
if (possig == 0)
strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )