볼린저 밴드 이동 평균 페어 트레이딩 전략


생성 날짜: 2023-11-24 15:32:57 마지막으로 수정됨: 2023-11-24 15:32:57
복사: 0 클릭수: 706
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

볼린저 밴드 이동 평균 페어 트레이딩 전략

개요

부린띠와 이동평준선을 교차하는 것을 거래 신호로 사용하여 시장의 추세를 자동으로 식별할 수 있는 양적 전략을 구현하고 스톱스톱 손실 규칙에 따라 거래를 수행합니다.

전략 원칙

이 전략은 주로 부린띠 지표와 이동평균 지표의 교차 신호를 기반으로 거래한다. 구체적으로, 그것은 동시에 부린띠 중간 궤도, 부린띠 위 궤도, 그리고 5 ~ 200 일 길이의 7 개의 이동 평균을 사용합니다. 가격이 아래에서 위쪽으로 부린띠 중간 궤도를 돌파 할 때 구매 신호를 발생; 가격이 위에서 아래로 부린띠 위 궤도를 돌파 할 때 판매 신호를 발생, 트렌드 추적을 구현한다.

또한, 전략은 moveToFract의 다공간 판단 지표를 도입한다. 이 지표는 단기 및 장기 이동 평균의 순서 배열을 계산하여 현재 시장의 움직임이 상향 또는 하향이라고 판단하여 충격적인 상황에서 잘못된 신호를 피한다. 마지막으로, 구성 가능한 스톱 스톱 손실 규칙과 결합하여 보다 완전한 트렌드 추적 거래 전략을 형성한다.

우위 분석

  1. 구성이 유연하며, 다양한 시장 환경에 맞게 사용자 정의 가능한 요소 조합
  2. 두 가지 다른 지표가 필터링으로 결합되어 잘못된 신호를 줄일 수 있습니다.
  3. 트렌드를 판단하는 지표는 흔들리는 시장을 역으로 조작하는 것을 피할 수 있다.
  4. 트래킹 중지 설정으로 수익을 극대화합니다.

위험 분석

  1. 과도한 거래를 피하기 위해 다른 주기에 따라 매개 변수를 적절하게 조정해야 합니다.
  2. 트래킹 스톱은 급격한 하락에서 손실을 확대할 수 있습니다.
  3. 충분한 자금을 확보해야 합니다. 그렇지 않으면 지속적인 손실의 위험을 감수할 수 없습니다.

최적화 방향

  1. 골든 크로스, 데드 포크의 판단을 추가하여 더욱 최적화 할 수 있습니다.
  2. 다양한 품종의 변수, 머신러닝 훈련에 가장 적합한 변수
  3. 동향이 흔들리는 것을 판단하기 위해 변동률 지수와 함께 풍력 조절을 강화합니다.

요약하다

이 전략은 전반적으로 매우 실용적인 트렌드 추적 전략이다. 그것은 지표의 교차를 사용하여 결정을 내리고, 트렌드 판단 모듈을 추가하여 잘못된 신호를 효과적으로 제거할 수 있다. 정지 중지 손실을 구성 한 후, 트렌드를 충분히 추적하여 거래를 할 수 있으며, 더 나은 수익을 얻을 수 있다. 파라미터 포지션을 조정하고 더 많은 필터를 추가함으로써, 이 전략은 더욱 최적화 될 수 있으며, 더 많은 시장 환경에 적응할 수 있으며, 많은 개선 공간과 응용 전망이 있다.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)

BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)

atrLength = input(22)
atrMult = input(6)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
    
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)

trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)

buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)

strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )