안녕하세요, 트레이더 여러분! 오늘은 오실레이터 사용에 대한 고민을 덜어줄 정규화(Normalization) 방법에 대해 이야기해보려고 합니다. 오실레이터의 값을 [-1;1] 범위로 조정하는 것은 새로운 가능성을 열어주는 좋은 방법인데요. 이로 인해 특정 레벨(예: 0.5, 0.8 등)에 따라 지표의 값을 제어할 수 있게 됩니다. 시장에 따라 임의로 추정된 값에 의존하지 않고도 말이죠. 물론 정규화가 이미 된 지표는 별도로 고려할 필요가 없지만, 만약 그렇지 않다면 이 방법을 활용해 보세요! 제 코드가 다소 미완성일 수 있지만, 너무 엄격하게 판단하지 말아주세요.
매개변수:
string Indicator - icustom() 함수에 전달되는 지표입니다. 아쉽게도 MQL4 자동화 도구가 표준 지표 추가에는 충분하지 않아요. 하지만 호기심 많은 코더가 프로그램의 항목을 변경하는 것을 누가 막을 수 있을까요?
int mode - 초기 지표의 필요한 라인 번호입니다...
int param1
int param2 - 그리고 그 지표의 매개변수입니다. 다시 말하지만, MQL 개발자들의 상상력은 매개변수의 가변 수를 가진 함수(예: Print)를 작성할 수 있게 허용하는 정도에서 끝나는 것 같아요. 그래서 우리는 수작업으로 진행해야 합니다.
그림:

주석:
계산은 두 단계로 이루어집니다:
1. 초기화 단계(init() 함수에서, 혹시 모르는 분을 위해 설명드리자면)에서는 지표 데이터의 전체 배열을 분석하여 특징적인 주기를 계산합니다. 이 주기는 지표의 평균 제곱 값이 전체 역사에서 어떤 통찰력을 제공할 수 있는지를 나타냅니다.
예를 들어, 우리가 오실레이터를 가지고 있고 여러 연속된 진동 주기에 대한 평균 제곱을 계산했다고 가정해 봅시다. 여기서 3개의 주기가 필요하다는 합의를 해보죠(#define PERIODS_CHARACTERISTIC 3, 너무 많은 주기를 사용할 경우 프로세서가 과부하 될 수 있으니 주의하세요). 계산의 본질은 평균적으로 한 주기가 얼마나 긴지를 결정하고(즉, 지표의 두 제로 사이의 평균 간격의 2배), 이 값을 3으로 곱하는 것입니다.
2. 이제는 얻어진 3개 주기에 대해 각 바의 MSV(평균 제곱 값)를 계산하고, 이를 바탕으로 지표 값을 정규화한 후, 마지막으로 모든 값을 동적인 범위 [-1;1]로 조정합니다. 이때 사용하는 함수는 f(x)=tanh(x)로, 하이퍼볼릭 탄젠트 함수입니다. 이 함수를 직접 작성해야 했어요! :)
아주 기술적인 예시를 들어보면, 그림에서 초록색 선은 시장 활동을 나타내는 저의 오래된 오실레이터입니다(사실상 MACD와 비슷하지만, 거래량 기반입니다). 파란색 선은 -=정규화기=-를 통과한 오실레이터입니다. +-0.75, +-0.5, +-0.25 레벨이 명확하게 보이며, 모든 최대값과 최소값, 상승 및 하락 구간, 그리고 제로 레벨의 교차점이 그 위치를 잘 유지하고 있습니다.
그러니 여러분, 제 방법이 마음에 들지 않더라도 제가 잘못한 것은 아닙니다! :)