시스템트레이딩 게시글

MT5를 위한 새로운 바 탐지 코드 완벽 가이드

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

안녕하세요, 트레이더 여러분! 오늘은 메타트레이더 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)
  {
//---

  }
//+------------------------------------------------------------------+

이제 이 코드를 활용하여 새로운 바가 생성될 때마다 효율적으로 대응할 수 있게 되었습니다. 다른 질문이 있으시면 댓글로 남겨주세요!

연관 포스트

댓글 (0)