Chiến lược này dựa trên một phương pháp giao dịch ngắn hạn cổ điển: sau khi hình thành nhiều đường dương liên tiếp, đường âm sẽ trống; sau nhiều đường âm liên tiếp, đường dương sẽ nhiều hơn. Cụ thể hơn, chiến lược này bằng cách phát hiện chiều cao thực thể và màu sắc của đường K, để xác định có nhiều đường K liên tiếp cùng màu, sau đó đánh giá bằng chỉ số RVI để xác định xem có đảo ngược hay không. Nói chung, đây là một chiến lược sử dụng đặc điểm đường K liên tiếp ngắn hạn kết hợp với chỉ số RVI để thực hiện giao dịch đảo ngược ngắn hạn.
Lập luận cốt lõi của chiến lược này bao gồm:
Kiểm tra độ cao của thực thể đường K vượt quá ngưỡng độ cao tối thiểu để lọc các dao động dương và âm quá nhỏ.
Xác định xem hai đường K đầu tiên có giống nhau không, và nếu có, có thể tạo ra cơ hội đảo ngược giá trong ngắn hạn.
Sau khi xác định hai dòng K trước cùng màu, nếu dòng K hiện tại khác với màu của hai dòng K trước, sẽ tạo ra tín hiệu giao dịch. Đó là, một dòng dương xuất hiện sau hai dòng dương liên tiếp làm nhiều; một dòng dương xuất hiện sau hai dòng dương liên tiếp làm trống.
Sau khi giao dịch vào, định hướng giữ vị trí được đánh giá thông qua sự giao thoa đa không gian của chỉ số RVI. Chỉ số RVI có thể đánh giá điểm đảo ngược ngắn hạn.
Nhìn chung, chiến lược tổng hợp tính đến các đặc điểm đường K và chỉ số RVI để tạo thành một hệ thống giao dịch đảo ngược ngắn hạn. Lấy cơ hội đảo ngược lợi nhuận khi có hành vi giá bất thường ngắn hạn.
Chiến lược này có một số ưu điểm:
Lấy bất thường giá ngắn hạn. Khi có nhiều đường dương liên tiếp hoặc nhiều đường âm liên tiếp, cho thấy giá bất thường trong thời gian ngắn, thì hoạt động ngược sẽ có lợi nhuận tốt hơn.
Chỉ số RVI hỗ trợ phán đoán. Chỉ số RVI có thể xác định hiệu quả các điểm đảo ngược ngắn hạn, hình thành sự tương tác với đặc điểm đường K, tăng sự ổn định của hệ thống.
Tần suất hoạt động cao, phù hợp với hoạt động đường ngắn. Các trường hợp liên tục K đường cùng màu xảy ra thường xuyên, kết hợp với chỉ số RVI, chiến lược này có thể cung cấp nhiều cơ hội giao dịch hơn.
Có thể kiểm soát rủi ro. Sử dụng số lượng giao dịch cố định và thiết lập Stop Loss Stop.
Logic rõ ràng và đơn giản. Dễ dàng hiểu và thực hiện, hoạt động trên ổ đĩa không khó khăn lắm.
Chiến lược này cũng có một số rủi ro cần lưu ý:
Một sự đảo ngược ngắn hạn không nhất thiết phải được thực hiện. Trong trường hợp xu hướng tiếp tục, tín hiệu đảo ngược ngắn hạn có thể không có hiệu lực và tạo ra sai lệch.
Các chỉ số RVI có thể phát ra tín hiệu sai. Các chỉ số RVI cũng có thể không hiệu quả do các tình huống đặc biệt.
Cài đặt trục dừng lỗ không đúng cách có thể làm tăng tổn thất. Cần thiết lập điểm dừng lỗ hợp lý.
Tiêu chuẩn K-line liên tục là quá cứng nhắc. Bạn có thể xem xét tối ưu hóa tỷ lệ X% K-line đồng màu xuất hiện trong N-root K-line.
Cần chú ý đến số lượng giao dịch. Số lượng cố định không thể kiểm soát lỗ hổng rủi ro tổng thể, giao dịch lớn dễ bị phá vỡ.
Chiến lược này cũng có thể được tối ưu hóa hơn nữa trong các khía cạnh sau:
Tối ưu hóa logic xác định đồng sắc của K liên tiếp, sử dụng phương pháp thống kê thay vì số gốc cố định cứng.
Tối ưu hóa các tham số RVI, tìm kiếm sự kết hợp tham số tốt nhất.
Thêm chiến lược dừng chân di động, có thể tùy thuộc vào biến động thị trường trailing stop loss.
Thêm mô-đun quản lý vị trí, điều chỉnh số lần giao dịch theo tỷ lệ sử dụng tiền.
Thêm nhiều điều kiện lọc để tăng sự ổn định của hệ thống, bao gồm các chỉ số như đường dẫn, xu hướng.
Tối ưu hóa tham số cho các giống khác nhau, cải thiện khả năng thích ứng.
Nhập học máy để đào tạo dữ liệu lịch sử, tối ưu hóa động các tham số hệ thống.
Chiến lược này nói chung là một chiến lược giao dịch đảo ngược ngắn hạn điển hình dựa trên bất thường đường K ngắn hạn với chỉ số RVI. Nó có một số lợi thế, nhưng cũng có thể có rủi ro. Bằng cách liên tục tối ưu hóa các tham số và xây dựng một hệ thống nghiêm ngặt hơn, bạn có thể nâng cao hơn nữa sự ổn định và khả năng lợi nhuận của chiến lược.
/*backtest
start: 2022-10-07 00:00:00
end: 2023-10-07 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//This is part of a series of strategies developed automatically by a online software. I cannot share the site url, which is not related to me in any way, because it is against the TV reules.
//
//This strategy was optimized for GBPUSD, timeframe 1D, fixed lots 0.1, initial balance 1000€
//LOGIC:
//- LONG ENTRY when previous candle is bear
//- LONG EXIT: RVI > signal line
//- SHORT ENTRY when previous candle is bull
//- SHORT EXIT: RVI < signal line
//
//NOTE: I considered the open of actual candle instead of close otherwise there will be a back shift of 1 candle in pine script
//
//Take profit = no
//Stop loss = no
// strategy("Expert studio strategy 1 - GBPUSD", overlay=false, precision=6, initial_capital=1000,calc_on_every_tick=true, pyramiding=0, default_qty_type=strategy.fixed, default_qty_value=10000, currency=currency.EUR)
//INPUTS
src = input(close, "source")
min_body_height = input(42, "Minimum body height", type=input.float)
//bars_back=input(2, "Consecutive bars of same color")
rvi_period = input(55, "RVI period")
//CALCULATIONS_____________________________
//candle color
body_height = abs(open - close) / syminfo.mintick
body_color = open > close ? color.red : color.green
//da migliorare for i=0 to bars_back-1
//RVI -------- thanks to hecate
p = rvi_period
CO = close - open
HL = high - low
value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6
value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6
num = sum(value1, p)
denom = sum(value2, p)
RVI = denom != 0 ? num / denom : 0
RVIsig = (RVI + 2 * RVI[1] + 2 * RVI[2] + RVI[3]) / 6
plot(RVI, color=color.green, style=plot.style_line, linewidth=1)
plot(RVIsig, color=color.red, style=plot.style_line, linewidth=1)
//----------------------------------
longCondition = body_height[1] >= min_body_height and body_color[1] == color.red and
body_height[0] >= min_body_height and body_color[0] == color.red and
RVIsig > RVI
exitLong = RVI > RVIsig
shortCondition = body_height[1] >= min_body_height and body_color[1] == color.green and
body_height[0] >= min_body_height and body_color[0] == color.green and
RVIsig < RVI
exitShort = RVI < RVIsig
if longCondition and strategy.opentrades == 0
strategy.entry("Long", strategy.long)
strategy.close("Long", when=exitLong)
if shortCondition and strategy.opentrades == 0
strategy.entry("Short", strategy.short)
strategy.close("Short", when=exitShort)
// === Backtesting Dates === thanks to Trost
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2011, "Backtest Start Year")
testStartMonth = input(10, "Backtest Start Month")
testStartDay = input(7, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testStopHour = input(23, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, testStopHour, 0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
testPeriod_1 = testPeriod()
isPeriod = testPeriodSwitch == true ? testPeriod_1 : true
// === /END
if not isPeriod
strategy.cancel_all()
strategy.close_all()