MT4에서 자동매매 시스템을 개발할 때, 새로운 틱이 도착하면 MetaTrader 터미널은 기본적으로 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() 함수에서 반환할 때에도 바의 열림 시간을 추적합니다. 일반적인 지역 변수와 달리, 정적 변수는 데이터 내용을 기억하고 함수를 떠날 때 해제되지 않습니다. 이는 현재 바의 열림 시간 변화를 감지하는 핵심입니다.
또한, 자동매매 시스템이 차트에 처음 배치될 때, 위의 코드는 바가 방금 열렸다고 반응하는 점도 중요합니다. 이 경우에 따라 다르게 처리해야 할 필요가 있을 수 있습니다.
참고로, 저의 CodeBase 출판물의 소스 코드는 이제 MetaEditor의