볼린저 밴드 리미트 마켓 메이커 전략


생성 날짜: 2024-01-24 11:05:56 마지막으로 수정됨: 2024-01-24 11:05:56
복사: 0 클릭수: 949
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

볼린저 밴드 리미트 마켓 메이커 전략

개요

이 전략은 브린띠를 엔트리로, 이동 평균을 클로즈로, 그리고 간단한 스톱로스 퍼센티지를 클로즈로 사용하는 시장 전략이다. 2022년 6월의 xtbtusd 계약에서 매우 높은 수익을 얻었다.

전략 원칙

이 전략은 부린띠의 상하철도를 매장 기회 지역으로 사용한다. 구체적으로, 가격이 하하철보다 낮을 때, 다중 매장이 열리고, 가격이 상하철보다 높을 때, 빈 매장이 열린다.

또한, 이 전략은 이동 평균을 평준화의 기준으로 사용한다. 여러 주문을 보유할 때, 가격이 이동 평균보다 높으면 평준화를 선택한다. 마찬가지로, 공백을 보유할 때, 가격이 이동 평균보다 낮으면 평준화를 선택한다.

스톱의 경우, 이 전략은 입점 가격에 일정 비율을 곱한 이러한 간단한 롤링 스톱 방식을 사용합니다. 이것은 일방적인 상황에서 막대한 손실을 효과적으로 방지 할 수 있습니다.

우위 분석

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

  1. 브린 띠를 사용하면 가격의 변동성을 효과적으로 포착할 수 있으며, 변동성이 심해지면 더 많은 거래 기회를 얻을 수 있습니다.
  2. 시장거래 전략은 양방향 거래를 통해 구매자와 판매자의 수수료 수입을 얻을 수 있다.
  3. 백분율 상쇄를 적용하면 위험을 적극적으로 통제할 수 있으며, 일방적인 상황에서 엄청난 손실을 효과적으로 피할 수 있다.

위험 분석

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

  1. 브린 벨트는 항상 신뢰할 수 있는 진입 지표가 아닙니다. 때로는 잘못된 신호를 냅니다.
  2. 시장에 대한 전략은 격동의 상황 속에서 쉽게 갇히게 됩니다.
  3. “비용의 절감 비율이 너무 무분별해서 복잡한 상황에 대처할 수 없습니다”.

이러한 위험을 줄이기 위해, 우리는 다른 지표와 결합하여 필터링을 고려할 수 있습니다.

최적화 방향

이 전략에는 더 많은 최적화 가능성이 있습니다:

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