동적 모멘텀 인덱스 전략

저자:차오장, 날짜: 2023-09-14 16:15:42
태그:

전략 논리

이 전략은 동적 모멘텀 인덱스 (DMI) 를 기반으로 거래합니다. DMI는 트렌드를 결정하기 위해 가격과 다른 길이의 이동 평균 사이의 비율 오차를 측정합니다.

거래의 논리는 다음과 같습니다.

  1. 1차 DMI로 긴 MA (예: 200일) 의 가격의 비율 오차를 계산합니다.

  2. 중간 MA (예: 50일) 의 오차를 2차 DMI로 계산합니다.

  3. 짧은 MA (예: 20일) 에서의 오차를 3차 DMI로 계산합니다.

  4. 3차 DMI가 1차 DMI보다 높으면 하향, 3차 DMI가 2차 DMI보다 낮으면 상승.

  5. DMI 관계를 기반으로 생성된 트레이드 신호

MA 기간에 걸쳐 상대적 강도를 동적으로 비교함으로써 DMI는 트렌드 전환점을 식별하는 것을 목표로합니다. 매개 변수는 다른 주기에 최적화 될 수 있습니다.

장점

  • DMI는 안정성을 위해 여러 기간의 룩백을 결합합니다.

  • 상대적 강도와 절대적 강도를 비교합니다.

  • 시장 적응을 위한 유연한 MA 기간

위험성

  • DMI는 지연이 있고 반전을 놓칠 수 있습니다.

  • 기간 매개 변수들의 신중한 최적화

  • 여러 가지 잘못된 신호에 취약합니다.

요약

DMI는 다중 MA 기간 강도 역학을 비교하여 전환점을 판단합니다. 최적화는 다른 시장 환경에 맞을 수 있습니다. 그러나 지연 제한은 추가 필터를 필요로합니다.


/*backtest
start: 2023-08-14 00:00:00
end: 2023-09-13 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 31/06/2018
// The related article is copyrighted materialfrom Stocks & Commodities Dec 2009
// My strategy modification.
//
// You can change long to short in the Input Settings
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
strategy(title="CMOaDisparity Index Backtest")
LengthFirst = input(200, minval=1)
LengthSecond = input(50, minval=1)
LengthThird = input(20, minval=1)
ShowFirst = input(type=bool, defval=true)
ShowSecond = input(type=bool, defval=true)
ShowThird = input(type=bool, defval=true)
reverse = input(false, title="Trade reverse")
xEMAFirst = ema(close,LengthFirst)
xEMASecond  = ema(close,LengthSecond)
xEMAThird  = ema(close,LengthThird)
xResFirst = 100 * (close - xEMAFirst) / close
xResSecond = 100 * (close - xEMASecond) / close
xResThird = 100 * (close - xEMAThird) / close
pos = iff(xResThird > xResFirst, -1,
       iff(xResThird < xResSecond, 1, nz(pos[1], 0))) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1, 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	   	    
barcolor(possig == -1 ? red: possig == 1 ? green : blue ) 
plot(ShowFirst ? xResFirst : na, color=red, title="DIX 1")
plot(ShowSecond ? xResSecond : na, color=blue, title="DIX 2")
plot(ShowThird ? xResThird : na, color=green, title="DIX 3")

더 많은