볼린저 밴드와 칼킨 채널을 기반으로 한 모멘텀 스퀴즈 전략


생성 날짜: 2024-01-30 17:33:49 마지막으로 수정됨: 2024-01-30 17:33:49
복사: 0 클릭수: 869
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

볼린저 밴드와 칼킨 채널을 기반으로 한 모멘텀 스퀴즈 전략

개요

이것은 LazyBear의 동력 압축 지표에 기반하여 개발된 양적 거래 전략이다. 이 전략은 브린 띠, 칼킨 채널 및 동력 지표를 통합하여 여러 기술 지표의 조합을 통해 높은 승률의 동력 돌파 거래를 달성한다.

전략 원칙

이 전략의 핵심 지표는 LazyBear의 동력 압축 지표이다. 이 지표는 불린 띠가 칼킨 통로로 압축되는지 여부를 판단하며, 압축이 발생하면 시장이 잠재적인 폭발 지점으로 진입하는 것을 나타냅니다. 동력 지표 판단 방향과 함께 압축이 풀릴 때 시장의 폭발 상황을 포착 할 수 있습니다.

구체적으로, 이 전략은 21주기의 브린 띠를 먼저 계산하고, 가격 표준 차이의 2배의 폭을 가지고 있다. 또한 20주기의 칼킨 채널을 계산하고, 가격 변동의 1.5배의 폭을 가지고 있다. 브린 띠가 칼킨 채널 에 압축될 때, 압축 신호가 발산된다. 또한, 이 전략은 한 기간 동안 가격에 대한 가격의 동력을 계산한다. 압축이 발생했을 때, 동력 지표의 방향성과 결합하여 구매 또는 판매를 판단한다.

경기장에서 운동량 지표 색이 회색으로 변하여 포지션을 평평하게 하여 압축 상태가 끝났음을 나타낸다면, 추세는 역전될 수 있다.

전략적 이점

  1. 거래 결정의 정확성을 높이기 위해 다양한 기술 지표를 통합

이 전략은 브린 벨트, 칼킨 채널 및 동력 지표를 통합하여, 이러한 지표의 종합 관계를 판단하여 거래 의사 결정의 정확도를 높이고, 잘못된 거래의 가능성을 줄일 수 있습니다.

  1. 동력 압축 지점이 정확하고, 잠재적인 수익의 여지가 크다

동력 압축 전략은 시장 폭발의 핵심 지점을 포착 할 수 있습니다. 이러한 지점은 시장이 중요한 방향 판단을 할 수있는 전환점입니다. 올바른 판단을 할 경우, 그 후의 흐름이 더 오래 지속 될 수 있으므로 전략의 잠재적인 수익 공간은 크다.

  1. 성공률이 높은 획기적인 거래

무작위적 돌파 거래와 비교하여, 이 전략의 선택된 진입 지점은 부린 벨트와 칼킨 통로의 압축 지점에 위치하고 있으며, 지표 통합을 통해 판단하면 거래 성공률이 높다.

전략적 위험

  1. 브린 벨트 및 칼킨 통로 파라미터 설정 위험

브린 띠와 칼킨 채널의 주기 변수와 대역폭 변수 설정은 전략 거래 결과에 큰 영향을 미칩니다. 변수가 잘못 설정되면 잘못된 판단이 발생할 수 있습니다. 이것은 많은 재검토를 통해 최적의 변수를 찾는 것이 필요합니다.

  1. 실패의 위험

모든 돌파 거래에는 실패의 위험이 있으며, 가격이 전략의 선택 지점을 돌파 한 후 다시 회수되어 손실을 초래할 수도 있습니다. 이것은 엄격한 손실을 제어해야합니다.

  1. 추세 반전 위험

압축 상태가 끝나면 이 전략은 모든 포지션을 평행한다. 그러나 때로는 가격 추세가 여전히 지속될 수 있으며, 이는 전략의 조기 퇴출의 위험을 초래한다. 이것은 출장 판단 논리를 최적화해야 한다.

전략 최적화 방향

  1. 최적화 변수 설정

더 많은 데이터 테스트 오류를 통해 브린밴드 및 칼킨 채널의 더 나은 파라미터 주기 및 대역폭 설정을 찾아서 전략 효과를 향상시킬 수 있다.

  1. 더 많은 손실을 막는 전략

이동 중지 또는 진동 중지 설정할 수 있으며, 가격 반전 시 신속하게 중지하여 전략의 최대 회수량을 제어합니다.

  1. 재입학 조건

전략이 포지션에서 빠져 나간 후, 특정 재입장 조건을 설정할 수 있으며, 추세가 계속되면 다시 진입할 수 있다.

  1. 더 많은 지표와 함께

다른 변동성 지표, 거래량 지표 등과 같은 더 많은 다른 유형의 지표를 결합하여 의사 결정의 정확성을 높이기 위해 지표 통합 복합 전략을 구축 할 수 있습니다.

요약하다

이 전략은 브린 벨트, 칼킨 통로 및 동력 지표를 통합하고, 이러한 지표 관계를 판단하여, 성공률이 높은 돌파구 입지를 선택한다. 파라미터 최적화, 손해 방지 전략, 재입장 조건 및 복합 지표 통합과 같은 여러 측면에서 최적화 공간이 있으며, 전략 효과를 더욱 향상시킬 수 있다.

전략 소스 코드
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//All credits to LazyBear. All I did was turn it into a strategy!

strategy(title = "SQZMOM STRAT", overlay=false)

// --- GENERAL INPUTS ---
FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2020, title = "From Year", minval = 2012)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
FromDay   = 1
ToDay     = 1
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision)
trade_leverage = input(1, title = "Trade - Leverage", step = 0.25)
trade_risk     = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
tradeType   = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"])

// --- SQZMOM CODE

length = input(21, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = color.gray
if (val > 0 and val > nz(val[1]))
    bcolor := color.green
if (val < 0 and val < nz(val[1]))
    bcolor := color.red

scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray 
plot(val, color=bcolor, style=plot.style_histogram, linewidth=4)
plot(0, color=scolor, style=plot.style_cross, linewidth=2)

// --- VWMA CODE ---
useVWMA        = input(false, title = "Use VWMA to selectively long/short?", type = input.bool)
lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1)
useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?")
nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA)
medianSrc=close

calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares)

m=calc_evwma(medianSrc, lengthVWMA, nbfs)


// ---STRATEGY---
if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false))
    longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (longCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("LONG", strategy.long, qty = contracts, when = window())
        
if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false))
    shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (shortCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("SHORT", strategy.short, qty = contracts, when = window())

if (bcolor == color.gray)
    strategy.close("LONG")
    strategy.close("SHORT")