Chiến lược này được gọi làChiến lược chỉ số của TSI cửa sổ chuyển động hai bướcÝ tưởng cốt lõi của chiến lược này là sử dụng cửa sổ trượt EMA kép để làm trơn tru biến động giá, và sau đó kết hợp các thay đổi theo hướng của xu hướng để xây dựng một chỉ số động lực phản ánh sức mua và bán trên thị trường, cụ thể là chỉ số TSI, và sử dụng nó như một tín hiệu giao dịch để đưa ra quyết định mua và bán.
Chiến lược này sử dụng cửa sổ trượt kép (double sliding window) để tính toán thay đổi giá. Thời gian cửa sổ bên ngoài dài hơn và thời gian cửa sổ bên trong ngắn hơn.
Đầu tiên tính toán sự thay đổi đơn vị trong giá:
pc = change(price)
Sau đó sử dụng cửa sổ trượt kép để làm mịn đôi các thay đổi giá:
double_smoothed_pc = double_smooth(pc, long, short)
Sau đó tính giá trị tuyệt đối của sự thay đổi giá, cũng được làm bằng cách sử dụng hai cửa sổ trượt:
double_smoothed_abs_pc = double_smooth(abs(pc), long, short)
Cuối cùng, sử dụng thay đổi giá trơn bằng chia cho thay đổi giá tuyệt đối trơn bằng để có được chỉ số TSI phản ánh sức mua và bán:
tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc)
Bằng cách thiết lập các khoảng thời gian cửa sổ dài và ngắn khác nhau, tiếng ồn thị trường trong ngắn hạn có thể được lọc ra một phần, do đó chỉ số TSI có thể phản ánh tốt hơn sức mua và bán trong xu hướng trung bình và dài hạn. Khi chỉ số TSI vượt quá đường trung bình động của nó, một tín hiệu mua được tạo ra; Khi chỉ số TSI giảm xuống dưới đường trung bình động của nó, một tín hiệu bán được tạo ra.
Nó có thể được tối ưu hóa bằng cách điều chỉnh các tham số thời gian cửa sổ và rút ngắn chiều dài trung bình động của tín hiệu một cách thích hợp.
Khả năng điều chỉnh các thông số giao dịch thông qua các công cụ giao dịch thông qua các cửa sổ trượt kép lọc tiếng ồn. Khả năng điều chỉnh hai lần các biến đổi giá cũng làm cho chỉ số ổn định và đáng tin cậy hơn. Tỷ lệ tiêu chuẩn hóa làm cho nó có thể so sánh được. Chỉ số kết hợp hướng và cường độ của các thay đổi giá như một nguồn tín hiệu chất lượng cao. Thông qua điều chỉnh tham số, độ nhạy của chỉ số có thể được kiểm soát tự do. Với tối ưu hóa tham số và kiểm soát rủi ro, nó là một lựa chọn chiến lược giao dịch định lượng rất thực tế.
/*backtest start: 2023-01-01 00:00:00 end: 2024-01-07 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("True Strength Indicator BTCUSD 2H", shorttitle="TSI BTCUSD 2H",initial_capital=1000, commission_value=0.2, commission_type =strategy.commission.percent, default_qty_value=100 , overlay = false, pyramiding=10, default_qty_type=strategy.percent_of_equity) //BASED ON True Strength Indicator MTF resCustom = input(title="Timeframe", defval="120" ) long = input(title="Long Length", defval=25) short = input(title="Short Length", defval=13) signal = input(title="Signal Length", defval=13) length = input(title="Период", defval=300) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2017, title = "From Year", minval = 2017) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" price = request.security(syminfo.tickerid,resCustom,close) double_smooth(src, long, short) => fist_smooth = ema(src, long) ema(fist_smooth, short) pc = change(price) double_smoothed_pc = double_smooth(pc, long, short) double_smoothed_abs_pc = double_smooth(abs(pc), long, short) tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc) tsi2=ema(tsi_value, signal) plot(tsi_value, color=lime,linewidth=2) plot(tsi2, color=red,linewidth=2) hline(30, title="Zero") hline(50, title="Zero",linewidth=2) hline(70, title="Zero") buy = crossover(tsi_value, tsi2) sell = crossunder(tsi_value, tsi2) if(buy) strategy.entry("BUY", strategy.long, when = window()) if(sell) strategy.entry("SELL", strategy.short, when = window()) //greentsi =tsi_value //redtsi = tsi2 //bgcolor( greentsi>redtsi and rsiserie > 50 ? lime : na, transp=90) //bgcolor( greentsi<redtsi and rsiserie < 50 ? red : na, transp=90) //yellow1= redtsi > greentsi and rsiserie > 50 //yellow2 = redtsi < greentsi and rsiserie < 50 //bgcolor( yellow1 ? yellow : na, transp=80) //bgcolor( yellow2 ? yellow : na, transp=50) //bgcolor( yellow1 and yellow1[1] ? yellow : na, transp=70) //bgcolor( yellow2 and yellow2[2] ? yellow : na, transp=70) //bgcolor( rsiserie > 70 ? lime : na, transp=60) //bgcolor( rsiserie < 30 ? red : na, transp=60)