
다이내믹 가격 간격과 RSI 이탈 거래 전략은 가격 간격 탐지, RSI 지표 이탈 신호, 이동 평균 트렌드 분석을 결합한 3개의 핵심 기술을 결합한 종합적인 정량 거래 시스템이다. 이 전략은 특히 OKX 신호 로봇 플랫폼에 설계되어 있으며, 동적 포지션 조정 및 일부 포지션 평점의 고급 기능을 갖추고 있다. 전략은 주로 가격 간격의 돌파구를 식별하고, RSI 지표 이탈 신호와 결합하고, 다중 주기 이동 평균선을 통해 시장 추세를 필터링하여 하향 추세에서 여러 기회를 찾고, 정밀한 거래 시기를 파악한다.
이 전략의 특징은 동적 포지션 관리 시스템으로, 현재 가격과 평균 포지션 가격 사이의 격차에 따라 거래 규모를 동적으로 조정할 수 있기 때문에, 전략은 가격이 유리한 방향으로 계속 진행될 때 포지션을 증가시킬 수 있으며, 가격이 반전되기 시작하면 포지션을 점차적으로 감소시켜 자본 효율성과 리스크 수익률을 최적화 할 수 있습니다.
이 전략은 다음과 같은 세 가지 핵심 요소에 기반을 두고 있습니다.
가격 범위 탐지전략: 특정 주기 (boxLength 파라미터 설정) 내의 최고 가격과 최저 가격을 계산하여 가격 범위를 결정합니다. 이러한 가격 수준은 상하의 경계선으로 도표에 그려져 거래에 대한 가시적인 가격 참조 범위를 제공합니다.
RSI 검출에서 벗어난 경우전략은 상대적으로 강한 약 지수 ((RSI) 를 사용하여 시장 동력을 계산하고 가격과 RSI 사이의 오차 현상을 검출한다. 가격이 새로운 낮은 것을 기록하고 RSI가 더 높은 낮은 것을 기록하면, 보이스 배틀이 형성된다. 가격이 새로운 높은 것을 기록하고 RSI가 더 낮은 높은 것을 기록하면, 보이스 배틀이 형성된다. 전략은 좌우 회귀 주기 ((leftLookback 및 rightLookback) 를 설정하여 지역 극한값을 정확하게 식별한다.
이동 평균 트렌드 분석전략은 사용자 정의 시간 프레임에 여러 유형의 이동 평균을 계산합니다 (MA20, MA50, MA100 및 MA200) 이 평균의 배열과 가격의 평균에 대한 위치를 분석하여 시장의 추세를 결정합니다. 전략은 하향 추세에서만 여러 신호를 유발하여 거래가 전체 시장 환경과 일치하는지 확인합니다.
거래의 논리는 다음과 같습니다.
다차원 확인 메커니즘가격 간격 돌파, RSI 외신 신호 및 이동 평균 트렌드 필터링을 결합하여 다차원 거래 확인 시스템을 생성하여 거래 신호의 신뢰도와 정확도를 크게 향상시킵니다.
동적 위치 관리전략: 시장 상황과 가격 변화에 따라 포지션 크기를 동적으로 조정하는 전략, 고정 포지션 분배를 채택하는 것이 아닙니다. 이것은 전략이 유리한 시장 환경에서 수익 잠재력을 극대화하고 불리한 조건에서 위험을 제어 할 수있게합니다.math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1), 100), minEnterPercent)포지션 조정이 탄력적이면서도 제한적이어야 합니다.
시장 환경에 적응: 이동 평균의 교차 및 배열 분석을 통해, 전략은 다양한 시장 환경에 적응할 수 있으며, 기술 형태가 전체적인 추세와 일치하는 경우에만 거래를 수행한다.
정확한 출입구: 반향 신호와 가격 간격 돌파구가 정확한 입구와 출구 지점을 제공하며, 가짜 신호의 가능성을 줄여줍니다. 다시보기 파라미터 (leftLookback 및 rightLookback) 는 극한 지점 식별의 정확성을 향상시킵니다.
시각화된 피드백전략: 차트에 가격 범위를 그리는 것, 이동 평균 및 거래 신호 태그, 직관적인 시각적 피드백을 제공하여 거래자가 거래 결정을 이해하고 확인하는 데 도움이됩니다.
유연한 변수 구성다양한 조정 가능한 매개 변수들로 인해 전략은 RSI 길이, 가격 간격 주기와 역전 주기와 같은 다른 시장과 거래 스타일에 적응할 수 있습니다.
가짜 침입 위험: 가격 범위를 돌파하는 것은 때때로 실제 트렌드의 시작이 아닌 단기적일 수 있다. 이것은 불필요한 거래를 초래하고 손실을 초래할 수 있다. 위험을 줄이는 방법은 회귀 주기를 확장하거나 거래량 확인을 증가시키는 것과 같은 확인 요소를 추가하는 것이다.
과도한 거래의 위험: 동적인 포지션 조정으로 인해 과도한 거래가 발생할 수 있으며 거래 비용이 증가합니다. 미세한 가격 변동이 자주 거래되는 것을 피하기 위해 합리적인 최소 조정 값 (minEnterPercent 및 minExitPercent) 을 설정하는 것이 좋습니다.
평균선 지연 위험이동 평균은 특히 빠르게 변하는 시장에서 지연성을 가지고 있다. 사용된 평균의 유형을 조정하거나 평균의 주기를 조정함으로써 이러한 위험을 줄일 수 있다.
매개변수 민감도전략은 RSI 미지수, 평균주기 등과 같은 여러 변수에 의존하며, 이러한 변수의 미세한 변화는 전략의 성과에 크게 영향을 미칠 수 있습니다. 다양한 변수 조합을 재검토하여 안정적인 설정을 찾고, 변화하는 시장 조건에 적응하기 위해 주기적으로 변수를 다시 최적화하는 것이 좋습니다.
단일 시장 의존: 전략은 특정 시장 조건에서 잘 작동하고 다른 조건에서는 잘 작동하지 않을 수 있습니다. 다른 시장 환경과 다른 시간 프레임에서 전략을 테스트하고, 시장 상태 필터를 추가하여 부적절한 시장 조건에서 거래를 중지하는 것을 고려하는 것이 좋습니다.
볼륨 증가 확인: 현재 전략은 가격과 RSI 지표에만 의존하여 거래 결정을 내립니다. 거래량 분석을 추가하여 가격 간 브레이크의 유효성을 확인할 수 있으며, 거래량이 부족한 가짜 브레이크를 피할 수 있습니다.
변동율 조정 메커니즘 도입: 높은 변동률 기간에 신호 필터를 추가하거나 포지션 크기 공식을 조정하여 가짜 신호 위험을 줄이고 최대 위험 을 제어하십시오. ATR (Average True Range) 지표를 사용하여 변동률을 정량화하고 거래 파라미터를 동적으로 조정할 수 있습니다.
이윤/손실 필터: 각 거래 전에 잠재적인 위험-수익률을 추정하고, 최소 수익-손실 비치 절감에 도달한 거래만 실행하여 전체 전략의 예상 수익을 최적화합니다. 이것은 ATR 기반의 동적 중지 및 중지 수준을 설정하여 수행 할 수 있습니다.
다중 시간 프레임 분석: 더 높은 시간 프레임에 트렌드 확인을 추가하여 신호 품질을 향상시킬 수 있습니다. 예를 들어, 일대 트렌드가 현재 거래 시간 프레임의 트렌드와 일치하는 경우에만 거래를 수행하십시오.
동적 포지션 알고리즘 개선: 현재 함수는 극단적 인 경우 과대 또는 과소 조정을 일으킬 수 있습니다. 시장의 변동률과 현재 수익률을 기반으로하는 자기 적응 공식과 같은 더 복잡한 알고리즘을 고려하거나 단일 거래가 전체 포트폴리오에 과도하게 영향을 미치지 않도록 위험 제한을 도입 할 수 있습니다.
자동 변수 최적화 추가: 자동 변수 최적화 순환을 구현하고, 최근 시장 데이터에 따라 정기적으로 전략 변수를 조정하여 변화하는 시장 조건에 더 잘 적응할 수 있도록합니다. 이것은 피드백 프레임워크 또는 기계 학습 알고리즘을 통해 수행 할 수 있습니다.
다이내믹 가격 범위와 RSI 이탈 거래 전략은 가격 범위, RSI 이탈 및 이동 평균 추세와 결합하여 강력한 거래 의사 결정 프레임 워크를 제공하는 여러 가지 기술적 분석 방법을 통합 한 고급 정량 거래 시스템입니다. 가장 큰 장점은 다이내믹 포지션 관리 시스템으로 시장 조건에 따라 거래 규모를 자동으로 조정하고 위험을 통제하면서 자본 효율성을 최적화 할 수 있습니다.
전략에는 가짜 돌파구 및 변수 민감성과 같은 몇 가지 고유한 위험이 있지만, 거래량 확인을 추가하고, 변동성 조정 및 다중 시간 프레임 분석을 도입하는 것과 같은 권장된 최적화 방향으로 전략의 안정성과 적응력을 더욱 강화할 수 있습니다. 자동화 된 거래 플랫폼 (OKX 신호 로봇과 같은) 에 고급 전략을 배포하려는 거래자에게는 개인 거래 스타일과 시장 선호도에 따라 사용자 정의 및 확장 할 수있는 유연하고 강력한 기본 프레임 워크를 제공합니다.
/*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)