안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 5에서 새로운 바(캔들)를 탐지하는 간단한 코드를 소개할게요. 이 코드를 통해 거래의 효율성을 높일 수 있습니다.
이 코드의 기본 원리는 아주 간단합니다. 먼저, 이전 바의 시간을 저장해두고, 여기에 60초를 더합니다. 이렇게 하면 현재 바의 마감 시간 값을 얻을 수 있습니다.
이후 현재 시간이 현재 바의 마감 시간과 일치할 때, 새로운 바가 생성되었다고 판단하게 됩니다.
이 코드에서는 플래그(NewBarReceived)를 사용하여 이 코드 블록이 여러 번 호출되는 것을 방지합니다. 즉, 이 코드는 바(캔들)당 한 번만 실행됩니다. Comment();와 playsound("ok.wav");는 코드의 정확성을 확인하기 위한 것입니다. 필요 없으시면 제거하셔도 괜찮습니다.
현재 시간이 현재 캔들의 마감 시간을 초과하면 플래그가 false로 리셋되어 다음 바의 도착을 확인할 수 있습니다. (코드 내 주석을 확인하세요.)
//+------------------------------------------------------------------+ //| New Bar Detect.mq5 | //| by H A T Lakmal | //| https://t.me/Lakmal846 | //+------------------------------------------------------------------+ bool NewBarReceived = false; // 제어용 플래그. //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- 타이머 생성 EventSetTimer(60); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- 타이머 삭제 EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { datetime TimePreviousBar = iTime(_Symbol,PERIOD_M1,1); datetime TimeCurrentClose = TimePreviousBar + 60; // 현재 바의 마감 시간. datetime Time_Current = TimeCurrent(); if(Time_Current == TimeCurrentClose && NewBarReceived == false) { PlaySound("ok.wav"); // 코드가 제대로 작동하는지 확인. NewBarReceived = true; // 플래그를 업데이트하여 중복 호출 방지. // 여기에 코드를 추가하세요 ----- (무언가를 수행) } else if(Time_Current > TimeCurrentClose) { NewBarReceived = false; // 다음 바 오픈을 위해 플래그 리셋. // 여기에 코드를 추가하세요 ----- (무언가를 수행) } Comment("\n" + "\n" + "현재 바 시간: " + TimeToString(TimePreviousBar,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + "\n" + "현재 마감 시간: " +TimeToString(TimeCurrentClose,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + "\n" + "현재 시간: " + TimeToString(Time_Current,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + "\n" +"\n" + "새로운 바 수신 여부: " + NewBarReceived); // 계산 확인용 } //+------------------------------------------------------------------+ //| 타이머 함수 | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ //| 거래 함수 | //+------------------------------------------------------------------+ void OnTrade() { //--- } //+------------------------------------------------------------------+ //| 차트 이벤트 함수 | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+
이제 이 코드를 활용하여 새로운 바가 생성될 때마다 효율적으로 대응할 수 있게 되었습니다. 다른 질문이 있으시면 댓글로 남겨주세요!