이 전략은 볼링거 밴드를 엔트리, 이동 평균을 클로즈 및 간단한 퍼센트 스톱 로스를 사용하는 시장 메이커 전략입니다. 2022년 6월 XBTUSD 계약에서 매우 수익성이 높았습니다.
이 전략은 볼링거 밴드의 상단 및 하단 밴드를 포지션 입출 기회 영역으로 사용합니다. 구체적으로, 가격이 하단 밴드 아래에있을 때 긴 포지션을 열고 가격이 상단 밴드 위에있을 때 짧은 포지션을 열 것입니다.
또한, 전략은 또한 이동 평균을 포지션 폐쇄 기준으로 사용합니다. 장차 포지션을 보유할 때, 가격이 이동 평균보다 높으면, 그것은 긴 포지션을 닫는 것을 선택합니다. 마찬가지로, 짧은 포지션을 보유할 때, 가격이 이동 평균보다 낮으면, 그것은 또한 짧은 포지션을 닫는 것을 선택합니다.
스톱 로스를 위해, 엔트리 가격에 기반한 간단한 비율의 트레일링 스톱 로스를 사용합니다. 이것은 트렌딩 시장에서 엄청난 손실을 효과적으로 피할 수 있습니다.
이 전략의 주요 장점은 다음과 같습니다.
이 전략에는 몇 가지 위험도 있습니다.
이러한 위험을 완화하기 위해 다른 필터를 추가하거나 스톱 로스 설정을 최적화하거나 포지션 크기를 적절히 제한하는 것을 고려할 수 있습니다.
더 많은 최적화를 할 수 있습니다.
전체적으로 이것은 매우 수익성 높은 주파수 시장 제작 전략입니다. 그것은 거래 신호를 위해 볼링거 밴드를 활용하고 위험을 제어합니다. 그러나 우리는 또한 결함을 인식하고 라이브 거래에서 신중하게 확인해야합니다. 추가 최적화로,이 전략은 더욱 안정적이고 큰 수익을 창출 할 가능성이 있습니다.
/*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()