트렌드 추적 브레이크업 전략

저자:차오장, 날짜: 2024-01-22 17:21:10
태그:

img

전반적인 설명

이것은 트렌드 추적에 기반한 브레이크업 전략입니다. 브레이크업이 발생했을 때 강점을 구매하고 트렌드를 추적하기 위해 약점을 판매합니다.

전략 논리

전략은 주로 두 가지 지표에 의존하여 입출 신호를 결정합니다. 특정 기간 동안 가장 높은 가격을 결정하는 가장 높은 기능과 특정 기간 동안 가장 낮은 가격을 결정하는 가장 낮은 기능입니다.

닫기 가격이 특정 기간 동안 가장 높은 가격 (highPeriod 매개 변수) 이상일 때, 그것은 상승 추세 브레이크로 간주되며, 따라서 긴 신호가 발행됩니다. 닫기 가격이 특정 기간 동안 가장 낮은 가격 (lowPeriod 매개 변수) 이하일 때, 그것은 하락 추세 브레이크로 간주되며, 따라서 짧은 신호가 발행됩니다.

이 전략은 또한 이동 스톱 손실과 고정 스톱 손실을 설정합니다. 이동 스톱 손실은 ATR 지표에 기초하여 특정 기간 동안의 ATR 값과 이동 스톱 손실 수준으로 인수 (트레일링AtrMultiplier 매개 변수) 로 계산됩니다. 고정 스톱 손실은 ATR 지표에 기초하여 유사하게 계산됩니다.

긴 또는 짧은 후에, 고정 스톱 손실은 첫 번째 바에 효력을 발휘합니다. 그 다음 주로 움직이는 스톱 손실로 전환합니다. 이 조합은 트렌드를 추적하는 동안 일부 이익을 잠금합니다.

이 전략은 또한 포지션 사이즈 계산에 대한 규칙을 설정합니다. 최대 허용 손실 비율, 계정 자금 등에 기초하여 적절한 포지션 크기를 계산합니다. 또한 거래 도구의 수를 고려하여 각 도구의 포지션 크기를 적절히 줄입니다.

요약하자면, 이것은 전형적인 트렌드 추적 브레이크아웃 전략입니다. 브레이크아웃이 발생했다고 판단했을 때 입력하고, 수익을 잠금하고, 스톱 로스를 통해 트렌드를 추적하고, 트렌드가 역전되면 종료됩니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 정확한 트렌드 판단. 가장 높은 가격과 가장 낮은 가격을 사용하여 트렌드가 역전되는지 결정하면 정확도가 매우 높고 잘못된 신호가 거의 없습니다.

  2. 합리적인 포지션 사이즈 및 스톱 로스. 최대 손실 비율 설정, 계정 자금 연관성 등은 과도한 거래 또는 비효율적 인 거래를 피하여 포지션 크기를 합리화합니다. 결합 된 스톱 로스는 이익을 잠그고 트렌드 움직임을 추적합니다.

  3. 간단하고 실용적이며 이해하기 쉽고 사용하기 쉽습니다. 그것은 단지 기본적인 지표에 의존하고 논리는 간단하고 이해하기 쉽습니다.

  4. 좋은 확장성. 지표 매개 변수, 위치 크기 규칙 등은 사용자가 필요에 따라 조정 할 수있는 입력 상자를 제공합니다.

요약하자면, 이것은 매우 실용적인 탈출 전략입니다. 판단에 안전하고 신뢰할 수 있으며, 설계는 위험 통제와 추적을 고려합니다. 중장기 보유에 매우 적합합니다.

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. 트렌드 역전 위험. 브레이크아웃 전략은 트렌드 판단에 크게 의존합니다. 잘못되면 엄청난 손실이 발생할 수 있습니다.

  2. 부적절한 매개 변수 위험. 가장 높은/최저 가격 사이클 매개 변수가 잘못 선택되면 트렌드가 놓칠 수 있습니다. 부적절한 위치 사이징 매개 변수는 과대 손실로 이어질 수 있습니다.

  3. 너무 공격적인 스톱 로스 위험. 이동 스톱 로스 거리가 너무 작으면 시장 소음이 조기에 포지션을 무너뜨릴 수 있습니다.

주요 해결책은 다음과 같습니다.

  1. 트렌드 필터를 추가합니다. 예를 들어 잘못된 브레이크오웃을 확인하기 위한 추가 지표와 같이요.

  2. 안정성 테스트를 통해 매개 변수 선택 최적화

  3. 적당한 리트레이스를 견딜 수 있도록 스톱 손실 거리를 적절히 풀어야 합니다.

최적화 방향

이 전략의 주요 최적화 방향은 다음과 같습니다.

  1. 추세를 결정하기 위해 더 많은 지표를 추가하십시오. 가장 높은 / 가장 낮은 가격 외에도 추세를 결정하는 것이 더 정확하도록 이동 평균과 같은 지표가 추가 될 수 있습니다.

  2. 매개 변수 설정을 최적화합니다. 테스트하고 최고 / 최저 가격 사이클과 같은 매개 변수 최적의 조합을 찾으십시오.

  3. 시장 조건에 따라 포지션 사이즈 알고리즘을 조정합니다. 예를 들어 변동성 (예를 들어 VIX) 이 증가할 때 포지션 크기를 낮추십시오.

  4. 부진 확인을 위해 볼륨 필터를 추가해 가짜 부진을 방지해

  5. 스프레드와 상관관계를 고려하여 거래 도구를 선택하십시오. 스프레드 변동이 작고 상관관계가 낮은 도구를 선택하는 것은 포트폴리오 위험을 줄일 수 있습니다.

  6. 스톱 손실 메커니즘을 최적화합니다. 스톱 손실을 덜 공격적으로 만들기 위해 이동 및 고정 스톱 손실의 다른 조성을 테스트하십시오.

결론

트렌드 추적 브레이크아웃 전략으로서, 이 전략은 판단의 정확성, 포지션 사이즈 & 리스크 제어, 운영의 편의성 등에 잘 수행됩니다. 트렌드를 일찍 파악하고 이동 스톱 손실을 통해 수익 취득 및 추적을 균형있게합니다.

물론, 브레이크아웃 전략으로서, 트렌드 판단에 크게 의존하고 시장 노이즈 간섭에 취약합니다. 열악한 매개 변수 조정 또한 성능을 약화시킬 수 있습니다. 이러한 문제를 해결하기 위해 추가 최적화가 필요합니다.

전체적으로 이것은 매우 실용적인 전략이다. 그것의 기본 구조는 이미 양자 전략의 가장 중요한 구성 요소를 포함하고 있다. 지속적인 최적화와 향상으로, 그것은 확실히 안정적인 수익성 있는 자동화 전략이 될 수 있다. 양자 연구와 참조에 귀중하다.


/*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=4
strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout",
     overlay=true)

// Risk for position and pyramid
maxriskval = input(2, "Max % risk", type = input.float,
     tooltip="Risk % over total equity / Position", group = "Risk Management")
pairnumber = input(title = "How many pairs",type = input.integer, defval= 1,
     tooltip="How many pairs are you trading with the strategy?", group = "Risk Management")

// Emtry Exit
highPeriod = input(title="Highest High Period", type=input.integer, defval=168
     , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)"
     , group = "Entry Condition")
lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168,
     tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)"
     , group = "Entry Condition")
// Stoploss
trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Trailing Stop. (Thick Green Line) "
     , group = "Exit Condition")
trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8
     , group = "Exit Condition")
fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)"
     , group = "Exit Condition")
fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2
     , group = "Exit Condition")
// Pair info 
pair = syminfo.basecurrency + syminfo.currency

// High Low Variable
highestHigh = highest(high, highPeriod)[1]
lowestLow = lowest(low, lowPeriod)[1]
trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier

// Trade Condition
longCondition = crossover(close, highestHigh) 
shortCondition = crossunder(close, lowestLow)

// Risk Variable
fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier
stopvaluelong = close[1] - fixAtr[1]
stopvalueshort = close[1] + fixAtr[1]

// Position size Long
maxpossize = strategy.equity / close 
positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) 
stopperclong = ((close - stopvaluelong) / close) * 100
leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2
posperclong =  (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber
realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close

// Position size Short
positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) 
stoppercshort = ((close - stopvalueshort) / close) * 100
leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2
pospercshort =  (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber
realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close

// Alert Message
entry_long_message = '\nGo Long for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(posperclong) +
                     '\nLeverage' + tostring(leveragelong) +
                     '\nStoploss Price =' + tostring(stopvaluelong) +
                     '\nClose any Short position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

entry_short_message ='\nGo Short for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(pospercshort) +
                     '\nLeverage' + tostring(leverageshort) +
                     '\nStoploss Price =' + tostring(stopvalueshort) +
                     '\nClose any Long position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_short_message = '\nExit Short for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_long_message = '\nExit Long for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'
// Order
if longCondition 
    strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong
     , alert_message = entry_long_message)
if shortCondition
    strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort
     , alert_message = entry_short_message)

// Stoploss Trailing
longTrailing = close - trailingAtr
shortTrailing = close + trailingAtr

var longTrailingStop = 0.0
var shortTrailingStop = 999999.9

trailingStopLine = 0.0
trailingStopLine := na
fixedStopLine = 0.0
fixedStopLine := na
var inTrade = 0
if longCondition or shortCondition
    if 0 == inTrade
        if longCondition
            inTrade := 1
        else
            inTrade := -1
if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop))
    inTrade := 0
if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop))
    inTrade := 0

longTrailingStop := if (1 == inTrade)
    stopValue = longTrailing
    max(stopValue, longTrailingStop[1])
else
    0

shortTrailingStop := if (-1 == inTrade)
    stopValue = shortTrailing
    min(stopValue, shortTrailingStop[1])
else
    999999

// Fix Stoploss
firstPrice = 0.0
firstFixAtr = 0.0
firstPrice := na
firstFixAtr := na
if 0 != inTrade
    firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0)
    firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0)
    if 1 == inTrade
        fixedStopLine := firstPrice - firstFixAtr
        trailingStopLine := longTrailingStop
    else
        fixedStopLine := firstPrice + firstFixAtr
        trailingStopLine := shortTrailingStop

if (strategy.position_size > 0)
    strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop)
     , alert_message = exit_long_message)

if (strategy.position_size < 0)
    strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop)
     , alert_message = exit_long_message)
    

// Plot
plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High')
plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low')
plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop')
plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')

더 많은