Ý tưởng cốt lõi của chiến lược này là kết hợp các chỉ số RSI của các chu kỳ khác nhau để xác định khu vực giá hiện tại, và khi thấy các chỉ số RSI chu kỳ lớn hơn có đột phá, hãy thực hiện giao dịch mua hoặc bán tương ứng trong các chu kỳ nhỏ hơn. Chiến lược này tổng hợp lợi thế của các chỉ số kỹ thuật chu kỳ khác nhau để xác định giá trị tương đối của giá hiện tại thông qua nhiều chiều thời gian để tìm kiếm điểm vào tốt hơn.
Chiến lược này chủ yếu xác định các khu vực giá và tìm kiếm các cơ hội giao dịch thông qua các bước sau:
Ví dụ, khi chỉ số RSI đường ngày phá vỡ một mức cao mới, chúng tôi đánh giá hiện tại đang ở trong giao dịch đa đầu, và nếu RSI đường ngày phá vỡ một mức thấp mới, chúng tôi đánh giá hiện tại đang ở trong giao dịch trống, trong cả hai trường hợp chúng tôi thực hiện mua và bán trên đường 5 phút.
So với các chiến lược truyền thống chỉ tập trung vào một chu kỳ thời gian, chiến lược này có một số ưu điểm:
Đánh giá giá trị tương đối của giá hiện tại chính xác hơn. Các chỉ số chu kỳ lớn hơn như đường nắng có thể lọc ra tiếng ồn thị trường ngắn hạn, phán đoán xu hướng chu kỳ lớn và khu vực giá trị.
Kết hợp với các chỉ số chu kỳ thời gian khác nhau, tăng độ tin cậy của tín hiệu. Dựa vào chỉ số chu kỳ đơn lẻ dễ bị tín hiệu sai, trong khi nhiều chỉ số chu kỳ phát tín hiệu đồng thời thì đáng tin cậy hơn.
Chúng ta cần tìm kiếm cơ hội trong khoảng thời gian ngắn như 5 phút để có được lợi nhuận.
Quay lại nhỏ hơn. Kết hợp theo chu kỳ thời gian giúp tránh bị lôi kéo. Khi chỉ số chu kỳ lớn biến đổi, chúng tôi sẽ dừng lỗ khi rút ra.
Rủi ro chính của chiến lược này là:
Lỗi đánh giá của chỉ số chu kỳ lớn. Các chỉ số như RSI đường ngày không có khả năng đánh giá hiệu quả các khu vực giá trị, có thể dẫn đến lỗi tín hiệu. Điều này đòi hỏi phải tối ưu hóa các tham số của RSI.
Các hoạt động của chu kỳ nhỏ không phù hợp với phán đoán của chu kỳ lớn. Đôi khi, các động thái giá của chu kỳ nhỏ sẽ chống lại xu hướng của chu kỳ lớn, khi đó cần thiết phải thiết lập dừng lỗ để kiểm soát tổn thất.
Quản lý tiền tệ không đúng cách. Nếu quản lý rủi ro không đúng cách, một lần mất mát quá lớn, sẽ dẫn đến khó phục hồi. Điều này đòi hỏi phải thiết lập quản lý vị thế hợp lý.
Có rất nhiều cách để tối ưu hóa chiến lược này, chủ yếu là từ các khía cạnh sau:
Tối ưu hóa tham số chu kỳ. Bạn có thể thử nghiệm nhiều hơn các kết hợp chu kỳ để tìm tham số tối ưu.
Tối ưu hóa tham số RSI. Bạn có thể điều chỉnh các tham số của RSI để xem liệu có thể cải thiện độ chính xác phán đoán hay không.
Thêm các chỉ số khác. Bạn có thể thêm nhiều chỉ số để kết hợp, ví dụ như thêm đường trung bình để xác định xu hướng.
Tối ưu hóa cơ chế dừng lỗ. Bạn có thể điều chỉnh điểm dừng lỗ một cách động theo trường hợp rút tiền.
Tối ưu hóa quản lý vị thế. Có thể quản lý một cách khoa học và hợp lý hơn vị thế cụ thể của mỗi giao dịch.
Chiến lược này thực hiện đòn bẩy giá trị giữa các chiều thời gian khác nhau bằng cách đánh giá giá cả của chỉ số RSI trong các chu kỳ khác nhau. Suy nghĩ về phán đoán xuyên chu kỳ này đáng để khai thác thêm, chúng ta có thể liên tục hoàn thiện bằng các phương pháp tối ưu hóa tham số, tối ưu hóa dừng lỗ và tối ưu hóa kết hợp, để làm cho chiến lược có lợi thế hơn. Nói chung, chiến lược này có suy nghĩ độc đáo và có rất nhiều không gian tối ưu hóa.
/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Swing MTF", shorttitle="Swing MTF", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5)
//
otf_period = input(defval=2, title="Look Back Period (2nd Timeframe)")
otf = input(defval="180", title="Second Momentum Timeframe")
// Function to dectect a new bar
is_newbar(res) =>
t = time(res)
change(t) != 0 ? true : false
// Check how many bars are in our upper timeframe
since_new_bar = barssince(is_newbar(otf))
otf_total_bars = na
otf_total_bars := since_new_bar == 0 ? since_new_bar[1] : otf_total_bars[1]
//Calculate RSI Values
ctf_rsi = rsi(open, otf_period)
breakline=input(title="Breaks in lines", defval = true, type=bool)
so = request.security(syminfo.tickerid, otf, rsi(open, otf_period))
sc = request.security(syminfo.tickerid, otf, rsi(close, otf_period))
final_otf_so = na
final_otf_so := barstate.isrealtime ? since_new_bar == otf_total_bars ? so : final_otf_so[1] : so
final_otf_sc = na
final_otf_sc := barstate.isrealtime ? since_new_bar == otf_total_bars ? sc : final_otf_sc[1] : sc
barsback = input(11, title='Bars back to check for a swing')
// showsig = input(false, title='Show Signal Markers')
swing_detection(index)=>
swing_high = false
swing_low = false
start = (index*2) - 1 // -1 so we have an even number of
swing_point_high = final_otf_so[index]
swing_point_low = final_otf_sc[index]
//Swing Highs
for i = 0 to start
swing_high := true
if i < index
if final_otf_so[i] > swing_point_high
swing_high := false
break
// Have to do checks before pivot and after seperately because we can get
// two highs of the same value in a row. Notice the > and >= difference
if i > index
if final_otf_so[i] >= swing_point_high
swing_high := false
break
//Swing lows
for i = 0 to start
swing_low := true
if i < index
if final_otf_sc[i] < swing_point_low
swing_low := false
break
// Have to do checks before pivot and after seperately because we can get
// two lows of the same value in a row. Notice the > and >= difference
if i > index
if final_otf_sc[i] <= swing_point_low
swing_low := false
break
[swing_high, swing_low]
// Check for a swing
[swing_high, swing_low] = swing_detection(barsback)
long = final_otf_so > final_otf_sc
short = final_otf_so < final_otf_sc
if swing_low and long
strategy.entry("My Long Entry Id", strategy.long)
if swing_high and short
strategy.entry("My Short Entry Id", strategy.short)