이중 이동 평균 역전 거래 전략

저자:차오장, 날짜: 2023-12-04 16:39:13
태그:

img

전반적인 설명

이것은 이중 이동 평균 지표에 기반한 반전 거래 전략입니다. 다른 매개 변수 설정을 가진 이동 평균의 두 그룹을 계산하고 방향 변화에 따라 가격 트렌드를 판단함으로써 방향 변화에 대한 민감도 매개 변수를 설정하여 거래 신호를 생성 할 수 있습니다.

원칙

이 전략의 핵심 지표는 이중 이동 평균이다. 이 전략은 이동 평균의 종류 (SMA, EMA, 등), 길이 및 가격 소스 (닫기 가격, 전형적인 가격, 등) 를 선택할 수 있다. 이동 평균의 두 그룹을 계산한 후 반응 매개 변수를 정의하여 방향이 결정된다. 빠른 선이 느린 선 위에 넘어가면 구매 신호가 생성되고, 아래로 넘어가면 판매 신호가 생성된다. 반응 매개 변수는 전환점을 식별하기 위해 민감도를 조정하는 데 사용됩니다.

또한, 전략은 또한 잘못된 신호를 생성하지 않도록 방향의 변화와 지속적인 상승/하락을 결정하는 조건을 설정합니다. 그리고 그것은 다른 색상으로 가격의 상승과 하락을 시각화합니다. 가격이 계속 상승할 때, movavg 라인은 녹색으로 표시되며 가격이 떨어지면 빨간색으로 표시됩니다.

이점 분석

이중 모바브그 전략은 다른 매개 변수 설정과 함께 빠르고 느린 라인을 결합하여 거래 시장의 소음을 효과적으로 필터하고 더 강한 트렌드를 식별 할 수 있습니다. 단일 모바브그 전략과 비교하면 잘못된 신호를 줄이고 트렌드가 더 뚜렷할 때 시장에 진입하여 더 높은 승률을 얻을 수 있습니다.

반응 매개 변수는 전략이 유연하고 다른 주기와 품종에 적응 할 수있게합니다. 전략 프로세스는 직관적이고 간단하며 이해하기 쉽고 최적화됩니다.

위험 분석

이 전략의 가장 큰 위험은 전환점을 놓치고 돈을 잃거나 역행하는 것입니다. 이것은 반응 매개 변수 설정과 관련이 있습니다. 반응이 너무 작으면 잘못된 신호가 발생할 가능성이 있습니다. 반응이 너무 크면 더 나은 입구 지점을 놓칠 수 있습니다.

또 다른 위험은 손실을 효과적으로 통제할 수 없다는 것입니다. 가격이 격렬하게 변동할 때 손실을 빠르게 멈출 수 없으며 손실이 증가합니다. 이것은 위험을 제어하기 위해 스톱-로스 전략을 사용해야합니다.

최적화 방향

이 전략의 주요 최적화 방향은 반응 매개 변수, 이동 평균의 종류 및 길이를 선택하는 데 중점을 둔다. 적절한 반응을 증가하면 잘못된 신호를 줄일 수 있다. 이동 평균 매개 변수는 신호를 생성하기 위한 최상의 조합을 선택하기 위해 다른 주기와 품종에 따라 테스트 될 수 있다.

또한, RSI와 KD와 같은 다른 보조 지표로 거래 신호를 확인하는 것도 최적화 아이디어입니다. 또는 기계 학습 방법을 사용하여 매개 변수를 자동으로 최적화하십시오.

요약

전체적으로, 이 전략은 비교적 간단하고 실용적입니다. 이중 이동 평균과 함께 필터링하고 거래 신호를 생성함으로써, 트렌드 반전을 효과적으로 식별 할 수 있으며 전형적인 트렌드 추적 전략입니다. 매개 변수 포트폴리오를 최적화 한 후, 트렌드를 캡처하고 시장에 대한 포지션을 보유하는 능력이 향상됩니다. 스톱 로스 및 포지션 관리 메커니즘과 함께 사용하는 것이 더 잘 작동합니다.


/*backtest
start: 2023-11-03 00:00:00
end: 2023-12-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(shorttitle="MA_color strategy", title="Moving Average Color", overlay=true)

// === INPUTS

ma_type   = input(defval="HullMA", title="MA Type: ", options=["SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "ZEMA", "TMA", "SSMA"])
ma_len    = input(defval=32, title="MA Lenght", minval=1)
ma_src    = input(close, title="MA Source")
reaction  = input(defval=2, title="MA Reaction", minval=1)

// SuperSmoother filter
// © 2013  John F. Ehlers
variant_supersmoother(src,len) =>
    a1 = exp(-1.414*3.14159 / len)
    b1 = 2*a1*cos(1.414*3.14159 / len)
    c2 = b1
    c3 = (-a1)*a1
    c1 = 1 - c2 - c3
    v9 = 0.0
    v9 := c1*(src + nz(src[1])) / 2 + c2*nz(v9[1]) + c3*nz(v9[2])
    v9
    
variant_smoothed(src,len) =>
    v5 = 0.0
    v5 := na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len
    v5

variant_zerolagema(src,len) =>
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    v10 = ema1+(ema1-ema2)
    v10
    
variant_doubleema(src,len) =>
    v2 = ema(src, len)
    v6 = 2 * v2 - ema(v2, len)
    v6

variant_tripleema(src,len) =>
    v2 = ema(src, len)
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)              
    v7
    
variant(type, src, len) =>
    type=="EMA"     ? ema(src,len) : 
      type=="WMA"   ? wma(src,len): 
      type=="VWMA"  ? vwma(src,len) : 
      type=="SMMA"  ? variant_smoothed(src,len) : 
      type=="DEMA"  ? variant_doubleema(src,len): 
      type=="TEMA"  ? variant_tripleema(src,len): 
      type=="HullMA"? wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) :
      type=="SSMA"  ? variant_supersmoother(src,len) : 
      type=="ZEMA"  ? variant_zerolagema(src,len) : 
      type=="TMA"   ? sma(sma(src,len),len) : sma(src,len)


// === Moving Average
ma_series = variant(ma_type,ma_src,ma_len)

direction = 0
direction := rising(ma_series,reaction) ? 1 : falling(ma_series,reaction) ? -1 : nz(direction[1])
change_direction= change(direction,1)
change_direction1= change(direction,1)

pcol = direction>0 ? lime : direction<0 ? red : na
plot(ma_series, color=pcol,style=line,join=true,linewidth=3,transp=10,title="MA PLOT")

/////// Alerts ///////

alertcondition(change_direction,title="Change Direction MA",message="Change Direction MA")


longCondition = direction>0
shortCondition = direction<0
if (longCondition)
    strategy.entry("BUY", strategy.long)
if (shortCondition)
    strategy.entry("SELL", strategy.short)



더 많은