시스템트레이딩 게시글

신규 바(캔들) 시작 감지하기 - 메타트레이더 5용 EA 작성법

첨부파일
39103.zip (884 bytes, 다운로드 2회)

안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 5에서 신규 바(캔들)의 시작을 감지하는 방법에 대해 이야기해볼까 합니다. EA(전문가 어드바이저)를 사용하면 새로운 틱(tick) 시세가 도착할 때, 메타트레이더 터미널은 기본적으로 OnTick() 이벤트 처리 함수를 호출합니다. 하지만, 신규 바가 시작되거나 열릴 때를 감지하는 기본 이벤트 처리 함수는 없습니다.

그래서 현재 가장 최근 바의 오프닝 시간을 모니터링해야 합니다. 이 시간이 변경되면 신규 바의 시작을 의미하며, 이에 반응하고 이벤트를 처리할 수 있게 됩니다. 아래의 샘플 코드는 MQL4와 MQL5에서 모두 호환되는 방법을 보여줍니다:

// 기본 틱 이벤트 핸들러
   void OnTick()
   {
      // 신규 바 확인 (MQL4 및 MQL5 호환)
         static datetime dtBarCurrent  = WRONG_VALUE;
                datetime dtBarPrevious = dtBarCurrent;
                         dtBarCurrent  = iTime( _Symbol, _Period, 0 );
                bool     bNewBarEvent  = ( dtBarCurrent != dtBarPrevious );

      // 신규 바 이벤트에 반응하고 처리하기
         if( bNewBarEvent )
         {
            // 첫 번째 틱 수신 여부를 감지하고 처리하기
               /* 예를 들어, 차트에 처음 부착되었을 때
                   바가 진행 중간에 위치하고,
                   사실 신규 바의 시작이 아닐 때 */
               if( dtBarPrevious == WRONG_VALUE )
               {
                  // 첫 번째 틱 또는 바 중간에서 무언가 수행...
               }
               else
               {
                  // 일반적인 바가 시작될 때 무언가 수행...
               };

            // 위의 조건과 관계없이 무언가 수행...
         }
         else
         {
            // 다른 작업 수행...
         };

      // 다른 작업 수행...
   };

위의 코드에서 정적 변수는 바의 오프닝 시간을 추적하며, OnTick() 함수에서 반환할 때에도 그 값을 유지합니다. 일반적인 지역 변수와 달리, 데이터 내용을 기억하고 함수에서 나올 때 해제되지 않습니다. 이 점이 현재 바의 오프닝 시간 변경을 감지하는 핵심입니다.

또한 EA가 차트에 처음 부착될 때, 위의 코드는 마치 바가 막 열린 것처럼 반응합니다. 이 조건은 상황에 따라 다르게 처리해야 할 수도 있습니다.

마지막으로, 모든 제 CodeBase 출판물의 소스 코드는 현재 메타에디터의 “Public Projects” 탭에서 “FMIC”라는 이름으로 확인하실 수 있습니다.

연관 포스트

댓글 (0)