단계별 이익 실현 슬리피지 전략


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

단계별 이익 실현 슬리피지 전략

개요

이 전략은 계단식 스톱포드를 사용하여 슬라이드포드 손실을 결합한 탈퇴 전략이다. 첫 번째 스톱포드를 달성한 후에 스톱포드를 손실의 균형점으로 이동시키고, 두 번째 스톱포드를 달성한 후에 스톱포드를 첫 번째 스톱포드로 이동하여, 계단식 스톱포드 슬라이드 메커니즘을 구현한다. 이것은 수익의 일부를 잠금시키면서 큰 수익 공간을 유지할 수 있다.

전략 원칙

이 전략은 주로 다음과 같은 부분들을 통해 단계별로 스리핑 중지점을 구현합니다:

  1. 스톱로스와 3개의 스톱포인트를 설정한다.
  2. 현재 이득 수와 스톱로스 가격을 정의하는 계산 함수.
  3. 수익을 얻는 단계를 정의하는 판단 함수
  4. 각기 다른 수익 단계에서 스라이드 스톱을 위해 스로프 가격을 수정합니다.

구체적으로, 그것은 100점의 중지 거리와 100/200/300점의 3개의 중지 거리를 먼저 설정한다. 그리고는 현재 가격과 포지션 개시 가격을 기반으로 이득을 계산하는 함수를 정의한다.curProfitInPts, 점수 거리에 따른 스톱 로스 함수calcStopLossPrice

그 핵심 논리는getCurrentStage함수, 현재 포지션이 있는지 여부를 판단하고, 이득이 어느 스톱포인트를 넘었는지 여부를 판단하고, 그 이상이면 다음 단계로 이동한다. 예를 들어, 100 스톱포인트를 달성한 후 2 단계로 이동하고, 200 스톱포인트를 달성한 후 3 단계로 이동한다.

마지막으로 단계에 따라 다른 중지 손실 가격을 수정하여 슬라이드 스톱을 달성합니다. 첫 번째 단계의 중지 손실은 원래 설정을 유지합니다. 두 번째 단계는 손해 균형으로 이동합니다. 세 번째 단계는 첫 번째 중지 포인트로 이동합니다.

우위 분석

이 계단식 스틸 스라이드 포인트 전략은 다음과 같은 장점이 있습니다.

  1. 수익의 일부를 잠금할 수 있고, 이후 더 큰 수익을 얻을 수 있는 공간을 유지할 수 있다.
  2. 슬라이드 스톱을 사용하여 가격을 추적하여 PRODID 또는 손실을 되돌릴 가능성을 줄일 수 있습니다.
  3. 한 번만 하는 것보다 여러 번 하는 것이 더 위험하다는 것을 알 수 있습니다.
  4. 전략적 논리는 명확하고, 간단하고, 이해하기 쉽다.

위험 분석

이 전략에는 위험도 있습니다.

  1. 단계적 정지는 제 시간에 정지할 수 없고, 탈퇴 지점을 놓치는 것이 좋다. 정지 지점 수를 조정하여 최적화할 수 있다.
  2. 슬라이드 폭을 너무 크게 설정하면 스톱 패드가 너무 일찍 작동하게 될 수 있다. 다양한 슬라이드 폭을 테스트할 수 있다.
  3. 손해를 멈출 수 없는 경우에도 큰 손실 위험이 있습니다. 특정 상황에서 빠른 손해를 고려할 수 있습니다.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 다양한 스톱 스톱 손실 거리를 테스트하고, 최적화 파라미터를 다.
  2. 특수한 경우에 급속한 중단 장치를 고려하십시오.
  3. 기술 지표 판단과 함께 스톱 및 스톱 손실을 결정한다.
  4. 슬라이드 포인트 폭을 최적화하고, 스톱 및 스로드를 균형을 잡는다.
전략 소스 코드
/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 3m
basePeriod: 1m
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/
// © adolgov

// @description
// when tp1 is reached, sl is moved to break-even
// when tp2 is reached, sl is moved to tp1
// when tp3 is reached - exit

//@version=4
strategy("Stepped trailing strategy example", overlay=true)

// random entry condition
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

// sl & tp in points
sl = input(100)
tp1 = input(100)
tp2 = input(200)
tp3 = input(300)

curProfitInPts() =>
    if strategy.position_size > 0
        (high - strategy.position_avg_price) / syminfo.mintick
    else if strategy.position_size < 0
        (strategy.position_avg_price - low) / syminfo.mintick
    else
        0
        
calcStopLossPrice(OffsetPts) =>
    if strategy.position_size > 0
        strategy.position_avg_price - OffsetPts * syminfo.mintick
    else if strategy.position_size < 0
        strategy.position_avg_price + OffsetPts * syminfo.mintick
    else
        0
        
calcProfitTrgtPrice(OffsetPts) =>
    calcStopLossPrice(-OffsetPts)

getCurrentStage() =>
    var stage = 0
    if strategy.position_size == 0 
        stage := 0
    if stage == 0 and strategy.position_size != 0
        stage := 1
    else if stage == 1 and curProfitInPts() >= tp1
        stage := 2
    else if stage == 2 and curProfitInPts() >= tp2
        stage := 3
    stage

stopLevel = -1.
profitLevel = calcProfitTrgtPrice(tp3)

// based on current stage set up exit
// note: we use same exit ids ("x") consciously, for MODIFY the exit's parameters
curStage = getCurrentStage()
if curStage == 1
    stopLevel := calcStopLossPrice(sl)
    strategy.exit("x", loss = sl, profit = tp3, comment = "sl or tp3")
else if curStage == 2
    stopLevel := calcStopLossPrice(0)
    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "breakeven or tp3")
else if curStage == 3
    stopLevel := calcStopLossPrice(-tp1)
    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "tp1 or tp3")
else
    strategy.cancel("x")
    
// this is debug plots for visulalize TP & SL levels
plot(stopLevel > 0 ? stopLevel : na, style = plot.style_linebr)
plot(profitLevel > 0 ? profitLevel : na, style = plot.style_linebr)