이 전략의 핵심 아이디어는 다른 주기 RSI 지표와 결합하여 현재 가격 영역을 판단하고, 더 큰 주기 RSI 지표가 돌파구를 발견하면, 더 작은 주기에서 그에 따른 구매 또는 판매 작업을 수행하는 것입니다. 이 전략은 다양한 주기 기술 지표의 장점을 활용하여 여러 시간 차원을 통해 현재의 가격의 상대적 가치를 판단하여 우수한 입점 위치를 찾습니다.
이 전략은 다음과 같은 몇 가지 단계를 통해 가격 영역을 판단하고 거래 기회를 찾습니다.
예를 들어, 일일 RSI 지표가 새로운 고치를 돌파했을 때, 우리는 현재 다단계 거래상태에 있다고 판단하고, 일일 RSI 지표가 새로운 낮은 것을 돌파했을 때, 현재 공백 거래상태에 있다고 판단합니다. 두 경우 모두 5 분 선에서 각각 구매 및 판매 작업을 수행합니다.
이 전략은 전통적인 전략과 비교하여 다음과 같은 장점을 가지고 있습니다.
현재 가격의 상대적 가치를 평가하는 것이 더 정확하다. 일선과 같은 더 큰 주기적 지표는 단기 시장 소음을 필터링하여 더 큰 주기적 추세와 가치 영역을 판단할 수 있다.
서로 다른 시간 주기 지표와 결합하여 신호의 신뢰성을 높인다. 단 하나의 주기 지표에만 의존하는 것은 잘못된 신호가 발생할 수 있으며, 여러 주기 지표가 동시에 신호를 발산하는 것은 더 신뢰할 수 있다.
단기적 기회에 더 효율적으로 접근한다. 일선과 같은 큰 주기를 돌파하는 것은 우리에게 큰 방향을 제시해 주는데, 우리는 단기적 기회에 대해 5분 정도의 짧은 주기를 찾아서만 이익을 얻을 수 있다.
철회량이 작습니다. 시간 주기간의 결합으로, 을 피하는 데 도움이 됩니다. 대주기 지표가 전환되면, 우리는 적시에 퇴출을 할 것입니다.
이 전략의 주요 위험은 다음과 같습니다.
대주기 지표 판단 오류. 당일선 RSI와 같은 지표가 가치 지역을 효과적으로 판단하지 못할 때, 신호가 오류를 발생하게 됩니다. 이것은 RSI의 최적화된 파라미터를 설정하는 것이 필요합니다.
소주기상태와 대주기상태의 판단이 일치하지 않는다. 때때로 소주기상태가 대주기상태와 상반되는 경우가 있는데, 이때는 손실을 통제하기 위해 스톱로스를 설정해야 한다.
재원 관리 부적절함. 위험 관리 부적절함, 일회성 손실이 너무 커서 회복이 어렵게 된다. 이는 합리적인 포지션 관리 설정이 필요하다.
이 전략의 최적화 가능성은 매우 넓고, 다음과 같은 부분에서 시작될 수 있습니다.
주기 변수 최적화. 더 많은 주기 조합을 테스트하여 최적의 변수를 찾을 수 있다.
RSI 파라미터를 최적화한다. RSI의 파라미터를 조정하여 판단의 정확성을 향상시킬 수 있는지 살펴볼 수 있다.
다른 지표들을 추가한다. 더 많은 지표들을 추가하여 조합할 수 있다. 예를 들어, 평균선을 더해서 트렌드 방향을 판단한다.
최적화 스톱 로즈 메커니즘. 철수 상황에 따라 스톱 로즈를 동적으로 조정할 수 있다.
포지션 관리를 최적화한다. 각 거래의 특정 포지션을 보다 과학적이고 합리적으로 관리할 수 있다.
이 전략은 주기간의 RSI 지표 낙관 상황을 평가하여 서로 다른 시간 차원 사이의 가치 중개를 실현합니다. 이러한 주기간의 판단의 생각은 더 많은 탐색을 할 가치가 있으며, 우리는 변수 최적화, 스톱 스로즈 최적화, 조합 최적화 등의 방법을 통해 지속적으로 개선하여 전략을 더 우월하게 만들 수 있습니다.
/*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)