가격 갭을 기반으로 한 트레일링 스톱로스 전략


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

가격 갭을 기반으로 한 트레일링 스톱로스 전략

개요

이 전략은 가격 간격 원칙을 채택하고, 낮은 시점을 돌파할 때 구매하고, 최저 가격의 스톱로스를 추적하기 위해 스톱로스 및 스톱오드 명령을 설정하여 수익을 창출한다.

전략 원칙

가격이 최근 N 시간 동안의 최저 지점을 넘어갔을 때 위치 간격, 설정된 비율에 따라 더 많이 들어가며, 동시에 중지 손실과 중지 주문을 설정한다. 그 후에 상행에 따라 중지 손실 라인과 중지 라인을 이동한다. 구체적인 논리는 다음과 같습니다:

  1. N 시간 내 최저 지점을 묶는 가격으로 계산합니다.
  2. 실시간 가격이 매매 가격보다 낮아 매매 가격 곱하기 매매 비율을 설정할 때 추가 입점
  3. 세팅 스톱 램프의 입점 가격 곱하기 세팅 판매 비율
  4. 단 하나의 입시 가격에서 입시 가격 곱하기 단 하나의 입시 가격으로 설정
  5. 다단계 숫자는 전략의 지분 비율입니다.
  6. 최저 가격 이동 스톱 라인을 추적합니다.
  7. 정지 또는 상쇄

전략적 강점 분석

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

  1. 가격 간격 사고를 적용하여 하락 시 입점하여 승률을 높여라
  2. 자동으로 트래킹한 정지, 대부분의 수익을 잠금할 수 있습니다.
  3. 다양한 시장에 맞게 설정 가능한 스톱 스톱 손실 비율
  4. 명백한 회전 특성을 가진 품종에 적합하다
  5. 간단하고 실행하기 쉽습니다.

전략적 위험 분석

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

  1. 틈을 뚫는 것은 성공하지 못할 수도 있고, 다시 시도할 수도 있다.
  2. 부적절한 정지 또는 정지 설정으로 인해 조기 정지 또는 정지 손실이 발생할 수 있습니다.
  3. 시장의 변화에 대응하기 위해 매개 변수를 정기적으로 최적화해야 합니다.
  4. 제한된 종류로 일부 품종에는 효과가 없을 수 있습니다.
  5. 인공적인 개입이 필요하다는 것

전략 최적화 방향

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

  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=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)