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

TimeGMT library for the strategy tester - MetaTrader 5용 라이브러리

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

TimeGMT() 함수

클라이언트 터미널이 실행 중인 컴퓨터의 현지 시간으로 DST 전환을 고려하여 계산된 GMT를 반환합니다. 이 함수에는 두 가지 변형이 있습니다.

매개 변수 없이 호출

datetime  TimeGMT();

MqlDateTime 유형 매개 변수를 사용하여 호출

datetime  TimeGMT(
   MqlDateTime&  dt_struct      // 구조 유형 변수
   );

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



TimeGMT 라이브러리

이 라이브러리는 전략 테스터에서 테스트하는 동안 실제 GMT를 제공하기 위해 TimeGMT() 함수를 수정합니다. 이 라이브러리는 두 가지 버전의 TimeGMT에 대한 글로벌 API 후크(매크로 대체를 통해)를 설치합니다.

class CTimeGMT
  {
public:
   static datetime   TimeGMT(void);
   static datetime   TimeGMT(MqlDateTime &dt_struct);
  }

사용법:

전략 테스터에서 뉴스 필터 또는 시간 제한을 사용하는 전문가 조언을 테스트하기 전에 코드 시작 부분에 이 줄을 추가한 다음 메타에디터에서 소스를 다시 컴파일하면 됩니다.

#include "TimeGMT.mqh"

- 선택적으로 디버그 메시지를 보려면 #include 지시어 앞에 이 줄을 추가하세요:

#define  PRINT_GMT_DETAILS

전문가 어드바이저 또는 표시기에 대해 다른 수정이나 함수 호출이 필요하지 않습니다.

  • TimeGMT는 전략 테스터가 감지된 경우에만 수정됩니다.
  • 이 수정은 전략 테스터에서 선택한 심볼에서 작동합니다.
  • 주말이나 크리스마스 휴일에는 계산 오류가 없습니다.
  • 전략 테스터의 낮은 오버헤드와 빠른 계산 시간

브로커 오프셋 재계산은 전문가 자문 시작 시점과 매주 일요일 및 월요일 자정에만 이루어집니다. 계산된 브로커 오프셋은 메모리에 캐시되어 이후 TimeGMT 호출에 사용됩니다.

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

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

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

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

참고:

참고: XAUUSD는 Forex보다 한 시간 후에 시작되므로 전략 테스터에서는 한 시간 후에 DST 전환이 발생합니다.



TimeGMT_TestEA

전략 테스터에서 라이브러리를 탐색하기 위해 전략 테스터에서 데모 전문가 자문을 테스트합니다.


전략 테스터에서 전문가 어드바이저를 실행한 결과입니다:

AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating
AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs:
  timer_hours=24
2023.03.05 00:00:00   TimeCurrent() = Sun, 2023.03.05 00:00:00  | TimeTradeServer() = Sun, 2023.03.05 00:00:00  | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.06 00:00:00   TimeCurrent() = Mon, 2023.03.06 00:00:00  | TimeTradeServer() = Mon, 2023.03.06 00:00:00  | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.07 00:00:00   TimeCurrent() = Tue, 2023.03.07 00:00:00  | TimeTradeServer() = Tue, 2023.03.07 00:00:00  | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.08 00:00:00   TimeCurrent() = Wed, 2023.03.08 00:00:00  | TimeTradeServer() = Wed, 2023.03.08 00:00:00  | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.09 00:00:00   TimeCurrent() = Thu, 2023.03.09 00:00:00  | TimeTradeServer() = Thu, 2023.03.09 00:00:00  | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.10 00:00:00   TimeCurrent() = Fri, 2023.03.10 00:00:00  | TimeTradeServer() = Fri, 2023.03.10 00:00:00  | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.11 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sat, 2023.03.11 00:00:00  | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.12 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sun, 2023.03.12 00:00:00  | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.13 00:00:00   TimeCurrent() = Mon, 2023.03.13 00:00:00  | TimeTradeServer() = Mon, 2023.03.13 00:00:00  | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.14 00:00:00   TimeCurrent() = Tue, 2023.03.14 00:00:00  | TimeTradeServer() = Tue, 2023.03.14 00:00:00  | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.15 00:00:00   TimeCurrent() = Wed, 2023.03.15 00:00:00  | TimeTradeServer() = Wed, 2023.03.15 00:00:00  | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.16 00:00:00   TimeCurrent() = Thu, 2023.03.16 00:00:00  | TimeTradeServer() = Thu, 2023.03.16 00:00:00  | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.17 00:00:00   TimeCurrent() = Fri, 2023.03.17 00:00:00  | TimeTradeServer() = Fri, 2023.03.17 00:00:00  | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.18 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sat, 2023.03.18 00:00:00  | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.19 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sun, 2023.03.19 00:00:00  | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)


업데이트

2024.03.30 - v.1.25 : 브로커 GMT 오프셋 수정. 현재 라이브러리는 가장 정확한 시작 시간을 가진 골드 차트에서 H1 바만 스캔합니다.

2024.04.09-v.1.33 : GMT+0 브로커에서 크리스마스 연휴 기간 동안 브로커 GMT 오프셋 계산의 잠재적 문제를 수정했습니다.

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

2024.07.07 - v.1.36 : 일부 브로커에서 GOLD 기호가 제대로 감지되지 않던 문제를 수정했습니다.

2024.10.21-v.1.40 : EURUSD 기호로 대체하여 GOLD 기호 감지가 개선되었습니다.

2024.10.22 - v.1.45 : 전략 테스터에서 주말 동안 서버의 GMT 오프셋을 더 빠르게 결정합니다.

2024.10.26 - v.1.47 : 더 나은 오류 처리 및 디버깅 코드가 추가되었습니다. HistoryBrokerOffset() 메서드의 이름을 TimeServerGMTOffset()으로 변경했습니다.

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

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

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

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

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

2024.12.17 - v.1.62 : HistoryServerGMTOffset() 함수의 최적화가 추가되었습니다.

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



브로커의 시간대 및 DST 일정

협정 세계시(UTC)라고도 하는 그리니치 표준시(GMT)는 시간에 대한 공식적인 세계 기준으로 사용됩니다. 시간대는 종종 UTC - 3시간 또는 GMT - 3시간과 같이 표시됩니다. 이 예에서 (-3h)는 해당 시간대가 UTC 또는 GMT보다 3시간 늦다는 것을 나타냅니다. UTC+3h 또는 GMT +3h는 해당 시간대가 UTC보다 GMT보다 3시간 빠르다는 것을 나타냅니다. 현지 시간(UTC)과 GMT(협정세계시) 사이의 시간 차이를 GMT 오프셋이라고 합니다.

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

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

각 브로커는 서머타임(DST)을 자유롭게 선택할 수 있습니다. 그리고 해당 시간대의 DST가 반드시 동일한 것은 아닙니다. 때때로 EU 시간대 대신 미국 시간대를 사용하는 경우도 있습니다. 미국 일정을 따르지 않는 브로커의 경우 주 시작(및 종료) 서버 시간은 연중 내내 동일한 브로커에 대해 +/- 1시간씩 달라집니다. 이러한 변화를 처리하려면 매주 브로커 오프셋을 다시 계산하여 브로커의 DST 변경을 제때 감지할 수 있도록 해야 합니다.

따라서 표준 시간대 +2(미국 일정상 여름에는 +3)를 사용하면 매주 캔들은 월요일 자정에 시작되고, 매주 5개의 D1 캔들이 있으며 일일 캔들(및 H4)의 시작은 새로운 FX일의 시작이 됩니다. 매주 토요일 자정 직전에 종료됩니다. 토요일과 일요일에는 캔들이 없습니다.간단히 말해, 이 서버의 시간은 항상 뉴욕보다 7시간 앞서며 NY+7로 표시됩니다.이것이 가장 일반적인 설정이지만 덜 일반적인 변형이 많이 있습니다.


실제 GMT 계산에대한 세부 정보

라이브러리에서 TimeGMT() 호출을 가로채면 먼저 전략 테스터에서 실행 중이 아닌지 확인한 다음 원래 함수를 반환합니다. 전략 테스터가 감지되면 코드가 브로커 오프셋을 계산하기 시작하고(나중에 참조), 반환 값은 클라이언트 터미널의 트레이딩 서버 현재 시간에서 이 오프셋을 뺀 결과입니다.

true GMT  = TimeTradeServer() - ServerGMTOffset (of the current trading week)

'서버GM오프셋' 자체는 H1 호가 기록을 분석하여 알려진 두 시간 사이의 차이로 추정할 수 있습니다:

1) 거래 주의 첫 번째 막대가 GOLD 차트(FstBarWk)에 나타나는 시간,

2) 뉴욕에서 18:00(일) GOLD 거래 시작 시간에 해당하는 UTC 시간 .

ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)  

브로커오프셋 계산은 칼 슈라이버가 시간 다루기(2) 함수에서 발표한 알고리즘을 최적화하여 수정한 것을 사용합니다.


https://www.timeanddate.com/time/change/usa/new-york 에 따르면

  • 뉴욕에서는 3월 둘째 주 일요일 오전 02:00(현지 시간)에 서머타임이 시작됩니다. 시계는 GMT-4로 한 시간 앞당겨지므로 이에 해당하는 UTC 시간인 뉴욕 일요일 18:00은 (일요일, 22:00 UTC)입니다.

  • 11월 첫째 일요일 02:00(현지 시간)에 뉴욕의 서머타임이 종료(겨울철)되므로 시계는 1시간 뒤로 이동하여 GMT-5로 변경되므로 이에 해당하는 UTC 시간은 뉴욕 Sun, 18:00(일, 23:00 UTC)가 됩니다.

예를 들어 GOLD 차트의 FstBarWk가 월 01:00에 시작하고 해당 막대의 뉴욕이 겨울인 경우 BrokerOffset은 다음과 같이 계산할 수 있습니다:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)

그리고 뉴욕이 여름인 경우 BrokerOffset은 다음과 같이 계산할 수 있습니다:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)



세션 시간을 브로커 서버 시간으로 변환하기

트레이더는 TimeGMT()를 사용하여 세션 시간을 해당 서버 시간으로 변환하여 특정 시장이 언제 열리거나 닫힐지 결정할 수 있습니다. 예를 들어 트레이더가 아시아(도쿄) 세션에서 거래하려면 다음과 같이 거래 시간을 조정해야 합니다.

1] 브로커 거래 서버의 오프셋을 결정합니다.

int ServerGMTOffset = TimeTradeServer() - TimeGMT();

    2] 특정 시장의 현지 시간을 해당 브로커의 서버 시간으로 변환합니다.

    datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset

    목적지 시간대가 현재 서머타임인 경우 방정식의 두 번째 항(xxx_GMTOffset)을 +1시간 늘려야 합니다.

    전략 테스터에서 테스트하는 동안 TimeGMT()는 항상 TimeTradeServer() 시뮬레이션 서버 시간과 같으므로 세션 시간 변환이 잘못됩니다. 이 라이브러리는 실제 GMT를 제공하기 위해 TimeGMT() 함수를 수정하므로 전략 테스터에서 테스트하는 동안 변환된 세션 시간이 정확해집니다.


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

    Simple Bar Timer Simple Bar Timer

    다음 막대가 도착할 때까지 남은 시간을 표시하는 스크립트입니다.

    뉴스 V라인 뉴스 V라인

    스크립트는 뉴스 릴리스 지점에서 차트에 세로줄을 표시합니다.

    MA mass cloud MA mass cloud

    서로 다른 기간의 이동 평균 덩어리로 형성된 구름입니다.

    멀티-윌리엄스 퍼센트 범위 방향 표시기 멀티-윌리엄스 퍼센트 범위 방향 표시기

    멀티 윌리엄스 퍼센트 범위 추세 방향 표시기.