이 브레이크아웃 트레이딩 전략은 패러볼 SAR 지표와 세 개의 SMMA 라인을 서로 다른 기간으로 결합하는 브레이크아웃 트레이딩 전략이다. 세 개의 SMMA 라인이 모두 상승할 때 길게 가고 모든 것이 떨어질 때 짧게 이동하며, SAR 지표를 사용하여 트렌드 방향을 결정하고 SAR가 방향을 전환할 때 카운터 트렌드 엔트리를 취합니다. 이 전략에는 또한 스톱 로스와 영업이 포함됩니다.
이 전략은 다음의 핵심 요점들에 기초하고 있습니다.
현재 트렌드 방향을 결정하기 위해 패러볼 SAR 지표를 사용하여 SAR는 가격 변화를 동적으로 추적하고 상승 추세와 하락 추세를 식별 할 수 있습니다.
서로 다른 기간을 가진 세 개의 SMMA 라인을 설정합니다. (빠른 라인 21, 중간 라인 50, 느린 라인 200). 세 가지 라인이 모두 상승할 때 상승 추세를 나타냅니다. 모든 것이 떨어질 때 하락 추세를 나타냅니다.
세 개의 SMMA 라인이 올라갈 때 SAR가 내려갈 때 길게 이동합니다.
세 개의 SMMA 라인이 떨어질 때 SAR가 올라갈 때 단축됩니다.
SAR에 기반한 스톱 로스를 포함하고 입시 가격의 특정 비율로 수익을 취합니다.
구체적으로, 전략은 먼저 현재 바에서 SAR가 방향을 전환하는지 확인합니다. SMMA가 상승하는 동안 SAR가 위에서 아래로 전환되면 길게됩니다. SMMA가 떨어지는 동안 SAR가 아래에서 위로 전환되면 짧게됩니다.
엔트리 후, 스톱 로스는 다음 바의 SAR 가격으로 설정되며, SAR를 동적인 트레일링 스톱 로스로 사용합니다. 영업이익은 엔트리 가격의 10%로 설정됩니다. 가격이 영업이익 또는 스톱 로스 수준에 도달하면 포지션은 종료됩니다.
이 전략은 트렌드를 따르는 지표와 여러 시간 프레임 이동 평균의 장점을 결합하여 트렌드 반전 시에 적시에 입력 할 수 있으며 SMMA를 사용하여 잘못된 파장을 필터링합니다. 주요 장점은 다음과 같습니다.
SAR는 트렌드 변화를 빠르게 감지하고 역전 기회를 잡을 수 있습니다.
삼중 SMMA는 시장 소음을 효과적으로 필터링하고 잘못된 파업을 피합니다.
SMMA를 사용하면 더 부드러운 곡선과 MA 윙사우의 간섭이 적습니다.
스톱 로스 및 취득을 포함하면 단일 거래 손실을 제어하고 부분 수익을 잠금 할 수 있습니다.
유연한 매개 변수 설정은 다양한 시장에 최적화를 허용합니다.
또한 고려해야 할 몇 가지 위험이 있습니다.
변동적인 트렌드 중에 SAR가 자주 뒤집어질 수 있고, 과도한 거래로 인한 비용이 증가합니다.
SMMA 설정은 모든 기기에 잘 맞지 않을 수 있으므로 개별적인 최적화가 필요합니다.
SAR 스톱 로즈는 시간 지연이 있고 손실을 증가시킬 수 있습니다.
SAR는 안정적인 트렌드에서 잘못된 파업을 뒤집을 수 있습니다. SAR 매개 변수를 부드럽게 하는 것이 도움이 될 수 있습니다.
잘못된 SMMA 설정은 놓친 트렌드 또는 나쁜 신호를 일으킬 수 있습니다. 신중한 테스트가 필요합니다.
위험을 해결하기 위해 최적화는 다음에 초점을 맞출 수 있습니다.
변동성을 기반으로 SAR 매개 변수를 조정하여 플립을 줄입니다.
기기 특성에 맞게 SMMA 기간을 조정합니다.
스톱 로스를 개선하는 것, 예를 들어 트래일링 또는 리미트 오더.
액티브 트레이딩에서 스톱 로스를 위한 리미트 오더를 사용하는 것.
광범위한 테스트와 매개 변수 조정
위의 분석을 바탕으로 최적화는 다음을 포함할 수 있습니다.
더 부드러운 곡선과 더 적은 플립을 위해 SAR 매개 변수를 최적화합니다.
SMMA 길이를 거래 도구와 일치하도록 조정합니다.
트레일링 스톱이나 리미트 오더와 같은 동적 스톱 손실을 사용합니다.
고주파 거래에서 손해를 멈추는 제한 명령을 사용하는 것.
신호 품질을 향상시키기 위해 RSI, KD 같은 필터를 추가합니다.
입구 조건 개선, 예를 들어 SAR 플립으로 촛불 패턴을 확인.
스톱 로스 트리거가 끝나면 재입구 조건을 추가합니다.
이윤을 끌어올리는 것, 부분적으로 밀리는 것, 놀라운 수준.
백테스트 결과와 감수성 분석에 기초한 파라미터 조정
요약하자면, 이것은 트렌드 변화를 포착하는 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)