
Chiến lược giao dịch Phân vùng giá động với RSI là một hệ thống giao dịch định lượng tổng hợp, kết hợp ba công nghệ cốt lõi: phát hiện Phân vùng giá, tín hiệu Phân vùng RSI và phân tích xu hướng trung bình di chuyển. Chiến lược này được thiết kế đặc biệt cho nền tảng robot tín hiệu OKX, có chức năng nâng cao điều chỉnh vị trí và cân bằng một số vị trí. Chiến lược này chủ yếu xác định điểm đột phá của Phân vùng giá, kết hợp với tín hiệu Phân vùng RSI và lọc xu hướng thị trường bằng đường trung bình di chuyển nhiều chu kỳ, do đó tìm kiếm nhiều cơ hội để nắm bắt thời gian giao dịch chính xác trong xu hướng giảm.
Điều độc đáo của chiến lược này là hệ thống quản lý vị trí động của nó, có thể điều chỉnh kích thước giao dịch một cách động dựa trên khoảng cách giữa giá hiện tại và giá giữ vị trí trung bình, cho phép chiến lược tăng vị trí khi giá tiếp tục đi theo hướng thuận lợi, đồng thời giảm dần vị trí khi giá bắt đầu đảo ngược, do đó tối ưu hóa hiệu quả vốn và lợi nhuận rủi ro.
Chiến lược này dựa trên 3 thành phần cốt lõi:
Phân tích giá cảChiến lược: Xác định phạm vi giá bằng cách tính toán giá cao nhất và giá thấp nhất trong một chu kỳ nhất định (sắp đặt tham số boxLength). Các mức giá này được vẽ trên biểu đồ dưới dạng đường biên trên và dưới, cung cấp phạm vi tham chiếu giá trực quan cho giao dịch.
RSI đi xa khỏi kiểm traChiến lược sử dụng chỉ số tương đối mạnh yếu (RSI) để tính toán động lực của thị trường và để phát hiện sự lệch giữa giá và RSI. Khi giá tạo ra mức thấp mới và RSI tạo ra mức thấp cao hơn, thì hình thành sự lệch lạc của bullish; Khi giá tạo ra mức cao mới và RSI tạo ra mức cao thấp hơn, thì hình thành sự lệch lạc của bullish. Chiến lược xác định chính xác các cực điểm địa phương bằng cách thiết lập chu kỳ quay trở về bên trái và bên phải (leftLookback và rightLookback).
Phân tích xu hướng trung bình di chuyểnChiến lược này tính toán nhiều loại moving average (MA20, MA50, MA100 và MA200) trên một khung thời gian tùy chỉnh để xác định xu hướng thị trường bằng cách phân tích sự sắp xếp của các đường trung bình này và vị trí của giá so với đường trung bình. Chiến lược chỉ kích hoạt nhiều tín hiệu trong xu hướng giảm để đảm bảo giao dịch phù hợp với môi trường thị trường tổng thể.
Các giao dịch được thực hiện theo cách sau:
Cơ chế xác nhận đa chiềuKết hợp các đợt phá vỡ giá, RSI từ tín hiệu và lọc xu hướng trên đường trung bình di chuyển, tạo ra một hệ thống xác nhận giao dịch đa chiều, làm tăng đáng kể độ tin cậy và độ chính xác của tín hiệu giao dịch.
Quản lý vị trí độngChiến lược: Điều chỉnh kích thước vị trí động theo tình trạng thị trường và biến động giá, thay vì sử dụng phân bổ vị trí cố định. Điều này cho phép chiến lược tối đa hóa tiềm năng lợi nhuận trong môi trường thị trường thuận lợi, đồng thời kiểm soát rủi ro trong điều kiện bất lợi.math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1), 100), minEnterPercent)Đảm bảo rằng việc điều chỉnh vị trí là linh hoạt và có giới hạn.
Thích ứng với môi trường thị trườngThông qua phân tích chéo và xếp hàng của các đường trung bình di chuyển, chiến lược có thể thích ứng với các môi trường thị trường khác nhau và chỉ thực hiện giao dịch khi hình thức kỹ thuật phù hợp với xu hướng tổng thể.
Điểm chính xác vào và raCác tham số nhìn lại (leftLookback và rightLookback) tăng độ chính xác nhận điểm cực đoan.
Hình ảnh phản hồiChiến lược: Lập các bảng giá, moving average và các thẻ tín hiệu giao dịch trên biểu đồ, cung cấp phản hồi trực quan trực quan giúp các nhà giao dịch hiểu và xác minh quyết định giao dịch.
Thiết lập tham số linh hoạtMột số tham số có thể điều chỉnh cho phép chiến lược phù hợp với các thị trường và phong cách giao dịch khác nhau, chẳng hạn như độ dài RSI, chu kỳ giá và chu kỳ quay ngược.
Rủi ro đột phá giảSự phá vỡ trong phạm vi giá đôi khi có thể ngắn ngủi hơn so với sự bắt đầu của xu hướng thực tế. Điều này có thể dẫn đến giao dịch không cần thiết và gây ra tổn thất. Cách giảm rủi ro là thêm các yếu tố xác nhận, chẳng hạn như mở rộng chu kỳ quay trở lại hoặc tăng xác nhận khối lượng giao dịch.
Rủi ro giao dịch quá mứcĐộng lực điều chỉnh vị trí có thể dẫn đến giao dịch quá mức, tăng chi phí giao dịch. Đặt ngưỡng điều chỉnh tối thiểu hợp lý (min EnterPercent và min ExitPercent) để tránh biến động giá nhỏ gây ra giao dịch thường xuyên.
Rủi ro chậm trễ đường trung bình: Đường trung bình di chuyển có độ trễ, đặc biệt là trong thị trường chuyển đổi nhanh. Bạn có thể giảm thiểu rủi ro này bằng cách điều chỉnh loại đường trung bình được sử dụng (ví dụ như chuyển từ SMA sang EMA) hoặc điều chỉnh chu kỳ đường trung bình.
Độ nhạy tham sốChiến lược phụ thuộc vào nhiều tham số, chẳng hạn như RSI, chu kỳ đường trung bình, và các thay đổi nhỏ trong các tham số này có thể ảnh hưởng đáng kể đến hiệu suất của chiến lược. Chúng tôi khuyên bạn nên tìm kiếm các thiết lập vững chắc bằng cách kiểm tra lại các kết hợp tham số khác nhau và thường xuyên tối ưu hóa lại các tham số để thích ứng với điều kiện thị trường thay đổi.
Sự phụ thuộc vào thị trường duy nhấtChiến lược có thể hoạt động tốt trong một số điều kiện thị trường và không hoạt động tốt trong các điều kiện khác. Chúng tôi khuyên bạn nên thử nghiệm chiến lược trong các môi trường thị trường khác nhau và các khung thời gian khác nhau và xem xét thêm bộ lọc trạng thái thị trường để tạm dừng giao dịch trong điều kiện thị trường không phù hợp.
Tăng xác nhận âm lượngChiến lược hiện tại chỉ dựa vào giá và chỉ số RSI để đưa ra quyết định giao dịch. Bằng cách thêm phân tích khối lượng giao dịch, có thể xác minh tính hiệu quả của sự phá vỡ trong khoảng giá, tránh phá vỡ giả của khối lượng giao dịch không đủ.
Tham gia cơ chế điều chỉnh tỷ lệ dao độngTrong thời gian biến động cao, thêm bộ lọc tín hiệu hoặc điều chỉnh công thức kích thước vị trí để giảm nguy cơ tín hiệu giả và kiểm soát lỗ hổng rủi ro tối đa. Các chỉ số ATR (Average True Range) có thể được sử dụng để định lượng biến động và điều chỉnh các tham số giao dịch động.
Thêm bộ lọc so với lợi nhuận: Đánh giá tỷ lệ lợi nhuận rủi ro tiềm năng trước mỗi giao dịch và chỉ thực hiện giao dịch đạt mức giá trị so với tỷ lệ lỗ hổng tối thiểu, do đó tối ưu hóa lợi nhuận dự kiến của chiến lược tổng thể. Điều này có thể được thực hiện bằng cách thiết lập mức dừng lỗ và dừng động dựa trên ATR.
Giới thiệu phân tích nhiều khung thời gian: Bằng cách thêm xác nhận xu hướng trên khung thời gian cao hơn, bạn có thể cải thiện chất lượng tín hiệu. Ví dụ, chỉ thực hiện giao dịch khi xu hướng đường Nhật Bản phù hợp với xu hướng khung thời gian giao dịch hiện tại.
Cải thiện thuật toán vị thế độngHàm chiết xuất hiện tại có thể tạo ra sự điều chỉnh quá lớn hoặc quá nhỏ trong trường hợp cực đoan. Các thuật toán phức tạp hơn có thể được xem xét, chẳng hạn như các công thức tự điều chỉnh dựa trên biến động thị trường và tình trạng lỗ hổng hiện tại, hoặc giới hạn lỗ hổng rủi ro để đảm bảo rằng các giao dịch đơn lẻ không ảnh hưởng quá nhiều đến danh mục đầu tư tổng thể.
Thêm tự động tối ưu hóa tham số: Thực hiện vòng lặp tối ưu hóa tham số tự động, thường xuyên điều chỉnh tham số chiến lược dựa trên dữ liệu thị trường gần đây nhất, để chiến lược có thể thích ứng tốt hơn với điều kiện thị trường thay đổi. Điều này có thể được thực hiện thông qua khung phản hồi hoặc thuật toán học máy.
Phạm vi giá động và chiến lược giao dịch RSI là một hệ thống giao dịch định lượng cao cấp kết hợp nhiều phương pháp phân tích kỹ thuật, kết hợp với khu vực giá, RSI và xu hướng trung bình di chuyển, cung cấp một khuôn khổ quyết định giao dịch mạnh mẽ. Ưu điểm lớn nhất của nó là hệ thống quản lý vị thế động, có thể tự động điều chỉnh quy mô giao dịch theo điều kiện thị trường, tối ưu hóa hiệu quả vốn trong khi vẫn kiểm soát rủi ro.
Mặc dù có một số rủi ro vốn có của chiến lược, chẳng hạn như phá vỡ giả và nhạy cảm với các tham số, nhưng sự ổn định và thích ứng của chiến lược có thể được tăng cường hơn nữa thông qua các hướng tối ưu hóa được đề xuất, chẳng hạn như tăng xác nhận khối lượng giao dịch, giới thiệu điều chỉnh tỷ lệ biến động và phân tích nhiều khung thời gian. Đối với các nhà giao dịch muốn triển khai chiến lược cao cấp trên nền tảng giao dịch tự động (như robot tín hiệu OKX), điều này cung cấp một khung cơ bản linh hoạt và mạnh mẽ, có thể được tùy chỉnh và mở rộng theo phong cách giao dịch cá nhân và sở thích thị trường.
/*backtest
start: 2025-05-07 00:00:00
end: 2025-05-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
// Strategy: Box Range with RSI Divergence (Dynamic Adjustment - OKX Signal Format)
// © aws2333
//I'm chinese
strategy("Kaito Box with RSI Div(Dynamic Adjustment + MA + Long)", overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=10)
rsiOverbought = 80
rsiOversold = 13
boxLength = input.int(3, title="Box Length", minval=1)
rsiLength = input.int(2, title="RSI Length", minval=1)
divergenceLookback = input.int(2, title="Divergence Lookback Period", minval=1)
leftLookback = input.int(2, title="Left Lookback", minval=1)
rightLookback = input.int(2, title="Right Lookback", minval=1)
var float avgPrice = na
//var float position_size = 0
signalToken = input.string("**********", "Signal Token")
enterOrderType = input.string("limit", "Order Type", options=["market", "limit"])
enterOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
enterInvestmentType = input.string("percentage_investment", "Investment Type", options=["margin", "contract", "percentage_balance", "percentage_investment"])
exitOrderType = input.string("limit", "Order Type", options=["market", "limit"])
exitOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
exitInvestmentType = input.string("percentage_position", "Investment Type", options=["percentage_position"])
maxLag = input.float(30, "maxLag")
minEnterPercent = 1.3
minExitPercent = 0.09
highestHigh = ta.highest(high, boxLength)
lowestLow = ta.lowest(low, boxLength)
plot(highestHigh, title="Upper Box", color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
plot(lowestLow, title="Lower Box", color=color.new(color.red, 0), linewidth=1, style=plot.style_line)
rsi = ta.rsi(low, rsiLength)
isLowestLeft = low < ta.lowest(low[1], leftLookback)
isLowestRight = low <= ta.lowest(low, rightLookback)
isLowestClose = isLowestLeft and isLowestRight
isHighestLeft = low > ta.highest(low[1], leftLookback)
isHighestRight = low >= ta.highest(low, rightLookback)
isHighestClose = isHighestLeft and isHighestRight
lowestClose = ta.lowest(low, divergenceLookback)
lowestRsi = ta.lowest(rsi, divergenceLookback)
highestClose = ta.highest(low, divergenceLookback)
highestRsi = ta.highest(rsi, divergenceLookback)
lowestClosePrev = ta.lowest(low[1], leftLookback)
lowestRsiPrev = ta.lowest(rsi[1], leftLookback)
highestClosePrev = ta.highest(low[1], leftLookback)
highestRsiPrev = ta.highest(rsi[1], leftLookback)
bullishDivergence = isLowestClose and (low < lowestClosePrev) and (rsi > lowestRsiPrev) and (rsi < rsiOversold)
bearishDivergence = isHighestClose and (low > highestClosePrev) and (rsi < highestRsiPrev) and (rsi > rsiOverbought)
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :type == "EMA" ? ta.ema(source, length) :type == "SMMA (RMA)" ? ta.rma(source, length) :type == "WMA" ? ta.wma(source, length) :type == "VWMA" ? ta.vwma(source, length) :na
custom_timeframe = input.timeframe("3", "Custom time period (leave blank for current period)")
ma_type = input.string("SMA", "Moving average type", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma20_period = input.int(20, "MA20 ", minval=1)
ma50_period = input.int(50, "MA50 ", minval=1)
ma100_period = input.int(100, "MA100 ", minval=1)
ma200_period = input.int(200, "MA200 ", minval=1)
source_close = request.security(syminfo.tickerid, custom_timeframe, close)
ma20 = ma(source_close, ma20_period, ma_type)
ma50 = ma(source_close, ma50_period, ma_type)
ma100 = ma(source_close, ma100_period, ma_type)
ma200 = ma(source_close, ma200_period, ma_type)
up_signal_1 = ma20 > ma200
up_signal_2 = ma50 > ma200
up_signal_3 = ma100 > ma200
up_signal_4 = (high > ma20 and high > ma50 and high > ma100 and high > ma200)
up_trend = (up_signal_1 and up_signal_2 and up_signal_3 and (source_close > ma200)) or up_signal_4
down_signal_1 = ma20 < ma200
down_signal_2 = ma50 < ma200
down_signal_3 = ma100 < ma200
down_signal_4 = (low < ma20 and low < ma50 and low < ma100 and low < ma200)
down_trend = (down_signal_1 and down_signal_2 and down_signal_3 and (source_close < ma200)) or down_signal_4
plot(ma20, color=color.yellow, title="MA20")
plot(ma50, color=color.orange, title="MA50")
plot(ma100, color=color.red, title="MA100")
plot(ma200, color=color.maroon, title="MA200")
var float longAddPercent = na
var float shortAddPercent = na
roundToFourDecimals(value) => math.round(value * 10000) / 10000
if not na(avgPrice)
if close < avgPrice
longAddPercent := roundToFourDecimals(math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1) , 100), minEnterPercent))
if close > avgPrice
longAddPercent := 1
if close == avgPrice
longAddPercent := 1
if not na(avgPrice)
if close < avgPrice
shortAddPercent := 0.01
if close > avgPrice
shortAddPercent := roundToFourDecimals(math.max(math.min(math.pow((close - avgPrice)*1000,1.1), 100), minExitPercent))
if close == avgPrice
longAddPercent := 1
longSignal = (close <= lowestLow) and bullishDivergence
shortSignal = (close >= highestHigh) and bearishDivergence
plotLongSignal = down_trend and longSignal and close < avgPrice
plotShortSignal = up_trend and shortSignal and close > avgPrice
if plotLongSignal
label.new(bar_index, avgPrice, "average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_up, color=color.green, textcolor=color.white )
if plotShortSignal
label.new(bar_index, avgPrice,"average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_down, color=color.red, textcolor=color.white)
if plotLongSignal
label.new(
bar_index,
close,
"LONG :" + str.tostring(longAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"),
style=label.style_label_up,
color=color.new(color.green, 80),
textcolor=color.white
)
if plotShortSignal
label.new(
bar_index,
close,
"EXIT LONG :" + str.tostring(shortAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"),
style=label.style_label_down,
color=color.new(color.red, 80),
textcolor=color.white
)
if longSignal
avgPrice := na(avgPrice) ? close : (avgPrice + close) / 2
if down_trend and longSignal
strategy.entry("Long",strategy.long,qty=longAddPercent )
var float close_size = na
if up_trend and shortSignal
if strategy.position_size > 0
close_size := strategy.position_size * (shortAddPercent/100)
strategy.order("Partial Close Long", strategy.short, close_size)