
이 전략은 알렉스그로버가 개발한 회귀띠 지표의 트렌드 추적 및 돌파 전략이다. 전략은 회귀띠 지표를 사용하여 가격 트렌드와 핵심 지원 저항 지점을 판단하고, 동력 조건 필터링 가짜 돌파를 결합하여, 낮은 주파수이지만 높은 품질의 입구를 구현한다.
회귀띠 지표는 상반대, 하반대, 중선으로 구성된다. 지표의 계산 방법은 다음과 같다:
상단 = 최대 값 (前 K 선의 상단, 종점값 + n)*변동률)
하위역 = 최저값 ((전 K 선의 하위역, 마감값 - n*변동률)
중간선 = (상단 + 하단) / 2
여기서 n은 축소 계수이며, 변동률은 ATR, 표준 격차, 평균 채널 및 특수 RFV 방법을 선택할 수 있다. 길이는 지표의 민감도를 제어하는 변수이며, 값이 클수록 지표가 촉발되지 않는다.
전략은 먼저 하단선 방향이 계속 상승하고 상단선 방향이 계속 하락하는지를 검출하여 가짜 돌파구를 제거한다.
가격대가 하위권으로 떨어지면 더 많이 하고, 상위권으로 넘어지면 더 많이 하라고 한다.
또한, 전략에는 상쇄 손실 논리도 설정되어 있습니다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
이 전략에는 몇 가지 위험도 있습니다.
이러한 위험은 최적화 변수, 스톱로스 설정, 슬라이드 포인트를 높임으로 조절할 수 있다.
이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.
이 전략은 전체적으로 매우 실용적이고 효율적인 트렌드 추적 전략이다. 이는 회수 프레임워크를 결합하여 계산 자원을 절약하고, 트렌드를 지원하는 저항을 사용하여 큰 트렌드 방향을 판단하고, 동력 조건을 필터링하는 가짜 돌파구를 증가시켜 거래 신호 품질을 보장한다. 매개 변수 조정과 위험 통제가 이루어지면 더 나은 효과를 얻을 수 있다. 더 복잡한 시장 환경에 적응하기 위해 추가 연구 및 최적화를 할 가치가 있다.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// @version=5
// Original indicator by alexgrover
strategy('Extended Recursive Bands Strategy', overlay=true, commission_type=strategy.commission.percent,commission_value=0.06,default_qty_type =strategy.percent_of_equity,default_qty_value = 100,initial_capital =1000)
length = input.int(260, step=10, title='Length')
src = input(close, title='Source')
method = input.string('Classic', options=['Classic', 'Atr', 'Stdev', 'Ahlr', 'Rfv'], title='Method')
bandDirectionCheck = input.bool(true, title='Bands Hold Direction')
lookback = input(3)
//----
atr = ta.atr(length)
stdev = ta.stdev(src, length)
ahlr = ta.sma(high - low, length)
rfv = 0.
rfv := ta.rising(src, length) or ta.falling(src, length) ? math.abs(ta.change(src)) : rfv[1]
//-----
f(a, b, c) =>
method == a ? b : c
v(x) =>
f('Atr', atr, f('Stdev', stdev, f('Ahlr', ahlr, f('Rfv', rfv, x))))
//----
sc = 2 / (length + 1)
a = 0.
a := math.max(nz(a[1], src), src) - sc * v(math.abs(src - nz(a[1], src)))
b = 0.
b := math.min(nz(b[1], src), src) + sc * v(math.abs(src - nz(b[1], src)))
c = (a+b)/2
// Colors
beColor = #675F76
buColor = #a472ff
// Plots
pA = plot(a, color=color.new(beColor, 0), linewidth=2, title='Upper Band')
pB = plot(b, color=color.new(buColor, 0), linewidth=2, title='Lower Band')
pC = plot(c, color=color.rgb(120,123,134,0), linewidth=2, title='Middle Band')
fill(pC, pA, color=color.new(beColor,90))
fill(pC, pB, color=color.new(buColor,90))
// Band keeping direction
// By Adulari
longc = 0
shortc = 0
for i = 0 to lookback-1
if b[i] > b[i+1]
longc:=longc+1
if a[i] < a[i+1]
shortc:=shortc+1
bhdLong = if bandDirectionCheck
longc==lookback
else
true
bhdShort = if bandDirectionCheck
shortc==lookback
else
true
// Strategy
if b>=low and bhdLong
strategy.entry(id='Long',direction=strategy.long)
if high>=a and bhdShort
strategy.entry(id='Short',direction=strategy.short)
// TP at middle line
//if low<=c and strategy.position_size<0 and strategy.position_avg_price>close
//strategy.exit(id="Short",limit=close)
//if high>=c and strategy.position_size>0 and strategy.position_avg_price<close
//strategy.exit(id="Long",limit=close)