리소스 로딩... 로딩...

스크리즈 백테스트 트랜스포머 v2.0

저자:차오장, 날짜: 2024-04-28 14:09:26
태그:

img

전반적인 설명

스크리즈 백테스트 트랜스포머 (Squeeze Backtest Transformer) 는 스크리즈 전략에 기반한 양적 거래 시스템이다. 엔트리, 스톱 로스, 영업률, 최대 보유 시간 등의 매개 변수를 설정하여 특정 시간 범위 내에서 전략을 백테스트한다. 전략은 다방향 거래를 지원하며 장기 또는 단위로 거래 방향을 유연하게 설정할 수 있다. 동시에 전략은 백테스트 기간을 설정하는 풍부한 옵션을 제공하여 고정 시간 범위 또는 최대 백테스트 시간을 쉽게 선택할 수 있다.

전략 원칙

  1. 먼저, 사용자가 설정한 백테스트 기간 매개 변수에 기초하여 백테스트의 시작 및 종료 시간을 결정합니다.
  2. 백테스트 기간 동안 현재 포지션이 존재하지 않고 가격이 입상 가격 (개시 비율에 따라 계산) 에 도달하면 포지션을 열고 동시에 스톱 로스 및 영업률 (스톱 로스 및 영업률에 따라 계산) 을 설정합니다.
  3. 포지션이 이미 보유된 경우 이전 취득 및 중지 손실 명령을 취소하고 새로운 취득 및 중지 손실 가격을 재설정합니다 (현재 포지션 평균 가격에 따라 계산됩니다).
  4. 최대 보유 시간이 설정되면, 보유 시간이 최대 값에 도달하면 포지션을 강제로 닫습니다.
  5. 이 전략은 긴 방향과 짧은 방향의 거래를 지원합니다.

전략적 장점

  1. 유연한 매개 변수 설정은 다른 시장 조건과 거래 필요에 따라 조정할 수 있습니다.
  2. 다양한 시장 조건에서 이익을 얻기 위해 다방향 거래를 지원합니다.
  3. 백테스트 기간을 설정하는 풍부한 옵션을 제공하여 역사 데이터 백테스트 및 분석을 쉽게 수행 할 수 있습니다.
  4. 스톱 로스 및 영리 설정은 위험을 효과적으로 제어하고 자본 활용 효율을 향상시킬 수 있습니다.
  5. 최대 보유 시간 설정은 너무 오래 포지션을 보유하고 시장 위험에 직면하는 것을 피할 수 있습니다.

전략 위험

  1. 엔트리 가격, 스톱 로스 가격 및 영업 가격의 설정은 전략의 수익에 큰 영향을 미칩니다. 부적절한 매개 변수 설정은 손실로 이어질 수 있습니다.
  2. 시장이 격렬하게 변동할 때, 지점을 열고 즉시 스톱 로스가 발생하여 손실이 발생할 수 있습니다.
  3. 최대 보유 기간이 포지션의 폐쇄를 유발하면 후속 수익을 얻을 기회를 놓칠 수 있습니다.
  4. 이 전략은 어떤 특별한 시장 조건 (변경 시장과 같이) 에서 잘 작동하지 않을 수 있습니다.

전략 최적화 방향

  1. 더 많은 기술 지표 또는 시장 정서 지표를 도입하여 전략의 안정성과 수익성을 향상시키기 위해 진입 조건, 스톱 손실 및 수익을 최적화하는 것을 고려하십시오.
  2. 최대 보유 기간을 설정하기 위해서는 시장 변동성과 위치 이익과 손실에 따라 동적으로 조정하여 고정된 시간 종료가 가져올 수있는 기회 비용을 피할 수 있습니다.
  3. 측면 시장의 특성에 대해 측면 범위의 돌파구 또는 트렌드 역전 확인과 같은 논리는 빈번한 거래 비용을 줄이기 위해 추가 될 수 있습니다.
  4. 단일 거래의 위험 노출을 제어하고 자본 활용의 효율성과 안정성을 향상시키기 위해 포지션 관리 및 자본 관리 전략을 추가하는 것을 고려하십시오.

요약

스크리즈 백테스트 트랜스포머 (Squeeze Backtest Transformer) v2.0는 플렉시블한 매개 변수 설정과 다방향 거래 지원을 통해 다양한 시장 환경에서 거래할 수 있는 스크리즈 전략에 기반한 양적 거래 시스템이다. 동시에 풍부한 백테스트 기간 설정 옵션과 수익 및 스톱 로스 설정은 사용자가 역사적 데이터 분석 및 위험 통제를 수행하는 데 도움이 될 수 있다. 그러나 전략의 성능은 매개 변수 설정에 의해 크게 영향을 받으며 전략의 안정성과 수익성을 향상시키기 위해 시장 특성과 거래 필요에 따라 최적화 및 개선되어야 한다. 앞으로 더 많은 기술적 지표를 도입하고, 최대 보유 시간을 동적으로 조정하고, 측면 전략을 최적화하고, 최적화하기 위해 시장 위치 및 자본 관리를 강화하는 것을 고려할 수 있다.


/*backtest
start: 2023-04-22 00:00:00
end: 2024-04-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5

strategy(title="Squeeze Backtest by Shaqi v2.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)
R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"

BL = "low"
BH = "high"
BO = "open"
BC = "close"
BHL= "mid (hl)"
BOC = "mid (oc)"

LONG = "LONG"
SHORT = "SHORT"

direction = input.string(title="Direction", defval=LONG, options=[LONG, SHORT], group="Squeeze Settings")
strategy.risk.allow_entry_in(direction == LONG ? strategy.direction.long : strategy.direction.short)
openPercent = input.float(1.4, "Open, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
closePercent = input.float(0.6, "Close, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
stopPercent = input.float(0.8, "Stop Loss, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
isMaxBars = input.bool(true, "Max Bars To Sell", inline="MaxBars", group="Squeeze Settings")
maxBars = input.int(10, title="", minval=0, maxval=1000, step=1, inline="MaxBars", group="Squeeze Settings")
bind = input.string(BC, "Bind", options=[BL, BH, BO, BC, BHL, BOC], group="Squeeze Settings")
isRange = input.bool(true, "Fixed Range", inline="Range", group="Backtesting Period")
rangeStart = input.string(R2, "", options=[R0, R1, R2, R3, R4, R5, R6, R7], inline="Range", group="Backtesting Period")
periodStart = input(timestamp("12 Apr 2024 00:00 +0000"), "Backtesting Start", group="Backtesting Period")
periodEnd = input(timestamp("20 Apr 2024 00:00 +0000"), "Backtesting End", 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
    
float bindOption = na
if bind == BL
    bindOption := low
else if bind == BH
    bindOption := high
else if bind == BO
    bindOption := open
else if bind == BC
    bindOption := close
else if bind == BHL
    bindOption := hl2
else
    bindOption := ohlc4

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

barsFromEntry = ta.barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
openLimitPrice = direction == LONG ? (bindOption - bindOption * openPercent) : (bindOption + bindOption * openPercent)

closeLimitPriceEntry = openLimitPrice * (direction == LONG ? 1 + closePercent : 1 - closePercent)
closeLimitPrice = strategy.position_avg_price * (direction == LONG ? 1 + closePercent : 1 - closePercent)

stopLimitPriceEntry = direction == LONG ? openLimitPrice - openLimitPrice * stopPercent : openLimitPrice + openLimitPrice * stopPercent
stopLimitPrice = direction == LONG ? strategy.position_avg_price - strategy.position_avg_price * stopPercent : strategy.position_avg_price + strategy.position_avg_price * stopPercent

if periodCondition and notInTrade
    strategy.entry(direction == LONG ? "BUY" : "SELL", direction == LONG ? strategy.long : strategy.short, limit = openLimitPrice, stop = stopLimitPriceEntry)
    strategy.exit("INSTANT", limit = closeLimitPriceEntry, stop = stopLimitPriceEntry, comment_profit = direction == LONG ? 'INSTANT SELL' : 'INSTANT BUY', comment_loss = 'INSTANT STOP')
if inTrade 
    strategy.cancel("INSTANT")
    strategy.exit(direction == LONG ? "SELL" : "BUY", limit = closeLimitPrice, stop = stopLimitPrice, comment_profit = direction == LONG ? "SELL" : "BUY", comment_loss = "STOP")
if isMaxBars and barsFromEntry == maxBars
    strategy.close_all(comment = "TIMEOUT STOP", immediately = true)



showStop = stopPercent <= 0.20

// plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=1)
// plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=1)
// plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=1)
plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=0)
plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=0)
plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=0)

plot(openLimitPrice, title="Trailing Open Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.blue : color.red, 30), offset=1)
plot(closeLimitPriceEntry, title="Trailing Close Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.red : color.blue, 80), offset=1)
plot(stopLimitPriceEntry, title="Trailing Stop Position Limit Order", style=plot.style_stepline, color=color.new(#c50202, 80), offset=1)



더 많은