동적 스톱 로스 볼링거 밴드 전략

저자:차오장, 날짜: 2024-02-01 10:48:52
태그:

img

전반적인 설명

이 전략은 볼링거 밴드의 상부 및 하부 레일을 사용하여 동적 스톱 손실을 구현합니다. 가격이 상부 레일을 통과 할 때 짧고 가격이 하부 레일을 통과 할 때 길게됩니다. 그리고 가격 움직임을 추적하기 위해 동적 스톱 손실을 설정합니다.

원칙

이 전략의 핵심은 볼링거 밴드의 상부 및 하부 레일에 있습니다. 중부 레일은 n 일 이동 평균입니다. 상부 레일은 중부 레일 + k입니다.n일 표준편차. 하부 레일은 중간 레일 − kn일 표준편차. 가격이 하부 레일에서 반등되면, 긴 이동. 가격이 상부 레일에서 다시 떨어지면, 짧은 이동. 동시에, 전략은 신중한 위험 통제를 구현하기 위해 수익점을 설정하기 위해 가격 움직임 중에 스톱 로스 포인트를 설정하고 동적으로 조정합니다.

장점

  1. 중장기 트렌드를 파악하기 위해 볼링거 밴드 중장기 레일 특성에 강한 회귀를 활용합니다.
  2. 명확한 길고 짧은 신호, 조작이 쉽다.
  3. 이윤 잠금 및 통제 위험을 극대화하기 위해 동적인 슬라이딩 스톱 손실을 설정합니다.
  4. 다른 시장 조건에 적응하기 위해 조정 가능한 매개 변수

위험 과 해결책

  1. 볼링거 밴드는 범위 제한 시장에서 여러 장과 짧은 신호를 생성하여 사용자가 화이프사우에 갇힐 수 있습니다. 해결책은 거래 손실에 따라 통제 할 수있는 정지 손실 지점을 합리적으로 설정하는 것입니다.
  2. 부적절한 매개 변수 설정으로 인해 승률이 낮을 수 있습니다. 해결책은 다른 제품에 대한 매개 변수를 합리적으로 최적화하는 것입니다.

최적화 방향

  1. 이동 평균 매개 변수를 최적화하여 제품 특성에 맞게 조정합니다.
  2. 범위에 묶인 시장을 피하기 위해 트렌드 필터링을 추가합니다.
  3. 전략 안정성을 높이기 위해 필터링 조건으로 다른 지표와 결합합니다.

결론

이 전략은 위험을 제어하면서 중장기 트렌드 수익을 얻기 위해 동적인 슬라이딩 스톱 로스와 함께 볼링거 밴드 회귀 특성을 활용합니다. 그것은 매우 적응 가능하고 안정적인 양적 전략입니다. 매개 변수 최적화 및 논리 최적화를 통해 더 많은 제품에 적응하여 실시간 거래에서 안정적인 수익을 얻을 수 있습니다.


/*backtest
start: 2024-01-24 00:00:00
end: 2024-01-31 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(shorttitle="BB Strategy", title="Bollinger Bands Strategy", overlay=true)
length = input.int(20, minval=1, group = "Bollinger Bands")
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = "Bollinger Bands")
src = input(close, title="Source", group = "Bollinger Bands")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group = "Bollinger Bands")

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

basis = ma(src, length, maType)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500, group = "Bollinger Bands")
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

lo = input.bool(true, "Long", group = "Strategy")
sh = input.bool(true, "Short", group = "Strategy")
x = input.float(3.0, "Target Multiplier (X)", group = "Strategy", minval = 1.0, step = 0.1)
token = input.string(defval = "", title = "Token", group = "AUTOMATION")
Buy_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1) + '"}'
Buy_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2) + '"}'
Exit_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-1) + '"}'
Exit_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-2) + '"}'
Exit_PE_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2.5) + '"}'
Exit_CE_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1.5) + '"}'
long = high < lower
short = low > upper
var sl_b = 0.0
var tar_b = 0.0
var sl_s = 0.0
var tar_s = 0.0
var static_sl = 0.0
entry = strategy.opentrades.entry_price(strategy.opentrades - 1)
if long and lo and strategy.position_size == 0
    strategy.entry("Long", strategy.long, alert_message = Buy_CE, stop = high)
    strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE)
    sl_b := low
    tar_b := high + (math.abs(high - low) * x)
    static_sl := math.abs(low - high)
if short and sh and strategy.position_size == 0
    strategy.entry("Short", strategy.short, alert_message = Buy_PE, stop = low)
    strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE)
    sl_s := high
    tar_s := low - (math.abs(high - low) * x)
    static_sl := math.abs(high - low)
// if long and strategy.position_size < 0
//     strategy.entry("Long", strategy.long, alert_message = Exit_PE_CE, stop = high)
//     strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE)
//     sl_b := low
//     tar_b := high + (math.abs(high - low) * x)
// if short and strategy.position_size > 0
//     strategy.entry("Short", strategy.short, alert_message = Exit_CE_PE, stop = low)
//     strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE)
//     sl_s := math.max(high[1], high)
//     tar_s := low - (math.abs(high - low) * x)
if ta.change(dayofmonth) or (long[1] and not long[2])
    strategy.cancel("Long")
if ta.change(dayofmonth) or (short[1] and not short[2])
    strategy.cancel("Short")
var count = 1
if strategy.position_size != 0
    if strategy.position_size > 0
        if close > (entry + (static_sl * count))
            strategy.exit("LX", "Long", limit = tar_b, stop = sl_b, alert_message = Exit_CE)
            sl_b := entry + (static_sl * (count - 1))
            count += 1
            
    else
        if close < (entry - (static_sl * count))
            strategy.exit("SX", "Short", limit = tar_s, stop = sl_s, alert_message = Exit_PE)
            sl_s := entry - (static_sl * (count - 1))
            count += 1
// label.new(bar_index, high, str.tostring(static_sl))
if strategy.position_size == 0
    count := 1
plot(strategy.position_size > 0 ? sl_b : na, "", color.red, style = plot.style_linebr)
plot(strategy.position_size < 0 ? sl_s : na, "", color.red, style = plot.style_linebr)
plot(strategy.position_size > 0 ? tar_b : na, "", color.green, style = plot.style_linebr)
plot(strategy.position_size < 0 ? tar_s : na, "", color.green, style = plot.style_linebr)

더 많은