SAR 동적 추적 돌파 3 이동 평균 전략


생성 날짜: 2023-11-08 11:53:09 마지막으로 수정됨: 2023-11-08 11:53:09
복사: 0 클릭수: 778
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

SAR 동적 추적 돌파 3 이동 평균 전략

개요

이것은 파러스 라인 SAR 지표와 세 개의 다른 주기의 SMMA 평균선을 결합한 돌파구 거래 전략이다. 그것은 세 개의 평균선이 전면 상승할 때 더 많이하고, 세 개의 평균선이 전면 하락할 때 공백을 하고, 동시에 SAR 지표와 결합하여 트렌드 방향을 판단하고, SAR 지표가 변할 때 역전 개시한다. 이 전략은 동시에 중지 손실을 지원한다.

전략 원칙

이 전략은 다음과 같은 것을 기반으로 합니다.

  1. 패러블 라인 SAR 지표를 사용하여 현재 트렌드 방향을 판단한다. SAR 지표는 가격 변화를 동적으로 추적하고, 다목적 트렌드 및 공허 트렌드를 판단한다.

  2. 세 개의 다른 주기의 SMMA 평균선을 설정하십시오: 빠른 21 회기, 중간 50 회기, 느린 200 회기. 세 개의 평균선이 모두 올라갈 때, 다중 트렌드 형성으로 간주; 세 개의 평균선이 모두 떨어질 때, 공중 트렌드 형성으로 간주.

  3. SAR 지표가 하향으로 변할 때, 세 개의 평행선이 전체적으로 상승하면 더 많은 진입을 한다.

  4. SAR 지표가 상향으로 변할 때, 세 개의 평행선이 전체적으로 하락하면, 공백으로 진입한다.

  5. 스톱 손실과 스톱 을 설정한다. 스톱 손실은 SAR 지표를 동적 스톱 로스로, 스톱 은 입점 가격의 일정한 비율로 설정한다.

구체적으로, 전략은 먼저 현재 BAR의 SAR 지표가 전환되는지 판단한다. SAR이 위에서 아래로 전환되고 세 평선이 전체적으로 상승하면 더 많이; SAR이 아래에서 위로 전환되고 세 평선이 전체적으로 하락하면 공백한다.

포지션을 보유한 후, 중지 라인을 다음 BAR의 SAR 지표 가격으로 설정하고, SAR를 동적으로 추적하는 스톱으로 설정한다. 스톱은 입시 가격의 10%로 설정한다. 가격이 스톱 또는 스톱 레벨에 도달했을 때, 평점 포지션을 종료한다.

우위 분석

이 전략은 트렌드 판단 지표와 다중 시간 주기 평균선의 장점을 결합하여 트렌드 전환이 발생했을 때 적시에 진입할 수 있으며, 동시에 평균선을 통해 필터링 가짜 돌파구를 할 수 있다. 주요 장점은 다음과 같다:

  1. SAR 지표는 동적으로 트렌드 전환을 판단하고, 트렌드 전환 기회를 빠르게 포착할 수 있다.

  2. 세 개의 평행선은 시장의 소음을 효과적으로 필터링하여 가짜 돌파구를 방지합니다.

  3. SMMA 평행선을 사용해서 곡선이 더 부드럽고, 평행선 흔들림이 거래에 대한 간섭을 줄인다.

  4. 스톱로스 스톱 설정과 함께 단편 손실을 제어하고 수익의 일부를 잠금 할 수 있습니다.

  5. 전략 매개 변수 설정은 다양한 시장에 따라 매개 변수를 조정하여 전략 효과를 최적화 할 수 있습니다.

위험 분석

이 전략에는 다음과 같은 위험도 있습니다.

  1. 변동성 트렌드에서 SAR 지표는 여러 번 자주 변동할 수 있으며, 이는 너무 자주 거래되어 거래 비용을 증가시킬 수 있습니다.

  2. 세 개의 평선 Settings는 모든 품종에 완전히 적합하지 않을 수 있으며, 특정 품종의 상황에 따라 조정할 필요가 있습니다.

  3. 다음 BAR로 설정된 SAR 가격이 시간 지연되어 손실을 확대할 수 있다.

  4. 안정적인 추세에서 가짜 돌파가 SAR 회전을 일으키는 문제는 SAR 곡선을 부드럽게하는 매개 변수를 조정하여 완화 할 수 있습니다.

  5. 평균 세팅이 잘못되면 트렌드를 놓치거나 잘못된 신호를 생성할 수 있으며, 신중한 테스트와 최적화가 필요합니다.

위험은 다음과 같이 최적화 될 수 있습니다.

  1. 다양한 품종의 변동에 따라 SAR 매개 변수를 조정하여 빈번한 전환 확률을 줄여줍니다.

  2. 세 개의 평행선의 파라미터를 조정하여 다른 품종의 특성에 더 가깝게 만듭니다.

  3. 소형 스톱, 이동 스톱 등으로 손실을 막는 전략을 최적화하십시오.

  4. 거래 빈도 시장에서 제한 가격 단위 스톱 로스를 사용하여 슬라이드 포인트가 손실을 확대하지 않도록하십시오.

  5. 매개 변수 조정 테스트를 수행하여 평균선과 SAR 변수가 전략 효과에 미치는 영향을 평가하십시오.

최적화 방향

위와 같은 분석을 통해, 이 전략은 다음과 같은 측면에서 최적화될 수 있습니다.

  1. SAR 매개 변수 설정을 최적화하고, SAR 곡선을 평평하게 하고, 곡선의 회전 빈도를 낮추고, 과도한 거래를 피한다.

  2. 세 개의 평행선의 길이를 조정하여 특정 거래 품종의 특성에 맞게 조정하여 트렌드 필터링 기능을 더 잘 수행합니다.

  3. 동적 중지 전략, 예를 들어 이동 중지, 작은 중지, 등, 중지로 인한 손실을 줄이기 위해.

  4. HFT 거래 시장에서 제한 가격 단 단위 스톱 로스를 사용하여 스톱 로스 지점 손실을 줄인다.

  5. RSI, KD 등과 같은 다른 지표를 추가하여 필터링하여 신호 품질을 향상시키고 가짜 돌파 가능성을 줄입니다.

  6. 입구 조건을 최적화하여 SAR 회전시 동시에 K선 형태를 검사하여 저품질의 신호를 피하는 것을 고려할 수 있다.

  7. 재입장 조건이 추가되어, 상쇄 후 가격이 유리한 방향으로 계속 운행될 때 재입장한다.

  8. 이동식 차단, 부분 차단, 차차 차단과 같은 차단 전략을 개선하여 수익성을 향상시킵니다.

  9. 피드백 결과를 기반으로 매개 변수를 최적화하고, 전체 전략 효과에 대한 매개 변수의 영향을 평가한다.

요약하다

전체적으로, 이것은 트렌드 추적 지표 SAR와 평행선을 결합한 간단하고 실용적인 브레이크 전략이다. 그것은 SAR를 사용하여 트렌드 전환의 감수성을 판단하고, 평행선의 파동 작용을 사용하여, 트렌드 전환점에서 빠르게 입상한다. 동시에 위험을 제어하고 이익을 잠금하기 위해 스톱 로스 스톱을 설정한다. 파라미터 SETTINGS를 조정하고 입출장 조건을 최적화함으로써 더 나은 전략 효과를 얻을 수 있다. 그러나 거래자는 과도한 거래와 허위 브레이크 등의 문제를 제어하는 데 주의를 기울여야하며, 다양한 품종에 대한 파라미터 최적화 및 전략 테스트를 수행하여 안정적인 거래 시스템을 얻을 수 있다.

전략 소스 코드
/*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)