격리 대역 오시슬레이션 추적 전략

저자:차오장, 날짜: 2024-02-04 10:28:24
태그:

img

전반적인 설명

이 전략의 주요 아이디어는 ATR 지표를 기반으로 긴 및 짧은 스톱 로스 라인을 계산하는 것입니다. 가격은 이러한 스톱 로스 라인을 통과 할 때 거래 신호를 생성합니다. 트렌드 추적 및 오스실레이션 포착 기능이 있습니다.

전략 원칙

이 전략은 N 기간 ATR를 계수와 곱하여 긴 및 짧은 스톱 로스 라인을 계산합니다. 구체적인 계산 공식은 다음과 같습니다.

Long Stop = Highest Price - ATR * Coefficient 
Short Stop = Lowest Price + ATR * Coefficient

그것은 가격이 상승하고 긴 스톱-러스 라인을 통과 할 때 길고 가격이 떨어지고 짧은 스톱-러스 라인을 통과 할 때 짧습니다. 길거나 짧은 후에 스톱-러스 라인을 이동하기 위해 실시간으로 가격 변동을 추적합니다.

ATR 대역을 스톱 로스 수준으로 사용함으로써 이 방법은 스톱 로스 위험을 보장하면서 가격 트렌드를 완전히 포착할 수 있다. 이는 가격에 상당한 돌파구가 있을 때 신호를 생성하여 잘못된 돌파구를 효과적으로 필터링할 수 있다.

이점 분석

이 전략의 가장 큰 장점은 위험을 제어하면서 가격 추세를 파악하기 위해 자동으로 스톱 로스 수준을 조정 할 수 있다는 것입니다. 구체적인 장점은 다음과 같습니다.

  1. ATR 지표에 기반한 변동 스톱 로스는 단일 손실을 효과적으로 제어하기 위해 시장 변동성에 따라 스톱 로스 범위를 조정할 수 있습니다.

  2. 시그널을 생성하기 위한 혁신적인 방법을 채택하면 소음을 필터링할 수 있고 윗면과 아래면을 쫓는 것을 피할 수 있습니다.

  3. 가격 변동을 추적하기 위해 실시간으로 스톱 로스 라인을 조정하면 스톱 로스가 너무 느슨해지고 더 많은 수익을 올리는 것을 방지합니다.

위험 분석

이 전략은 또한 몇 가지 위험을 가지고 있으며, 주로 스톱 로스 레벨 설정과 신호 생성에 집중됩니다. 구체적인 위험 지점은 다음과 같습니다.

  1. 부적절한 ATR 사이클과 계수는 너무 넓거나 좁은 스톱 로스로 이어질 수 있습니다.

  2. 돌파구 신호 방법은 초기 트렌드 기회를 놓칠 수 있습니다.

  3. 트렌드 종료 시 스톱 로스 추적에 약간의 지연이 있을 수 있습니다. 완벽하게 탈퇴할 수 없습니다.

대책은 주로 스톱-러스를 더 합리적으로 만들기 위해 매개 변수를 조정하거나 다른 지표로 동향과 신호를 결정하는 데 도움이 됩니다.

최적화 방향

이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.

  1. 제2층 스톱-러스를 설정하여 위험을 더 제어합니다.

  2. 다른 지표를 결합하여 경향을 결정하고 신호 품질을 향상시킵니다.

  3. 이 추세가 계속될 때 수익을 높이기 위해 수익을 멈추는 전략을 추가합니다.

  4. ATR 사이클 및 계수 매개 변수를 최적화하여 실제 가격 변동에 더 가까운 스톱 로스를 만들 수 있습니다.

요약

전체적으로, 이 전략은 매우 실용적입니다. 트렌드 추적을 통해 좋은 이익을 얻는 동시에 자동으로 스톱 로스 수준을 조정함으로써 위험을 효과적으로 제어 할 수 있습니다. 우리는 기존의 기초에 다른 분석 방법을 결합하여 전략을 더 안정적이고 지능적으로 최적화하고 개선 할 수 있습니다.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © melihtuna
//@version=4
strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent)

length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false)
useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true)
highlightState = input(title="Highlight State ?", type=input.bool, defval=true)

atr = mult * atr(length)

longStop = (useClose ? highest(close, length) : highest(length)) - atr
longStopPrev = nz(longStop[1], longStop) 
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

var color longColor = color.green
var color shortColor = color.red

longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)

shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)

midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longFillColor = highlightState ? (dir == 1 ? longColor : na) : na
shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)


long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings")

start     = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings")
finish    = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings")   
window()  => true

slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings")
tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings")
tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings")
tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings")

lastBuyPrice = strategy.position_avg_price

diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100
diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
posHiRatio=0.0
posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0

s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100
s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
s_posHiRatio=0.0
s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0

strategy.entry("LONG", strategy.long, when = window() and buySignal)
strategy.close("LONG", when = window() and sellSignal)
strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG")
strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG")
strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG")

if long_short
    strategy.entry("SHORT", strategy.short, when = window() and sellSignal)
    strategy.close("SHORT", when = window() and buySignal)
    strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT")
    strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT")
    strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")

더 많은