더블 모멘텀 브레이크아웃 및 변동성 필터 양적 전략


생성 날짜: 2023-12-22 12:01:21 마지막으로 수정됨: 2023-12-22 12:01:21
복사: 0 클릭수: 825
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

더블 모멘텀 브레이크아웃 및 변동성 필터 양적 전략

개요

이 전략은 주로 트렌드를 식별하기 위해 가격의 이중 EMA 동력과 DEMA 동력을 교차하고 ATR 변동률 지표와 결합하여 가짜 돌파구를 필터링하여 이중 동력 지표와 변동률 필터링의 양적 거래 전략을 구현합니다.

전략 원칙

이 전략은 다음과 같은 부분들로 구성되어 있습니다.

  1. 가격을 계산하는 EMA와 DEMA는 이중 동력 지표로 다. 이 중 더 긴 기간의 EMA는 장기적인 트렌드를 반영하고, DEMA는 더 민감한 단기적인 동력 지표로 다. DEMA가 EMA를 통과하면 구매 신호를 생성한다.

  2. ATR 변동률 지표를 계산한다. ATR의 크기를 통해 시장의 변동률과 유동성을 판단한다. 변동률이 너무 커지면 변동량 지표의 신호를 필터링하여 가짜 돌파구를 피한다.

  3. ATR 변동률은 이동 평균을 변수화하여 높고 낮다는 것을 판단한다. ATR 변동률이 이동 평균보다 낮을 때, 운동량 지표 신호의 촉발을 허용한다.

  4. 매개 변수를 통해 ATR 시간 주기, ATR 길이, ATR 이동 평균 유형 및 길이를 제어하십시오.

  5. 다수 상점의 상쇄, 정지 및 추적 상쇄 규칙을 설정하십시오.

우위 분석

이 두 개의 EMA 필터링 전략은 일반적인 EMA 골드 포크 데드 포크 전략의 가짜 신호와 빈번한 거래를 현저하게 줄일 수 있습니다. ATR 변동률 지표가 추가되면 미세한 변동으로 인한 잘못된 신호를 효과적으로 필터링하여 잡히는 것을 피할 수 있습니다.

단일 동력 지표에 비해 이 전략은 쌍 지표 디자인을 적용하여 판단 효과를 높일 수 있다. 더 민감한 단기 동력 지표인 DEMA는 안정적인 긴 선 EMA와 함께 안정적인 조합 신호를 형성한다.

ATR 파라미터를 조정하여, 다른 스펙트럼의 물체에 대해 적절한 변동률 조건을 설정하여, 전략의 적용성을 향상시킬 수 있다.

위험 분석

이 전략의 가장 큰 위험은 잘못된 변수 설정이 거래 신호를 너무 희박하게 만들 수 있다는 것입니다. DEMA와 EMA 길이가 너무 길거나 ATR 변동률 경계가 너무 높게 설정되면 전략의 실제 운영 효과를 약화시킬 수 있습니다. 이것은 반복 테스트를 통해 최적의 변수 조합으로 조정해야합니다.

또 다른 잠재적인 위험은, 극단적인 상황에서는, 가격 변동이 ATR 파라미터의 제약을 뚫고 손실을 초래할 수 있다는 것입니다. 이것은 시장의 특이한 상황을 인적으로 감시하고, 전략 실행을 일시 중지하는 것이 필요합니다.

최적화 방향

  1. 다양한 모터 지표 파라미터 조합을 테스트하여 최적의 파라미터를 찾습니다.

  2. 동력 지표를 MACD 또는 다른 지표로 조정하기 위해 이중 EMA를 시도하십시오.

  3. 전체 역사 ATR, 시장 변동률 지수 등과 같은 다양한 변동률 지표 설정을 테스트하십시오.

  4. 거래량에 대한 필터링을 늘리고, 가격의 허위 돌파를 방지하기 위한 위험

  5. “이런 식으로, 우리는 우리의 모든 기술력을 활용하여,

요약하다

이 전략은 동적 지표와 변동률 분석을 통합하고, 견고한 이론적 기초에 의해 설계되었다. 매개 변수 조정과 규칙 최적화를 통해 안정적이고 신뢰할 수 있는 정량 거래 전략이 될 수 있다. 거래 신호는 명확하고, 위험은 제어할 수 있으며, 실습 검증 및 적용 가치가 있다.

전략 소스 코드
/*backtest
start: 2023-11-21 00:00:00
end: 2023-12-21 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/
// © Qorbanjf

//@version=4
strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true)

// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)

//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)


// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
//longLossPerc = input(title="Long Stop Loss (%)",
    // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01
longTrailPerc = input(title="Trail stop loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=50) * 0.01
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3000) / 100

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2017, title = "From Year", minval = 2000)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)


// ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30)

atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100

// Moving Average Logic
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))

// variables for enter position
enterLong = crossover(dema1, ema1) and atrp < maFilter

// variables for exit position
sale = crossunder(dema1, ema1)

// stop loss
//longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)

// trail stop
// Determine trail stop loss prices
longStopTrail = 0.0

longStopTrail := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopTrail[1])
else
    0
//Take profit Percentage
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

//Enter trades when conditions are met
strategy.entry(id="long",
 long=strategy.long,
 when=enterLong,
 comment="long")

//
strategy.close("long", when = sale, comment = "Sell")
//place exit orders (only executed after trades are active)

strategy.exit(id="sell",
 limit = longExitPrice,
 stop = longStopTrail,
 comment = "SL/TP")