저자: Witold Wozniak
주기 측정기는 금융 자산의 가격 변동 주기를 측정하기 위해 설계되었습니다. 이 지표는 현재 시장 주기 값을 지표 버퍼에 저장하는데, 이 값은 여러 이유로 인해 안정적일 수 없습니다. 이 지표는 오실레이터와 함께 사용되어 끊임없이 변화하는 시장 주기에 적응하도록 설계되었습니다.
이 지표는 2002년 11월 "Using The Fisher Transform"이라는 제목의 기사에서 영감을 받았습니다. 이 기사는 "Technical Analysis Of Stock & Commodities" 잡지에 게재되었습니다.

주기 측정기 지표 핸들은 다른 지표의 코드에서 사용하기 위해 전역 수준에서 선언되어야 합니다 (예: RVI 오실레이터에서). 다음과 같이 선언할 수 있습니다:
//---- 지표 핸들을 위한 정수 변수 선언 int CP_Handle;
그 다음, RVI 지표 초기화 블록에서 주기 측정기 핸들을 가져와야 합니다:
//---- 주기 측정기 핸들 가져오기 CP_Handle=iCustom(NULL,0,"CyclePeriod",Alpha); if(CP_Handle==INVALID_HANDLE) { Print("주기 측정기 핸들을 가져오는 데 실패했습니다."); return(1); }
이제 새로운 Alpha 변수가 사용된 지표의 입력 매개변수와 주기 평균 비율이 됩니다. 이 변수는 개발된 지표 입력 변수로 변환되어야 합니다.
//+----------------------------------------------+ //| 지표 입력 매개변수 | //+----------------------------------------------+ input double Alpha=0.07; // 지표 스무딩 비율
이전의 Length 입력 변수를 입력 매개변수 목록에서 제거하고 OnCalculate() 함수 내부의 지역 변수로 변환해야 합니다.
지표 스무딩에 사용되는 배열의 크기는 Length 매개변수 값에 의해 고정됩니다:
//---- 변수 배열을 위한 메모리 분배 ArrayResize(Count,Length); ArrayResize(Value1,Length); ArrayResize(Value2,Length);
이 매개변수의 값은 이제 변경됩니다. 따라서 이러한 배열의 크기는 이 변수의 예상 최대값보다 작지 않도록 설정하는 것이 좋습니다.
지표 차트를 분석하는 동안 이 값이 100을 초과하지 않음을 알 수 있습니다. 따라서 배열의 크기는 동일한 값으로 설정됩니다:
//---- 변수 배열을 위한 메모리 분배 ArrayResize(Count,MAXPERIOD); ArrayResize(Value1,MAXPERIOD); ArrayResize(Value2,MAXPERIOD);
이제 OnCalculate() 블록에서 현재 바의 주기 값은 CyclePeriod 사용자 정의 지표 버퍼에서 가져와야 하며, 이전의 Length 입력 매개변수의 값을 대신 사용해야 합니다.
//---- 주요 지표 계산 루프 for(bar=first; bar<rates_total && !IsStopped(); bar++) { //---- 새로 생성된 데이터를 배열로 복사 if(CopyBuffer(CP_Handle,0,rates_total-1-bar,4,period)<=0) return(RESET); Length=int(MathFloor((4.0*period[0]+3.0*period[1]+2.0*period[2]+period[3])/20.0)); if(bar<Length) Length=bar; // 실제 바 수로 스무딩을 줄입니다.
이 경우 마지막 4개의 값이 CyclePeriod 지표 버퍼에서 가져와지고, 이들의 선형 가중 스무딩이 수행된 후 얻어진 값이 Length 스무딩 기간으로 사용됩니다. 마지막으로, 지표 코드의 끝 부분에서 다음과 같이 수정해야 합니다:
if(bar<rates_total-1) Recount_ArrayZeroPos(Count,MAXPERIOD);
결과적으로, 우리는 적응형 RVI 오실레이터를 얻게 됩니다:
