이중 거북이 돌파구 전략은 거북이 거래 돌파구 전략과 린다 라스케의 이동 스톱 손실 원리를 통합하여 우수한 돌파구 성과와 엄격한 위험 통제를 제공합니다. 전략은 동시에 가격 돌파구를 위아래로 모니터링하고 돌파구가 발생했을 때 긴 또는 짧은 포지션을 설정하고 이동 스톱 손실과 이동 수익을 사용하여 포지션을 관리합니다.
핵심 논리는 큰 사이클의 높은 지점에서 작은 사이클의 높은 지점을 깨고 작은 사이클의 낮은 지점을 깨고 큰 사이클의 낮은 지점을 깨고 긴 지점을 취하는 것입니다. 포지션을 열면 이동 스톱 손실을 설정하고 이동 수익을 취하고 위험을 확인하기 위해 먼저 손실을 중지하십시오. 보유 양이 세트에서 축적되면 수익을 취하는 양, 다음 사이클에서 중지 손실 명령을 취소하고 다음 포지션의 절반을 종료하고 수익을 잠금하고 스프레드를 추적하기 위해 이동 스톱 손실을 설정하고 이동 수익을 취하십시오.
구체적인 작업 단계는 다음과 같습니다.
큰 사이클 (20주기) 고점 prevHigh와 작은 사이클 (4주기) 고점 smallPeriodHigh을 계산합니다.
최신 K-라인의 최고가 prevHigh보다 크고, prevHigh이 smallPeriodHigh보다 크면 큰 사이클의 최고가 작은 사이클의 최고점을 깨는 것을 나타냅니다.
포지션을 열고 나면 이동 스톱 로스를 설정합니다. 스톱 로스를 취소하기 전에 포지션이 역전될 때까지 기다립니다.
보유 금액이 설정된 이동 취득 순환 번호 (현재 0 순환) 에 도달하면 다음 순환에서 지점의 절반을 종료하고 스프레드를 추적하고 이익을 잠금하기 위해 이동 스톱 손실과 이동 취득을 설정합니다.
낮은 지점의 돌파점에서는 큰 사이클 최저점과 작은 사이클 최저점 사이의 돌파점 관계를 기반으로 긴 포지션을 설정합니다.
이것은 다음과 같은 장점을 가진 매우 포괄적인 돌파구 전략입니다.
이중 주기의 거북이 거래를 결합하면 돌파구 신호를 효과적으로 식별 할 수 있습니다.
스톱 로즈와 이윤을 취하는 기법을 사용하는 것은 위험을 엄격히 통제하고 큰 손실을 피합니다.
두 단계로 빠져나와, 한 번에 절반의 수익을 취하고, 그 다음 완전히 빠져나와, 수익을 취하고, 수익을 확보합니다.
중복되는 다중 빈 시장의 특성을 일치시키는 긴 거래와 짧은 거래를 모두 고려합니다.
훌륭한 백테스트 결과와 강력한 실제 거래 성과
주요 위험과 대책은 다음과 같습니다.
거짓 돌파구 위험. 돌파구 유효성을 보장하기 위해 주기 매개 변수를 적절히 조정하십시오.
추격 위험은 증가하고 죽이는 위험은 감소합니다. 트렌드와 패턴과 함께 필터링을 결합하여 트렌드 끝에 포지션을 열지 않도록해야합니다.
스톱 손실이 사라질 위험이 있습니다. 충분한 공간을 보장하기 위해 스톱 손실 진폭을 적절히 느슨하게하십시오.
너무 민감한 이동 스톱 손실의 위험. 불필요한 스톱 아웃을 피하기 위해 스리프 설정
이 전략은 다음 측면에서도 최적화 될 수 있습니다.
부피의 돌파구 필터를 추가하여 돌파구의 진위를 보장합니다.
트렌드 판단 지표를 추가하여 트렌드 끝에서 포지션을 개설하는 것을 피합니다.
더 많은 시간 순환을 결합하여 돌파구 타이밍을 결정합니다.
매개 변수의 동적 최적화를 위한 기계 학습 알고리즘을 강화합니다.
통계적 중재를 위한 다른 전략과 결합합니다.
이중 거북이 돌파구 전략 (Double Turtle Breakthrough Strategy) 은 이중 사이클 기술, 돌파구 이론 및 엄격한 위험 관리 방법을 종합적으로 사용하여 높은 승률을 보장하면서 안정적인 수익을 보장합니다. 이 전략 모델은 간단하고 명확하고 이해하기 쉽고 적용 할 수 있으며 우수한 수치 전략입니다. 이 전략은 여전히 최적화의 잠재력이 있습니다. 투자자는이 기반을 통해 혁신하여 더욱 나은 거래 시스템을 만들 수 있습니다.
/*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()