동적 손절매 볼린저 밴드 전략


생성 날짜: 2024-02-01 10:48:52 마지막으로 수정됨: 2024-02-01 10:48:52
복사: 0 클릭수: 332
1
집중하다
1166
수행원

동적 손절매 볼린저 밴드 전략

개요

이 전략은 부린 띠의 상하 궤도를 활용하여 동적 상쇄를 실현한다. 가격이 부린 띠를 상하 궤도를 돌파할 때 공백을 만들고, 하하 궤도를 돌파할 때 더 많이 하고, 동적 상쇄를 설정하여 가격 운행을 추적한다.

원칙

이 전략의 핵심은 부린 반도의 상하 궤도이다. 부린 반도의 중하 궤도는 n일 이동 평균이고, 상하 궤도는 중하 궤도+k이다.*n일 표준차, 하차는 중차-k*n일 표준 차기. 가격이 하위 궤도에서 상향으로 부딪히면 더 많이 하고, 가격이 상위 궤도에서 하향으로 부딪히면 공백을 낸다. 동시에, 전략적으로 스톱 로스를 설정하고, 가격 운행 과정에서 스톱 로스를 동적으로 조정하고, 스톱 로스를 설정하여 신중한 위험 관리를 한다.

장점

  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)