거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Telegram에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
라이브러리

Local Timezones and Local Session Hours - MetaTrader 5용 라이브러리

조회수:
49
평가:
(16)
게시됨:
MQL5 프리랜스 이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

트레이더 여러분, 안녕하세요.

이 라이브러리에는 특정 또는 모든 외환 시장의 현재 현지 시간을 가져오는 모든 기능이 있습니다. 현지 시간을 시간대 간 또는 브로커 서버 시간으로 변환할 수 있습니다. 또한 각 세션의 세션 시작 및 종료 시간을 개별적으로 설정하여 특정 세션에서 거래할 수도 있습니다. 라이브러리는 브로커와 해당 시장의 서로 다른 시차 및 일광 절약 시간 변경을 처리합니다. 따라서 시간대 및 현지 세션 시간을 처리해야 하는 전문가 자문 또는 보조지표를 프로그래밍할 때마다 매번 새로 만들어야 하는 부담을 덜어줍니다.


시간대란 무엇인가요?

시간대는 해당 장소의 지리적 표현에 따른 표준 시간으로 정의됩니다. 즉, 타임존은 지구 자전을 기준으로 한 특정 지역의 현지 시간을 의미합니다. 이는 전 세계의 지역 기반 시간을 조정하는 표준인 UTC(협정 세계시)로 정의됩니다.

예를 들어, 뉴욕의 시간은 그리니치보다 5시간 늦으며 일광을 기준으로 UTC-5 또는 UTC-4로 표시됩니다. 시드니의 시간은 그리니치보다 10시간 빠르며 일광(여름 또는 겨울)에 따라 UTC+10 또는 UTC+11로 표시됩니다. UTC와 GMT라는 용어는 오프셋을 표현할 때 종종 같은 의미로 사용되므로 UTC+2와 GMT+2는 종종 같은 의미를 갖습니다.

UTC 오프셋은 시간대가 GMT보다 동쪽이면 양수이고, 시간대가 GMT보다 서쪽이면 음수입니다.


시간대 식별자

//+------------------------------------------------------------------+
//| 시간대 식별자|
//+------------------------------------------------------------------+
enum ENUM_ZONE_ID
  {
   ZONE_ID_SYDNEY,     // 시드니
   ZONE_ID_TOKYO,      // 도쿄
   ZONE_ID_FRANKFURT,  // 프랑크푸르트
   ZONE_ID_LONDON,     // 런던
   ZONE_ID_NEWYORK,    // 뉴욕
   ZONE_ID_UTC,        // UTC
   ZONE_ID_LOCAL,      // LOCAL
   ZONE_ID_BROKER,     // 브로커
   ZONE_ID_CUSTOM      // CUSTOM
  };


클래스 인터페이스

//+------------------------------------------------------------------+
//| 클래스 CTimeZoneInfo.|
//| 목적: 지정된 | 현지 시간에 액세스할 클래스입니다.
//| 위치 및 시간대 정보, 시간 ||
현재 연도의 //| 변경 사항.|
//||
//| 라이브러리에서 사용되는 오프셋 표기법:|
//| 라이브러리는 양수 시간을 나타냅니다.
//| 양수 오프셋 및 음수 표준 시간대별 영역 ||
음수 오프셋으로 //|합니다.|
//| 반대로, MQL5에 내장된 TimeGMTOffset() |.
//| 함수는 GMT+3, |와 같은 양의 표준 시간대를 나타냅니다.
//|는 -10800과 같은 음수 오프셋으로, 그 반대도 마찬가지입니다.
//+------------------------------------------------------------------+
class CTimeZoneInfo
  {
public:
                     CTimeZoneInfo( ENUM_ZONE_ID placeId, datetime pLocalTime = TIME_NOW );
                    ~CTimeZoneInfo( void );

   string            Name( void );                                                       // 시간대 이름을 반환합니다.
   string            ToString( bool secs = true, bool tzname = true );                   // TZ/DST 오프셋과 tzname으로 포맷된 현지 시간 문자열을 반환합니다.
   bool              RefreshTime( void );                                                // 현재 현지 시간 새로 고침 및 표준 시간대 정보 채우기
   bool              SetLocalTime( datetime pLocalTime = TIME_NOW );                     // 이 위치의 현지 시간을 지정된 시간으로 설정합니다.

   datetime          TimeLocal( void );                                                  // 현지 시간을 표준 시간대로 반환합니다.
   datetime          TimeUTC( void );                                                    // UTC 시간을 반환합니다(모든 시간대에서 동일).
   int               TimeGMTOffset( void );                                              // 양수 시간대(예: GMT+3)의 경우 양수 값, 그렇지 않으면 음수입니다. (DST 포함)
   int               TimeDaylightSavings( void );                                        // 설정된 현지 시간에 대한 표준 시간대 보정(초 단위)을 반환합니다.

   datetime          ConvertLocalTime( ENUM_ZONE_ID destinationId );                     // 이 시간대의 현지 시간을 다른 시간대로 변환합니다.
   bool              GetDaylightSwitchTimes( datetime &dst_start, datetime &dst_end );   // 해당 연도의 서머타임 시작 및 종료 시간 가져오기
   datetime          GetDaylightNextSwitch( void );                                      // 다음 일광 절약 시간제 전환의 현지 시간 가져오기
   void              PrintObject( void );

   //--- 객체를 생성할 필요가 없는 정적 메서드입니다.
   static datetime   GetCurrentTimeForPlace ( ENUM_ZONE_ID placeId );                    // 지정된 시간대의 현재 현지 시간 가져오기
   static string     FormatTimeForPlace     ( datetime time, ENUM_ZONE_ID placeId, bool secs = true, bool tzname = true );
   static datetime   ConvertTimeForPlace    ( datetime time, ENUM_ZONE_ID placeId, ENUM_ZONE_ID destinationId );
   static int        TimeGMTOffset          ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // 지정된 현지 시간대의 시간대에 대한 GMT의 총 tz 오프셋(UTC+DST)을 반환합니다.
   static int        TimeDaylightSavings    ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // 지정된 현지 시간대의 시간대에 대한 dst 보정값을 초 단위로 반환합니다.
   static bool       IsDaylightSavingTime   ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // 지정한 시간이 서머타임에 해당하는지 확인합니다.
   static bool       GetDaylightSwitchTimes ( ENUM_ZONE_ID placeId, int iYear, datetime &dst_start, datetime &dst_end );
   static bool       GetDaylightSwitchDeltas( ENUM_ZONE_ID placeId, int iYear, int &delta_start, int &delta_end );

   static bool       SetCustomTimeZone( string name, int baseGMTOffset = 0,              // 라이브러리에서 찾을 수 없는 시간대를 정의합니다.
                                        ENUM_ZONE_ID dstSchedule = ZONE_ID_UTC );
   static void       SetUsingGoldSymbol( bool enabled = true );                          // 서버 TZ/DST 추정 시 골드 기호를 사용하도록 옵션을 설정합니다.
  };


클래스 인터페이스

//+------------------------------------------------------------------+
//| 클래스 CSessionHours.|
//| 목적: 현지 트레이딩 세션 시간에 액세스하는 클래스 ||
//| 지정된 위치로 이동합니다.|
//| CTimeZoneInfo 클래스에서 파생됩니다.|
//| 참고: 기본 세션 시간은 오전 8시 - 오후 5:00로 설정되어 있습니다.
//| 현지 시간으로 새 CSessionHours 객체에 대해.
//+------------------------------------------------------------------+
class CSessionHours : public CTimeZoneInfo
  {
public:
                     CSessionHours( ENUM_ZONE_ID placeId );
                    ~CSessionHours( void );

   //--- 로컬 세션 시간에 액세스하는 메서드
   bool              RefreshTime( void );                            // 현재 현지 시간 및 당일 세션 시간을 새로 고칩니다.
   bool              SetLocalTime( datetime pLocalTime );

   //--- 기본 로컬 세션 시간을 재정의하는 메서드
   bool              BeginLocalTime( int pHour, int pMinute );       // 시작 시간과 분을 사용하여 로컬 세션 시작 시간을 설정합니다.
   bool              EndLocalTime( int pHour, int pMinute );         // 종료 시간과 분을 사용하여 로컬 세션 종료 시간을 설정합니다.

   //--- 로컬 세션 시간에 액세스하는 방법
   datetime          BeginLocalTime( void );
   datetime          EndLocalTime( void );
   bool              CheckLocalSession( void );                      // 로컬 트레이딩 세션이 현재 활성화되어 있는지 확인합니다.
   int               SecRemainingSession( void );                    // 하루 동안 로컬 세션이 종료될 때까지 남은 시간(초)입니다.

   //--- 객체를 생성할 필요가 없는 정적 메서드입니다.
   static datetime   ForexCloseTime( void );                         // 이번 주 외환 시장이 마감되는 브로커 시간입니다.
   static int        SecRemainingForex( void );                      // 이번 주 외환 시장이 마감될 때까지 남은 시간(초)입니다.
  };


라이브러리에서 사용되는 오프셋 표기법

라이브러리에서는 양수 시간대는 양수 오프셋으로, 음수 시간대는 음수 오프셋으로 표시합니다.

이는 GMT+3과 같은 양의 시간대를 -10800과 같은 음의 오프셋으로 나타내거나 그 반대의 경우도 마찬가지인 MQL5의 내장된 TimeGMTOffset() 함수와 반대입니다.


서버 TZ/DST 추정을 위한 기호 선택하기

기본적으로 라이브러리는 서버의 시간대 오프셋을 추정하기 위해 XAUUSD 기호를 검색하고 로드합니다. 미국 DST와 EU DST 일정이 일치하지 않는 주(3월과 10월 말)에 XAUUSD는 보다 안정적인 결과를 제공할 수 있습니다(특히 EU DST 일정을 따르는 브로커의 경우). 선택적으로 브로커가 미국 DST 일정을 따르거나 전혀 일정을 따르지 않는 경우 차트 기호를 사용해도 괜찮습니다. XAUUSD 대신 현재 차트의 심볼을 사용하려면 CTimeZoneInfo::SetUsingGoldSymbol()을 'false'로 호출하세요.

브로커의 일광 절약 시간대(DST) 일정을 확인하려면 다음 스크립트를 사용할 수 있습니다. https://www.mql5.com/ko/code/48650

//+------------------------------------------------------------------+
//| XAUUSD(금) 기호를 사용하여 |를 추정하는 옵션을 설정합니다.
//| H1 호가 기록을 분석하여 서버의 TZ/DST를 계산합니다.
//| TRUE: 골드 심볼을 검색하여 로드합니다(기본 동작).
//| FALSE: 현재 차트의 기호를 사용합니다.
//+------------------------------------------------------------------+
void CTimeZoneInfo::SetUsingGoldSymbol(const bool enabled = true);

참고:

XAUUSD가 Forex보다 한 시간 후에 시작되는 부작용으로 인해 dst 전환은 한 시간 후에 발생합니다(일반 모드가 아닌 전략 테스터에서만 발생).


전략 테스터와의 호환성에 대한 참고 사항

전략 테스터에서 테스트하는 동안TimeGMT() 항상TimeTradeServer() 시뮬레이션 서버 시간과 동일합니다.

TimeZoneInfo 라이브러리는 내장된 TimeGMT 함수를 호출하여 반환된 시간이 아니라 H1 호가 기록을 분석하여 "실제" GMT를 기준으로 시간대의 적절한 시간을 추정합니다.

서버의 TZ/DST를 추정하기 위해 XAUUSD 기호를 사용하는 경우 전략 테스터에서 1시간 후에 dst 전환이 발생합니다.



I. 현지 시간대 작업

현재 시간을 어떻게 구하나요?

RefreshTime() 메서드는 해당 시간대의 현재 현지 시간을 업데이트합니다. 현재 시간을 구하는 방법을 보여주는 예제를 살펴봅시다 .

   Print("\n========== Get the current time in a timezone ==========");

   CTimeZoneInfo tz(ZONE_ID_TOKYO);
   tz.RefreshTime(); // 현재 시간대 정보 채우기

   Print("Name()      : ", tz.Name());
   Print("TimeLocal() : ", tz.TimeLocal());
   Print("ToString()  : ", tz.ToString());

출력합니다:

   // ========== 시간대의 현재 시간 가져오기 ==========
   // Name() : Tokyo
   // TimeLocal() : 2024.02.28 19:58:50
   // ToString() : 수, 2024.02.28 19:58:50 GMT+9 [도쿄]


더 자세한 정보가 필요하신가요?

   Print("\n========== More information about a timezone ==========");

   CTimeZoneInfo tz(ZONE_ID_NEWYORK);
   tz.RefreshTime();

   Print("Name()                  : ", tz.Name());
   Print("TimeUTC()               : ", tz.TimeUTC());
   Print("TimeLocal()             : ", tz.TimeLocal());
   Print("TimeGMTOffset()         : ", tz.TimeGMTOffset());
   Print("TimeDaylightSavings()   : ", tz.TimeDaylightSavings());
   Print("ToString()              : ", tz.ToString());
   datetime dst_start, dst_end;
   tz.GetDaylightSwitchTimes(dst_start, dst_end);
   Print("dst_start               : ", dst_start);
   Print("dst_end                 : ", dst_end);
   Print("GetDaylightNextSwitch() : ", tz.GetDaylightNextSwitch());

출력합니다:

   // ========== 시간대에 대한 자세한 정보 ==========
   // Name() : New York
   // TimeUTC() : 2024.03.17 16:50:38
   // TimeLocal() : 2024.03.17 12:50:38
   // TimeGMTOffset() : -14400
   // TimeDaylightSavings() : 3600
   // ToString() : Sun, 2024.03.17 12:50:38 GMT-4 [뉴욕] (DST)
   // dst_start : 2024.03.10 02:00:00
   // dst_end : 2024.11.03 02:00:00
   // GetDaylightNextSwitch() : 2024.11.03 02:00:00

참고:

- TimeUTC() 메서드는 GMT 시간에 해당하는 UTC 시간을 반환합니다.

- TimeLocal() 메서드는 이 시간대의 현지 시간( RefreshTime 또는 SetLocalTime 메서드 호출로 인해 변경되었을 수 있음)을 반환합니다.

- TimeGMTOffset() 메서드는 겨울 또는 여름 시간으로의 전환을 고려하여 이 시간대의 현지 시간과 GMT 시간 간의 현재 차이(초)를 반환합니다. 반환된 오프셋에는 현재 시간대의 DST 조정이 포함됩니다. 시간대가 GMT보다 동쪽(앞)에 있는 경우 GMT 오프셋은 양수이고, 시간대가 GMT보다 서쪽(뒤)에 있는 경우 음수입니다.

- TimeDaylightSavings() 메서드는 서머타임이 적용되는 지역에서 서머타임으로 전환한 경우 초 단위로 조정된 일광 절약 시간(DST)을 반환합니다. 겨울(표준) 시간으로 전환한 경우(또는 시간대가 DST를 지원하지 않는 경우) 0을 반환합니다. DST 조정은 이미 TimeGMTOffset의 일부입니다.


나중에 사용할 수 있도록 내장된 사용자 지정 표준 시간대를 구성하는 방법은 무엇인가요?

CTimeZoneInfo 클래스에는 내장된 사용자 지정 표준 시간대를 구성하는 데 사용할 수 있는 SetCustomTimeZone 메서드가 포함되어 있습니다. 나중에 사용자 지정 시간대는 ZONE_ID_CUSTOM 식별자를 통해 사용할 수 있습니다. 기본 제공 사용자 지정 시간대를 지정된 이름, 그리니치 표준시(GMT) 오프셋 및 일광 절약 시간제 식별자로 구성하는 방법을 보여주는 예제를 살펴보겠습니다.

   Print("\n========== Configure the built-in custom timezone ==========");

   string        name  = "Custom+3";               // 사용자 지정 시간대 이름
   int           baseGMTOffset  = 10800;           // 사용자 지정 표준 시간대의 기본 GMT 오프셋(초)
   ENUM_ZONE_ID  daylightRuleId = ZONE_ID_LONDON;  // 사용자 지정 표준 시간대의 DST 일정

   bool success = CTimeZoneInfo::SetCustomTimeZone(name, baseGMTOffset, daylightRuleId);

   Print("Parameter 'name'            : ", name);
   Print("Parameter 'baseGMTOffset'   : ", baseGMTOffset);
   Print("Parameter 'daylightRuleId'  : ", EnumToString(daylightRuleId));
   Print("SetCustomTimeZone() returns : ", success);

출력:

   // ========== 기본 제공 사용자 지정 시간대 구성하기 ==========
   // 매개변수 '이름' : Custom+3
   // 파라미터 'baseGMTOffset' : 10800
   // 매개변수 'daylightRuleId' : ZONE_ID_LONDON
   // SetCustomTimeZone() 반환값 : true


모든 시간대의 현재 시간 가져오기

모든 시간대의 현재 현지 시간을 구하는 방법을 보여주는 예제를 살펴보겠습니다.

   Print("\n========== Get Current Time in All Timezones ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime();

      PrintFormat("%-12s:  %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());
     }

출력합니다:

   // ========== 모든 시간대의 현재 시간 가져오기 ==========
   // 시드니 : 2024.02.28 21:58 | 수, 2024.02.28 21:58:50 GMT+11 [시드니] (DST)
   // 도쿄 : 2024.02.28 19:58 | 수, 2024.02.28 19:58:50 GMT+9 [도쿄]
   // 프랑크푸르트 : 2024.02.28 11:58 | 수, 2024.02.28 11:58:50 GMT+1 [프랑크푸르트]
   // 런던 : 2024.02.28 10:58 | 수, 2024.02.28 10:58:50 GMT+0 [런던]
   // 뉴욕 : 2024.02.28 05:58 | 수, 2024.02.28 05:58:50 GMT-5 [뉴욕]
   // UTC : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC]
   // 홈 : 2024.02.28 12:58 | 수, 2024.02.28 12:58:50 GMT+2 [홈]
   // FXOpen-MT5 : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]


이 작업은 정적 메서드 GetCurrentTimeForPlace() 를 사용하여 다른 방법으로 수행할 수 있습니다. 또한 요일, 날짜, 시간, 시간대 이름 및 오프셋을 사용하여 일반 mql 날짜/시간 변수를 문자열로 포맷하는 데 사용할 수 있는 또 다른 정적 메서드 FormatTimeForPlace() 도 있습니다(TimeToString과 유사 ). 이러한 정적 메서드는 호출하기 위해 객체를 생성할 필요가 없습니다.

   Print("\n========== GetCurrentTimeForPlace() ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      datetime time = CTimeZoneInfo::GetCurrentTimeForPlace(id);

      PrintFormat("Time        :  %s | %s", TimeToString(time), CTimeZoneInfo::FormatTimeForPlace(time, id));
     }

출력:

   // ========== GetCurrentTimeForPlace() ==========
   // 시간 : 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [시드니] (DST)
   // 시간 : 2024.02.28 19:58 | 수, 2024.02.28 19:58:50 GMT+9 [도쿄]
   // 시간 : 2024.02.28 11:58 | 수, 2024.02.28 11:58:50 GMT+1 [프랑크푸르트]
   // 시간 : 2024.02.28 10:58 | 수, 2024.02.28 10:58:50 GMT+0 [런던]
   // 시간 : 2024.02.28 05:58 | 수, 2024.02.28 05:58:50 GMT-5 [뉴욕]
   // 시간 : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC]
   // 시간 : 2024.02.28 12:58 | 수, 2024.02.28 12:58:50 GMT+2 [홈]
   // 시간 : 2024.02.28 12:58 | 수, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]


시간대의 현지 시간을 설정하는 방법은 무엇인가요?

SetLocalTime() 메서드는 지정된 현지 시간을 설정합니다. 시간대의 현지 시간을 설정하는 방법을 보여주는 예제를 살펴보겠습니다.

   Print("\n========== Set the local time for a timezone ==========");

   CTimeZoneInfo tz(ZONE_ID_NEWYORK);

   if(tz.SetLocalTime(D'2021.07.15 09:31'))
      PrintFormat("%-12s:  %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());

   if(tz.SetLocalTime(D'2022.01.23 17:04'))
      PrintFormat("%-12s:  %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());

   if(tz.SetLocalTime(D'2023.03.12 02:21'))
      PrintFormat("%-12s:  %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());

출력합니다:

   // ========== 시간대에 대한 현지 시간 설정 ==========
   // 뉴욕 : 2021.07.15 09:31 | 목요일, 2021.07.15 09:31:00 GMT-4 [뉴욕] (DST)
   // 뉴욕 : 2022.01.23 17:04 | 일, 2022.01.23 17:04:00 GMT-5 [뉴욕]
   // >>Error: 2023.03.12 02:21이라는 시간은 뉴욕에 존재하지 않습니다. 일광 절약 시간제가 한 시간 건너뛰었기 때문입니다.

마지막 오류 메시지의 원인은 다음 단락에서 설명하겠습니다.


일광 절약 시간제(DST):

서머타임은 일 년 중 일부 기간 동안 표준 시간보다 시계가 앞당겨지는 계절적 시간 변경 조치입니다.

https://www.timeanddate.com/time/dst/transition.html 참조

("서머 스킵", "윈드백")

봄에 서머타임이 시작되면 트위터의 시계는 보통 1시간씩 일정 시간 앞당겨집니다. 즉, 시계에서 한 시간이 건너뛰게 됩니다. 가을(가을)이 되면 보통 DST 기간이 끝나고 시계가 다시 표준시로 되돌아갑니다.


DST 시작의 예

(존재하지 않는 시간)

미국에서는 항상 현지 시간으로 02:00(오전 2시)에 DST가 시작됩니다. 시간이 처음 표준시 1:59:59에 도달하는 순간 시계는 3:00:00 일광 절약 시간제로 넘어갑니다. 따라서 전환 당일 밤에는 2:00:00부터 2:59:59까지의 시간이 존재하지 않습니다.



II. 시간대 정보 확인하기

1. UTC 오프셋 및 현재 DST 오프셋

DST가 적용 중인 경우 시간대 이름, UTC 오프셋, 현재 DST 오프셋을 가져오는 방법을 보여주는 예제를 살펴봅시다.

   Print("\n========== UTC offset and current DST offset ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime(); // 현재 시간대 정보 채우기

      PrintFormat("%-12s: GMT%+g | DST%+g", tz.Name(), tz.TimeGMTOffset()/3600., tz.TimeDaylightSavings()/3600.);
     }

출력합니다:

   // ========== UTC 오프셋 및 현재 DST 오프셋 ==========
   // 시드니 : GMT+11 | DST+1
   // 도쿄 : GMT+9 | DST+0
   // 프랑크푸르트 : GMT+1 | DST+0
   // 런던 : GMT+0 | DST+0
   // 뉴욕 : GMT-4 | DST+1
   // UTC : GMT+0 | DST+0
   // 홈 : GMT+2 | DST+0
   // FXOpen-MT5 : GMT+2 | DST+0

참고:

- TimeGMTOffset() 메서드는 겨울 또는 여름 시간으로의 전환을 고려하여 이 시간대의 현지 시간과 GMT 시간 사이의 현재 차이(초)를 반환합니다. 반환된 오프셋에는 현재 시간대의 DST 조정이 포함됩니다. 시간대가 GMT보다 동쪽(앞)에 있는 경우 GMT 오프셋은 양수이고, 시간대가 GMT보다 서쪽(뒤)에 있는 경우 음수입니다.

-TimeDaylightSavings() 메서드는 서머타임이 적용되는 지역에서 서머타임으로 전환한 경우 초 단위로 조정된 일광 절약 시간(DST)을 반환합니다. 겨울(표준) 시간으로 전환한 경우(또는 시간대가 DST를 지원하지 않는 경우) 0을 반환합니다. DST 조정은 이미 TimeGMTOffset의 일부입니다.


2. 현재 연도의 DST 전환 시간

DST 정보를 가져오는 방법을 보여주는 예제를 살펴봅시다.

   Print("\n========== DST switch times for the current year ==========");

   datetime dst_start, dst_end;

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime(); // 현재 시간대 정보 채우기

      //--- 일광 절약 시간을 준수하는 시간대에만 해당됩니다.
      if(tz.GetDaylightSwitchTimes(dst_start, dst_end))
        {
         PrintFormat("%-12s:  DST starts on %s |  DST ends on %s", tz.Name(), TimeToString(dst_start), TimeToString(dst_end));
        }
     }

출력합니다:

   // ========== 현재 연도의 DST 전환 시간 ==========
   // 시드니 : 2024.04.07 03:00에 DST 시작 | 2024.10.06 02:00에 DST 종료
   // 프랑크푸르트 : 2024.03.31 02:00에 DST 시작 | 2024.10.27 03:00에 DST 종료
   // 런던 : 2024.03.31 01:00에 DST 시작 | 2024.10.27 02:00에 DST 종료
   // 뉴욕 : 2024.03.10 02:00에 DST 시작 | 2024.11.03 02:00에 DST 종료

3. 다음 DST 전환 시간

다음 DST 전환 시간을 구하는 방법을 보여주는 예제를 살펴봅시다.

   Print("\n========== Time of the next DST switch ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime();

      datetime nxswitch = tz.GetDaylightNextSwitch();

      //--- 일광 절약 시간을 준수하는 시간대에만 해당됩니다.
      if(nxswitch)
        {
         PrintFormat("%-12s:  Time: %s |  dstNextSwitch: %s", tz.Name(), TimeToString(tz.TimeLocal()), TimeToString(nxswitch));
        }
     }

output:

   // ========== 다음 DST 전환 시간 ==========
   // 시드니 : 시간: 2024.02.28 21:58 | dstNextSwitch: 2024.04.07 03:00
   // 프랑크푸르트 : 시간: 2024.02.28 11:58 | dstNextSwitch: 2024.03.31 02:00
   // 런던 : 시간: 2024.02.28 10:58 | dstNextSwitch: 2024.03.31 01:00
   // 뉴욕 : 시간: 2024.02.28 05:58 | dstNextSwitch: 2024.03.10 02:00


4. DST 목록

이 라이브러리의 모든 시간대에 대한 다양한 연도의 DST 정보를 가져오는 방법을 보여주는 예제를 살펴봅시다.

   Print("\n========== DST List ==========");

   datetime dst_start, dst_end;
   int delta_start, delta_end;  // 초 단위 시계 변경

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo timezone(id);

      PrintFormat("========= %s Summer Time (DST) =========", timezone.Name());
      for(int year=2008; year<=2030; year++)
        {
         //--- 일광 절약 시간을 준수하는 시간대에만 해당됩니다.
         if(CTimeZoneInfo::GetDaylightSwitchTimes(id, year, dst_start, dst_end))
           {
            CTimeZoneInfo::GetDaylightSwitchDeltas(id, year, delta_start, delta_end);

            PrintFormat("DST starts on %s (%+d) and ends on %s (%+d)",TimeToString(dst_start), delta_start/3600, TimeToString(dst_end), delta_end/3600);
           }
        }

     }

출력합니다:

   // ========== DST 목록 ==========
   // ========= 시드니 서머타임(DST) =========
   // DST는 2008.04.06 03:00(-1)에 시작하여 2008.10.05 02:00(+1)에 종료됩니다.
   // DST는 2009.04.05 03:00(-1)에 시작하여 2009.10.04 02:00(+1)에 종료됩니다.
   // DST는 2010.04.04 03:00(-1)에 시작하여 2010.10.03 02:00(+1)에 종료됩니다.
   // DST는 2011.04.03 03:00(-1)에 시작하여 2011.10.02 02:00(+1)에 종료됩니다.
   // DST는 2012.04.01 03:00(-1)에 시작하여 2012.10.07 02:00(+1)에 종료됩니다.
   // ...
   // ...
   // ...

5. 서버 GMT 오프셋 (현재)

브로커의 GMT 오프셋은 브로커 시간이 GMT보다 몇 초 앞선 시간을 나타냅니다(브로커 오프셋 = TimeTradeServer() - TimeGMT()). 양수 값은 서버 시간이 GMT보다 앞선다는 것을 나타냅니다. 브로커의 현재 GMT 오프셋을 구하는 방법을 보여주는 예제를 살펴봅시다.

   Print("\n========== Current GMT offset of the broker ========== ");

   CTimeZoneInfo broker(ZONE_ID_BROKER);
   broker.RefreshTime();

   Print("Name()          : ", broker.Name());
   Print("TimeLocal()     : ", broker.TimeLocal());  // 브로커 시간
   Print("ToString()      : ", broker.ToString());
   Print("TimeGMTOffset() : ", broker.TimeGMTOffset());

출력합니다:

   // ========== 브로커의 현재 GMT 오프셋 ==========
   // Name() : ICMarketsSC-Demo
   // TimeLocal() : 2024.03.08 06:33:06
   // ToString() : Fri, 2024.03.08 06:33:06 GMT+2 [ICMarketsSC-Demo]
   // TimeGMTOffset() : 7200

참고: TimeGMTOffset() 의 중요한 점은 dst 보정(UTC+DST)을 포함한 utc 오프셋을 반환한다는 것입니다. 양수 값은 서버 시간이 GMT보다 앞(동쪽)에 있음을 나타냅니다.


6. 서버 GMT 오프셋(과거)

서버의 과거 GMT 오프셋은 차트에서 서버 주 첫 번째 막대가 나타난 시간과 뉴욕 시간 일요일 오후 5시에 해당하는 UTC 시간 사이의 차이로 계산할 수 있습니다. 브로커의 과거 GMT 오프셋을 구하는 방법을 보여주는 예제를 살펴보겠습니다. 이 예제에서는 차트 캔들 시간을 브로커의 과거 시간으로 사용합니다.

   Print("\n========== Past GMT offsets of the broker (chart candles) ==========");

   datetime bartimes[];
   int copied = CopyTime(Symbol(), PERIOD_D1, D'2022.03.18', 9, bartimes);
   if(copied<=0)
      Print("CopyTime() failed.");

   for(int i =0; i < copied; i++)
     {
      datetime t = bartimes[i];

      CTimeZoneInfo broker(ZONE_ID_BROKER);
      broker.SetLocalTime(t);

      PrintFormat("bar #%i  Time: %s |  offset: %5d (GMT%+g) |  %s",
                  i+1,
                  TimeToString(broker.TimeLocal()),
                  broker.TimeGMTOffset(),
                  broker.TimeGMTOffset()/3600.0,
                  broker.ToString());
     }

출력합니다:

   // ========== 브로커의 과거 GMT 오프셋(차트 캔들) ==========
   // bar #1 시간: 2022.03.08 00:00 | 오프셋: 7200 (GMT+2) | 화, 2022.03.08 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #2 시간: 2022.03.09 00:00 | 오프셋: 7200 (GMT+2) | 수, 2022.03.09 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // 바 #3 시간: 2022.03.10 00:00 | 오프셋: 7200 (GMT+2) | 목요일, 2022.03.10 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #4 시간: 2022.03.11 00:00 | 오프셋: 7200 (GMT+2) | 금, 2022.03.11 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // 바 #5 시간: 2022.03.14 00:00 | 오프셋: 10800 (GMT+3) | 월, 2022.03.14 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // 바 #6 시간: 2022.03.15 00:00 | 오프셋: 10800 (GMT+3) | 화, 2022.03.15 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // 바 #7 시간: 2022.03.16 00:00 | 오프셋: 10800 (GMT+3) | 수, 2022.03.16 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // 바 #8 시간: 2022.03.17 00:00 | 오프셋: 10800 (GMT+3) | 목요일, 2022.03.17 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // 바 #9 시간: 2022.03.18 00:00 | 오프셋: 10800 (GMT+3) | 금, 2022.03.18 00:00:00 GMT+3 [ICMarketsSC-Demo]

5번 막대에서 볼 수 있듯이 서버는 겨울철 +2에서 여름철 +3으로 전환되었으며, 전환 시간은 미국 서머타임(3월 둘째 일요일)을 따릅니다. 일주일에 5개의 D1 캔들이 있으며 토요일과 일요일에는 캔들이 없습니다.이 서버의 시간은 연중 항상 뉴욕보다 7시간 앞서며 NY+7로 표시됩니다. 겨울에는 -5, 여름에는 -4라는 점에 유의하세요.

이것은 코드베이스에서 서버의 과거 GMT 오프셋(과거 GMT 오프셋)을 확인할 수 있는 최초의 라이브러리입니다. 계산에 구현된 알고리즘은 매우 빠르고 정확하며, 가능한 한 다양한 브로커와 호환됩니다(GMT 오프셋 또는 DST 스케줄이 다른 수많은 브로커에서 테스트).



III. 시간대 간 변환

현재 현지 시간을 다른 시간대로 변환하기

이 시간대 인스턴스의 설정된 현지 시간을 특정 시간대로 변환하려면 ConvertLocalTime() 메서드를 사용합니다. 이 메서드는 지정된 시간대의 새 시간을 반환합니다.

"현재" 현지 시간을 특정 시간대로 변환하는 방법을 보여주는 예제를 살펴보겠습니다.

   Print("\n========== Convert current local time in Sydney to New York ==========");

   CTimeZoneInfo sydney(ZONE_ID_SYDNEY);
   sydney.RefreshTime();

   datetime localtime = sydney.TimeLocal();
   datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK);

   PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString());
   PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));

출력합니다:

   // ========== 현재 시드니 현지 시간을 뉴욕으로 변환 ==========
   // 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [시드니] (DST)
   // 2024.02.28 05:58 | 수, 2024.02.28 05:58:50 GMT-5 [뉴욕]


특정 현지 시간을 다른 시간대로 변환

특정 현지 시간을 특정 시간대로 변환하는 방법을 보여주는 예제를 살펴보겠습니다.

   Print("\n========== Convert a specific local time in Sydney to New York ==========");

   CTimeZoneInfo sydney(ZONE_ID_SYDNEY);
   sydney.SetLocalTime(D'2016.05.21 14:47:08');

   datetime localtime = sydney.TimeLocal();
   datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK);

   PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString());
   PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));

output:

   // ========== 시드니의 특정 현지 시간을 뉴욕으로 변환 ==========
   // 2016.05.21 14:47 | 토, 2016.05.21 14:47:08 GMT+10 [시드니]
   // 2016.05.21 00:47 | Sat, 2016.05.21 00:47:08 GMT-4 [뉴욕] (DST)


모든 시간대의 현재 현지 시간을 브로커 시간
으로 변환합니다.

모든 시간대의 현재 현지 시간을 브로커 시간으로 변환하는 방법을 보여주는 예제를 살펴봅시다.

   Print("\n========== Convert the current local time in all timezones to the broker time ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      datetime localtime = CTimeZoneInfo::GetCurrentTimeForPlace(id);
      datetime converted = CTimeZoneInfo::ConvertTimeForPlace(localtime, id, ZONE_ID_BROKER);

      PrintFormat("%-49s | %s", CTimeZoneInfo::FormatTimeForPlace(localtime, id), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_BROKER));
     }

출력합니다:

   // ========== 모든 시간대의 현재 현지 시간을 브로커 시간으로 변환 ==========
   // 2024.02.28 수 21:58:50 GMT+11 [시드니] (DST) | 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5]
   // 2024.02.28 수 19:58:50 GMT+9 [도쿄] | 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5]
   // 2024.02.28 수 11:58:50 GMT+1 [프랑크푸르트] | 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5]
   // 2024.02.28 수 10:58:50 GMT+0 [런던] | 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5]
   // 2024.02.28 수 05:58:50 GMT-5 [뉴욕] | 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5]
   // 2024.02.28 수 10:58:50 GMT+0 [UTC] | 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5]
   // 2024.02.28 수 12:58:50 GMT+2 [홈] | 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5]
   // 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5] | 2024.02.28 수 12:58:50 GMT+2 [FXOpen-MT5]



IV. 로컬 세션 시간으로 작업하기

A. CTimeZoneInfo 클래스

CSessionHours 클래스가 아닌 부모 CTimeZoneInfo 클래스를 사용하는 것은 코딩이 더 필요하고 오류가 발생하기 쉬우므로 선호되지 않습니다. 모든 시간대의 Forex 세션 시간을 가져와 브로커 시간으로 변환하는 방법을 보여주는 예제를 살펴 보겠습니다.

   Print("\n======= Local Session Hours (CTimeZoneInfo Class) =======");

   const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK};

   for(int i = 0; i < ArraySize(ids); i++)
     {
      ENUM_ZONE_ID id = ids[i];

      CTimeZoneInfo tz(id);
      tz.RefreshTime();

      datetime localtime = tz.TimeLocal();

      //--- 세션 시간을 현지 시간 오전 8시 - 오후 5시로 설정합니다.
      datetime beginlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "08:00");
      datetime endlocal   = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "17:00");

      //--- 브로커 시간으로 변환
      tz.SetLocalTime(beginlocal);
      datetime beginbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

      tz.SetLocalTime(endlocal);
      datetime endbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

      //--- 현지 시간대 요일
      MqlDateTime st;
      TimeToStruct(localtime, st);
      int dow = st.day_of_week;

      //string state_str = ((dow != SATURDAY && dow != SUNDAY) && (localtime >= beginlocal && localtime < endlocal)) ? "open" : "closed";
      string state_str = ((dow != SATURDAY && dow != SUNDAY) && (TimeTradeServer() >= beginbroker && TimeTradeServer() < endbroker)) ? "open" : "closed";

      PrintFormat("%-12s:  %s |  %s  [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str);
     }

   Print("-----------------------------------");
   Print("broker time :  ", TimeTradeServer());
   Print("broker time :  ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER));

출력합니다:

   // ======= 로컬 세션 시간(CTimeZoneInfo 클래스) =======
   // 시드니 : 2024.02.28 수 23:00:00 GMT+2 [FXOpen-MT5] | 2024.02.29 목 08:00:00 GMT+2 [FXOpen-MT5] [세션 마감]
   // 도쿄 : 2024.02.28 수 01:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 수 10:00:00 GMT+2 [FXOpen-MT5] [세션 마감]
   // 프랑크푸르트 : 2024.02.28 수 09:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 수 18:00:00 GMT+2 [FXOpen-MT5] [세션 오픈]
   // 런던 : 2024.02.28 수 10:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 수 19:00:00 GMT+2 [FXOpen-MT5] [세션 오픈]
   // 뉴욕 : 2024.02.28 수 15:00:00 GMT+2 [FXOpen-MT5] | 2024.02.29 목 00:00:00 GMT+2 [FXOpen-MT5] [세션 오픈]
   // -----------------------------------
   // 브로커 시간 : 2024.02.28 15:32:30
   // 브로커 시간 : 2024.02.28 수 15:32:30 GMT+2 [FXOpen-MT5]



B. CSessionHours 클래스

목적: 지정된 위치의 현지 거래 세션 시간에 액세스하는 클래스입니다.

CTimeZoneInfo 클래스에서 파생됩니다.

참고: 기본 세션 시간은 새 CSessionHours 객체의 경우 현지 시간 오전 8:00 - 오후 5:00로 설정됩니다. 이러한 기본값은 원하는 대로 재정의할 수 있습니다.


CSessionHours 개체로 작업하기

객체를 사용하는 방법에 대한 예제를 살펴보겠습니다.

   Print("\n========== Working with CSessionHours Objects  ==========");

   CSessionHours tz(ZONE_ID_SYDNEY);
   tz.RefreshTime(); // 시간대 및 세션 정보 채우기

   부모로부터 //---
   Print("Name()                : ", tz.Name());
   Print("TimeUTC()             : ", tz.TimeUTC());
   Print("TimeLocal()           : ", tz.TimeLocal());
   Print("ToString()            : ", tz.ToString());
   클래스에서 //---
   Print("BeginLocalTime()      : ", tz.BeginLocalTime());
   Print("EndLocalTime()        : ", tz.EndLocalTime());
   Print("CheckLocalSession()   : ", tz.CheckLocalSession());
   Print("SecRemainingSession() : ", tz.SecRemainingSession());
   Print("SecondsToString()     : ", CSessionHours::SecondsToString(tz.SecRemainingSession()));

출력합니다:

   // ========== CSessionHours 객체로 작업하기 ==========
   // Name() : Sydney
   // TimeUTC() : 2024.02.28 10:58:50
   // TimeLocal() : 2024.02.28 21:58:50
   // ToString() : 수, 2024.02.28 21:58:50 GMT+11 [시드니] (DST)
   // BeginLocalTime() : 2024.02.28 08:00:00
   // EndLocalTime() : 2024.02.28 17:00:00
   // CheckLocalSession() : false
   // SecRemainingSession() : 0
   // 세컨드 문자열() : 00:00:00


로컬 세션 시간

CSessionHours는 더 적은 코드로 더 많은 기능을 제공합니다. CSessionHours 클래스를 사용하여 모든 시간대의 Forex 세션 시간을 가져와서 브로커 시간으로 변환하는 방법을 보여주는 예제를 살펴보겠습니다. 브로커 시간으로 변환하는 것은 선택적 단계이며 각 세션의 시작 및 종료 시간을 확인하는 데는 필요하지 않습니다.

   Print("\n======= Local Session Hours (CSessionHours Class) =======");

   const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK};

   for(int i = 0; i < ArraySize(ids); i++)
     {
      ENUM_ZONE_ID id = ids[i];

      CSessionHours tz(id);
      tz.RefreshTime();

      //--- 기본 세션 시간은 현지 시간으로 오전 8시 - 오후 5:00로 설정되어 있습니다.
      datetime beginlocal = tz.BeginLocalTime();
      datetime endlocal   = tz.EndLocalTime();

      //--- 브로커 시간으로 변환
      datetime beginbroker = CTimeZoneInfo::ConvertTimeForPlace(beginlocal, id, ZONE_ID_BROKER);
      datetime endbroker = CTimeZoneInfo::ConvertTimeForPlace(endlocal, id, ZONE_ID_BROKER);

      string state_str = tz.CheckLocalSession() ? "open, ends in " + CSessionHours::SecondsToString(tz.SecRemainingSession()) : "closed";

      PrintFormat("%-12s:  %s |  %s  [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str);
     }

   Print("-----------------------------------");
   Print("broker time :  ", TimeTradeServer());
   Print("broker time :  ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER));
   Print("Fx close    :  ", CTimeZoneInfo::FormatTimeForPlace(CSessionHours::ForexCloseTime(), ZONE_ID_BROKER));
   int sec = CSessionHours::SecRemainingForex();
   Print("closes in   :  ", sec, " sec = ", CSessionHours::SecondsToString(sec));

출력:

   // ======= 로컬 세션 시간(CSessionHours 클래스) =======
   // 시드니 : 2024.02.28 수 23:00:00 GMT+2 [FXOpen-MT5] | 2024.02.29 목 08:00:00 GMT+2 [FXOpen-MT5] [세션 마감]
   // 도쿄 : 2024.02.28 수 01:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 수 10:00:00 GMT+2 [FXOpen-MT5] [세션 마감]
   // 프랑크푸르트 : 2024.02.28 수 09:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 수 18:00:00 GMT+2 [FXOpen-MT5] [세션 오픈, 02:27:29에 종료]
   // 런던 : 2024.02.28 수 10:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 수 19:00:00 GMT+2 [FXOpen-MT5] [세션 오픈, 03:27:29에 종료]
   // 뉴욕 : 2024.02.28 수 15:00:00 GMT+2 [FXOpen-MT5] | 2024.02.29 목 00:00:00 GMT+2 [FXOpen-MT5] [세션 오픈, 08:27:29에 종료]
   // -----------------------------------
   // 브로커 시간 : 2024.02.28 15:32:30
   // 브로커 시간 : 2024.02.28 수 15:32:30 GMT+2 [FXOpen-MT5]
   // Fx 마감 : 2024.03.02(토) 00:00:00 GMT+2 [FXOpen-MT5]
   // 마감 시간: 203249초 = 2D 08:27:29


기본 로컬 세션 시간을 재정의하는 방법은 무엇인가요?

CSessionHours 클래스에서 기본 세션 시간을 재정의하는 방법을 보여주는 예제를 살펴봅시다.

   Print("\n=========== Override the default session hours ===========");

   CSessionHours frankfurt(ZONE_ID_FRANKFURT);

   // 기본 세션 시간 변경
   frankfurt.BeginLocalTime(9, 0);
   frankfurt.EndLocalTime(19, 0);

   frankfurt.RefreshTime(); // 새 세션 시간 채우기

   datetime beginlocal = frankfurt.BeginLocalTime();
   datetime endlocal   = frankfurt.EndLocalTime();

   PrintFormat("new session hours  :  %s | %s", CTimeZoneInfo::FormatTimeForPlace(beginlocal, ZONE_ID_FRANKFURT), CTimeZoneInfo::FormatTimeForPlace(endlocal, ZONE_ID_FRANKFURT));
   PrintFormat("current local time :  %s", frankfurt.ToString());

output:

   // =========== 기본 세션 시간 재정의 ===========
   // 새로운 세션 시간: 2024.02.28 수 09:00:00 GMT+1 [프랑크푸르트] | 2024.02.28 수 19:00:00 GMT+1 [프랑크푸르트]
   // 현재 현지 시간 : 2024.02.28 수 11:58:50 GMT+1 [프랑크푸르트]


주말에 마감 포지션을 확인하는 방법은?

SecRemainingForex() 정적 메서드는 이번 주 Forex 시장이 마감될 때까지 남은 시간(초)을 반환합니다. 이 메서드는 OnTick() 이벤트 핸들러(또는 주말 직전에 틱이 없는 경우 OnTimer() 에서 호출하여 마감 조건을 반복적으로 확인해야 합니다. 주말에 종가를 확인하는 방법을 보여주는 예시를 살펴보겠습니다.

   Print("\n======= Check For Closing Positions at Weekend =======");

   int InpHours   = 2;   // 주말 몇 시간 전
   int InpMinutes = 30;  // 주말 몇 분 전

   int sec = CSessionHours::SecRemainingForex();
   PrintFormat("Time remaining till the weekend : %s", CSessionHours::SecondsToString(sec));
   PrintFormat("Close all if remaining time becomes %s or less.", CSessionHours::SecondsToString(InpHours * 3600 + InpMinutes * 60));

   // 남은 시간이 목표에 도달했는지 확인
   if(sec <= InpHours * 3600 + InpMinutes * 60)
     {
      // CloseAll();
     }

또는 절대 시간을 사용하여 이전 조건을 확인할 수도 있습니다:

   // 브로커의 시간이 목표에 도달했는지 확인
   if(TimeTradeServer() >= CSessionHours::ForexCloseTime() - (InpHours * 3600 + InpMinutes * 60))
     {
      // CloseAll();
     }

출력:

   // ======= 주말 마감 포지션 확인 =======
   // 주말까지 남은 시간 : 3일 03:32:27
   // 남은 시간이 02:30:00 이하가 되면 모두 닫습니다.




주말 - 브로커의 시간대 및 DST 일정

외환 시장은 일요일 17:00 뉴욕 시간(겨울철은 GMT-5, 여름철은 GMT-4)에 개장하고 금요일 같은 시간에 마감합니다. 뉴욕의 개장 시간은 겨울철은 일요일 오후 10:00 UTC (여름철은 일요일 오후 09:00 UTC), 여름철은 일요일 오후 10:00 UTC에 해당합니다. 외환은 동절기 금요일 오후 10시 (하절기 오후 09시)에 마감됩니다. 금과 은 현물 시장은 보통 한 시간 늦게 시작됩니다.

각 외환 브로커마다 시간대와 서버 시간이 다릅니다. 따라서 거래 주간(H1 캔들)의 시작은 브로커마다 다르며 샌프란시스코(GMT-8) 브로커의 경우 일요일 오후 02:00 서버 시간부터 시드니(GMT+11) 브로커의 경우 월요일 오전 09:00 서버 시간까지 다양할 수 있습니다. 거래 마감 시간도금 오후 02:00 서버 시간 부터토 오전 09:00 서버 시간까지 다양합니다.

각 브로커는 서머타임(DST)을 자유롭게 선택할 수 있습니다. 그리고 해당 시간대의 DST가 반드시 동일한 것은 아닙니다. 때때로 EU 시간대 대신 미국 시간대를 사용하는 경우도 있습니다. 미국 일정을 따르지 않는 브로커의 경우 주 시작(및 종료) 서버 시간은 일년 내내 동일한 브로커에서 +/- 1시간씩 다릅니다. ForexCloseTime() 메서드는 타임 오프와 DST를 고려하여 금요일 17:00 뉴욕의 마감 시간을 브로커 시간으로 변환하여 이러한 브로커 간 및 내부 변동을 처리하므로 정확한 결과를 제공합니다.

따라서 표준 시간대 +2(미국 일정상 여름에는 +3)를 사용하면 일주일에 D1 캔들이 5개가 됩니다. 일 년 내내 토요일과 일요일에는 캔들이 없습니다. 간단히 말해, 이 서버의 시간은 항상 뉴욕보다 7시간 빠르며 NY+7로 표시됩니다. 이것이 가장 일반적인 설정이지만 덜 일반적인 변형이 많이 있습니다.



샘플 인디케이터 TestIndi.mq5


iForexSessions - 메타트레이더 5용 인디케이터

외환 시장 세션 하이라이트

여기에서 다운로드 https://www.mql5.com/ko/code/48842


링크

세계 시계: https: //www.timeanddate.com/worldclock/

시간대 변환기: https: //www.timeanddate.com/worldclock/converter-classic.html


업데이트

2024.03.01 - v.1.40 : CTimeZoneInfo 클래스에서 중복 코드 제거 (테스트 중에 사용), CSessionHours 클래스에 더 많은 메소드 추가, 새로운 변경 사항을 반영하도록 TestIndi.mq5 업데이트.

2024.03.03 - v.1.45 : "로컬 세션 시간으로 작업하기 - CTimeZoneInfo 클래스"의 예제 코드를 업데이트했습니다.

2024.03.08 - v.1.50 : CTimeZoneInfo 클래스에 두 개의 내부 메서드 HistoryBrokerOffset과 FirstBarOfWeek를 추가했습니다. 과거 서버 시간 처리(UTC 오프셋, 텍스트 서식, 변환 등).

2024.03.15 - v.1.56 : 시드니의 세션 시간이 연중 어떻게 변동하는지 보여주는 스크립트 "SydneySession_Script.mq5"를 추가했습니다.

2024.03.30 - v.1.65 : 브로커 GMT 오프셋을 수정했습니다. 현재 라이브러리는 제가 테스트한 모든 브로커의 시작 시간이 가장 정확하기 때문에 골드 차트에서 H1 바만 스캔합니다.

2024.04.01 - v.1.67 : 거래 주 첫 시간 동안 브로커 GMT 오프셋 계산의 잠재적 문제를 수정했습니다.

2024.04.03 - v.1.70 : 더 빠른 검색(예: 인디케이터에서)을 위해 브로커 GMT 오프셋을 해시 맵에 캐싱. 브로커 오프셋 캐시에는 거래 주당 하나의 항목이 포함됩니다.

2024.04.08 - v.1.72 : 라이브러리 성능이 최소 2~3배 향상되었습니다. 이제 GetNthSunday 메서드 내에서 StringToTime 대신 StructToTime을 사용합니다.

2024.04.09-v.1.75 : GMT+0 브로커에서 크리스마스 연휴 기간 동안 브로커 GMT 오프셋 계산 시 발생할 수 있는 문제를 수정했습니다.

2024.04.11 - v.1.77 : GetDaylightSwitchTimes 메서드의 속도를 높였습니다. 이제 정적 배열을 사용해 현재 연도의 스위치 시간을 기억합니다.

2024.04.12-v.1.80 : 골드 거래를 제공하지 않는 브로커의 브로커 GMT 오프셋 계산 문제를 수정했습니다.

2024.04.15-v.1.82 : 지정된 이름, GMT 오프셋 및 DST 식별자로 내장된 사용자 지정 시간대를 구성하는 데 사용할 수 있는 SetCustomTimeZone 메서드를 CTimeZoneInfo 클래스에 추가했습니다. 사용자 지정 시간대는 ZONE_ID_CUSTOM을 통해 액세스할 수 있습니다.

2024.04.16 - v.1.85 : 내부 메서드 GetNthSunday를 보다 최적화된 GetMonthTime 메서드로 대체했습니다.

2024.04.17 - v.1.87 : TimeYear 내부 메서드를보다 최적화 된 GetYear 메서드로 대체했습니다.

2024.04.18 - v.1.88 : 날짜 구성 요소(년, 월, 일)에서 날짜 시간 값을 생성하는 CreateDateTime 내부 메서드를 추가했습니다. 이 메서드는 StructToTime 함수를 호출하는 것보다 100-120배 빠릅니다.

2024.10.21-v.1.90 : EURUSD 기호로 폴백하여 GOLD 기호 감지가 개선되었습니다.

2024.10.22-v.1.93 : 주말 동안 실시간 거래에서 서버의 GMT 오프셋을 더 빠르게 결정합니다.

2024.10.26 - v.1.95 : 두 개의 새로운 정적 메서드가 추가되었습니다: TimeGMTOffset()TimeDaylightSavings(). HistoryBrokerOffset() 메서드의 이름을 TimeServerGMTOffset()으로 변경했습니다.

2024.10.28 - v.1.97 : 시간을 다루는 모든 매크로를 함수로 변환하여 매크로 본문 내에서 매개변수가 이중으로 평가되는 것을 방지했습니다. 다른 줄에서 더 많은 코드 정리가 이루어졌습니다.

2024.10.30 - v.1.98 : 일부 브로커에서 XAUEUR 시세에서 GMT 오프셋이 잘못 추정되던 문제를 수정했습니다.

2024.11.01 - v.1.99 : 서버의 TZ/DST 추정을 위한 골드 심볼의 기본 로딩을 끄는 옵션이 추가되었습니다. 대신 현재 차트의 심볼을 사용하려면 CTimeZoneInfo:: SetUsingGoldSymbol()을 'false'로 호출하세요.

2024.11.13-v.2.00 : 온라인 서버 tz/dst 및 전략 전략의 추정 개선(TimeGMT 라이브러리가 더 이상 필요 없음). 생성자가 장소 및 시간 매개변수를 허용합니다. 날짜/시간 유형의 데이터 작업을 위한 새로운 공용 메서드. 오류 처리 및 디버깅 지원이 개선되었습니다.

2024.11.14 - v.2.02 : 서버 시간대 객체로 XAUUSD,H1 시세 기록에 액세스하려고 할 때 발생하는 오류 ERR_HISTORY_NOT_FOUND (4401)를 수정했습니다.

2024.11.17-v.2.03 : 사소한 버그 수정.

2024.11.23-v.2.04 : 사소한 개선 및 버그 수정.

2024.12.05 - v.2.05 : 새로운 정적 메서드 DaylightSavingsSupported(placeId)를 추가했습니다.

2024.12.12 - v.2.10 : HistoryServerGMTOffset() 및 HistoryServerDaylightSavings() 함수의 성능 개선 및 기타 사소한 코드 변경.

2024.12.14 - v.2.11: FindSymbol() 함수의 성능이 개선되었습니다.

2024.12.17 - v.2.12 : HistoryServerGMTOffset() 및 HistoryServerDaylightSavings() 함수의 최적화를 추가했습니다.

2024.12.24-v.2.13 : HistoryServerGMTOffset() 및 HistoryServerDaylightSavings() 함수의 잠재적 인 문제를 수정했습니다.

2025.01.12-v.2.15 : 전략 테스터에서 로드된 기록보다 먼저 호가 기록을 검색하는 HistoryServerDaylightSavings()의 문제를 수정했습니다.

2025.10.13-v.2.17 : 사소한 개선 및 버그 수정.


MetaQuotes Ltd에서 영어로 번역함.
원본 코드: https://www.mql5.com/en/code/48419

CVD (Cumulative Volume Delta) CVD (Cumulative Volume Delta)

MT5 - M1 기반 경량 CVD(누적 거래량 델타)는 매수/매도 압력을 캔들로 표시하며 리셋 옵션이 있습니다.

CFastFile - 바이트 배열을 파일로 작업하기 위한 클래스 CFastFile - 바이트 배열을 파일로 작업하기 위한 클래스

CFastFile 클래스를 사용하면 디스크의 실제 파일에 데이터를 중간에서 쓸 필요가 없습니다. 따라서 데이터 작업 속도를 크게 높일 수 있습니다.

MA-Env MA-Env

이동 평균 봉투.

통계 함수 statistics.mqh 통계 함수 statistics.mqh

평균, 분산, 스쾌도, 초과, 공분산, 상관관계 등을 계산하는 통계 함수가 포함된 라이브러리입니다.