English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
MQL5 트레이딩 시스템과 윌리엄 블라우의 인디케이터. 파트 1: 인디케이터

MQL5 트레이딩 시스템과 윌리엄 블라우의 인디케이터. 파트 1: 인디케이터

MetaTrader 5트레이딩 시스템 | 5 7월 2021, 17:05
177 0
Andrey F. Zelinsky
Andrey F. Zelinsky

기술적 분석은 좋은 도구들이 뒷받침되어야만 가능해집니다.
현명한 투자자에게 필요한 도구는 경험, 판단력 그리고 훌륭한 자동 매매 프로그램이 제공하는 오퍼레이션 계층 구조이죠.
윌리엄 블라우

개요

첫 번째 파트는 윌리엄 블라우의 MQL5 인디케이터 및 거래 시스템에 관한 내용입니다. 파트 1: 윌리엄 블라우의 'Momentum, Direction, and Divergence'에 따르면 인디케이터는 인디케이터와 오실레이터에 대한 설명이다. .

본문의 인디케이터와 오실레이터의 MQL5 소스 코드는 아카이브 내 'Blau_Indicators_MQL5_en.zip' 파일에 첨부되어 있습니다.

윌리엄 블라우가 제시하는 분석의 핵심

윌리엄 블라우의 기술적 분석은 다음의 네 단계로 구성됩니다.

  1. 박스권 데이터(q 바)를 이용하여 계산된 인디케이터가 차트에 나타납니다. 인디케이터는 가격 변동의 전반적 추세를 반영하지 않으며 추세 반전 지점 또한 판단할 수 없습니다.
  2. 인디케이터는 EMA 메소드를 사용하여 여러 번 평활화 됩니다. 기간 r, 기간 s, 그리고 기간 u를 거쳐 평활화된 인디케이터가 그려집니다. 평활화된 인디케이터는 지연이 최소화된 가격 변동을 꽤 정확하게 재현합니다. 가격 움직임의 추세와 반전 지점을 파악할 수 있으며 노이즈를 제거합니다.
  3. 평활화된 인디케이터는 정규화되며, 정규화된 인디케이터가 그려집니다. 정규화를 통해 인디케이터 값이 과매수 또는 과매도 상태로 해석됩니다.
  4. 정규화된 인디케이터는 EMA 메소드로 한 번 평활화됩니다(기간 ul). 이때 오실레이터가 생성되며, 인디케이터 히스토그램과 신호선, 시장의 과매수 및 과매도 정도가 추가됩니다. 오실레이터를 통해 시장의 과매수/과매도 상태와 반전 지점, 그리고 추세의 끝을 판단할 수 있습니다.

인디케이터

이 글에는 다음의 인디케이터에 대한 정보가 포함되어 있습니다.

  1. 모멘텀 기반 인디케이터
  2. 스토캐스틱 기반 인디케이터
  3. 스토캐스틱 모멘텀 기반 인디케이터
  4. 시장 추세 평균 편차 기반 인디케이터
  5. MACD 기반 인디케이터
  6. 캔들 모멘텀 기반 인디케이터
  7. 지수 고점-저점 모멘텀 기반 인디케이터

각 인디케이터 그룹별로 다음에 대한 설명이 포함됩니다.

  • 평활화 인디케이터 인덱스
  • 정규화된 평활화 인디케이터 인덱스
  • 정규화된 평활화 인덱스 기반 오실레이터

TSI 섹션은 다음의 내용을 포함합니다.

  • 가격 차트에 대한 기술적 분석 차원에서 본 윌리엄 블라우식 접근법의 상세 분석
  • 모멘텀 기반 인디케이터 그룹 인디케이터에 대한 상세 알고리즘 설명 및 코드

윌리엄 블라우는 평활화 메소드로 지수 이동 평균(EMA)을 사용합니다. 지수 이동 평균은 이동 평균의 최근 값에 현재 가격을 특정 비율 더하여 계산됩니다.

EMA를 사용하면 최근 가격에 더 높은 가중치가 있는 것이죠.

EMA 계산 함수는 다음과 같습니다.

EMA(k,n) = EMA(k-1,n) + 2/(n+1) * (price(k) - EMA(k-1,n))
         = price(k) * 2/(n+1) + EMA(k-1,n) * (1 - 2/(n+1))

좀 더 설명해 볼게요.

  • EMA(k,n)-기간 k 동안 기간 n에 대한 지수 이동 평균
  • price(k)-기간 k의 가격

4가지 유형의 이동 평균에 대한 설명 및 기술적 분석 적용법(iMA 참조)은 'MetaTrader5 도움말'에서 찾아볼 수 있습니다('분석/테크니컬 인디케이터/추세 인디케이터/이동 평균').

함수 라이브러리

이동 평균 계산 함수 라이브러리는 'MovingAverages.mqh'에서 찾아볼 수 있습니다. buffer[] 출력 배열을 price[] 입력 배열의 EMA 값으로 채우는 ExponentialMAOnBuffer() 함수에 관심이 가는데요. 'MovingAverages.mqh' 파일에 구현된 ExponentialMAOnBuffer() 함수는 기간 n이 1일 때 작동하지 않는다는 단점을 갖고 있습니다.

소스 코드를 확인하세요.

if(period<=1 || rates_total-begin<period) return(0);

그러나 윌리엄 블라우는 그의 저서에서 평활화 기간 n이 1인 경우 평활화가 일어나지 않는 것이라고 이야기하죠.

따라서 ExponentialMAOnBuffer() 함수 코드는 조금 수정되었습니다.

if(period<1 || rates_total-begin<period) return(0);

덕분에 ExponentialMAOnBufferWB() 함수가 새로 생겼죠. 해당 함수 코드는 'WilliamBlau.mqh'에서 찾아볼 수 있습니다.

'WilliamBlau.mqh'에는 다음의 함수 또한 포함되어 있습니다.

  • PriceName() 함수는 가격 유형을 문자열로 반환합니다.
string PriceName(
                 const int applied_price // price type
                )
  • CalculatePriceBuffer() 함수는 해당 가격 유형의 가격 배열을 계산합니다.
int CalculatePriceBuffer(
                         const int applied_price,   // price type
                         const int rates_total,     // rates total
                         const int prev_calculated, // bars, processed at the last call
                         const double &Open[],      // Open[]
                         const double &High[],      // High[]
                         const double &Low[],       // Low[]
                         const double &Close[],     // Close[]
                         double &Price[]           // calculated prices array
                        )

적용된 가격 유형 및 가격 차트 타임프레임

윌리엄 블라우는 종가를 일간 타임프레임으로 간주합니다. 본문의 인디케이터를 사용하면 가격 유형(가격 상수 참조)을 선택할 수 있으며 가격 차트의 타임프레임은 인디케이터의 타임프레임에 따라 상이합니다(차트 타임프레임 참조).

 

1. TSI

다음의 인디케이터를 포함합니다(첨부파일 참조).

  1. Blau_Mtm.mq5 -금리 인디케이터(q-기간 모멘텀, 평활화 q-기간 모멘텀)
  2. Blau_TSI.mq5-TSI(정규화된 평활화 q-기간 모멘텀)
  3. Blau_Ergodic.mq5-에르고딕 오실레이터(TSI 기반).

1.1. 모멘텀

내장된 테크니컬 인디케이터인 모멘텀에 대한 설명 및 기술적 분석 적용법은 'MetaTrader5 도움말'에서 찾아볼 수 있습니다'분석/테크니컬 인디케이터/오실레이터/모멘텀'(iMomentum 참조). 표준 모멘텀(iMomentum)과는 달리 윌리엄 블라우는 모멘텀을 절대적 가격 변화로 계산합니다.

윌리엄 블라우의 TSI가 MQL5에서 구현된 예제는 관련 자료의 'MQL5: Create Your Own Indicator'에 소개되어 있습니다.


1.1.1. 모멘텀 인디케이터를 이용한 기술적 분석

기술적 분석은 금융상품의 가격 차트를 대상으로 합니다. 차트 내 각각의 요소는 가격을 나타내는 가 됩니다. 각 바는 다음의 특성을 갖습니다. 개장 시간, 시가, 최고가, 최저가, 종가, 거래량기타. 가격 바는 특정 개별 기간의 가격 움직임을 반영하여 형성됩니다(타임프레임 차트).

가격 차트 기술적 분석의 목표는 현재 가격 추세를 판단하고, 고가와 저가를 계산하고, 앞으로의 가격 변동 방향을 예측하는 것입니다. 이는 가격이 기본적인 경향의 한계 내에서 움직이면서도 여러 방향 변동을 일으켜 노이즈를 발생시킨다는 점에서 복잡해지죠.

윌리엄 블라우의 제안. 첫 번째 차이점: 모멘텀. 윌리엄 블라우는 [일간] [종가]에 따라 모멘텀을 계산하여 모멘텀 인디케이터를 만들었습니다. 수학적인 관점에서 모멘텀 함수는 가격의 첫 파생 값이 됩니다.

그림 1.1. 모멘텀 인디케이터(q-기간 모멘텀)

그림 1.1. 모멘텀 인디케이터(q-기간 모멘텀)

모멘텀은 1일 동안의 가격 변동과 가격 변동의 속도(크기) 및 방향을 나타내지만 가격 변동의 전반적인 추세를 반영하지는 않으며 추세 반전 지점 또한 파악하지 않습니다.

두 번째 차이점은 평활화입니다. 모멘텀 이동 평균(일간 가격 변동 누계)은 가격 곡선 내 주요 변동과 국부적 변동을 거의 정확하게 재현합니다. 그림 1.2 (a)의 서브 창 I, II에 평활화된 모멘텀(각각 기간이 20과 300인 이동 평균)이 나타나 있습니다.

이동 평균 기간이 클수록 평활화된 모멘텀이 가격 곡선 이동을 더 정확하게 예측하거나 재현합니다. 수학적인 관점에서 모멘텀 평활화 함수는 모멘텀의 정함수 또는 가격의 복원 함수가 됩니다.

그림 1.2 (a). 모멘텀 인디케이터(평활화 q-기간 모멘텀)

그림 1.2 (a). 모멘텀 인디케이터(평활화 q-기간 모멘텀)


그림 1.2 (b). 모멘텀 인디케이터(평활화 q-기간 모멘텀)

그림 1.2 (b). 모멘텀 인디케이터(평활화 q-기간 모멘텀)


그림 1.2 (a)의 메인 창에 EMA 평활화(차례대로 기간이 5, 20, 100) 인디케이터가 나타나 있습니다. 이동 평균 기간이 약간 증가하면 지연이 발생하며 이로 인해 이동 평균은 가격 곡선의 변동을 재현할 수 없게 됩니다.

세 번째 차이점은 재평활화입니다. 모멘텀의 최초 평활화는 반전 지점과 가격 변동 추세를 정의하지만 노이즈를 제거하지는 못합니다. 노이즈 제거를 위해서는 이동 평균 내 짧은 기간에 대한 재평활화가 필요합니다.

그림 1.2 (b)의 서브 창 I은 평활화된 모멘텀 인디케이터(이동 평균 기간 20)가, 서브 창 II와 III에는 각각 재평활화, 재재평활화된 모멘텀(이동 평균 기간 5, 3)이 나타나 있습니다. 반복적인 평활화는 노이즈를 제거하지만 곡선에 약간의 지연을 발생시킵니다.

네 번째 차이점은 변화하는 추세 시그널입니다. 평균화 기간이 짧은 모멘텀의 평활화는 가격 곡선 추세의 다이버전스를 야기할 수 있습니다.

이러한 차이는 그림 1.2 (a)의 서브 창 I과 그림 1.2 (b)의 서브창 I, II, III(가격 변화 방향과 평활화된 모멘텀의 가격 변화 방햐이 상이)에서 확인할 수 있습니다. 이러한 차이는 종종 추세 변화를 나타내기도 하는데요. 수학적인 관점에서 다이버전스는 평활화 기간 함수입니다.

과매수 또는 과매도 영역 내 다이버전스만을 고려할 경우 이러한 차이의 추세 변화 시그널로서의 신뢰도를 높일 수 있습니다(п. 1.2.1 참조).


1.1.2. 모멘텀의 정의

모멘텀상대적인 가격 변동입니다.

긍정적 모멘텀은 기간 중 가격 상승을, 부정적 모멘텀은 기간 중 가격 하락을 나타냅니다. 모멘텀의 크기는 가격 변동의 상대적 속도(가격의 첫 파생 값)입니다.

그림 1.3. 모멘텀의 정의

그림 1.3. 모멘텀의 정의

모멘텀 공식:

mtm(price) = price - price[1]

좀 더 설명해 볼게요.

  • price-현재 기간의 가격 [종가]
  • price [1]-직전 기간의 가격 [종가]

윌리엄 블라우는 모멘텀을 현재 종가와 직전 종가의 차이로 설명합니다. 윌리엄 블라우는 단일 기간 모멘텀 계산에 기간(현재 및 직전)의 가격을 이용합니다.

우리는 모멘텀 계산 공식에 기간 인디케이터를 추가합니다. q는 계산에 포함된 기간의 개수이며 윌리엄 블라우는 이를 2로 설정합니다.

q-기간 모멘텀 공식:

mtm(price,q) = price - price[q-1]

좀 더 설명해 볼게요.

  • q- 모멘텀 계산에 사용되는 바의 개수
  • price-현재 기간의 가격 [종가]
  • price [q-1]-(q-1) 기간 전의 가격 [종가]

결과적으로 우리의 2기간 모멘텀은 윌리엄 블라우의 단일 기간 상대적 모멘텀과 동일하게 나타납니다.

평활화 q-기간 모멘텀 공식:

Mtm(price,q,r,s,u) = EMA(EMA(EMA( mtm(price,q) ,r),s),u)

좀 더 설명해 볼게요.

  • price-가격 차트 기준 가격 [종가]
  • q-모멘텀 계산에 사용되는 바의 개수
  • mtm(price,q)=price-price[q-1]-q-기간 모멘텀
  • EMA (mtm (price, q), r)-최초 평활화-EMA(r)이 q-기간 모멘텀에 적용
  • EMA (EMA(..., r),s)-재평활화-EMA(s)가 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-EMA(u)가 재평활화 결과에 적용

1.1.3. Mtm(price,q,r,s,u)-금리 인디케이터(모멘텀). 특징
  • 파일명: Blau_Mtm.mq5
  • 이름: 윌리엄 블라우의 모멘텀(q-기간 모멘텀, 평활화 q-기간 모멘텀)
  • 입력 변수:
    • q-모멘텀이 계산되는 기간(디폴트 값 2)
    • r-모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 EMA 평활화는 사용되지 않음 예: Mtm(price, 2,20,5,1)의 경우 재평활화된 모멘텀, Mtm(price, 2,1,1,1)의 경우 평활화되지 않은 모멘텀
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

1.2. TSI

1.2.1. TSI를 이용한 기술적 분석

계속: 시작은 1.1.1 참조.

다섯 번째 차이점은 정규화입니다.평활화된 모멘텀 값의 정규화를 단일 척도(매핑 인터벌 [-1, +1])로 가져오면 시장의 과매수 또는 과매도 상태를 판단할 수 있습니다. 정규화된 평활화 모멘텀 값을 100배 증가시키면 백분율 범위의 수치 급수가 변환됩니다(매핑 인터벌 [-100, 100]).

그림 1.4. 정규화된 평활화 모멘텀

그림 1.4. 정규화된 평활화 모멘텀


정규화된 평활화 모멘텀이 과매수 또는 과매도 상태인 경우 러한 차이의 추세 변화 시그널로서의 신뢰도를 높일 수 있습니다.


1.2.2. TSI의 정의

TSI-정규화 모멘텀(정규화된 q-기간 모멘텀) 인디케이터 평활화된 모멘텀 값을 단일 척도(매핑 인터벌 [-1, +1])로 가져오면 평활화 모멘텀의 각 값(평활화된 q-기간 가격 변동 누계)이 평활화 모멘텀의 절대 값으로 정규화됩니다.

이를 100으로 곱하면 디스플레이 인터벌이 [-100, +100](퍼센트)로 변경됩니다. 정규화된 TSI 값은 시장의 과매수(+) 또는 과매도(-) 정도를 나타냅니다.

TSI 공식:

                     100 * EMA(EMA(EMA( mtm(price,q) ,r),s),u)         100 * Mtm(price,q,r,s,u)
TSI(price,q,r,s,u) = –––––––––––––––––––––––––------–––––––––– = ––––––––––––––––------–––––––––––––––
                       EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)     EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)
if EMA(EMA(EMA(|mtm(price,q)|,r),s),u)=0, then TSI(price,q,r,s,u)=0

좀 더 설명해 볼게요.

  • price-가격 차트 기준 가격 [종가]
  • q-모멘텀 기간
  • mtm(price,q)=price-price[q-1]-q-기간 모멘텀
  • |Mtm(price,q)|-q-기간 모멘텀의 절대값
  • Mtm(price, q, r, s, u) -재재평활화 q-기간 모멘텀
  • EMA (..., r)-최초 평활화-다음에 적용되는 r 기간 EMA1) q-기간 모멘텀
    2) q-기간 모멘텀의 절대값
  • EMA (EMA(..., r),s)-재평활화-EMA(s)가 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-EMA(u)가 재평활화 결과에 적용

1.2.3. TSI(price,q,r,s,u)-TSI. 특징
  • 파일명: Blau_TSI.mq5
  • 이름: 윌리엄 블라우의 TSI(정규화된 상대적 q-기간 평활화 모멘텀)
  • 입력 변수:
    • q-모멘텀이 계산되는 기간(디폴트 값 2)
    • r-모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
    • (선택) 2개 레벨 (디폴트 값 -25, +25)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

1.3. 에르고딕 오실레이터

1.3.1. 에르고딕 오실레이터를 이용한 기술적 분석

계속 1.1.1, 1.2.1.

여섯 번째 차이점은 시장의 과매수 및 과매도 영역입니다. 정규화된 평활화 모멘텀 값에 변화가 발생하는 유닛 인터벌 [-1, +1] 또는 백분위 인터벌 [-100, +100]을 이용하면 과매수 또는 과매도 영역을 정의할 수 있습니다.

과매수 또는 과매도 상태를 특징하는 기술적 분석 인덱스 클래스를 오실레이터라고 합니다. 각 오실레이터에 정해진 레벨에 대한 근접성을 바탕으로 과매수 또는 과매도 신호가 수신됩니다. 오실레이터는 장기간 과매수 또는 과매도 상태가 유지될 수 있는 추세장에서는 비효과적입니다.

일곱 번째는 신호선입니다. 신호선은 추세의 끝 또는 가격 변동의 반전 지점을 알립니다. 매수 신호는 기준선이 아래에서 위로 신호선과 교차할 때 나타납니다. 매도 신호는 기준선이 위에서 아래로 신호선과 교차할 때 나타납니다. 에르고딕(TSI)에 기준선이 있는 경우, 에르고딕의 재평활화가 신호선을 생성합니다. 재평활화 과정은 에르고딕 평활화의 마지막 프로세스입니다.

여덟 번째는 가격 변동 추세입니다. 기준선(에르고딕)이 신호선 위로 지나갈 때 가격 움직임은 상승 추세입니다. 기준선(에르고딕)이 신호선 아래로 지나갈 때의 가격 움직임은 하락 추세가 되고요.

그림 1.5. 에르고딕 오실레이터

그림 1.5. 에르고딕 오실레이터


1.3.2. 에르고딕 오실레이터의 정의

Ergodic(price,q,r,s,u) = TSI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( Ergodic(price,q,r,s,u) ,ul)

좀 더 설명해 볼게요.

  • Ergodic()-에르고딕-TSI(price,q,r,s,u);
  • SignalLine()-신호선-EMA(ul)가 에르고딕에 적용
  • ul-신호선의 EMA 기간-윌리엄 블라우는 ul 값이 EMA 에르고딕의 직전 유의미(>1)한 기간 값과 동일해야 한다고 주장 예를 들어, 재재평활화된 에르고딕인 Ergodic(price, 2,20,5,1)을 사용하는 경우, 윌리엄 블라우에 따르면 ul=2=5

1.3.3. Ergodic(price, q,r,s,u,ul)-에르고딕 오실레이터. 특징
  • 파일명: Blau_Ergodic.mq5
  • 이름: 윌리엄 블라우의 에르고딕 오실레이터(TSI 기반)
  • 입력 변수:
    • 그래픽 플롯 #0-에르고딕(TSI)
      • q-모멘텀이 계산되는 기간(디폴트 값 2)
      • r-모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
      • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
      • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • 그래픽 플롯 #1-신호선
      • ul-에르고딕에 적용되는 EMA 기간 신호선(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
    • 2개 레벨 (디폴트 값 -25, +25)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 EMA 평활화는 사용되지 않음
    • ul>0. ul이 1일 때 신호선과 에르고딕선이 동일
    • 가격 배열 최소 크기=(q-1 + r + s + u + ul-4 +1)

1.4. 코드(상세 설명)

1.4.1. 'Blau_Mtm.mq5'-Mtm(price,q,r,s,u) 인디케이터-모멘텀

Mtm(price,q,r,s,u) 인디케이터 코드

//+------------------------------------------------------------------+
//|                                                     Blau_Mtm.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window     // indicator in a separate window
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots
//--- main graphic plot #0
#property indicator_label1  "Mtm"       // graphic plot label #0
#property indicator_type1   DRAW_LINE   // draw as a line
#property indicator_color1  Blue        // color
#property indicator_style1  STYLE_SOLID // line style - solid line
#property indicator_width1  1           // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA
//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes
int    rates_total_min; // total rates min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // plot buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
   // buffers for intermediate calculations
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");             // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // applied price
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[] arrays
                        PriceBuffer          // price buffer
                       );
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

코드를 자세히 살펴봅시다.


1.4.1.1. 인디케이터 설정 Mtm(price,q,r,s,u)

참고문헌

MQL5 레퍼런스 내 인디케이터 세팅 관련 글:

  1. '커스텀 인디케이터' 섹션.
  2. 인디케이터 및 해당 함수의 속성의 관계('커스텀 인디케이터' 참조).
  3. 프로그램 속성(# property)('언어기본/전처리기' 참조)
  4. 렌더링 스타일(그래픽 플롯 속성)('표준 상수, 열거형, 구조 및 인디케이터 상수' 참조)
  5. 커스텀 인디케이터 속성('표준 상수, 열거형, 구조 및 인디케이터 상수' 참조)
저작권 인디케이터 설명
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description

#property 전처리기 지시문으로만 설정 가능 저작권(매개 변수 copyrightlink), 버전(매개 변수 version) 및 MQL5 프로그램에 대한 설명(매개 변수 description)은 인디케이터 창이 '속성' 탭에서 확인할 수 있습니다('속성' 탭의 '추가' 상자).

첨부 파일
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)

전처리기#Include <WilliamBlau.mqh> 라인을 'WilliamBlau.mqh' 파일 내 컨텐츠로 대체합니다. 화살괄호는 'WilliamBlau.mqh' 파일이 터미널 데이터 폴더에서 불려올 것임을 의미합니다. 더 많은 정보는 첨부 파일에서 확인하세요.

'WilliamBlau.mqh' 파일에 대한 정보는 개요를 참조하세요.

인디케이터 설정(개괄)

커스텀 인디케이터는 몇 가지 그래픽 플롯으로 이루어집니다. 인디케이터의 그래픽 플롯은 가격 차트 메인 창 또는 별도의 창에 표시됩니다. 각각의 그래픽 플롯은 고유의 드로잉 메소드, 색깔, 스타일 및 굵기를 가집니다.

그래픽 플롯 렌더링을 위한 데이터는 인디케이터 버퍼에서 추출됩니다(각 그래픽 플롯이 1~5개의 인디케이터 버퍼에 해당). 인디케이터 배열을 인디케이터 버퍼로 사용합니다.

인디케이터 설정 방법은 다음과 같습니다(그림 1.6 참조).

  1. 인디케이터가 나타나는 창을 설정합니다.
  2. 그래픽 플롯의 개수를 설정합니다.
  3. 인디케이터 버퍼의 개수를 설정합니다.
  4. 인디케이터 배열을 선언합니다.
  5. 링크 설정: 인디케이터 배열 -> 인디케이터 버퍼 -> 그래픽 플롯
  6. 그래픽 플롯별 속성을 설정합니다.
  7. 인디케이터 값의 디스플레이 설정을 입력합니다.
  8. 각 그래픽 개체별 그래픽 렌더링 전 바의 개수를 설정합니다.
  9. 높이를 설정하고 각 높이의 속성을 설정합니다(없음.)
  10. 별도의 인디케이터 창에 대한 척도 제한을 설정합니다(없음.)
  11. 인디케이터에 이름을 붙입니다.

그림 1.6. 모멘텀 인디케이터 Mtm(price,q,r,s,u)

그림 1.6. 모멘텀 인디케이터 Mtm(price,q,r,s,u)


인디케이터 설정은 다음 중 하나로 실행됩니다.

더 많은 정보는 'Connection between Indicator Properties and Corresponding Functions'에서 확인하세요..

두 방법은 #property 지시문은 인디케이터가 가격 차트에 추가되기 전에 사용할 수 있다는 것이고, 특수 함수는 인디케이터가 가격 차트에 추가된 에 사용할 수 있다는 점에 차이가 있습니다. 설정의 컨피규레이션은 인디케이터의 '속성' 창에서 실행됩니다.

설정: 인디케이터 디스플레이 창(1)
#property indicator_separate_window     // indicator in a separate window

컨피규레이션은 필수적이며 오로지 #property 전처리기 지시문으로만 설정 가능합니다. 인디케이터 디스플레이에는 두 가지 옵션이 있습니다.

  1. 가격 차트 메인 창-indicator_chart_window
  2. 별도의 창-indicator_separate_window
설정: 버퍼(3) 및 그래픽 플롯(2) 개수
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots

컨피규레이션은 필수적이며 오로지 #property 전처리기 지시문으로만 설정 가능합니다. 인디케이터 버퍼의 수(매개 변수 indicator_buffers)와 그래픽 플롯의 수(매개 변수 indicator_plots)에는 제한이 없습니다.

세팅: 인디케이터 배열(4)
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA

인디케이터 배열은 전역 수준에서 double형 1차원 동적 배열로 선언됩니다.

설정: 인디케이터 배열, 인디케이터 버퍼 및 그래픽 플롯 간 링크 설정하기(5)
// graphic plot #0
SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
// buffers for intermediate calculations
SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA

코드는 Init 이벤트 핸들러의 OnInit() 함수에 작성됩니다.

인디케이터 버퍼와 해당하는 1차원 배열 사이의 링크는 SetIndexBuffer() 함수로 설정됩니다.

bool SetIndexBuffer(
   int                 index,    // index of the indicator buffer (starts from 0)
   double              buffer[], // dynamic array
   ENUM_INDEXBUFFER_TYPE data_type // type of data, stored in the indicator array
   );

인디케이터 버퍼는 클라이언트 터미널에 의해 그 크기가 인디케이터가 계산되는 바의 개수로 통제되는 <a2>double</a2>형 1차원 동적 배열입니다. 인디케이터 버퍼의 인덱세이션은 0에서 시작합니다.

인디케이터 버퍼는 세 가지 데이터 형식INDICATOR_DATA, INDICATOR_COLOR_INDEX, INDICATOR_CALCULATIONS를 저장합니다. 각 그래픽 플롯은 디스플레이 메소드에 따라 1~5개의 인디케이터 버퍼와 상응하게 됩니다. 1~4개의 인디케이터 버퍼 값(자료형 INDICATOR_DATA), 그리고 한 개의 컬러 버퍼(자료형 INDICATOR_COLOR_INDEX)가 생성됩니다.

자료형이 INDICATOR_CALCULATIONS인 인디케이터 버퍼는 중간 계산을 위해 고안되었습니다. 바인딩이 끝나면 해당 인디케이터 배열 또한 일반적인 배열과 마찬가지로 인덱세이션을 진행합니다(1.4.1.2 참조).

세팅: 그래픽 플롯 속성(6)

각 그래픽 플롯 세트의 컨피규레이션에는 다음이 지정됩니다.

  1. 라벨
  2. 드로잉 타입(ENUM_DRAW_TYPE 열거형에서 총 18가지 타입 확인 가능)
  3. 선 색깔
  4. 선 스타일(ENUM_LINE_STYLE 열거형에서 모든 타입 확인 가능)
  5. 선 굵기

다음의 두 가지 방법이 있습니다.

1) #property 전처리기 지시문(해당 방법으로 구현)

//--- graphic plot #0 (Main)
#property indicator_label1  "Mtm"       // label of graphic plot #0
#property indicator_type1   DRAW_LINE   // Drawing type: DRAW_LINE - line
#property indicator_color1  Blue        // Line color - Blue
#property indicator_style1  STYLE_SOLID // Line style: STYLE_SOLID - solid line
#property indicator_width1  1           // Line width

2) 그래픽 플롯 속성을 설정하는 함수 그룹PlotIndexSetDouble(), PlotIndexSetInteger()PlotIndexSetString() 함수 이용

//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");            // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);       // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);          // line width

코드는 Init 이벤트 핸들러의 OnInit() 함수에 작성됩니다. PlotIndexSet *() 함수 사양

bool PlotIndexSetDouble|Integer|String(
   int                             plot_index, // index of the graphic plot
   int                             prop_id,    // identifier of the property of the graphic plot
   double|int,char,bool,color|string  prop_value  // new value of the property
   );

ENUM_PLOT_PROPERTY 열거형에 포함된 그래픽 플롯의 속성 ID를 이용해 선택된 그래픽 플롯 형태의 디스플레이를 세부 설정합니다.

그래픽 플롯의 인덱세이션은 0에서 시작합니다. #property 지시문을 통한 컨피규레이션이 선호되는 이유는 위의 '인디케이터 선호도' 섹션을 참고하세요. 그래픽 플롯의 몇몇 속성(색깔, 스타일, 선 굵기)는 인디케이터의 '속성' 창('컬러' 탭)에서도 설정 가능합니다.

설정: 인디케이터 값 디스플레이 정밀 설정​​(7)
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

코드는 Init 이벤트 핸들러의 OnInit() 함수에 작성됩니다. IndicatorSet * () 인디케이터 세팅 컨피규레이션 함수 사양

bool IndicatorSetDouble|Integer|String(
   int                    prop_id,   // ID of indicator property
   double|int,color|string  prop_value // new value of a property
   );

식별자 및 인디케이터 속성은 ENUM_CUSTOMIND_PROPERTY 열거형에 포함되어 있습니다.

인디케이터 값 출력 설정은 IndicatorSetInteger() 함수로, 인디케이터 속성 ID는 INDICATOR_DIGITSENUM_CUSTOMIND_PROPERTY_INTEGER 열거형으로만 가능합니다.

렌더링하고자 하는 인디케이터 버퍼 값이 표시되어 있을 때 마우스 포인터를 인디케이터 라인에 가져다 대면 인디케이터가 추가된 금융상품의 가격이 _Digits에 표시된 소수점의 개수로 올림하여 팝업됩니다.

설정: 렌더링 전 바의 개수(8)

윌리엄 블라우의 q-기간 모멘텀 렌더링 데이터는 네 가지 단계로 구성됩니다.

스텝 1. PriceBuffer[] 가격 배열 데이터를 기반으로 모멘텀(기간 q)이 계산됩니다. q-기간 모멘텀 값이 MtmBuffer[] 배열에 저장됩니다. 가격 배열의 인덱세이션이 0에서 시작하므로 가격 배열 내 유의미한 데이터 또한 인덱스 0에서 시작하고, MtmBuffer[] 배열의 유의미한 데이터는 인덱스 (q-1)에서 시작합니다.

스텝 2. MtmBuffer[] 배열 내 유의미한 데이터가 평활화됩니다(평활화 기간 r). q-기간 평활화 모멘텀 값은 EMA_MtmBuffer[] 배열에 저장됩니다. MtmBuffer[] 배열의 인덱세이션이 0에서 시작하므로 MtmBuffer[] 버퍼의 유의미한 데이터는 인덱스 (q-1)에서, EMA_MtmBuffer[] 배열의 유의미한 데이터는 인덱스 (q-1) + (r-1)에서 시작합니다.

스텝 3 & 스텝 4. DEMA_MtmBuffer[] 배열(평활화 기간 s)과 MainBuffer[] 배열(평활화 기간 u) 내 어떤 바에서 유의미한 데이터가 시작되는지 판단하는 방법도 이와 유사합니다. 그림 1.7을 참고하세요.

그림 1.7. Mtm(price,q,r,s,u) 인디케이터의 유의미한 데이터

그림 1.7. Mtm(price,q,r,s,u) 인디케이터의 유의미한 데이터


전역 수준에서 변수가 선언됩니다.

//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes

변수의 값은 상응하는 변수 인디케이터 배열 내 바의 유의미한 데이터가 시작되는 인덱스 값이 됩니다. 변수 값은 Init 이벤트 핸들러의 OnInit() 함수에서 계산되어 Calculate 이벤트 핸들러의 OnCalculate() 함수에 사용됩니다.

//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);

그래픽 플롯에 나타나지 않는 초기 바 개수는 PlotIndexSetInteger() 함수로 설정되며, 인디케이터 속성 식별자는 PLOT_DRAW_BEGIN, 열거형은 ENUM_PLOT_PROPERTY_INTEGER입니다.

컨피규레이션: 인디케이터 별명 짓기(11)
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");

코드는 Init 이벤트 핸들러의 OnInit() 함수에 작성됩니다. 인디케이터 별명은 IndicatorSetString() 함수를 통해서만 설정 가능합니다. 인디케이터 속성 식별자는 INDICATOR_SHORTNAME(ENUM_CUSTOMIND_PROPERTY_STRING 열거형)입니다. PriceName () 함수는 입력 변수 AppliedPrice의 값에 따른 가격 타입의 명칭을 반환합니다. PriceName () 함수 코드는 'WilliamBlau.mqh' 파일에 포함되어 있습니다.

입력 변수
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type

더 많은 정보는 입력 변수에서 확인하세요. 입력 변수는 인디케이터의 '속성' 창('입력' 탭)에서 수정할 수 있습니다.


1.4.1.2. 인디케이터 모멘텀(price,q,r,s,u) 계산

계산: 알고리즘

Mtm(price,q,r,s,u) 인디케이터 계산 알고리즘

  1. 인디케이터 계산에 필요한 데이터가 충분한지 확인하세요.
  2. 특정 가격 타입에 따른 가격 배열 계산-PriceBuffer[] 배열 형성
  3. q-기간 모멘텀이 계산되는 인덱스 바 설정
  4. q-기간 모멘텀 계산-MtmBuffer[] 배열 완성
  5. EMA 메소드(기간 r)를 이용한 최초 평활화-EMA_MtmBuffer[] 배열 완성
  6. EMA 메소드(기간 s)를 이용한 재평활화-DEMA_MtmBuffer[] 배열 완성
  7. EMA 메소드(기간 u)를 이용한 재재평활화-MainBuffer[] 배열 완성-그래픽 플롯 #0의 렌더링에 필요한 값의 계산
계산: OnCalculate() 함수

인디케이터 값의 계산은 Calculate 이벤트 핸들러의 OnCalculate() 함수에서 실행됩니다. 두 번째 OnCalculate() 함수 호출 형식을 사용해 볼게요.

int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at the previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
//---
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }

전달인자 rates_total은 렌더링된 후 처리를 기다리는 가격 차트 내 바의 개수입니다. prev_calculated는 현재 OnCalculate() 함수 호출 시작 시 이미 처리된 가격 차트 내 바의 개수를 나타냅니다..

OnCalculate() 함수는 현재 호출 종료 시 처리된 가격 차트 내 바의 개수를 반환합니다. 해당 함수는 매개 변수 rates_total 을 반환하며, 최초 호출 시 가격 차트 내 모든 바가 처리되어야 합니다.

다시 말해, OnCalculate() 함수 최초 호출 시 매개 변수 prev_calculated는 0 값을 가졌다가, 두 번째 호출 이후에는 prev_calculatedrates_total의 값 또는 rates_total +1 값을 가지며 OnCalculate() 함수는 오직 직전에 위치한 바만을 핸들합니다. 보다 자세한 설명은 여기를 클릭하세요.

인디케이터 버퍼와 Time[], Open[], High[], Low[], Close[], TickVolume[], Volume[] 및 Spread[] 배열은 기본 인덱싱 방향이 왼쪽에서 오른쪽으로, 배열의 처음에서 끝으로, 가장 오래된 데이터에서 최신 데이터로 설정되어 있습니다. 첫 번째 요소의 인덱스는 0 값을 갖습니다. 인디케이터 버퍼의 크기는 항상 인디케이터가 계산되는 바의 개수에 맞도록 클라이언트 터미널에서 통제합니다.

계산: 인디케이터 계산에 충분한 데이터가 있는지 확인하기(1)
//--- check rates
   if(rates_total<rates_total_min) return(0);

전역 변수 rates_total_min은  인디케이터의 입력 시계열의 최소 크기이며 Init 이벤트 핸들러의 OnInit() 함수에서 계산됩니다.

   rates_total_min=begin4+1; // minimum size of the input timeseries of the indicator
계산: PriceBuffer[] 가격 배열(2)
//--- calculation of the prices array PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // size of the input timeseries
                        prev_calculated,     // bars, processed on the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // calculate the prices array
                       );

가격 배열인 PriceBuffer[]를 채우는 데에는 CalculatePriceBuffer() 함수가 사용됩니다. CalculatePriceBuffer() 함수 코드는 'WilliamBlau.mqh' 파일에 포함되어 있습니다(개요 참조). 가격 유형은 입력 변수인 AppliedPrice로 특정됩니다.

계산: q-기간 모멘텀의 계산이 시작되거나 계속되는 바 인덱스의 정의(3)

pos 지역 변수 는 현재 OnCalculate() 함수 호출을 통해 인디케이터가 계산될 바의 인덱스 값입니다. pos 변수의 계산을 MtmBuffer[] 배열 계산 준비 단계(MtmBuffer[] 배열 내 무의미한 요소 제로화 단계)와 합쳐 봅시다.

계산: q-기간 모멘텀(4)
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];

q-기간 모멘텀은 현재 기간 PriceBuffer[i]와 직전 기간 PriceBuffer[i-(q-1)]의 가격(q-1) 간의 차이로 계산됩니다.

계산: EMA 메소드를 이용한 평활화(5~7)
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);

ExponentialMAOnBuffer() 함수는 개요에서 설명되었습니다. r-기간 EMA 계산을 예로 들면, ExponentialMAOnBuffer() 함수가 EMA_MtmBuffer[] 아웃풋 배열에 ​MtmBuffer[] 인풋 배열의 ​EMA(r) 값을 입력하며, 0 값으로 채운 무의미한 데이터 또한 포함됩니다.

 

1.4.2. 'Blau_TSI.mq5'-TSI(price,q,r,s,u) 인디케이터-트루 스트렝쓰 인덱스

TSI(price,q,r,s,u) 인디케이터 코드('Blau_Mtm.mq5'를 수정)

//+------------------------------------------------------------------+
//|                                                     Blau_TSI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "True Strength Index (William Blau)"      // description
#include <WilliamBlau.mqh>               // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window      // indicator in a separate window
#property indicator_buffers 10           // number of buffers used
#property indicator_plots   1            // graphic plots
//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width
//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "TSI"        // label for graphic plot #0
#property indicator_type1   DRAW_LINE    // draw as a line
#property indicator_color1  Blue         // line color
#property indicator_style1  STYLE_SOLID  // line style
#property indicator_width1  1            // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // TSI (graphic plot #0)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period 1st EMA
double DEMA_MtmBuffer[];    // s-period 2nd EMA
double TEMA_MtmBuffer[];    // u-period 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4; // starting index
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"TSI");             // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // draw as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"
//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum
*/
//---
   begin1=q-1;        //                             - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_...[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_...[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - TEMA_...[], MainBuffer[]
   //
   rates_total_min=begin4+1; // rates total min
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous tick
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price buffer
                       );
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

'Blau_Mtm.mq5' 코드에서 어떤 부분이 수정되고 추가되었는지 살펴 볼까요?

1.4.2.1. TSI(price,q,r s,u) 인디케이터 컨피규레이션('Blau_Mtm.mq5' 코드 수정)

인디케이터 설정(개괄)

TSI(price,q,r,s,u) 인디케이터 컨피규레이션은 Mtm(price,q,r,s,u) 인디케이터 컨피규레이션과 상이합니다(그림 1.8 참조).

  1. 인디케이터 표시 창을 설정합니다(변화 없음).
  2. 그래픽 구조 개수를 설정합니다(변화 없음).
  3. 인디케이터 버퍼 개수를 설정합니다(버퍼 개수 증가).
  4. 인디케이터 배열을 선언합니다(배열에 추가).
  5. 배열, 버퍼 및 플롯 지정: 인디케이터 배열 -> 인디케이터 버퍼 -> 그래픽 플롯(재구성화.)
  6. 각 그래픽 플롯의 속성을 설정합니다(라벨 변경).
  7. 인디케이터 값 디스플레이의 정확도를 설정합니다​​(정확도 변경).
  8. 그래픽 플롯별 초기 바 개수를 보이지 않게 설정합니다(변화 없음).
  9. 높이를 설정하고 각 높이의 속성을 설정합니다(새로 추가).
  10. 별도의 인디케이터 창에 대한 척도 제한을 설정합니다(새로 추가).
  11. 인디케이터 별명을 설정합니다(이름 변경).

그림 1.8. TSI(price,q,r,s,u) 인디케이터

그림 1.8. TSI(price,q,r,s,u) 인디케이터


컨피규레이션(변경 사항)

'Blau_Mtm.mq5' 코드에서 다음 사항이 수정되었습니다.

1. MQL5 프로그램에 대한 간단한 설명

#property description "True Strength Index (William Blau)"      // description

2. (컨피규레이션 6) 그래픽 플롯 개수 동일, 드로잉 메소드(DRAW_LINE), 라인 컬러(Blue), 라인 스타일(STYLE_SOLID) 및 라인 굵기(1) 동일, 그래픽 플롯 #0 라벨 변경

#property indicator_label1  "TSI"        // label for graphic plot #0

3. (컨피규레이션 7) 인디케이터 값 디스플레이 정확도

   IndicatorSetInteger(INDICATOR_DIGITS,2);

4. (컨피규레이션 11) 인디케이터 별명

   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
컨피규레이션: 높이(9)

높이를 설정하기 위해서는 다음 사항이 반드시 특정되어야 합니다.

  1. 세로축 값
  2. 레벨 설명(선택) 단일 렌더링 스타일 수평 레이어
    1. 라인 컬러 
    2. 라인 스타일(ENUM_LINE_STYLE 열거형에서 확인 가능)
    3. 라인 굵기

다음의 두 가지 방법이 있습니다.

1) #property 전처리기 지시문(해당 방법으로 구현).

//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width

2) IndicatorSet *() 함수 그룹 이용

//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"

코드는 Init 이벤트 핸들러의 OnInit() 함수에 작성됩니다. 수평 레벨의 인덱세이션은 0에서 시작합니다. 레벨의 세부 설정에는 ENUM_CUSTOMIND_PROPERTY 열거형에 있는 INDICATOR_LEVEL * 인덱스 속성 식별자가 사용됩니다.

각 레벨에 대한 설명은 IndicatorSetString() 함수와 인디케이터 속성 식별자 INDICATOR_LEVELTEXT(ENUM_CUSTOMIND_PROPERTY_STRING 열거형)을 통해서만 설정할 수 있습니다. 설명은 레벨 바로 위 좌측에 표시됩니다. 

인디케이터 내 '속성' 창('레벨' 탭)에서 수평 레벨의 추가 및 삭제, 값, 레벨 설명 및 레벨 렌더링 스타일 변경이 가능합니다.

컨피규레이션: 별도의 인디케이터 창 내 척도 제한(10)

다음의 두 가지 방법이 있습니다.

1) #property 전처리기 지시문(해당 방법으로 구현).

//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum

2) IndicatorSetDouble() 함수, INDICATOR_MINIMUMINDICATOR_MAXIMUM(ENUM_CUSTOMIND_PROPERTY_DOUBLE 열거형) 인디케이터 속성 식별자.

//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum

코드는 Init 이벤트 핸들러의 OnInit() 함수에 작성됩니다. 별도의 인디케이터 창의 하한 및 상한은 인디케이터의 '속성' 창('스케일' 탭)에서 변경할 수 있습니다.

컨피규레이션(변경 사항): 인디케이터 버퍼(3~5)

컨피규레이션 변경 사항 '인디케이터 배열 -> 인디케이터 버퍼 -> 그래픽 플롯'

1. (in configuration 3) 증가 버퍼 수

#property indicator_buffers 10           // the number of buffers for the calculation of the indicator

2. (컨피규레이션 4) q-기간 모멘텀 절대값 계산에 필요한 인디케이터 배열 추가

double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)

MainBuffer[] 배열의 목적이 다음과 같이 바뀝니다.

double MainBuffer[];        // TSI (graphic plot #0)
double TEMA_MtmBuffer[];    // u-period 3rd EMA

3. (컨피규레이션 5) '인디케이터 배열 -> 인디케이터 버퍼 -> 그래픽 플롯' 연결 변경

   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)


1.4.2.2. TSI(price,q,r,s,u) 인디케이터 계산('Blau_Mtm.mq5' 코드 수정 및 추가)

계산: 알고리즘

TSI(price,q,r,s,u) 인디케이터 계산 알고리즘

  1. 인디케이터 계산에 필요한 데이터가 충분한지 확인하세요.
  2. 특정 가격 유형에 따른 가격 배열 계산-PriceBuffer[] 배열 형성
  3. q-기간 모멘텀이 계산되는 인덱스 바 설정
  4. q-기간 모멘텀 및 모멘텀 절대값 계산-MtmBuffer[] 배열과 AbsMtmBuffer[] 배열 완성
  5. EMA 메소드(기간 r)를 이용한 최초 평활화-EMA_MtmBuffer[] 배열과 EMA_AbsMtmBuffer[] 배열 완성
  6. EMA 메소드(기간 s)를 이용한 재평활화-DEMA_MtmBuffer[] 배열과 DEMA_AbsMtmBuffer[] 배열 완성
  7. EMA 메소드(기간 u)를 이용한 재재평활화-TEMA_MtmBuffer[] 배열과 TEMA_AbsMtmBuffer[] 배열 완성
  8. TSI 계산이 시작/지속될 인덱스 바 설정
  9. TSI 계산-MainBuffer[] 배열 완성-그래픽 플롯 #0 값 계산

알고리즘 내 변화 핵심(요약)

  • a) (4~7 참조) q-기간 모멘텀의 계산 (배열 그룹 *MtmtBuffer[])과 q-기간 모멘텀 절대값의 계산(*AbsMtmBuffer[] 배열 그룹)의 병렬 수행
  • b) (8~9 참조) TSI 계산 추가
계산: q-기간 모멘텀의 절대 값(3~7)
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);

계산: TSI(8~9)

//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }

1.4.3. 'Blau_Ergodic.mq5'-Ergodic(price,q,r,s,u,ul)-에르고딕 오실레이터

Ergodic (price,q,r,s,u,ul) 인디케이터 코드는 'Blau_TSI.mq5'를 기반으로 수정되었습니다.

//+------------------------------------------------------------------+
//|                                                 Blau_Ergodic.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "Ergodic Oscillator (William Blau)"       // description
#include <WilliamBlau.mqh>                 // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window        // indicator in a separate window
#property indicator_buffers 11             // number of buffers
#property indicator_plots   2              // indicator plots
//--- horizontal levels
#property indicator_level1 -25             // level #0
#property indicator_level2 25              // level #1
#property indicator_levelcolor Silver      // level color
#property indicator_levelstyle STYLE_DOT   // level style
#property indicator_levelwidth 1           // level width
//--- min/max
#property indicator_minimum -100           // minimum
#property indicator_maximum 100            // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width
//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input int    ul=3; // ul- period of a Signal Line
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // Ergodic (graphic plot #0)
double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period of the 1st EMA
double DEMA_MtmBuffer[];    // s-period of the 2nd EMA
double TEMA_MtmBuffer[];    // u-period of the 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period of the 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period of the 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period of the 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4, begin5; // starting indexes
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Ergodic");           // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); // draw as a histogram
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Silver);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);             // line width
//--- graphic plot #1 (Signal Line)
   PlotIndexSetString(1,PLOT_LABEL,"Signal");            // label of graphic plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);      // draw as a line
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Red);           // line color
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);             // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of indicator levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level #0 "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level #1 "Overbought"
//--- min/max values
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // min
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // max
*/
//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- rates total
   if(rates_total<rates_total_min) return(0);
//--- calculation of PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price array
                       );
//--- calculation of mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period of the 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period of 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- calculation of Ergodic (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // starting from begin4
      for(i=0;i<pos;i++)       // pos
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

'Blau_TSI.mq5' 코드에서 어떤 부분이 수정되고 추가되었는지 살펴 볼까요?

1.4.3.1. Ergodic(price,q,r,s,u,ul) 인디케이터 컨피규레이션('Blau_TSI.mq5' 코드 수정)

인디케이터 설정(개괄)

Ergodic (price,q,r,s,u,ul) 인디케이터 컨피규레이션과 TSI (price,q,r,s,u) 인디케이터 컨피규레이션은 상이합니다(그림 1.9 참조).

  1. 인디케이터 표시 창을 설정합니다(변화 없음).
  2. 그래픽 플롯의 개수를 설정합니다(그래픽 플롯 추가).
  3. 인디케이터 버퍼 개수를 설정합니다(버퍼 개수 증가)).
  4. 인디케이터 배열을 선언합니다(배열에 추가).
  5. 링크 설정: 인디케이터 배열 -> 인디케이터 버퍼 -> 그래픽 플롯(재구성화).
  6. 그래픽 플롯별 속성을 설정합니다(속성 변경, 그래픽 플롯 추가).
  7. 인디케이터 값 디스플레이 정확도를 설정합니다​​(변화 없음).
  8. 그래픽 구조별 초기 바 개수를 보이지 않게 설정합니다(그래픽 플롯 추가).
  9. 수평 레벨을 설정하고 각 레벨의 속성을 설정합니다(변화 없음).
  10. 별도의 인디케이터 창에 대한 척도 제한을 설정합니다(변화 없음).
  11. 인디케이터 별명을 설정합니다(이름 변경).

그림 1.9. Ergodic(price,q,r,s,u,ul) 인디케이터

그림 1.9. Ergodic(price,q,r,s,u,ul) 인디케이터


컨피규레이션(변경 사항)

'Blau_TSI.mq5' 코드 내 다음 사항이 수정되었습니다.

1. MQL5 프로그램에 대한 간단한 설명

#property description "Ergodic Oscillator (William Blau)"       // description

2. 입력 변수 추가

input int    ul=3; // ul- period of a Signal Line

3. (컨피규레이션 11) 인디케이터 별명 수정

//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
컨피규레이션(변경 사항): 그래픽 플롯(2, 6)

1. (컨피규레이션 2) 그래픽 플롯 추가(신호선)

#property indicator_plots   2              // indicator plots

2. (컨피규레이션 6) a) 첫 번째 그래픽 플롯 #0 'Ergodic'의 속성 변경

이제까지는 (식별자 DRAW_LINE)을 이용해 선을 표시했는데요. 지금부터는 히스토그램(ENUM_DRAW_TYPE 열거형의 DRAW_HISTOGRAM)을 사용하겠습니다.

선 색깔 및 굵기 변경

//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width

b) 그래픽 플롯 #1 '시그널'(신호선) 추가

//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
컨피규레이션(변경 사항): 인디케이터 버퍼(3~5)

컨피규레이션 변화: '인디케이터 배열 -> 인디케이터 버퍼 -> 그래픽 구조'

1. (in configuration 3) 증가 버퍼 수

#property indicator_buffers 11             // number of buffers

2. (컨피규레이션 4) 신호선 값 계산 및 렌더링에 필요한 인디케이터 배열 추가

double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)

3. (컨피규레이션 5) '인디케이터 배열 -> 인디케이터 버퍼 -> 그래픽 구조' 관계 변화

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
설정: 렌더링 전 바의 개수(8)
  • 그래픽 플롯 #0 'Ergodic' 렌더링 이전의 바 개수는 변함이 없습니다. 계산 메소드는 섹션 1.4.1.1.에 나와 있습니다.
  • 그래픽 플롯 #1 'Signal' 렌더링 이전의 바 개수를 계산하는 방법은 동일합니다. MainBuffer[](평활화 기간 ul) 배열의 유의미한 데이터 평활화 결과로 SignalBuffer[] 배열이 생성됩니다.

MainBuffer[] 배열의 인덱세이션이 0에서 시작하며 MainBuffer[] 배열 내 유의미한 데이터의 인덱스 값은 (q-1)+(r-1)+(s-1)+(u-1)에서 시작하므로 SignalBuffer[] 배열 내 유의미한 데이터의 인덱스 값은 (q-1)+(r-1)+(s-1)+(u-1)+(ul-1)에서 시작됩니다.

전역 변수 begin5가 선언되었습니다.

int    begin1, begin2, begin3, begin4, begin5; // starting indexes

계산(완성, 1.4.1.1 추가 참조)

//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);


1.4.3.2. Ergodic(price,q,r,s,u,ul) 인디케이터 계산('Blau_TSI.mq5' 코드 수정)

계산: 알고리즘

Ergodic (price,q,r,s,ul) 인디케이터 계산 알고리즘

  1. 인디케이터 계산에 필요한 데이터가 충분한지 확인하세요.
  2. 특정 가격 유형에 따른 가격 배열 계산-PriceBuffer[] 배열 완성
  3. q-기간 모멘텀이 계산되는 인덱스 바 설정
  4. q-기간 모멘텀 및 모멘텀 절대값 계산-MtmBuffer[] 배열과 AbsMtmBuffer[] 배열 완성
  5. EMA 메소드(기간 r)를 이용한 최초 평활화-EMA_MtmBuffer[] 배열과 EMA_AbsMtmBuffer[] 배열 완성
  6. EMA 메소드(기간 s)를 이용한 재평활화-DEMA_MtmBuffer[] 배열과 DEMA_AbsMtmBuffer[] 배열 완성
  7. EMA 메소드(기간 u)를 이용한 재재평활화-TEMA_MtmBuffer[] 배열과 TEMA_AbsMtmBuffer[] 배열 완성
  8. TSI 계산이 시작/지속되는 인덱스 바 설정
  9. 에르고딕(TSI) 계산-MainBuffer[] 배열 완성-그래픽 플롯 #0 렌더링에 필요한 값의 계산
  10. 신호선 계산-EMA 메소드(기간 ul)를 이용한 에르고딕 평활화-SignalBuffer[] 배열 완성-그래픽 플롯 #1 렌더링에 필요한 값의 계산

알고리즘 핵심 변화 a) (섹션 1 참조) 인디케이터 인풋 시계열 최소 필요 크기 변경 b) (10문단 참조) 신호선 계산 변경

계산(변경): 인디케이터 계산에 필요한 데이터가 충분한지 확인하기(1)

알고리즘의 변화는 없습니다.

//--- rates total
   if(rates_total<rates_total_min) return(0);

전역 변수 rates_total_min 값 변경(Initialization 이벤트의 OnInit() 함수로 계산되는 인디케이터 인풋 시계열 최소 필요 크기)

   rates_total_min=begin5+1; // the minimum size of the input timeseries of the indicator
계산: 신호선(10)
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);

2. 스토캐스틱 모멘텀

포함된 인디케이터(첨부파일 참조)는 두 그룹으로 나뉩니다.

I. 스토캐스틱 기반 인디케이터

  1. Blau_TStoch.mq5-스토캐스틱(q-기간 스토캐스틱, q-기간 평활화 스토캐스틱)
  2. Blau_TStochI.mq5-스토캐스틱 인덱스(정규화된 q-기간 평활화 스토캐스틱)
  3. Blau_TS_Stochastic.mq5-스토캐스틱 TS 오실레이터(스토캐스틱 인덱스 기반)

II. 스토캐스틱 모멘텀 기반 인디케이터

  1. Blau_SM.mq5-스토캐스틱 모멘텀(q-기간 스토캐스틱 모멘텀, q-기간 평활화 스토캐스틱 모멘텀)
  2. Blau_SMI.mq5-스토캐스틱 모멘텀 인덱스(정규화된 q-기간 평활화 모멘텀)
  3. Blau_SM_Stochastic.mq5-스토캐스틱 SM오실레이터(스토캐스틱 모멘텀 인덱스 기반)


2.1. 스토캐스틱 기반 인디케이터

'MetaTrader 클라이언트 터미널 유저 가이드'의 '분석/테크니컬 인디케이터/오실레이터/스토캐스틱 오실레이터' 섹션에 스토캐스틱 오실레이터의 기술적 지표와 기술적 분석 적용법이 설명되어 있습니다(iStochastic 참조).

 

2.1.1. 조지 레인(George Lane)의 스토캐스틱 오실레이터

스토캐스틱, 스토캐스틱 오실레이터(스토캐스틱, 스토캐스틱 오실레이터)는 직전 q 기간 가격 변동에 대비한 가격을 보여주는 인디케이터입니다. 조지 레인(George Lane)이 만들었는데요.

다음의 구분이 필요합니다.

  • 패스트 스토캐스틱은 %K로 불리기도 합니다.
  • 슬로우 스토캐스틱(추세선)은 %D로 불리기도 합니다.

조지 레인스토캐스틱 공식

           price - LL(q)
%K = 100 * -------------
           HH(q) - LL(q)
%D = SMA(%k, ul)

좀 더 설명해 볼게요.

  • % K-패스트 스토캐스틱
  • % D-슬로우 스토캐스틱(신호선)
  • price-현재 기간의 가격 [종가]
  • q-스토캐스틱 계산에 필요한 가격 차트 내 기간의 수
  • HH (q)-q 기간 최고가에 대한 직전 q 기간 최대값
  • LL (q)-q 기간 최저가에 대한 직전 q 기간의 최소값
  • SMA (% K, ul)-패스트 스토캐스틱에 적용된 ul 이동 평균

조지 레인에 따르면, 상승 추세일 때 가격은 직전 최대값에 가까운 가격에서 멈추게 됩니다. 하락 추세인 가격은 직전 최소값에 가까운 가격에서 멈추게 되죠.

 

2.1.2. 윌리엄 블라우의 스토캐스틱 오실레이터


그림 2.1. 윌리엄 블라우의 스토캐스틱 기반 인디케이터

그림 2.1. 윌리엄 블라우의 스토캐스틱 기반 인디케이터

 

2.1.2.1. 스토캐스틱


스토캐스틱은 현재 기간의 가격 [종가]와 지난 q 기간 동안의 가격 변동 최저점 간의 거리입니다. q-기간 스토캐스틱의 값은 q-기간 동안의 가격 변동 최저점에 비해 얼마 만큼의 가격 변동이 있었는지를 나타냅니다. q-기간 스토캐스틱의 값은 0 이상입니다.

그림 2.2. 스토캐스틱의 정의

그림 2.2. 스토캐스틱의 정의

q-기간 스토캐스틱 공식

stoch(price,q) = price - LL(q)

좀 더 설명해 볼게요.

  • price-현재 기간의 가격 [종가]
  • q-스토캐스틱 계산에 필요한 가격 그래프 내 기간의 수
  • LL (q)- 지난 q 기간 동안 q 기간 최저가의 최소값

평활화 q-기간 스토캐스틱 공식

TStoch(price,q,r,s,u) = EMA(EMA(EMA( stoch(price,q) ,r),s),u)

좀 더 설명해 볼게요.

  • price-가격 차트 기준 가격 [종가]
  • q-스토캐스틱 계산에 사용되는 바의 개수
  • stoch(price,q)=price-LL(q)-q-기간 스토캐스틱
  • EMA (stoch (price,q),r)-최초 평활화-기간이 r인 EMA를 q-기간 스토캐스틱에 적용
  • EMA (EMA(..., r),s)-재평활화-기간이 s인 EMA를 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-기간이 u인 EMA를 재평활화 결과에 적용

TStoch(price,q,r,s,u)-스토캐스틱 특징

  • 파일명: Blau_TStoch.mq5
  • 이름: 윌리엄 블라우의 스토캐스틱 인디케이터(q-기간 스토캐스틱, q-기간 평활화 스토캐스틱)
  • 입력 변수:
    • q-스토캐스틱이 계산되는 기간(디폴트 값 5)
    • r-스토캐스틱에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 EMA 평활화는 사용되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

2.1.2.2. 스토캐스틱 인덱스

스토캐스틱 인덱스 인디케이터는 정규화된 q-기간 평활화 스토캐스틱입니다.

q-기간 평활화 스토캐스틱 값은 백분율로 매핑됩니다(인터벌 [0, 100]). q-기간 평활화 스토캐스틱의 각 값은 q-기간 가격 범위 값으로 정규화됩니다. 정규화된 q-기간 평활화 스토캐스틱은 시장의 과매수/과매도 정도를 나타냅니다.

스토캐스틱 인덱스 공식:

                         100 * EMA(EMA(EMA( price-LL(q) ,r),s),u)       100 * TStoch(price,q,r,s,u)
TStochI(price,q,r,s,u) = ---------------------------------------- = ----------------------------------
                            EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)      EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then TStochI(price,q,r,s,u)=0

좀 더 설명해 볼게요.

  • price-가격 차트 기준 가격 [종가]
  • q-스토캐스틱 계산에 사용되는 바의 개수
  • LL (q)-q 기간 최저 가격의 최소값
  • HH (q)-q 기간 최고 가격의 최대 값
  • stoch(q)=price-LL(q)-q-기간 스토캐스틱
  • TStoch(price,q,r,s,u)-재재평활화된 q-기간 스토캐스틱
  • HH(q)-LL(q)-q-기간 가격 범위
  • EMA (..., r)-최초 평활화-EMA(r)은 다음에 적용:
    1. q-기간 스토캐스틱
    2. q-기간 가격 범위
  • EMA (EMA(..., r),s)-재평활화-EMA(s)가 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-EMA(u)가 재평활화 결과에 적용

TStochI(price,q,r,s,u)-스토캐스틱 인덱스 특징

  • 파일명: Blau_TStochI.mq5
  • 이름: 윌리엄 블라우의 스토캐스틱 인덱스(정규화된 q-기간 평활화 스토캐스틱)
  • 입력 변수:
    • q-스토캐스틱이 계산되는 기간(디폴트 값 5)
    • r-스토캐스틱에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
    • (선택) 2개 레벨 (디폴트 값 40, 60)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 0) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

2.1.2.3. 스토캐스틱 오실레이터

스토캐스틱 오실레이터의 정의

TS_Stochastic(price,q,r,s,u) = TStochI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( TS_Stochastic(price,q,r,s,u) ,ul)

좀 더 설명해 볼게요.

  • TS_Stochastic()-패스트 스토캐스틱, %k-스토캐스틱 인덱스 TStochI(price,q,r,s,u)
  • SignalLine()-슬로우 스토캐스틱(신호선), %d-기간이 ul인 EMA를 패스트 스토캐스틱(%K)에 적용
  • ul-EMA 기간 신호선-윌리엄 블라우에 따르면 ul 값은 직전의 유의미한(>1) EMA 패스트 스토캐스틱 값과 반드시 일치해야 합니다.

TS_Stochastic(price,q,r,s,u,ul)-스토캐스틱 오실레이터 특징

  • 파일명: Blau_TS_Stochastic.mq5
  • 이름: 윌리엄 블라우의 스토캐스틱 오실레이터(스토캐스틱 인덱스 기반)
  • 입력 변수:
    • 그래픽 플롯 #0-패스트 스토캐스틱(스토캐스틱 인덱스),% k
      • q-스토캐스틱 인덱스가 계산되는 기간(디폴트 값 5)
      • r-스토캐스틱에 적용되는 최초 EMA 기간(디폴트 값 20)
      • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
      • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • 그래픽 플롯 #1-슬로우 스토캐스틱(신호선),% d
      • ul-패스트 스토캐스틱에 적용되는 EMA 기간 신호선(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 렌더링 스타일 변경-색깔, 굵기, 선 스타일('컬러' 탭)
    • 2개 레벨 (디폴트 값 40, 60)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 0) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 EMA 평활화는 사용되지 않음
    • ul>0. ul = 1일 때 슬로우 스토캐스틱(신호선)과 패스트 스토캐스틱의 선이 동일
    • 가격 배열 최소 크기=(q-1 + r + s + u + ul-4 +1)

 

2.1.2.4. 연속성


윌리엄 블라우의 스토캐스틱 오실레이터에는 조지 레인의 스토캐스틱 오실레이터가 포함됩니다. TS_Stochastic(윌리엄 블라우)이 표준 스토캐스틱 오실레이터(조지 레인)과 일치하려면 다음 사항이 반드시 명시되어야 합니다.

TS_Stochastic( price=Close, q=KPeriod, r=1, s=1, u=1, ul=DPeriod )
Stochastic( KPeriod=q, DPeriod=ul, Slowing=1, price="Low/High", method="Exponential" )

그림 2.3. 조지 레인의 스토캐스틱 오실레이터를 포함하는 윌리엄 블라우의 스토캐스틱 오실레이터

그림 2.3. 조지 레인의 스토캐스틱 오실레이터를 포함하는 윌리엄 블라우의 스토캐스틱 오실레이터

 

2.1.2.5. 스토캐스틱 오실레이터 코드


TS_Stochastic(price,q,r,s,u,ul) 인디케이터를 예로 들겠습니다.

1) 인디케이터 배열, 인디케이터 버퍼 및 그래픽 플롯의 관계

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // fast Stochastic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // slow Stochastic: ul-period EMA of the fast Stochastic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);         // min value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);         // max value (q bars)
   SetIndexBuffer(5,StochBuffer,INDICATOR_CALCULATIONS);      // q-period Stochastic
   SetIndexBuffer(6,EMA_StochBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_StochBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_StochBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA
   SetIndexBuffer(9,HHLLBuffer,INDICATOR_CALCULATIONS);       // q-period price range
   SetIndexBuffer(10,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (price range)
   SetIndexBuffer(11,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (price range)
   SetIndexBuffer(12,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (price range)

2) q-기간 스토캐스틱 및 q-기간 가격 범위 계산 알고리즘

   // calculation of StochBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // LLBuffer[] - search for the minimal price (q bars)
      // HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // StochBuffer[] - q-period Stochastic
      StochBuffer[i]=PriceBuffer[i]-LLBuffer[i];
      // HHLLBuffer[] - q-period price range
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }


2.2. 스토캐스틱 모멘텀 기반 인디케이터

Fig. 2.4. 윌리엄 블라우의 스토캐스틱 모멘텀 기반 인디케이터

Fig. 2.4. 윌리엄 블라우의 스토캐스틱 모멘텀 기반 인디케이터

 

2.2.1. 스토캐스틱 모멘텀

스토캐스틱 모멘텀(Stochastic Momentum, SM)은 현재 기간의 가격과 지난 q 기간 가격 범위 중앙값의 거리입니다. q-기간 스토캐스틱 모멘텀의 값은 가격 범위 내 가격의 위치를 보여줍니다.

q-기간 스토캐스틱 모멘텀의 부호는 q-기간 가격 범위 중간에 대한 가격 포지션을 나타냅니다. 가격이 중앙값 위에 위치하는 경우 양수, 가격이 중앙값 아래에 위치하는 경우 음수로 나타납니다.

그림 2.5. 스토캐스틱 모멘텀의 정의

그림 2.5. 스토캐스틱 모멘텀의 정의

q-기간 스토캐스틱 모멘텀 공식

sm(price,q) = price - 1/2 * [LL(q) + HH(q)]

좀 더 설명해 볼게요.

  • price-현재 기간의 가격 [종가]
  • q-스토캐스틱 모멘텀 계산에 필요한 바 개수
  • LL (q)-q 기간 최저 가격의 최소값
  • HH (q)-q 기간 최고 가격 최고값
  • 1/2* [LL(q)+HH (q)]-q-기간 가격 범위 중간값

q-기간 스토캐스틱 평활화 모멘텀 공식

SM(price,q,r,s,u) = EMA(EMA(EMA( sm(price,q) ,r),s),u)

좀 더 설명해 볼게요.

  • price-가격 차트 기준 가격 [종가]
  • q-스토캐스틱 모멘텀 계산에 필요한 바 개수
  • sm(price,q)=price-1/2*[LL(q)+HH(q)]-q-기간 스토캐스틱 모멘텀
  • EMA(sm(price,q),r)-최초 평활화-EMA(r),이 q-기간 스토캐스틱 모멘텀에 적용
  • EMA (EMA(..., r),s)-재평활화-EMA(s)가 최초 평활화 결과에 적용
  • EMA(EMA(EMA(sm(q),r),s),u)-재재평활화-EMA(u)를 재평활화 결과에 적용


2.2.1.2. SM(price,q,r,s,u)-스토캐스틱 모멘텀 특징

  • 파일명: Blau_SM.mq5
  • 이름: 윌리엄 블라우의 스토캐스틱 모멘텀 인디케이터(q-기간 스토캐스틱 모멘텀, q-기간 스토캐스틱 평활화 모멘텀)
  • 입력 변수:
    • q-스토캐스틱 모멘텀이 계산되는 기간(디폴트 값 5)
    • r-스토캐스틱 모멘텀에 적용되는 최초 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 EMA 평활화는 사용되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

2.2.2. 스토캐스틱 모멘텀 인덱스

스토캐스틱 모멘텀 인덱스(SMI)는 정규화된 확률론 금리 인디케이터입니다(정규화된 q-기간 스토캐스틱 평활화 모멘텀). q-기간 스토캐스틱 평활화 모멘텀의 값은 백분율로 나타납니다(인터벌 [-100, 100]).

q-기간 스토캐스틱 평활화 모멘텀이 각 값은 q-기간 가격 변동 범위 절반 값으로 정규화됩니다. 정규화를 통해 SMI 값은 시장의 과매수(+) 또는 과매도(-) 정도를 보여줍니다.

스토캐스틱 모멘텀 인덱스 공식

                     100 * EMA(EMA(EMA( price-1/2*[LL(q)+HH(q)] ,r),s),u)           100 * SM(price,q,r,s,u)
SMI(price,q,r,s,u) = ---------------------------------------------------- = ----------------------------------------
                           EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)         EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)
if EMA(EMA(EMA(1/2*[HH(q)-LL(q)],r),s),u)=0, then SMI(price,q,r,s,u)=0

좀 더 설명해 볼게요.

  • price-가격 차트 기준 가격 [종가]
  • LL (q)-q 기간 최저 가격의 최소값
  • HH (q)-q 기간 최고 가격 최고값
  • sm(price,q)=price-1/2*[LL(q)+HH(q)]-q-기간 스토캐스틱 모멘텀
  • SM(price,q,r,s,u)-재재평활화된 q-기간 스토캐스틱 모멘텀
  •  - q-period price range;
  • 1/2* [LL (q)+HH(q)]-q-기간 가격 범위 중간값
  • 1/2*[HH(q)-LL(q)]-q-기간 가격 범위 절반값
  • EMA (..., r)-최초 평활화-EMA(r)이 다음에 적용됨 1) q-기간 스토캐스틱 모멘텀
    2) q-기간 가격 범위 절반값
  • EMA (EMA(..., r),s)-재평활화-EMA(s)를 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-EMA(u)가 재평활화 결과에 적용


2.2.2.2. SMI(price,q,r,s,u)-스토캐스틱 모멘텀 인덱스 특징

  • 파일명: Blau_SMI.mq5
  • 이름: 윌리엄 블라우의 스토캐스틱 모멘텀 인덱스(정규화된 q-기간 스토캐스틱 평활화 모멘텀)
  • 입력 변수:
    • q-스토캐스틱 모멘텀이 계산되는 기간(디폴트 값 5)
    • r-스토캐스틱 모멘텀에 적용되는 최초 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 재평활화 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 재재평활화 기간(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
    • (선택) 2개 레벨 (디폴트 값 -40, +40)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

2.2.3. 스토캐스틱 오실레이터

스토캐스틱 오실레이터의 정의
SM_Stochastic(price,q,r,s,u) = SMI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( SM_Stochastic(price,q,r,s,u) ,ul)

좀 더 설명해 볼게요.

  • SM_Stochastic()-스토캐스틱 모멘텀 인덱스 SMI(price,q,r,s,u)
  • SignalLine()-신호선-스토캐스틱 모멘텀 인덱스에 적용되는 ul 기간 EMA
  • ul-EMA 기간 신호선-윌리엄 블라우에 따르면 ul 값은 직전의 유의미한(>1) 확률론 금리 EMA 인덱스 기간과 동일해야 합니다.


2.2.3.1. SM_Stochastic(price,q,r,s,u,ul)-스토캐스틱 오실레이터 특징

  • 파일명: Blau_SM_Stochastic.mq5
  • 이름: 윌리엄 블라우의 스토캐스틱 오시렐이터(스토캐스틱 모멘텀 기반)
  • 입력 변수:
    • 그래픽 플롯 #0-스토캐스틱 모멘텀 인덱스
      • q-스토캐스틱 모멘텀이 계산되는 기간(디폴트 값 5)
      • r-스토캐스틱 모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
      • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
      • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • 그래픽 플롯 #1-신호선
      • ul-확률론 금리 인덱스에 대한 EMA 기간 신호선(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 렌더링 스타일 변경-색깔, 굵기, 선 스타일('컬러' 탭)
    • 2개 레벨(디폴트 값 -40, +40)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • ul>0. ul = 1일 때 신호선과 확률론 금리 인덱스가 일치합니다.
    • 가격 배열 최소 크기=(q-1 + r + s + u + ul-4 +1)

 

2.2.4. 스토캐스틱 오실레이터 코드

SM_Stochastic(price, q, r, s, u, ul)

1) 인디케이터 배열, 인디케이터 버퍼 및 그래픽 플롯의 관계

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                   // Stochastic Momentum Index
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                 // Signal Line: ul-period EMA of Stochastic Momentum Index
   // buffers for intermediate calculations (not used for plotting)
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);          // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);             // minimal price value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);             // maximal price value (q bars)
   SetIndexBuffer(5,SMBuffer,INDICATOR_CALCULATIONS);             // q-period Stochastic Momentum
   SetIndexBuffer(6,EMA_SMBuffer,INDICATOR_CALCULATIONS);         // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_SMBuffer,INDICATOR_CALCULATIONS);        // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_SMBuffer,INDICATOR_CALCULATIONS);        // u-period of the 3rd EMA
   SetIndexBuffer(9,HalfHHLLBuffer,INDICATOR_CALCULATIONS);       // half of price range (q bars)
   SetIndexBuffer(10,EMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (half of price range)
   SetIndexBuffer(11,DEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (half of price range)
   SetIndexBuffer(12,TEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (half of price range)

2) q-기간 스토캐스틱 모멘텀과 q-기간 가격 범위 절반의 계산 알고리즘

//--- calculation of q-period Stochastic Momentum and half of price range (q bars)
   if(prev_calculated==0)       // at first call
     {
      pos=begin1;               // starting from 0
      for(i=0;i<pos;i++)        // pos values
        {
         SMBuffer[i]=0.0;       // zero values
         HalfHHLLBuffer[i]=0.0; //
         LLBuffer[i]=0.0;       //
         HHBuffer[i]=0.0;       //
        }
     }
   else pos=prev_calculated-1;  // overwise calculate only last value
   // calculation of SMBuffer[], HalfHHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // calculation of LLBuffer[] - search for the minimal price (q bars)
      // calculation of HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // calculation of SMBuffer[] - q-period Stochastic Momentum
      SMBuffer[i]=PriceBuffer[i]-0.5*(LLBuffer[i]+HHBuffer[i]);
      // calculation of HalfHHLLBuffer[] - half of price range (q bars)
      HalfHHLLBuffer[i]=0.5*(HHBuffer[i]-LLBuffer[i]);
     }

3. 추세 편차 인디케이터

포함된 인디케이터(첨부파일 참조)는 두 그룹으로 나뉩니다.

I. 시장 추세 편차 기반 인디케이터

  1. Blau_MDI.mq5-추세 평균 편차 인디케이터(평균 편차, 이동 평균 편차)
  2. Blau_Ergodic_MDI.mq5-에르고딕 MDI 오실레이터(평균 편차 기반)

II. MACD 기반 인디케이터.

  1. Blau_MACD.mq5-이동 평균 수렴/확장 지수(MACD, 평활화된 MACD)
  2. Blau_Ergodic_MACD.mq5-에르고딕 MACD 오실레이터(MACD 인디케이터 기반)


3.1. 시장 추세 편차 기반 인디케이터

그림 3.1. 시장 추세 편차를 기반으로 하는 윌리엄 블라우의 인디케이터.

그림 3.1. 시장 추세 편차를 기반으로 하는 윌리엄 블라우의 인디케이터.

 

3.1.1. 평균 편차 인디케이터

추세 평균 편차는 기간 r의 가격과 EMA 간의 거리입니다.

시장 트렌드: EMA(r)이 가격에 적용된 값이 상승세 또는 하락세 판단에 사용됩니다.

이동 평균은 가격 곡선을 평활화하지만 이동 평균의 증가는 지연을 일으키며 이는 가격 반전 지점에서 눈에 띄게 나타납니다(1.1.1, 그림 1.2 추가 참조). 추세 평균 편차 값은 가격에 적용된 EMA(r)까지의 거리를 나타냅니다.

추세 평균 편차의 부호는 가격에 적용된 EMA(r)에 대한 가격 위치를 나타냅니다. 양수인 경우 가격이 지수보다 높고, 음수인 경우 가격이 지수보다 낮습니다.

추세 평균 편차 공식:

md(price,r) = price - EMA(price,r)

좀 더 설명해 볼게요.

  • price-현재 기간의 가격
  • EMA(price,r)-시장 추세-r 기간 EMA가 가격에 적용

'분석/테크니컬 인디케이터/추세 인디케이터'에서 'MetaTrader 클라이언트 터미널 유저 가이드'를 확인하세요.

  1. 이중 지수 이동 평균, DEMA
  2. 삼중 지수 이동 평균, TEMA

알렉산더 엘더(Alexander Elder)의 베어스 파워 및 불스 파워 인디케이터에서도 유사한 인덱스가 사용됩니다. 'MetaTrader 클라이언트 터미널 유저 가이드' 내 '분석/테크니컬 인디케이터/오실레이터' 섹션을 참조하세요.

  1. 베어스 파워
  2. 불스 파워

추세 평균 편차 인디케이터(평균 편차 인덱스, MDI)는 평활화된 시장 추세 평균 편차입니다.

평균 편차 인디케이터 공식

MDI(price,r,s,u) = EMA(EMA( md(price,r) ,s),u) = EMA(EMA( price-EMA(price,r) ,s),u)

좀 더 설명해 볼게요.

  • price-가격 차트 기준 가격 [종가]
  • EMA (price, r)-시장 추세-가격에 EMA(r)의 최초 평활화 적용
  • md (price,r) = price-EMA (price,r)-추세 평균 편차-가격에 EMA(r) 가격 편차 적용
  • EMA (md (price, r), s)-추세 평균 편차에 재평활화 적용
  • EMA (EMA (md(price,r),s),u)-재재평활화-재평활화 결과에 EMA(u) 적용


3.1.1.3. MDI(price,r,s,u)-평균 편차 인덱스 특징

  • 파일명: Blau_MDI.mq5
  • 이름: 윌리엄 블라우의 시장 평균 편차 인디케이터(평균 편차, 평활화된 평균 편차)
  • 입력 변수:
    • r-가격에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-평균 편차에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • r>1;
    • s>0, u>0. s 또는 u가 1인 경우 EMA 평활화는 사용되지 않음
    • 가격 배열 최소 크기=(r+s+u-3+1)

 

3.1.2. 에르고딕 MDI 오실레이터

에르고딕 MDI 오실레이터의 정의
Ergodic_MDI(price,r,s,u) = MDI(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MDI(price,r,s,u) ,ul)

좀 더 설명해 볼게요.

  • Ergodic_MDI()-에르고딕-평균 편차 인덱스 MDI(price,r,s,u)
  • SignalLine()-신호선-에르고딕에 적용되는 ul 기간 EMA
  • ul-EMA 기간 신호선- 윌리엄 블라우에 따르면 ul 값이 EMA 에르고딕의 직전 유의미한(>1) 기간 값에 동일해야 함


3.1.2.2. Ergodic_MDI(price,r,s,u,ul)-에르고딕 MDI 오실레이터. 특징

  • 파일명: Blau_Ergodic_MDI.mq5
  • 이름: 윌리엄 블라우의 에르고딕 MDI 오실레이터(평균 편차 인덱스)
  • 입력 변수:
    • 그래픽 플롯 #0-에르고딕(추세 평균 편차 인디케이터)
      • r-가격에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
      • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
      • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • 그래픽 플롯 #1-신호선
      • ul-에르고딕에 적용되는 EMA 기간 신호선(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 렌더링 스타일 변경-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • r>1;
    • s>0, u>0. s 또는 u가 1인 경우 EMA 평활화는 사용되지 않음
    • ul>0. ul = 1인 경우 신호선과 에르고딕선이 동일
    • 가격 배열 최소 크기=(r+s+u+ul-4+1)

 

3.1.3. 에르고딕 오실레이터 코드

Ergodic_MDI(price,r,s,u,ul) 인디케이터를 예로 들겠습니다.

1) 인디케이터 배열, 인디케이터 버퍼 및 그래픽 플롯의 관계

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations; not used for plotting
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);     // price array
   SetIndexBuffer(3,EMA_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (price)
   SetIndexBuffer(4,MDBuffer,INDICATOR_CALCULATIONS);        // среднее отклонение
   SetIndexBuffer(5,DEMA_MDBuffer,INDICATOR_CALCULATIONS);   // s-period 2nd EMA

2) 평균 편차 계산 알고리즘

//--- calculation of the mean deviation
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // starting from 0
      for(i=0;i<pos;i++)       // pos data
         MDBuffer[i]=0.0;      // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // r-period 1st EMA: calculation of EMA_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA_PriceBuffer);
   // calculation of MDBuffer[]
   for(i=pos;i<rates_total;i++)
      MDBuffer[i]=PriceBuffer[i]-EMA_PriceBuffer[i];


3.2. MACD 기반 인디케이터

그림 3.2. 윌리엄 블라우의 MACD 기반 인디케이터

그림 3.2. 윌리엄 블라우의 MACD 기반 인디케이터

 

3.2.1. MACD 인디케이터

이동 평균 수렴 확산 지수(MACD)는 패스트 EMA(s)와 슬로우 EMA(r) 사이의 차이입니다.

MACD 부호는 슬로우 EMA(r)에 대한 패스트 EMA(s)의 위치를 나타냅니다. 양의 MACD는 EMA(s)가 EMA(r) 위에 위치함을, 음의 MACD는 EMA(s)가 EMA(r) 아래에 위치함을 의미합니다. MACD 절대값 변화: |MACD|의 증가는 이동 평균 간의 확산을, |MACD|의 감소는 이동 평균 간의 수렴을 나타냅니다.

MACD 공식

macd(price,r,s) = EMA(price,s) - EMA(price,r)
s < r

좀 더 설명해 볼게요.

  • price-현재 기간의 가격 [종가]
  • EMA(price,r)-가격에 적용된 슬로우 EMA(r)
  • EMA(price,s)-가격에 적용된 패스트 EMA(s)

MACD 인디케이터는 패스트 지수 평균과 슬로우 지수 평균 간의 관계를 보여 줍니다(평활화된 이동 평균 수렴/확산).

MACD 인디케이터 공식

MACD(price,r,s,u) = EMA( macd(price,r,s) ,u) = EMA( EMA(price,s)-EMA(price,r) ,u)
s < r

좀 더 설명해 볼게요.

  • price-가격 차트 가격 [종가]
  • EMA(price,r)-최초 평활화-가격에 적용된 EMA(r) 슬로우 지수
  • EMA(price,s)-재평활화-가격에 적용된 패스트 EMA(s)
  • macd(r,s)=EMA(price,s)-EMA (price,r)-MACD
  • EMA(macd (r,s),u)-재재평활화-MACD에 EMA(u) 적용: 패스트 EMA(price,s)와 슬로우 EMA(price,r).

3.2.1.1. MACD(price,r,s,u)-이동 평균 수렴/확산 인디케이터 특징

  • 파일명: Blau_MACD.mq5
  • 이름: 윌리엄 블라우의 MACD 인디케이터(MACD, 평활화된 MACD)
  • 입력 변수:
    • r-가격에 적용되는 첫 번째 EMA(슬로우) 기간(디폴트 값 20)
    • s-가격에 적용되는 두 번째 EMA(패스트) 기간(디폴트 값 5)
    • u-MACD에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • r>1, s>1;
    • s <r (프로그램상으로 확인되지 않은 이론상의 한계)
    • u>0. u = 1일 때 평활화는 수행되지 않음
    • 가격 배열 최소 크기=([max(r,s)]+u-2+1)

 

3.2.2. 에르고딕 MACD 오실레이터

에르고딕 MACD 오실레이터의 정의
Ergodic_MACD(price,r,s,u) = MACD(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MACD(price,r,s,u) ,ul)

좀 더 설명해 볼게요.

  • Ergodic_MACD ()-에르고딕-MACD 인디케이터 MACD(price,r,s,u)
  • SignalLine()-신호선-에르고딕에 적용되는 EMA(ul)
  • ul-신호선의 EMA 기간-윌리엄 블라우는 ul 값이 EMA 에르고딕의 직전 유의미(>1)한 기간 값과 동일해야 한다고 주장

'MetaTrader 클라이언트 터미널 유저 가이드'의 '분석/테크니컬 인디케이터/오실레이터/MACD' 섹션에 MACD 기술적 지표와 기술적 분석 적용법이 설명되어 있습니다(iMACD 참조).

표준 MACD와는 달리, 윌리엄 블라우는 지수로 평활화된 이동 평균(표준 MACD의 경우 단순 이동 평균 사용)을 사용합니다.

3.2.2.1. Ergodic_MACD(price,r,s,u,ul)-에르고딕 MACD 오실레이터. 특징

  • 파일명: Blau_Ergodic_MACD.mq5
  • 이름: 윌리엄 블라우의 에르고딕 MACD 오실레이터(MACD 기반)
  • 입력 변수:
    • 그래픽 플롯 #0-에르고딕(MACD)
      • r-가격에 적용되는 첫 번째 EMA(슬로우) 기간(디폴트 값 20)
      • s-가격에 적용되는 두 번째 EMA(패스트) 기간(디폴트 값 5)
      • u-MACD에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • 그래픽 플롯 #1-신호선
      • ul-에르고딕에 적용되는 EMA 기간 신호선(디폴트 값 3)
    • AppliedPrice-가격 유형(디폴트 값 PRICE_CLOSE)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 렌더링 스타일 변경-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • r>1, s>1;
    • s <r (프로그램상으로 확인되지 않은 이론상의 한계)
    • u>0. u = 1일 때 평활화는 수행되지 않음
    • ul>0. ul = 1일 때 신호선과 에르고딕 선이 일치
    • 가격 배열 최소 크기=([max(r,s)]+u+ul-3+1)

 

3.2.3. 에르고딕 MACD 오실레이터 코드

Ergodic_MACD(price,r,s,u,ul) 인디케이터를 예로 들어 보겠습니다.

1) 인디케이터 배열, 인디케이터 버퍼 및 그래픽 플롯 간 링크

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: ul-period EMA, applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,EMA1_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (slow), applied to price
   SetIndexBuffer(4,EMA2_PriceBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (fast), applied to price
   SetIndexBuffer(5,MACDBuffer,INDICATOR_CALCULATIONS);       // moving averages convergence/divergence

2) MACD 알고리즘

//--- calculation of moving average convergence/divergence
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // 
      for(i=0;i<pos;i++)       // pos
         MACDBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // r-period 1st EMA: calculation of EMA1_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA1_PriceBuffer);
   // s-period 2nd EMA: calculation of EMA2_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,s,PriceBuffer,EMA2_PriceBuffer);
   // calculation of MACDBuffer[]
   for(i=pos;i<rates_total;i++)
      MACDBuffer[i]=EMA2_PriceBuffer[i]-EMA1_PriceBuffer[i];

3.3. 추가

에르고딕 MDI 오실레이터와 MACD 오실레이터 계산 시 윌리엄 블라우는 정규화를 사용하지 않습니다 (1.2.1, 1.3.1 참조). 따라서, 에르고딕 MDI 오실레이터와 MACD 오실레이터는 시장의 과매수 또는 과매도 상태를 나타내지 못합니다.

'MetaTrader 클라이언트 터미널 유저 가이드' 내 '분석/테크니컬 인디케이터/오실레이터/MACD' 섹션을 참조해 MACD 인디케이터 시그널 이용법을 알아보세요.

MACD는 시장의 과매수/과매도 상태를 효과적으로 나타내는 인디케이터입니다. 짧은 이동 평균이 긴 이동 평균에서 크게 멀어진 경우(예: MACD 상승), 가격이 과도하게 상승하여 곧 현실적인 수준으로 조정될 가능성이 큽니다.

이 경우, 기술적 분석의 관점에서입니다.


4. 캔들 모멘텀

포함된 인디케이터(첨부파일 참조)는 두 그룹으로 나뉩니다.

  1. Blau_CMtm.mq5-캔들 모멘텀 인디케이터(q-기간 캔들 모멘텀, 평활화 q-기간 캔들 모멘텀)
  2. 인덱스(정규화된 q-기간 평활화 캔들 모멘텀)
    • Blau_CMI.mq5-캔들 모멘텀 인덱스(q-기간 캔들 모멘텀의 절대값으로 정규화)
    • Blau_CSI.mq5-캔들 인덱스(q-기간 캔들 모멘텀의 길이로 정규화)
  3. 캔들 에르고딕 오실레이터
    • Blau_Ergodic_CMI.mq5-에르고딕 CMI 오실레이터(캔들 모멘텀 인덱스 기반)
    • Blau_Ergodic_CSI.mq5-에르고딕 CSI 오실레이터(캔들 인덱스 기반)

그림 4.1. 윌리엄 블라우의 캔들 모멘텀 기반 인디케이터(normalized by the absolute value of the q-period Candlestick Momentum)

그림 4.1. 윌리엄 블라우의 캔들 모멘텀 기반 인디케이터(normalized by the absolute value of the q-period Candlestick Momentum)

 

그림 4.2. 윌리엄 블라우의 캔들 모멘텀 기반 인디케이터(q-기간 캔들의 길이로 정규화)

그림 4.2. 윌리엄 블라우의 캔들 모멘텀 기반 인디케이터(q-기간 캔들의 길이로 정규화)

 

4.1. 캔들 모멘텀

4.1.1. 캔들 모멘텀의 정의

모멘텀(p. 참조) 1.1) -는 현재 가격(대개 당일 종가)와 직전 가격(대개 전일 종가)의 차이입니다. 모멘텀은 가격 그래프의 모든 기간에 해당하는 가격을 반영할 수 있습니다.

윌리엄 블라우에 따르면 캔들 모멘텀은 동일한 기간 내 종가와 시가의 차이입니다(단일 캔들). 캔들 모멘텀 부호는 가격 변동 방향을 나타냅니다. 양의 캔들 모멘텀은 가격이 해당 기간 중 상승했음을, 음의 캔들 모멘텀은 해당 기간 중 가격이 감소했음을 의미합니다.

캔들 모멘텀 공식

cmtm = close - open

좀 더 설명해 볼게요.

  • close-(캔들)의 [현재] 기간 종가
  • open-(캔들)의 [현재] 기간 시가

캔들 모멘텀의 정의를 보다 넓은 의미에서 이해해 봅시다.

  1. 캔들 모멘텀은 가격 차트 내 어떤 기간의 가격도 반영할 수 있습니다.
  2. 기준 가격(종가, 시가)은 임의적일 수 있습니다.

그림 4.3. q-기간 캔들의 정의

그림 4.3. q-기간 캔들의 정의


q-기간 캔들 모멘텀 공식

cmtm(price1,price2,q) = price1 - price2[q-1]

좀 더 설명해 볼게요.

  • q-캔들 모멘텀 계산에 필요한 가격 차트 내 바 개수
  • price1-q-기간 최종 가격 [종가]
  • price2[q-1]-q 기간 초반의 가격 [시가]

평활화된 q-기간 캔들 모멘텀 공식

CMtm(price1,price2,q,r,s,u) = EMA(EMA(EMA( cmtm(price1,price2,q) ,r),s),u)

좀 더 설명해 볼게요.

  • q-q-기간 캔들 모멘텀 계산에 필요한 가격 차트 내 바의 개수
  • price1-q-기간 최종 가격 [종가]
  • price2-q-기간 최초 가격 [시가]
  • cmtm(price1,price2,q)=price1-price2[q-1]-q-가격 캔들 모멘텀
  • EMA(cmtm (price1, price2, q), r)- 최초 평활화-EMA(r)을 q-기간 캔들 모멘텀에 적용
  • EMA (EMA(..., r),s)-재평활화-EMA(s)를 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-EMA(u)가 재평활화 결과에 적용


4.1.2. CMtm(price1,price2,q,r,s,u)-캔들 모멘텀 인디케이터. 특징
  • 파일명: Blau_CMtm.mq5
  • 이름: 윌리엄 블라우의 캔들 모멘텀 인디케이터(q-기간 평활화 캔들 모멘텀)
  • 입력 변수:
    • q-캔들 모멘텀 기간(디폴트 값 1)
    • r-q-기간 캔들 모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice1 - 가격 유형 [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - 가격 유형 [opening] (by default AppliedPrice=PRICE_OPEN).
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 EMA 평활화는 사용되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)


4.2. 정규화된 캔들 모멘텀

4.2.1. 캔들 모멘텀 인덱스

캔들 모멘텀 인덱스(CMI)는 정규화된 q-기간 캔들 모멘텀입니다.

q-기간 캔들의 평활화 값은 백분율로 나타납니다(매핑 인터벌 [-100, 100]). 평활화된 q-기간 캔들 모멘텀의 각 값은 평활화된 q-기간 캔들 모멘텀의 절대값으로 정규화됩니다. 정규화를 통해 CMI 값은 시장의 과매수(+) 또는 과매도(-) 정도를 반영하게 됩니다.

캔들 모멘텀 인덱스 공식

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)          100 * CMtm(price1,pric2,q,r,s,u)
CMI(price1,price2,q,r,s,u) = –––––––––––-------------––––––––-–––––––––––––––– = –––––––––––––––-------------–––-–––––––––––––
                               EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)     EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)
if EMA(EMA(EMA(|cmtm(price1,pric2,q)|,r),s),u)=0, then CMI(price1,price2,q,r,s,u)=0

좀 더 설명해 볼게요.

  • q-q-기간 캔들 모멘텀 계산에 필요한 가격 차트 기간의 개수
  • price1-q-기간 최종 가격 [종가]
  • price2-q-기간 최초 가격 [시가]
  • cmtm(price1,pric2,q)=price1-pric2[q-1]-q-기간 캔들 모멘텀
  • |cmtm(price1,pric2,q)|-q-기간 캔들 모멘텀의 절대값
  • CMtm (price,q,r,s,u)-재재평활화된 q-기간 캔들 모멘텀
  • EMA (..., r)-첫 번째 평활화-EMA(r)이 다음에 적용됨
    1) q-기간 캔들 모멘텀
    2) q-기간 캔들 모멘텀의 절대값
  • EMA (EMA(..., r),s)-재평활화-EMA(s)가 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-재평활화 결과에 EMA(u) 적용


4.2.1.1. CMI(가격1,가격2,q,r,s,u)-캔들 모멘텀 인덱스. 특징

  • 파일명: Blau_CMI.mq5
  • 이름: 윌리엄 블라우의 q-기간 캔들 모멘텀 인덱스(정규화된 q-기간 평활화 캔들 모멘텀, q-기간 캔들 모멘텀의 절대값으로 평활화)
  • 입력 변수:
    • q-캔들 모멘텀 기간(디폴트 값 1)
    • r-q-기간 캔들 모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice1 - 가격 유형 [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - 가격 유형 [opening] (by default AppliedPrice=PRICE_OPEN).
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
    • (선택) 2개 레벨 (디폴트 값 -25, +25)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

4.2.2. 캔들 인덱스

캔들스틱 인덱스(CSI)는 정규화된 q-기간 캔들 모멘텀 인디케이터(정규화된 q-기간 캔들 평활화 모멘텀)입니다. 평활화된 q-기간 캔들 모멘텀 값은 백분율로 나타납니다(인터벌 [-100, 100]).

평활화된 q-기간 캔들 모멘텀의 각 값은 q-기간 가격 범위 값(또는 q-기간 캔들 길이)으로 정규화됩니다. 정규화를 통해 CSI 값은 시장의 과매수(+) 또는 과매도(-) 상태를 나타내게 됩니다.

캔들 인덱스 공식:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)    100 * CMtm(price1,pric2,q,r,s,u)
CSI(price1,price2,q,r,s,u) = –––––––––––––––––––-–––-------------––––––––––––– = ––––––––––––––––--––-–––––––––––––
                                    EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)           EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then CSI(price1,price2,q,r,s,u)=0

좀 더 설명해 볼게요.

  • q-q-기간 캔들 모멘텀 계산에 사용되는 가격 차트 바의 개수
  • price1-q-기간 최종 가격 [종가]
  • price2-q-기간 최초 가격 [시가]
  • cmtm(price1,pric2,q)=price1-price2[q-1]-q-기간 캔들 모멘텀
  • LL (q)-q 기간 최저 가격의 최소값
  • HH(q)-q 기간 최고 가격의 최대 값
  • HH(q)-LL(q)-q-기간 가격 범위(q-기간 캔들 길이)
  • CMtm(price1,pric2,q,r,s,u)-재재평활화된 q-기간 캔들 모멘텀
  • EMA (..., r)-최초 평활화-EMA(r)가 다음에 적용됨
    1) q-기간 캔들 모멘텀
    2) q-기간 가격 범위(또는 q-기간 캔들 길이)
  • EMA (EMA(..., r),s)-재평활화-EMA(s)가 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-EMA(u)가 재평활화 결과에 적용

4.2.2.1. CSI(price1,price2,q,r,s,u)-캔들 인덱스. 특징

  • 파일명: Blau_CSI.mq5
  • 이름: 윌리엄 블라우의 q-기간 캔들 인덱스(정규화된 q-기간 캔들 평활화 모멘텀, q-기간 캔들 길이로 정규화)
  • 입력 변수:
    • q-q-기간 캔들 모멘텀이 계산되는 기간(디폴트 1)
    • r-q-기간 캔들 모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • AppliedPrice1 - 가격 유형 [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - 가격 유형 [opening] (by default AppliedPrice=PRICE_OPEN).
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
    • (선택) 2개 레벨 (디폴트 값 -25, +25)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 EMA 평활화는 사용되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

4.3. 캔들 에르고딕 오실레이터

4.3.1. 에르고딕 CMI 오실레이터

에르고딕 CMI 오실레이터의 정의
Ergodic_CMI(price1,pric2,q,r,s,u) = CMI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CMI(price1,pric2,q,r,s,u) ,ul)

좀 더 설명해 볼게요.

  • Ergodic_CMI()-에르고딕-캔들 모멘텀 인덱스 CMI(price1,price2,q,r,s,u)
  • SignalLine()-신호선-에르고딕에 EMA(ul) 적용
  • ul-신호선의 EMA 기간-윌리엄 블라우는 ul 값이 EMA 에르고딕의 직전 유의미(>1)한 기간 값과 동일해야 한다고 주장

Ergodic_CMI(price1,pric2,q,r,s,u,ul)-에르고딕 CMI 오실레이터. 특징

  • 파일명: Blau_Ergodic_CMI.mq5
  • 이름: 윌리엄 블라우의 에르고딕 CMI 오실레이터(캔들 모멘텀 인덱스 기반)
  • 입력 변수:
    • 그래픽 플롯 #0-에르고딕(캔들 모멘텀 인덱스)
      • q-캔들 모멘텀 기간(디폴트 값 1)
      • r-q-기간 캔들 모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
      • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
      • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • 그래픽 플롯 #1-신호선
      • ul-에르고딕에 적용되는 신호선 기간(디폴트 값 3)
    • AppliedPrice1 - 가격 유형 [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - 가격 유형 [opening] (by default AppliedPrice=PRICE_OPEN).
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 렌더링 스타일 변경-색깔, 굵기, 선 스타일('컬러' 탭)
    • 2개 레벨 (디폴트 값 -25, +25)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • ul>0. ul = 1일 때 신호선과 에르고딕 선이 일치
    • 가격 배열 최소 크기=(q-1 + r + s + u + ul-4 +1)


에르고딕 CMI 오실레이터 코드


Ergodic_CMI(price1,price2,r,s,u,ul) 인디케이터를 예로 보겠습니다.

1) 인디케이터 배열, 인디케이터 버퍼 및 그래픽 플롯의 관계

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                  // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                // Signal Line: EMA(ul), applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);        // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);        // price array [open]
   SetIndexBuffer(4,CMtmBuffer,INDICATOR_CALCULATIONS);          // q-period Candlestick Momentum
   SetIndexBuffer(5,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsCMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum (absolute value)
   SetIndexBuffer(9,EMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute value)
   SetIndexBuffer(10,DEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(11,TEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)

2) cmtm 및 |cmtm| 계산 알고리즘

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // applied price [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and |cmtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         AbsCMtmBuffer[i]=0.0; //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[] and AbsCMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      AbsCMtmBuffer[i]=MathAbs(CMtmBuffer[i]);
     }


4.3.2. 에르고딕 CSI 오실레이터

에르고딕 CSI 오실레이터는 다음과 같이 정의됩니다.

Ergodic_CSI(price1,pric2,q,r,s,u) = CSI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CSI(price1,pric2,q,r,s,u) ,ul)

좀 더 설명해 볼게요.

  • Ergodic_CSI()-에르고딕-캔들 인덱스 CSI(price1,price2,q,r,s,u)
  • SignalLine()-신호선-에르고딕에 EMA(u) 적용
  • ul-신호선의 EMA 기간-윌리엄 블라우에 따르면 ul 값은 EMA 에르고딕의 유의미한(>1) 직전 기간과 동일해야 합니다.


4.3.2.1. Ergodic_CSI(price1,price2,q,r,s,u,ul)-에르고딕 CI 오실레이터. 특징

  • 파일명: Blau_Ergodic_CSI.mq5
  • 이름: 윌리엄 블라우의 에르고딕 CSI 오실레이터(캔들 인덱스 기반)
  • 입력 변수:
    • 그래픽 플롯 #0-에르고딕(캔들 인덱스)
      • q-q-기간 캔들 모멘텀이 계산되는 기간(디폴트 1)
      • r-q-기간 캔들 모멘텀에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
      • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
      • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
    • 그래픽 플롯 #1-신호선
      • ul-에르고딕에 적용되는 EMA 기간 신호선(디폴트 값 3)
    • AppliedPrice1 - 가격 유형 [closing] (by default AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - 가격 유형 [opening] (by default AppliedPrice=PRICE_OPEN).
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 렌더링 스타일 변경-색깔, 굵기, 선 스타일('컬러' 탭)
    • 2개 레벨 (디폴트 값 -25, +25)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • ul>0. ul = 1일 때 신호선과 에르고딕 선이 일치
    • 가격 배열 최소 크기=(q-1 + r + s + u + ul-4 +1)


4.3.2.2. 에르고딕 CSI 오실리에이터 코드


Ergodic_CSI (price1, price2,r,s,u,ul) 인디케를 예로 들겠습니다.

1) 인디케이터 배열, 인디케이터 버퍼 및 그래픽 플롯의 관계

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);     // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);     // price arrya [open]
   SetIndexBuffer(4,LLBuffer,INDICATOR_CALCULATIONS);         // lowest prices (q bars)
   SetIndexBuffer(5,HHBuffer,INDICATOR_CALCULATIONS);         // highest prices (q bars)
   SetIndexBuffer(6,CMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum
   SetIndexBuffer(7,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA
   SetIndexBuffer(8,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // s-period 2nd EMA
   SetIndexBuffer(9,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // u-period 3rd EMA
   SetIndexBuffer(10,HHLLBuffer,INDICATOR_CALCULATIONS);      // price range (q bars)
   SetIndexBuffer(11,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (price range)
   SetIndexBuffer(12,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (price range)
   SetIndexBuffer(13,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (price range)

2) cmtm 및 q-기간 가격 범위 계산 알고리즘 

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // price type [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and price range (q bars)
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         HHLLBuffer[i]=0.0;    //
         LLBuffer[i]=0.0;      //
         HHBuffer[i]=0.0;      //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // CMtmBuffer[] - q-period Candlestick Momentum
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      // LLBuffer[] - search for the lowest price (q bars)
      // HHBuffer[] - search for the highest price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // HHLLBuffer[] - Price Range (q bars)
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }

5. 추세 경향

다음의 인디케이터를 포함합니다(첨부파일 참조).

  1. Blau_HLM.mq5-가상 마감 인디케이터(q-기간 지수 고점-저점 모멘텀, 평활화된 q-기간 지수 고점-저점 모멘텀)
  2. Blau_DTI.mq5-추세 경향 인덱스(정규화된 평활화 q-기간 지수 고점-저점 모멘텀)
  3. Blau_Ergodic_DTI.mq5-에르고딕 DTI 오실레이터(추세 경향 인덱스 기반)

그림 5.1. 추세 경향 인덱스 인디케이터

그림 5.1. 추세 경향 인덱스 인디케이터

 

5.1. 지수 고점-저점 모멘텀

5.1.1. 상승세 및 하락세 모멘텀 정의하기

추세의 정의 중 하나를 볼게요. 최대값이 상승하면 상승세라고 봅니다. 최소값이 하락하면 하락세라고 하죠.

섹션 1에서 언급한 모멘텀 인디케이터를 이용하면 최고가 모멘텀을 계산할 수 있습니다.

Mtm( price=High, q, r, s, u )
TSI( price=High, q, r, s, u )
Ergodic( price=High, q, r, s, u )

최저가의 경우는 다음을 따르면 됩니다.

Mtm( price=Low, q, r, s, u )
TSI( price=Low, q, r, s, u )
Ergodic( price=Low, q, r, s, u )

상승세 모멘텀 또는 하이 모멘텀 업(HMU)은 현재 기간의 최대 가격과 q-기간 가격 범위 초반 최대 가격 사이의 의 차이입니다. 상승세인 q-기간 모멘텀의 값은 q-기간 초반 가격 변동 범위 최대값에 대한 현재 기간 최고가의 성장의 상대적 속도를 의미합니다.

상승세 q-기간 모멘텀 공식

HMU(q) = High - High[q-1], if High - High[q-1] > 0
HMU(q) = 0, if High - High[q-1] <= 0

좀 더 설명해 볼게요.

  • q-상승세 모멘텀의 계산에 필요한 가격 그래프 내 기간 수
  • High-현재 기간 최고가
  • High[q–1]-(q-1) 기간 최고가

하락세 모멘텀 또는 로우 모멘텀 다운(LMD)은 현재 기간의 최저 가격과 q-기간 가격 범위 초반 최저 가격 사이의 의 차이입니다. 하락세인 q-기간 모멘텀의 값은 q-기간 초반 가격 변동 범위 최소값에 대한 현재 기간 최저가의 하락의 상대적 속도를 나타냅니다.

하락세 q-기간 모멘텀 공식:

LMD(q) = -(Low - Low[q-1]), if Low - Low[q-1] < 0
LMD(q) = 0, if Low - Low[q-1] >= 0

좀 더 설명해 볼게요.

  • q-하락세 모멘텀 계산에 필요한 가격 그래프 내 기간 수
  • Low-현재 기간 최저가
  • Low[q-1]-(q-1) 기간 최저가

지수 고점-저점 모멘텀(고점-저점 모멘텀, HLM)은 상승세인 q-기간 모멘텀과 하락세인 q-기간 모멘텀의 차이를 나타냅니다. 지수 고점-저점 모멘텀 부호는 가격 변동 추세를 나타냅니다. 양의 HLM은 상승 추세를, 음의 HLM은 하락 추세를 의미합니다.

공식:

HLM(q) = HMU(q) - LMD(q)

좀 더 설명해 볼게요.

  • q-상승세 및 하락세 모멘텀 계산에 필요한 가격 차트 기간의 수
  • HMU(q)-q 기간 상승세 모멘텀
  • LMD(q)-q 기간 하락세 모멘텀

평활화된 지수 고점-저점 모멘텀 공식(가상 마감)

HLM(q,r,s,u) = EMA(EMA(EMA( HLM(q) ,r),s),u) = EMA(EMA(EMA( HMU(q)-HMD(q) ,r),s),u)

좀 더 설명해 볼게요.

  • q-상승세 및 하락세 모멘텀 계산에 필요한 가격 차트 기간의 수
  • HMU(q)-q 기간 상승세 모멘텀
  • LMD(q)-q 기간 하락세 모멘텀
  • HLM(q) = HMU(q)-LMD(q)-q-기간 지수 고점-저점 모멘텀
  • EMA (HLM (q), r)-최초 평활화-q-기간 지수 고점-저점 모멘텀에 EMA(r) 적용
  • EMA (EMA(..., r),s)-재평활화-EMA(s)를 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-재평활화 결과에 EMA(u)를 적용

상승세 모멘텀과 하락세 모멘텀의 복잡한 누계를 나타내는 그래프 곡선을 가상 마감이라고 합니다.


5.1.2. HLM(q,r,s,u)-가상 마감 인디케이터 특징
  • 파일명: Blau_HLM.mq5
  • 이름: 윌리엄 블라우의 가상 마감(q-기간 지수 고점-저점 모멘텀, 평활화된 q-기간 지수 고점-저점 모멘텀)
  • 입력 변수:
    • q-HLM 계산 기간(디폴트 값 2)
    • r-HLM에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

5.2. 추세 경향 인덱스

5.2.1. 추세 경향 인덱스의 정의

추세 경향 인덱스(Directional Trend Index, DTI)는 정규화된 q-기간 지수 고점-저점 모멘텀 인디케이터(정규화된 평활화 HLM)입니다. 평활화된 HLM 값은 백분율로 나타납니다(디스플레이 인터벌 [-100, 100]).

평활화된 HLM의 각 값은 평활화된 HLM의 절대값으로 정규화됩니다. 정규화를 통해 DTI 값은 시장의 과매수(+) 또는 과매도(-) 상태를 나타내게 됩니다.

추세 경향 인덱스 공식:

               100 * EMA(EMA(EMA( HLM(q) ,r),s),u)          100 * HLM(q,r,s,u)
DTI(q,r,s,u) = –––––––––––––––––––––––––---––––––– = ––––––––––––––--–––––––––––––––
                 EMA(EMA(EMA( |HLM(q)| ,r),s),u)     EMA(EMA(EMA( |HLM(q)| ,r),s),u)
if EMA(EMA(EMA(|HLM(q)|,r),s),u)=0, then DTI(price,q,r,s,u)=0

좀 더 설명해 볼게요.

  • q-상승세 및 하락세 모멘텀 계산에 필요한 가격 차트 기간의 수
  • HLM(q) = HMU(q)-LMD(q)-q-기간 복합 모멘텀
  • |HLM(q)|-HLM(q)의 절대값
  • HLM(q,r,s,u)-재재평활화된 HLM(q)
  • EMA(..., r)-최초 평활화-EMA(r)을 다음에 적용
    1) HLM(q)
    2) HLM(q)의 절대값
  • EMA (EMA(..., r),s)-재평활화-EMA(s)가 최초 평활화 결과에 적용
  • EMA (EMA (EMA (..., r), s), u)-재재평활화-EMA(u)가 재평활화 결과에 적용
5.2.2. DTI(q,r,s,u)-추세 경향 인덱스 특징
  • 파일명: Blau_DTI.mq5
  • 이름: 윌리엄 블라우의 추세 경향 인덱스(정규화된 평활화 q-기간 지수 고점-저점 모멘텀)
  • 입력 변수:
    • q-HLM 계산 기간(디폴트 값 2)
    • r-HLM에 적용되는 첫 번째 EMA 기간(디폴트 값 20)
    • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
    • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트 값 3)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 변화-색깔, 굵기, 선 스타일('컬러' 탭)
    • (선택) 2개 레벨 (디폴트 값 -25, +25)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 해당 EMA 기간에 대한 평활화가 수행되지 않음
    • 가격 배열 최소 크기=(q-1 + r + s + u-3 +1)

 

5.3. 에르고딕 DTI 오실레이터

5.3.1. 에르고딕 DTI 오실레이터의 정의

Ergodic_DTI(q,r,s,u) = DTI(q,r,s,u)
SignalLine(q,r,s,u,ul) = EMA( Ergodic_DTI(q,r,s,u) ,ul)

좀 더 설명해 볼게요.

  • Ergodic_DTI()-에르고딕-추세 방향 인덱스 DTI(q,r,s,u)
  • SignalLine()-신호선-에르고딕에 적용되는 EMA(ul)
  • ul-신호선의 EMA 기간-윌리엄 블라우에 따르면 ul 값은 EMA 에르고딕의 유의미한(>1) 직전 기간과 동일해야 합니다.
5.3.2. Ergodic_DTI(q,r,s,u,ul)-에르고딕 DTI 오실레이터. 특징
  • 파일명: Blau_Ergodic_DTI.mq5
  • 이름: 윌리엄 블라우의 에르고딕 DTI 오실레이터(추세 방향 인덱스 기반)
  • 입력 변수:
    • 그래픽 플롯 #0-에르고딕(추세 방향 인덱스)
      • q-HLM 계산 기간(디폴트 값 2)
      • r-HLM에 대한 첫 번째 EMA 기간(디폴트 값 20)
      • s-최초 평활화 결과에 적용되는 두 번째 EMA 기간(디폴트 값 5)
      • u-재평활화 결과에 적용되는 세 번째 EMA 기간(디폴트값 3)
    • 그래픽 플롯 #1-신호선
      • ul-에르고딕에 적용되는 EMA 기간 신호선(디폴트 값 3)
  • 기타:
    • 별도의 창에 표시
    • 그래픽 플롯 렌더링 스타일 변경-색깔, 굵기, 선 스타일('컬러' 탭)
    • 2개 레벨 (디폴트 값 -25, +25)-레벨 추가/삭제, 값 변경, 레벨 설명, 레벨 렌더링 스타일 변경('레벨' 탭)
    • 단일 인디케이터 창 하한(디폴트 값 -100) 및 상한(디폴트 값 100) 변경('스케일' 탭)
  • 한계점:
    • q>0;
    • r>0, s>0, u>0. r, s, 또는 u가 1일 때 EMA 평활화는 사용되지 않음
    • ul>0. ul = 1일 때 신호선과 에르고딕 선이 일치
    • 가격 배열 최소 크기=(q-1 + r + s + u + ul-4 +1)


5.4. 에르고딕 DTI 오실레이터 코드

Ergodic_DTI (q,r,s,u,ul) 인디케이터

1) 인디케이터 배열, 인디케이터 버퍼 및 그래픽 플롯 간 링크

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic Line
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,HMUBuffer,INDICATOR_CALCULATIONS);          // q-period Up Trend Momentum
   SetIndexBuffer(3,LMDBuffer,INDICATOR_CALCULATIONS);          // q-period Down Trend Momentum
   SetIndexBuffer(4,HLMBuffer,INDICATOR_CALCULATIONS);          // Composite q-period High/Low Momentum
   SetIndexBuffer(5,EMA_HLMBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsHLMBuffer,INDICATOR_CALCULATIONS);       // Composite q-period High/Low Momentum (absolute values)
   SetIndexBuffer(9,EMA_AbsHLMBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute values)
   SetIndexBuffer(10,DEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute values)
   SetIndexBuffer(11,TEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute values)

2) HLM 및 |HML| 계산 알고리즘

//--- calculation of HLM and |HLM|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         HLMBuffer[i]=0.0;     // zero values
         AbsHLMBuffer[i]=0.0;  //
         HMUBuffer[i]=0.0;     //
         LMDBuffer[i]=0.0;     //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of HLMBuffer[], AbsHLMBuffer[], HMUBuffer[], LMDBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      HMUBuffer[i]=High[i]-High[i-(q-1)];    HMUBuffer[i]=(HMUBuffer[i]>0)?HMUBuffer[i]:0;
      LMDBuffer[i]=-1*(Low[i]-Low[i-(q-1)]); LMDBuffer[i]=(LMDBuffer[i]>0)?LMDBuffer[i]:0;
      HLMBuffer[i]=HMUBuffer[i]-LMDBuffer[i];
      AbsHLMBuffer[i]=MathAbs(HLMBuffer[i]);
     }

결론

첫 번째 파트는 윌리엄 블라우의 MQL5 인디케이터 및 거래 시스템에 관한 내용입니다. 파트 1: 인디케이터는 윌리엄 블라우의 'Momentum, Direction, and Divergence'에 따른 MQL5 인디케이터 및 오실레이터에 대한 설명을 제공합니다.

해당 인디케이터 사용법은 '윌리엄 블라우의 인디케이터 및 거래 시스템'의 두 번째 파트에서 소개됩니다. 파트 2: 트레이딩 시스템.

 

첨부파일 목록(Blau_Indicators_MQL5_en.zip)

파일 명칭
첨부 파일 위치: terminal_data_folder\MQL5\Include
 WilliamBlau.mqh  
인디케이터 위치: terminal_data_folder\MQL5\Indicator
   모멘텀 기반 인디케이터
 Blau_Mtm.mq5  모멘텀 인디케이터(q-기간 모멘텀, 평활화 q-기간 모멘텀)
 Blau_TSI.mq5  TSI(정규화된 평활화 q-기간 모멘텀)
 Blau_Ergodic.mq5  에르고딕 오실레이터(TSI 기반)
   스토캐스틱 기반 인디케이터
 Blau_TStoch.mq5  스토캐스틱(q-기간 스토캐스틱, 평활화 q-기간 스토캐스틱)
 Blau_TStochI.mq5  스토캐스틱 인덱스(정규화된 평활화 q-기간 스토캐스틱)
 Blau_TS_Stochastic.mq5  스토캐스틱 TS 오실레이터(스토캐스틱 인덱스 기반)
   스토캐스틱 모멘텀 기반 인디케이터
 Blau_SM.mq5  스토캐스틱 모멘텀(q-기간 스토캐스틱 모멘텀, 평활화 q-기간 스토캐스틱 모멘텀)
 Blau_SMI.mq5  스토캐스틱 모멘텀 인덱스(정규화된 평활화 q-스토캐스틱 모멘텀 RSI)
 Blau_SM_Stochastic.mq5  스토캐스틱 SM 오실레이터(스토캐스틱 모멘텀 인덱스 기바)
   시장 추세 편차 기반 인디케이터
 Blau_MDI.mq5  평균 편차 인디케이터(평규 편차, 평활화된 평균 편차)
 Blau_Ergodic_MDI.mq5  에르고딕 MDI 오실레이터(평균 편차 인디케이터 기반)
   MACD 기반 인디케이터
 Blau_MACD.mq5  MACD 인디케이터(MACD, 평활화된 MACD)
 Blau_Ergodic_MACD.mq5  에르고딕 MACD 오실레이터(MACD 인디케이터 기반)
   캔들 모멘텀 기반 인디케이터
 Blau_CMtm.mq5  캔들 모멘텀 인디케이터(q-기간 캔들 모멘텀, 평활화 q-기간 캔들 모멘텀)
 Blau_CMI.mq5  캔들 모멘텀 인덱스(정규화된 평활화 q-기간 캔들 모멘텀, q-기간 캔들 모멘텀 절대값으로 정규화)
 Blau_CSI.mq5  캔들 인덱스(정규화된 평활화 q-기간 캔들 모멘텀, q-기간 캔들 길이로 정규화)
 Blau_Ergodic_CMI.mq5  에르고딕 CMI 오실레이터(캔들 모멘텀 인덱스 기반)
 Blau_Ergodic_CSI.mq5  에르고딕 CSI 오실레이터(캔들 인덱스 기반)
   지수 모멘텀 기반 인디케이터
 Blau_HLM.mq5  가상 마감 인디케이터(q-기간 지수 고점-저점 모멘텀, 평활화 q-기간 고점-저점 모멘텀)
 Blau_DTI.mq5  추세 경향 인덱스(정규화된 평활화 q-기간 지수 고점-저점 모멘텀)
 Blau_Ergodic_DTI.mq5  에르고딕 DTI 오실레이터(추세 경향 인덱스 기반)

MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/190

사전 정의된 위험 및 R/R 비율을 기반으로 인터랙티브 반자동 드래그 앤 드롭 Expert Advisor 구축 사전 정의된 위험 및 R/R 비율을 기반으로 인터랙티브 반자동 드래그 앤 드롭 Expert Advisor 구축
일부 거래자는 모든 거래를 자동으로 실행하고 일부는 여러 지표의 출력을 기반으로 자동 및 수동 거래를 혼합합니다. 후자 그룹의 일원이기 때문에 동적으로 위험을 평가하고 차트에서 직접 가격 수준을 보상 할 수 있는 대화형 도구가 필요했습니다. 이 글에서는 사전 정의된 주식 위험 및 R/R 비율을 사용하여 대화형 반자동 Expert Advisor를 구현하는 방법을 설명합니다. Expert Advisor 위험, R/R 및 랏 크기 매개 변수는 EA 패널에서 런타임 중에 변경할 수 있습니다.
스펙트럼 분석기 구축 스펙트럼 분석기 구축
이 글은 독자들이 MQL5 언어의 그래픽 객체를 사용하는 가능한 변형에 대해 알게 하기 위한 것입니다. 그래픽 개체를 사용하여 간단한 스펙트럼 분석기를 관리하는 패널을 구현하는 표시기를 분석합니다. 이 기사는 MQL5의 기본 사항에 대해 잘 알고 있는 독자를 대상으로 합니다.
CChartObject 클래스 기반의 새로운 GUI 위젯 설계 및 구현 CChartObject 클래스 기반의 새로운 GUI 위젯 설계 및 구현
GUI 인터페이스가 있는 반자동 Expert Advisor에 대한 이전 글을 작성한 후 더 복잡한 지표와 Expert Advisors를 위한 몇 가지 새로운 기능으로 인터페이스를 향상시키는 것이 바람직하다는 것이 밝혀졌습니다. MQL5 표준 라이브러리 클래스에 익숙해 진 후 새로운 위젯을 구현했습니다. 이 글에서는 표시기 및 Expert Advisor에서 사용할 수 있는 새로운 MQL5 GUI 위젯을 설계하고 구현하는 프로세스를 설명합니다. 글에 제시된 위젯은 CChartObjectSpinner, CChartObjectProgressBar 및 CChartObjectEditTable입니다.
추가 버퍼를 사용하지 않고 중간 계산을 위한 평균 가격 시리즈 추가 버퍼를 사용하지 않고 중간 계산을 위한 평균 가격 시리즈
이 문서는 가장 단순한 클래스와 단일 유형 클래스로 압축된 평균화의 전통적이고 특이한 알고리즘에 대해 설명합니다. 거의 모든 지표 개발에서 보편적으로 사용하기 위한 것입니다. 제안된 클래스가 사용자 지정 및 기술 지표의 '대량' 호출에 대한 좋은 대안이 되기를 바랍니다.