가격 격차에 기반한 트래일링 스톱 손실 전략

저자:차오장, 2023-11-28 13:53:16
태그:

img

전반적인 설명

이 전략은 가격 격차 원칙을 채택하여 가격이 최근 최저치를 넘으면 긴 경로로 이동하며, 수익을 취하기 위해 가장 낮은 가격을 추적하기 위해 손해를 멈추고 수익을 취합니다.

전략 논리

최근 N 시간 동안 가격이 가장 낮은 가격 이하로 떨어질 때 격차를 식별하고, 설정된 비율에 따라 장기간에 걸립니다. 스톱 로스 및 영업 주문을 사용합니다. 스톱 로스 라인과 영업 라인은 가격 행동에 따라 움직입니다. 논리는 다음과 같습니다:

  1. 최근 N시간 동안 가장 낮은 가격을 구속 가격으로 계산합니다
  2. 실시간 가격이 구속 가격 * 구매 비율보다 낮을 때 긴 이동
  3. 입시 가격 * 판매 비율에 기초한 수익을 설정
  4. 엔트리 가격 - 엔트리 가격 * 엔트리 손실 %에 기초한 스톱 로스를 설정합니다.
  5. 포지션 크기는 전략 자금의 비율입니다.
  6. 가장 낮은 가격의 트레일 스톱 손실 라인
  7. 이윤을 취하거나 손실을 멈추게 할 때 포지션을 닫습니다.

이점 분석

이 전략의 장점:

  1. 가격 격차 개념을 활용하고, 승률을 향상
  2. 대부분의 수익을 확보하기 위해 자동 후속 스톱 손실
  3. 다른 시장에 대한 사용자 정의 가능한 스톱 로스 및 영업률
  4. 명백한 리보운드를 가진 악기에는 잘 작동합니다
  5. 간단한 논리와 실행하기 쉬운

위험 분석

또한 몇 가지 위험이 있습니다.

  1. 격차의 파업은 낮은 최저로 실패할 수 있습니다.
  2. 부적절한 스톱 로스 또는 수익 취득 설정은 조기 종료로 이어질 수 있습니다.
  3. 시장 변화에 대한 주기적인 매개 변수 조정 요구
  4. 제한된 적용 가능한 도구는 일부에 효과가 없을 수 있습니다.
  5. 간혹 수동 개입이 필요합니다.

최적화 방향

이 전략은 다음과 같은 측면에서 개선될 수 있습니다.

  1. 자동 매개 변수 조정을 위한 기계 학습 모델을 추가
  2. Stop loss/take profit의 더 많은 종류를 추가합니다. 예를 들어, trailing stop loss, bracket order
  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=4

strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)



더 많은