시스템트레이딩 게시글

MT4에서 새로운 바 이벤트 감지하는 방법

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

안녕하세요, 트레이더 여러분! 오늘은 MetaTrader 4에서 새로운 바 이벤트를 감지하는 방법에 대해 알아보려고 합니다.

새로운 바 존재 감지하기

현재 시간대에서 새로운 바를 감지하는 것은 생각보다 간단합니다. 아래의 코드를 참조해보세요:

void start(){
  static datetime tmp;
  if (tmp != Time[0]) {
    tmp = Time[0];
    // 여기에 코드 작성
  }
}

하지만 다른 시간대 이벤트는 조금 다릅니다. MT4는 onBar 이벤트를 지원하지 않지만, 상승하는 시간을 배열에 저장하고 매 틱마다 배열의 시간을 체크하여 적절한 시간이 되면 새로운 바 이벤트를 실행할 수 있습니다. 예를 들어 M5 시간대에서 백테스트를 실행한다면 M6, M7, ... D1 이벤트를 감지할 수 있습니다.

왜 상승 추세만 감지할 수 있냐고요? 그 이유는 메타트레이더에서 틱 데이터를 생성하는 방법과 관련이 있습니다. D1 시간대까지는 주가 일요일 20:45 (브로커에 따라 다름)부터 시작되며, 월의 시작이 주 중간에 시작될 수 있는 등 복잡한 요소가 많습니다. 이 정보는 별로 중요하지 않으니 깊게 다루지 않겠습니다.

이 주제에 대한 글도 있지만, 많은 분들이 포럼이나 글을 읽지 않으시므로 이 코드를 게시하게 되었습니다.

코드 설명:

초기화 함수에서는 시간 배열을 시작 시간으로 채웁니다:

  curIndex = utils.periodToPeriodIndex(Period());
  times[curIndex] = Time[0];
  for(int i = curIndex + 1; i < MAX; i++)
    times[i] = times[curIndex] - MathMod(times[curIndex], utils.periodIndexToPeriod(i) * 60);

그리고 start 함수에서는 충분한 시간이 경과했는지 체크한 후 이벤트를 실행합니다:

  if (times[curIndex] != Time[0]) {
    times[curIndex] = Time[0];
    onBar(Period());
    for(int i = curIndex + 1; i < MAX; i++) {
      int period = utils.periodIndexToPeriod(i),
          seconds = period * 60,
          time0 = times[curIndex] - MathMod(times[curIndex], seconds);
      if (times[i] != time0) {
        times[i] = time0;
        onBar(period);
      }
    }
  }

마지막으로, 코드를 아래와 같이 작성하면 됩니다:

void onTick() { 
}

그리고

void onBar(int period) {
}

이상입니다! 질문이 있거나 더 알고 싶은 내용이 있다면 댓글로 남겨주세요.

업데이트 1.1: WHRoeder님께 감사드립니다.

연관 포스트

댓글 (0)