파라볼리 SAR 동적 브레이크오웃 삼중 SMMA 전략

저자:차오장, 날짜: 2023-11-08 11:53:09
태그:

img

전반적인 설명

이 브레이크아웃 트레이딩 전략은 패러볼 SAR 지표와 세 개의 SMMA 라인을 서로 다른 기간으로 결합하는 브레이크아웃 트레이딩 전략이다. 세 개의 SMMA 라인이 모두 상승할 때 길게 가고 모든 것이 떨어질 때 짧게 이동하며, SAR 지표를 사용하여 트렌드 방향을 결정하고 SAR가 방향을 전환할 때 카운터 트렌드 엔트리를 취합니다. 이 전략에는 또한 스톱 로스와 영업이 포함됩니다.

전략 논리

이 전략은 다음의 핵심 요점들에 기초하고 있습니다.

  1. 현재 트렌드 방향을 결정하기 위해 패러볼 SAR 지표를 사용하여 SAR는 가격 변화를 동적으로 추적하고 상승 추세와 하락 추세를 식별 할 수 있습니다.

  2. 서로 다른 기간을 가진 세 개의 SMMA 라인을 설정합니다. (빠른 라인 21, 중간 라인 50, 느린 라인 200). 세 가지 라인이 모두 상승할 때 상승 추세를 나타냅니다. 모든 것이 떨어질 때 하락 추세를 나타냅니다.

  3. 세 개의 SMMA 라인이 올라갈 때 SAR가 내려갈 때 길게 이동합니다.

  4. 세 개의 SMMA 라인이 떨어질 때 SAR가 올라갈 때 단축됩니다.

  5. SAR에 기반한 스톱 로스를 포함하고 입시 가격의 특정 비율로 수익을 취합니다.

구체적으로, 전략은 먼저 현재 바에서 SAR가 방향을 전환하는지 확인합니다. SMMA가 상승하는 동안 SAR가 위에서 아래로 전환되면 길게됩니다. SMMA가 떨어지는 동안 SAR가 아래에서 위로 전환되면 짧게됩니다.

엔트리 후, 스톱 로스는 다음 바의 SAR 가격으로 설정되며, SAR를 동적인 트레일링 스톱 로스로 사용합니다. 영업이익은 엔트리 가격의 10%로 설정됩니다. 가격이 영업이익 또는 스톱 로스 수준에 도달하면 포지션은 종료됩니다.

이점 분석

이 전략은 트렌드를 따르는 지표와 여러 시간 프레임 이동 평균의 장점을 결합하여 트렌드 반전 시에 적시에 입력 할 수 있으며 SMMA를 사용하여 잘못된 파장을 필터링합니다. 주요 장점은 다음과 같습니다.

  1. SAR는 트렌드 변화를 빠르게 감지하고 역전 기회를 잡을 수 있습니다.

  2. 삼중 SMMA는 시장 소음을 효과적으로 필터링하고 잘못된 파업을 피합니다.

  3. SMMA를 사용하면 더 부드러운 곡선과 MA 윙사우의 간섭이 적습니다.

  4. 스톱 로스 및 취득을 포함하면 단일 거래 손실을 제어하고 부분 수익을 잠금 할 수 있습니다.

  5. 유연한 매개 변수 설정은 다양한 시장에 최적화를 허용합니다.

위험 분석

또한 고려해야 할 몇 가지 위험이 있습니다.

  1. 변동적인 트렌드 중에 SAR가 자주 뒤집어질 수 있고, 과도한 거래로 인한 비용이 증가합니다.

  2. SMMA 설정은 모든 기기에 잘 맞지 않을 수 있으므로 개별적인 최적화가 필요합니다.

  3. SAR 스톱 로즈는 시간 지연이 있고 손실을 증가시킬 수 있습니다.

  4. SAR는 안정적인 트렌드에서 잘못된 파업을 뒤집을 수 있습니다. SAR 매개 변수를 부드럽게 하는 것이 도움이 될 수 있습니다.

  5. 잘못된 SMMA 설정은 놓친 트렌드 또는 나쁜 신호를 일으킬 수 있습니다. 신중한 테스트가 필요합니다.

위험을 해결하기 위해 최적화는 다음에 초점을 맞출 수 있습니다.

  1. 변동성을 기반으로 SAR 매개 변수를 조정하여 플립을 줄입니다.

  2. 기기 특성에 맞게 SMMA 기간을 조정합니다.

  3. 스톱 로스를 개선하는 것, 예를 들어 트래일링 또는 리미트 오더.

  4. 액티브 트레이딩에서 스톱 로스를 위한 리미트 오더를 사용하는 것.

  5. 광범위한 테스트와 매개 변수 조정

최적화 방향

위의 분석을 바탕으로 최적화는 다음을 포함할 수 있습니다.

  1. 더 부드러운 곡선과 더 적은 플립을 위해 SAR 매개 변수를 최적화합니다.

  2. SMMA 길이를 거래 도구와 일치하도록 조정합니다.

  3. 트레일링 스톱이나 리미트 오더와 같은 동적 스톱 손실을 사용합니다.

  4. 고주파 거래에서 손해를 멈추는 제한 명령을 사용하는 것.

  5. 신호 품질을 향상시키기 위해 RSI, KD 같은 필터를 추가합니다.

  6. 입구 조건 개선, 예를 들어 SAR 플립으로 촛불 패턴을 확인.

  7. 스톱 로스 트리거가 끝나면 재입구 조건을 추가합니다.

  8. 이윤을 끌어올리는 것, 부분적으로 밀리는 것, 놀라운 수준.

  9. 백테스트 결과와 감수성 분석에 기초한 파라미터 조정

요약

요약하자면, 이것은 트렌드 변화를 포착하는 SAR의 민감성과 이동 평균의 필터링 효과를 결합한 간단하고 실용적인 브레이크아웃 전략이다. 트렌드 반전 지점을 빠르게 식별할 수 있다. 스톱 로스 (stop loss) 와 영리 (take profit) 를 사용하면 위험을 제어하고 이익을 잠금하는 데 도움이 된다. 매개 변수 설정, 엔트리/엑시트 규칙 및 가짜 브레이크에 대한 견고성 등에 대한 추가 최적화는 다양한 거래 도구의 전략 성능을 향상시킬 수 있다.


/*backtest
start: 2023-10-08 00:00:00
end: 2023-11-07 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="SAR + 3SMMA with SL & TP", overlay=true, calc_on_order_fills=false, calc_on_every_tick=false, default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency=currency.USD, commission_type= strategy.commission.percent, commission_value=0.03)
start = input.float(0.02, step=0.01, group="SAR")
increment = input.float(0.02, step=0.01, group="SAR")
maximum = input.float(0.2, step=0.01, group="SAR")

//Take Profit Inputs     
take_profit = input.float(title="Take Profit (%)", minval=0.0, step=0.1, defval = 0.1, group="Stop Loss and Take Profit", inline="TP") * 0.01

//Stop Loss Inputs
stop_loss = input.float(title="StopLoss (%)", minval=0.0, step=0.1, defval=1, group="Stop Loss and Take Profit", inline="SL") * 0.01

// Smooth Moving Average
fastSmmaLen = input.int(21, minval=1, title="Fast Length", group = "Smooth Moving Average")
midSmmaLen = input.int(50, minval=1, title="Mid Length", group = "Smooth Moving Average")
slowSmmaLen = input.int(200, minval=1, title="Slow Length", group = "Smooth Moving Average")

src = input(close, title="Source", group = "Smooth Moving Average")

smma(ma, src, len) => 
    smma = 0.0
    smma := na(smma[1]) ? ma : (smma[1] * (len - 1) + src) / len
    smma

fastSma = ta.sma(src, fastSmmaLen)
midSma = ta.sma(src, midSmmaLen)
slowSma = ta.sma(src, slowSmmaLen)

fastSmma = smma(fastSma, src, fastSmmaLen)
midSmma = smma(midSma, src, midSmmaLen)
slowSmma = smma(slowSma, src, slowSmmaLen)

isSmmaUpward = ta.rising(fastSmma, 1) and ta.rising(midSmma, 1) and ta.rising(slowSmma, 1)

var bool uptrend = na
var float EP = na
var float SAR = na
var float AF = start
var float nextBarSAR = na

if bar_index > 0
	firstTrendBar = false
	SAR := nextBarSAR
	if bar_index == 1
		float prevSAR = na
		float prevEP = na
		lowPrev = low[1]
		highPrev = high[1]
		closeCur = close
		closePrev = close[1]
		if closeCur > closePrev
			uptrend := true
			EP := high
			prevSAR := lowPrev
			prevEP := high
		else
			uptrend := false
			EP := low
			prevSAR := highPrev
			prevEP := low
		firstTrendBar := true
		SAR := prevSAR + start * (prevEP - prevSAR)
	if uptrend
		if SAR > low
			firstTrendBar := true
			uptrend := false
			SAR := math.max(EP, high)
			EP := low
			AF := start
	else
		if SAR < high
			firstTrendBar := true
			uptrend := true
			SAR := math.min(EP, low)
			EP := high
			AF := start
	if not firstTrendBar
		if uptrend
			if high > EP
				EP := high
				AF := math.min(AF + increment, maximum)
		else
			if low < EP
				EP := low
				AF := math.min(AF + increment, maximum)
	if uptrend
		SAR := math.min(SAR, low[1])
		if bar_index > 1
			SAR := math.min(SAR, low[2])
	else
		SAR := math.max(SAR, high[1])
		if bar_index > 1
			SAR := math.max(SAR, high[2])
	nextBarSAR := SAR + AF * (EP - SAR)

sarIsUpTrend = uptrend ? true : false

sarFlippedDown = sarIsUpTrend and not sarIsUpTrend[1] ? true : false
sarFlippedUp = not sarIsUpTrend and sarIsUpTrend[1] ? true : false


longEntryCondition = isSmmaUpward and sarFlippedDown
shortEntryCondition = not isSmmaUpward and sarFlippedUp

if(longEntryCondition)
    strategy.entry("L", strategy.long, stop=nextBarSAR, comment="L")

if(shortEntryCondition)
    strategy.entry("S", strategy.short, stop=nextBarSAR, comment="S")


strategy.exit("CL", when=strategy.position_size > 0, limit=strategy.position_avg_price * (1+take_profit), stop=strategy.position_avg_price*(1-stop_loss))
strategy.exit("CS", when=strategy.position_size < 0, limit=strategy.position_avg_price * (1-take_profit), stop=strategy.position_avg_price*(1+stop_loss))


plot(SAR, style=plot.style_cross, linewidth=1, color=color.orange)
plot(nextBarSAR, style=plot.style_cross, linewidth=1, color=color.aqua)
plot(series = fastSmma, title="fastSmma", linewidth=1)
plot(series = midSmma, title="midSmma", linewidth=2)
plot(series = slowSmma, title="slowSmma", linewidth=3)
plotchar(series = isSmmaUpward, title="isSmmaUpward", char='')
plotchar(series=sarIsUpTrend, title="sarIsUpTrend", char='')
plotchar(series=sarFlippedUp, title="sarFlippedUp", char='')
plotchar(series=sarFlippedDown, title="sarFlippedDown", char='')
plotchar(series=longEntryCondition, title="longEntryCondition", char='')
plotchar(series=shortEntryCondition, title="shortEntryCondition", char='')
plotchar(series=strategy.position_size > 0, title="inLong", char='')
plotchar(series=strategy.position_size < 0, title="inShort", char='')


//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)



더 많은