더블 터틀 브레이크아웃 전략


생성 날짜: 2023-11-28 16:25:41 마지막으로 수정됨: 2023-11-28 16:25:41
복사: 0 클릭수: 689
avatar of ChaoZhang ChaoZhang
1
집중하다
1619
수행원

더블 터틀 브레이크아웃 전략

개요

이중 해안 파격 전략은 해안 거래법의 파격 전략과 린다 라슈크의 이동적 손실 원칙을 결합하여 우수한 파격 성능과 엄격한 위험 관리를 갖는다. 이 전략은 가격의 상하 파격을 동시에 모니터링하고, 파격이 발생했을 때 상장 또는 상장을 설정하고, 이동적 손실과 이동적 중지 관리 위치를 활용한다.

전략 원칙

핵심 논리는 큰 주기의 최고점에 작은 주기의 최고점을 돌파할 때 공백을 하고, 큰 주기의 낮은 곳에서 작은 주기의 낮은 곳을 돌파할 때 더 많이 하는 것이다. 포지션을 세운 후, 이동 스톱과 이동 스톱을 설정하고, 먼저 스톱을 확인하는 위험을 감수한다. 포지션 수가 설정된 스톱의 수에 축적되면, 다음 주기에 스톱을 취소하고, 포지션을 반으로 나와 이동 스톱과 이동 스톱을 설정하여 수익을 잠금하고 가격 차이를 추적한다.

다음 단계로 진행됩니다.

  1. 계산 대주기 ((20주기) 고점prevHigh 및 소주기 ((4주기) 고점smallPeriodHigh。
  2. 최신 K 선의 high이 prevHigh보다 크고, prevHigh이 smallPeriodHigh보다 크면, 큰 주기적 high이 작은 주기적 high을 돌파한다는 것을 나타냅니다. 이 시점에는 포지션이 없으면 공백합니다.
  3. 창고가 세워진 후 이동적 손실을 설정하고, 입장이 반전된 후 중지 손실을 취소하여 손실을 방지한다.
  4. 포지션 수가 설정된 이동식 스톱톱 사이클 수 (현재 0 사이클) 에 도달하면, 다음 사이클에 포지션의 절반을 내리고 이동식 스톱 손실과 이동식 스톱을 설정하여 가격 차이를 추적하고 수익을 잠금합니다.
  5. 하위점의 돌파구와 비슷하게, 대주기 하위점과 소주기 하위점의 돌파구 관계를 기반으로 다중 포지션을 만든다.

우위 분석

이 전략은 포괄적이고, 다음과 같은 장점을 가지고 있습니다.

  1. 이중 주기적 해파리 거래법과 결합하여, 돌파 신호를 효과적으로 식별할 수 있다.
  2. 모바일 스톱 및 모바일 스톱 기술을 사용하여 위험을 엄격히 통제하여 큰 손실을 피하십시오.
  3. 두 번 출전하여 한 번은 반을 상쇄하고, 또 한 번은 전체 포지션을 상쇄하여 수익을 잠금합니다.
  4. 다공식과 다공식 양방향 동작을 동시에 고려하여 다공식 교환의 시장 특성에 부합한다.
  5. 리스커스 효과는 우수하며, 강력한 실디 디스크 성능이 있다.

위험 분석

주요 위험과 대응 방법은 다음과 같습니다.

  1. 가짜 돌파 위험. 돌파의 유효성을 보장하기 위해 주기 파라미터를 적절히 조정해야 한다.
  2. 추격할 때, 추세와 형태를 고려하여 필터링을 해야 하며, 추세가 끝날 무렵에 포지션을 세우는 것을 피해야 한다.
  3. 스포드 리스크에 의해 충격을 받습니다. 스포드 폭을 적절히 완화하여 충분한 공간이 있는지 확인하십시오.
  4. 이동 상쇄는 너무 민감한 위험. 상쇄 후 슬라이드 설정을 조정하여 불필요한 상쇄를 피하십시오.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 트랜스포메이션의 개선을 필터링하여 개선을 확인합니다.
  2. 트렌드를 판단하는 지표에 가입하여 트렌드 말기에 포지션을 세우는 것을 피하십시오.
  3. 더 많은 시간 주기를 통해 돌파구를 판단할 수 있습니다.
  4. 기계 학습 알고리즘을 추가하고, 동적으로 최적화 파라미터를 추가한다.
  5. 다른 전략과 결합하여 통계적 배당을 시행한다.

요약하다

이중 해파리 돌파구 전략은 종합적으로 이중주기 기술, 돌파구 이론 및 엄격한 위험 관리 수단을 적용하여 높은 승률을 유지하면서도 수익의 안정성을 보장합니다. 이 전략 모델은 간단하고 명확하며 이해하기 쉽고 적용하기 쉽습니다.

전략 소스 코드
/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Turtle soup plus one", shorttitle = "Turtle soup plus one", overlay=true)

bigPeriod = input(20)
smallPeriod = input(4)
takeProfitBars = input(0)
trailingStop = input(5, title = "Trailing stop percentages")
if (strategy.position_size == 0)
    strategy.cancel("Long")
    strategy.cancel("Short")
    strategy.cancel("Stop")



stopLossPrice = 0.1
stopLossPrice := nz(stopLossPrice[1])
takeProfitStarted = false
takeProfitStarted := nz(takeProfitStarted[1])

prevHigh = highest(high, bigPeriod - smallPeriod)[smallPeriod]
smallPeriodHigh = highest(high, smallPeriod - 1)[1]
if (high > prevHigh and prevHigh > smallPeriodHigh and close > prevHigh and strategy.position_size == 0)
    strategy.order("Short", strategy.short, stop = prevHigh)

if strategy.position_size < 0 and strategy.position_size[1] == 0
    stopLossPrice := high[1]
    strategy.order("Stop", strategy.long, qty = -strategy.position_size, stop = stopLossPrice)
    takeProfitStarted := false

if (strategy.position_size < 0 and sum(strategy.position_size, takeProfitBars) == strategy.position_size * takeProfitBars and close < strategy.position_avg_price and not takeProfitStarted)
    takeProfitStarted := true
    strategy.cancel("Stop")
    strategy.order("ExitHalf", strategy.long, qty = ceil(-strategy.position_size / 2), stop = close)
    if (strategy.position_size != -1)
        strategy.exit("ExitFull", "Short", qty = -strategy.position_size - ceil(-strategy.position_size / 2), loss = stopLossPrice, trail_price  = close, trail_offset = -(close - strategy.position_avg_price) * trailingStop / 100 / syminfo.mintick)
        

prevLow = lowest(low, bigPeriod - smallPeriod)[smallPeriod]
smallPeriodLow = lowest(low, smallPeriod - 1)[1]
if (low < prevLow and prevLow < smallPeriodLow and close < prevLow and strategy.position_size == 0)
    strategy.order("Long", strategy.long, stop = prevLow)

if strategy.position_size > 0 and strategy.position_size[1] == 0
    stopLossPrice := low[1]
    strategy.order("Stop", strategy.short, qty = strategy.position_size, stop = stopLossPrice)
    takeProfitStarted := false

if (strategy.position_size > 0 and sum(strategy.position_size, takeProfitBars) == strategy.position_size * takeProfitBars and close > strategy.position_avg_price and not takeProfitStarted)
    takeProfitStarted := true
    strategy.cancel("Stop")
    strategy.order("ExitHalf", strategy.short, qty = ceil(strategy.position_size / 2), stop = close)
    if (strategy.position_size != 1)
        strategy.exit("ExitFull", "Long", qty = strategy.position_size - ceil(strategy.position_size / 2),loss = stopLossPrice, trail_price  = close, trail_offset = (close - strategy.position_avg_price) * trailingStop / 100 / syminfo.mintick)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2038, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()