스프레시 모멘텀 브레이크업 전략

저자:차오장, 날짜: 2024-01-30 17:33:49
태그:

img

전반적인 설명

이것은 라지베어의 모멘텀 압축 지표에 기초하여 개발된 양적 거래 전략입니다. 이 전략은 여러 기술적 지표의 조합을 통해 높은 승률의 모멘텀 브레이크아웃 거래를 달성하기 위해 볼링거 밴드, 켈트너 채널 및 모멘텀 지표를 통합합니다.

전략 논리

이 전략의 핵심 지표는 LazyBear의 모멘텀 압축 지표이다. 이 지표는 볼링거 밴드가 채널에 의해 압축되고 있는지 여부를 결정한다. 압축이 발생하면 시장이 잠재적 인 폭발점에 진입했다는 것을 나타냅니다. 모멘텀 지표의 방향을 결합함으로써 압축이 풀릴 때 거래가 이루어질 수 있습니다.

특히, 전략은 먼저 가격의 2개의 표준편차의 너비로 21주기 볼링거 밴드를 계산한다. 동시에, 가격 진폭의 1.5배의 너비로 20주기 켈트너 채널을 계산한다. 볼링거 밴드가 켈트너 채널에 의해 압축될 때, 압축 신호가 유발된다. 또한, 전략은 또한 일정 기간 동안 자신의 가격 채널의 중간 지점과 비교하여 가격의 추진력을 계산한다. 압축이 발생하면, 추진력 지표의 방향성과 결합하여 구매 또는 판매 여부를 결정한다.

출구에 있어서, 모멘텀 지표의 색이 회색으로 변하면 압축 상태가 끝났고 트렌드가 역전될 수 있음을 나타냅니다.

장점

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

더 많은