MetaTrader 5 / 스크립트

TimeServerDaylightSavings - MetaTrader 5용 스크립트

114
(7)

이 스크립트는 로컬 컴퓨터에 대해 TimeDaylightSavings ( ) 함수만 제공하는 기본 제공 함수 중 누락된 TimeServerDaylightSavings() 함수를 소개합니다. 또한 첨부된 헤더 mqh-file에는 다른 유용한 서버 바운드 시간 관련 함수가 포함되어 있으며, 특히 브로커가 일반적으로 DST 스위치를 사용하는지 여부를 알 수 있습니다.

이 모든 것은 브로커의 호가 이력에 대한 경험적 분석을 기반으로 합니다. 전체 아이디어는 서머타임 (DST) 섹션의 알고리즘 트레이딩 책에 설명되어 있습니다. 간단히 설명하면, 이 방법은 주 개장 시간 통계를 분석하고 브로커의 GMT 오프셋을 추론하는 것입니다. 오프셋 통계에서 두 개의 뚜렷한 최대값이 인접한 시간에 매핑되면 표준("겨울") 및 일광 절약("여름") 시간에 해당할 가능성이 높습니다.

실제로 이 스크립트는 책에 제시된 스크립트를 개선하고 확장한 버전입니다. 특히 2024년 10월 이후 버전에는 중요한 버그 수정이 포함되어 있습니다. 주간 거래 개장 시간은 미국 시장에 의해 감지되며, 이는 미국 시간대(EST, UTC-5, 표준 겨울 시간 <--> EDT, UTC-4, 서머타임)에 따른 DST 전환의 영향을 받기 때문에 일년 내내 연속적인 자연 시간 흐름을 얻으려면 미국 DST의 영향을 제거하는 것이 중요하므로 수정에서 수행된 작업입니다. 모든 공은 암랄리에게 돌아갑니다.

서머타임 전환으로 인한 주중 개장 시간 변경 예시


북반구와 남반구에서는 시간대가 반대 방향으로 조정된다는 점에 유의하세요. 북반구에서는 '봄'(3월 또는 4월)에 1시간을 더하고 '가을'(10월 또는 11월)에 1시간을 뺀 반면, 남반구에서는 그 반대입니다(모든 계절이 바뀌기 때문에).

분석의 특수성으로 인해 가장 유동성이 높은 외환 시세(일반적으로 EURUSD)에 대한 코드를 실행하는 것이 좋습니다.

다음은 API입니다:

// 서버 표준 시간대 및 DST 현재 정보 struct ServerTimeZone  // 주 영업 시간 기록 분석에 따르면 {    int offsetGMT;      // 이번 주의 UTC/GMT 대비 시간대 오프셋(초)    int offsetDST;      // 초 단위의 DST 보정(MQL5에 따라 오프셋GMT에 포함됨)    bool supportDST;    // 따옴표에서 DST 변경이 감지됩니다. }; // H1 견적 기록에서 서버 시간대 및 DST 모드 추정하기 ServerTimeZone TimeServerZone(   const datetime srvtime = 0,     // 기본값은 현재 시간이지만 과거의 한 순간을 지정할 수 있습니다.   const int threshold = THRESHOLD,   const double lookupYears = 0.0, // 기본적으로 사용 가능한 모든 막대, 그렇지 않으면 3년이면 충분해 보입니다.   const string symbol = NULL)     // 기본적으로 현재 차트의 기호 // 서버 시간 DST 모드 보정 예상 시간(초) int TimeServerDaylightSavings(const datetime srvtime = 0,   const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // 서버 표준 시간대 오프셋 추정(초) int TimeServerGMTOffsetHistory(const datetime srvtime = 0,   const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // 서버가 DST를 사용하는지 추정(true/false) bool TimeServerDaylightSavingsSupported(const datetime srvtime = 0,   const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // 트레이드 서버용 TimeGMTOffset() 함수의 아날로그, 초 단위 차이 int TimeServerGMTOffset(); // TimeGMT() - TimeTradeServer() 

TimeServerDaylightSavings(), TimeServerGMTOffsetHistory(), TimeServerDaylightSavingsSupported() 함수는 TimeServerZone() 의 래퍼에 불과하므로 둘 이상의 특성이 필요한 경우 후자를 사용하고 ServerTimeZone 구조체에서 값을 읽는 것이 바람직합니다.

이 모든 함수는 해당 특성(현재 또는 과거)을 가져올 서버 시간을 첫 번째 인수로 받습니다. 서버 시간을 0으로 남겨두면(기본값), 현재 시점의 결과가 반환됩니다.

두 번째 인수 임계값을 사용하면 알고리즘의 감도를 조정할 수 있습니다. 기본적으로 52/4은 결정을 내리는 데 필요한 통계의 1/4인 52/4입니다(휴일 전후의 짧은 주 간섭 없이 시간대를 감지). 반면에 이 설정은 브로커가 임시 시간대 변경을 결정할 경우 이를 즉시 감지하지 못하도록 합니다. 임계값을 0으로 설정하여 알고리즘이 가능한 한 빨리 변경 사항을 감지하도록 할 수 있습니다.

TimeServerGMTOffset() 함수는 기록 분석을 사용하지 않고 MQL5 함수를 통해 직접 오프셋을 계산합니다( TimeGMT() - TimeTradeServer()).

이 함수는 MQL5에 내장된 TimeGMTOffset() 함수와 동일한 오프셋 표기법을 사용하므로 GMT+3과 같은 양의 시간대는 -10800과 같은 음의 오프셋으로 표시되고 그 반대의 경우도 마찬가지입니다. 이 표기법은 JaveScript와 같은 일부 다른 프로그래밍 언어에서 사용되지만 양수 시간대는 양수 오프셋으로, 음수 시간대는 음수 오프셋으로 표시하는 다른 언어도 있습니다. 알고리즘을 주의 깊게 확인하세요.

예를 들어 테스트 스크립트는 수집된 모든 데이터를 로그에 출력합니다:

1 ~ Built-in functions ~ TimeLocal()=2024.10.05 00:39:01 / ok TimeCurrent()=2024.10.05 00:38:59 / ok TimeTradeServer()=2024.10.05 00:39:01 / ok TimeGMT()=2024.10.04 21:39:01 / ok TimeGMTOffset()=-10800 / ok TimeDaylightSavings()=0 / ok 2 ~ Add-on over built-in functions ~ TimeServerGMTOffset()=-10800 / ok 3 ~ Estimation of server TZ with DST based on week opening hours in history ~ TimeServerDaylightSavings()=-3600 / ok     [offsetGMT] [offsetDST] [supportDST] [0]      -10800       -3600         true 

이 경우 서버는 현재 DST 모드에 있지만 로컬 컴퓨터는 그렇지 않은 것으로 감지됩니다.

로컬 컴퓨터와 서버의 시스템 시계는 일반적으로 같은 시간대에 있더라도 약간 다른 시간(초, 심지어 분)을 표시할 수 있다는 점을 기억하세요. 또한 내장된 TimeTradeServer() 함수는 시간별 정확도가 있는 서버의 시간이지만 로컬 시계에서 시간 내 분수를 상속하는 합성 날짜 시간을 반환한다는 점에 유의하세요. 이는 MQL5에서 시간대 간 변환을 간소화하기 위한 것으로, "현지 형식"으로 반환되는 TimeLocal(), TimeGMT() 와 거래 서버 시간도 마찬가지입니다.

전처리기 지시어를 통해 분석 중인 데이터의 상세 출력을 활성화할 수 있습니다:

#define  PRINT_DST_DETAILS

를 포함하기 전에 코드에 넣어야 합니다:

#include "TimeServerDST.mqh"

다음은 로그의 세부 정보 예시입니다:

Got 20023 H1 bars, ~834 days Week opening hours stats: 30  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 83 54  0 Time Zone changes (UTC±X before/after weekstart):             [weekstart]    [before] [DSTb] [after] [DSTa] [0] 2021.07.25 00:00:00 -2147483648  false      -1  false [1] 2021.11.08 00:00:00           0   true       0  false [2] 2022.03.14 00:00:00           0  false       0   true [3] 2022.11.07 00:00:00           0   true       0  false [4] 2023.03.13 00:00:00           0  false       0   true [5] 2023.11.06 00:00:00           0   true       0  false [6] 2024.03.11 00:00:00           0  false       2  false 3 different timezones detected in quotes, 1 DST candidates Server time offset: UTC+2 STD TimeServerDaylightSavings()=-3600 / ok 

여러분의 환경에서 자유롭게 스크립트를 실행하고 결과 로그를 토론에 게시해 주시기 바랍니다.


업데이트

2024.10.10 - 버그 수정: 주요 분석 전 타임라인에서 영업 시간 통계를 방해하는 미국 DST 전환이 제거되었습니다.

2024.10.27 - 모든 함수에 대한 인수로 서버 관심 시간 및 최소 주간 통계 임계값이 추가되고, TimeServerGMTOffsetEmpiric() 의 이름이 TimeServerGMTOffsetHistory() 로 변경되었습니다.

2024.10.29 - 요청된 시간을 조회 기간에 포함시키는 작은 버그 수정.

2024.10.30 - TimeZoneChange 배열의 DST 수정; 이제 srvtime 파라미터가 지정되어 있는 경우, 이 파라미터에서 조회가 수행됩니다.

2024.11.01 - 귀금속에 적용 시 계산을 자동으로 조정하는 기능이 추가되어 미국 DST와 EU DST 일정이 동기화되지 않는 주에 보다 안정적인 결과를 제공할 수 있습니다.

2024.11.04 - DST 스위치 켜기/끄기의 온라인 감지를 개선했습니다.

2024.11.07 - 지표 또는 경제 이벤트 백테스팅 기록에 대한 대량 요청에 대한 시간대/DST 변경 캐싱 추가.

2024.11.08 - 소규모 코드 리팩터링으로 캐싱 성능 최적화.

2024.11.16 - 암랄리에 의해 금속에서 추론된 타임스탬프의 1시간 조정.

2024.11.17 - 암랄리에 의한 리팩토링 및 수정: 주말 동안 온라인 요청에 대한 캐시 리빌드 제거, 주말 동안의 TZ 변경 감지를 위한 48시간 룩헤드 추가(DST 전환 가능), 일요일 00:00이 시간대 경계로 사용(일주일의 1번째 바 대신)됩니다.

2024.11.20 - 기본 임계값이 1로 변경(시간대 변경의 신속한 감지와 휴일 이후 등 비표준 주에 대한 오탐지 제거 사이의 균형), 시간대 오프셋 및 DST를 포함한 시간 서식을 위한 새로운 함수 세트 추가(TimeZoneFmt.mqh 참조) 및 기타 작은 개선 사항이 추가되었습니다.




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