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

볼링거 대역 제한 시장 제작자 전략

저자:차오장, 날짜: 2024-01-24 11:05:56
태그:

img

전반적인 설명

이 전략은 볼링거 밴드를 엔트리, 이동 평균을 클로즈 및 간단한 퍼센트 스톱 로스를 사용하는 시장 메이커 전략입니다. 2022년 6월 XBTUSD 계약에서 매우 수익성이 높았습니다.

전략 논리

이 전략은 볼링거 밴드의 상단 및 하단 밴드를 포지션 입출 기회 영역으로 사용합니다. 구체적으로, 가격이 하단 밴드 아래에있을 때 긴 포지션을 열고 가격이 상단 밴드 위에있을 때 짧은 포지션을 열 것입니다.

또한, 전략은 또한 이동 평균을 포지션 폐쇄 기준으로 사용합니다. 장차 포지션을 보유할 때, 가격이 이동 평균보다 높으면, 그것은 긴 포지션을 닫는 것을 선택합니다. 마찬가지로, 짧은 포지션을 보유할 때, 가격이 이동 평균보다 낮으면, 그것은 또한 짧은 포지션을 닫는 것을 선택합니다.

스톱 로스를 위해, 엔트리 가격에 기반한 간단한 비율의 트레일링 스톱 로스를 사용합니다. 이것은 트렌딩 시장에서 엄청난 손실을 효과적으로 피할 수 있습니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 볼링거 밴드를 사용하면 가격 변동성을 효과적으로 파악하고 변동성이 증가할 때 더 많은 거래 기회를 얻을 수 있습니다.
  2. 마켓 메이커 전략은 양쪽 거래로 사매 스프레드에서 이익을 얻을 수 있습니다.
  3. 금지 손실의 비율은 위험을 능동적으로 통제하고 트렌딩 시장에서 큰 손실을 피할 수 있습니다.

위험 분석

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

  1. 볼링거 밴드는 항상 신뢰할 수 있는 입력 신호가 아니며 때로는 잘못된 신호를 줄 수 있습니다.
  2. 시장 메이커 전략은 다양한 시장에서 공격받을 수 있습니다.
  3. % Stop Loss는 너무 무작위적인 힘으로 복잡한 시장 상황에 적응할 수 없습니다.

이러한 위험을 완화하기 위해 다른 필터를 추가하거나 스톱 로스 설정을 최적화하거나 포지션 크기를 적절히 제한하는 것을 고려할 수 있습니다.

최적화 방향

더 많은 최적화를 할 수 있습니다.

  1. 우리는 최적의 매개 변수를 찾기 위해 다양한 매개 변수 조합을 테스트할 수 있습니다.
  2. 우리는 멀티팩터 검증을 위한 더 많은 필터를 추가할 수 있습니다.
  3. 우리는 기계 학습 방법을 사용하여 매개 변수를 자동으로 최적화할 수 있습니다.
  4. 우리는 더 정교한 스톱 로스 방법을 고려할 수 있습니다.

결론

전체적으로 이것은 매우 수익성 높은 주파수 시장 제작 전략입니다. 그것은 거래 신호를 위해 볼링거 밴드를 활용하고 위험을 제어합니다. 그러나 우리는 또한 결함을 인식하고 라이브 거래에서 신중하게 확인해야합니다. 추가 최적화로,이 전략은 더욱 안정적이고 큰 수익을 창출 할 가능성이 있습니다.


/*backtest
start: 2023-12-24 00:00:00
end: 2024-01-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(shorttitle="BBL", title="BB limit", overlay = true)


length = input(200, minval=1)
src = input(hlc3, title="Source")
xmult = input(44, minval=0.001, maxval=5000, title = "bb mult (0.1%)")
s = input(title="Trend source", defval = "sma", options = ["ema", "sma", "rma", "wma"])
basis = s == "ema" ? ema(src, length) : s == "sma" ? sma(src, length) : s =="rma" ? rma(src, length) : wma(src, length)
sd = input(title="Dev source", defval = "stdev", options = ["stdev", "dev"])
mult = xmult / 10  
dev = sd == "stdev" ? mult * stdev(src, length) : mult * dev(src, length)
diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

pyr = input(1, title = "Pyramiding")
useStopLoss = input(true)
stoploss_xmult = input(15, minval=0.001, maxval=5000, title = "StopLoss 0.1%")
stopLoss_mult = sd == "simple" ? 1 + stoploss_xmult / 10 / 100 : stoploss_xmult / 10  
dev2 = sd == "stdev" ? stopLoss_mult * stdev(src, length) : sd == "dev" ? stopLoss_mult * dev(src, length) : (stopLoss_mult - 1) * basis
upper = basis + (1*dev)
lower = basis - (1*dev)
plot(basis, color=fuchsia, linewidth=2)
plot(upper, color=green, linewidth=2)
plot(lower, color=green, linewidth=2)


strategy.cancel_all()

if strategy.position_size > 0 and close <= basis + diff * 2
    strategy.order("Close long", strategy.short, strategy.position_size, limit = ShortPrice(basis))
else 
    if strategy.position_size < 0 and close >= basis - diff * 2
        strategy.order("Close short", strategy.long, -strategy.position_size, limit = LongPrice(basis))
            
stopLossPrice1 = na
stopLossPrice2 = na
add = na
openOrderCondition = close > lower - 2 * diff and (strategy.opentrades < pyr or (strategy.position_size < 0 and strategy.position_avg_price > lower * (1 + stopLoss_mult / 100)))
if openOrderCondition
    add := strategy.position_size > 0 ? -strategy.position_size : close >= basis - diff * 2 ? 0 : -strategy.position_size
    strategy.order("Open long", strategy.long, strategy.equity / pyr / lower + add, limit = LongPrice(lower))
if useStopLoss and (strategy.position_size > 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / lower : 0
    posPrice = strategy.position_size <= 0 ? lower : strategy.position_avg_price
    posSize = strategy.position_size <= 0 ? 0 : strategy.position_size
    stopLossPrice1 := posPrice * (1 - stopLoss_mult / 100)
    strategy.order("StopLoss open short ", strategy.short, posSize + add + strategy.equity / pyr / stopLossPrice1, stop = ShortPrice(stopLossPrice1))


openOrderCondition := close < upper + 2 * diff and (strategy.opentrades < pyr or (strategy.position_size > 0 and strategy.position_avg_price * (1 + stopLoss_mult / 100) < upper))
if openOrderCondition
    add := strategy.position_size < 0 ? strategy.position_size : close <= basis + diff * 2 ? 0 : strategy.position_size
    strategy.order("Open short", strategy.short, strategy.equity / pyr / upper + add, limit = ShortPrice(upper))
if useStopLoss and (strategy.position_size < 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / upper : 0
    posPrice = strategy.position_size >= 0 ? upper : strategy.position_avg_price
    posSize = strategy.position_size >= 0 ? 0 : -strategy.position_size
    stopLossPrice2 := posPrice * (1 + stopLoss_mult / 100)
    strategy.order("StopLoss open long", strategy.long, posSize + add + strategy.equity / pyr / stopLossPrice2, stop = LongPrice(stopLossPrice2))

plot(not useStopLoss ? na : stopLossPrice1, color=red, linewidth=2)
plot(not useStopLoss ? na : stopLossPrice2, color=red, linewidth=2)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "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()

더 많은