Alım-satım robotlarını ücretsiz olarak nasıl indirebileceğinizi izleyin
Bizi Twitter üzerinde bulun!
Fan sayfamıza katılın
Komut dosyasını ilginç mi buldunuz?
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
Komut dosyasını beğendiniz mi? MetaTrader 5 terminalinde deneyin
Kütüphaneler

Local Timezones and Local Session Hours - MetaTrader 5 için kütüphane

Görüntülemeler:
33
Derecelendirme:
(16)
Yayınlandı:
MQL5 Freelance Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git

Merhaba, tüccarlar.

Bu kütüphane, belirli bir veya tüm Forex piyasalarında geçerli yerel saati almak için tüm işlevlere sahiptir. Yerel saatleri saat dilimleri arasında veya brokerinizin sunucu saatine dönüştürebilirsiniz. Ayrıca, her oturum için oturum başlangıç ve bitiş saatlerini ayrı ayrı ayarlayarak belirli oturumlarda işlem yapabilirsiniz. Kütüphane, komisyoncunun ve bu pazarların farklı zaman ofsetleri ve yaz saati değişiklikleriyle ilgilenecektir. Bu, saat dilimleri ve yerel oturum saatleriyle ilgilenmesi gereken bir uzman danışman veya teknik bir gösterge programladığınızda tekerleği yeniden icat etme yükünü hafifletir.


Zaman Dilimi Nedir?

Zaman dilimi, o yerin coğrafi temsiline bağlı olarak standart zaman olarak tanımlanır. Başka bir deyişle, zaman dilimi, dünyanın dönüşüne bağlı olarak belirli bir bölgenin yerel saatini ifade eder. Dünyanın bölge bazlı zamanının koordine edildiği standart olan UTC'de (Koordineli Evrensel Zaman) tanımlanır.

Örneğin - New York'ta zaman Greenwich'ten 5 saat geridedir ve gün ışığına bağlı olarak UTC-5 veya UTC-4 olarak gösterilir. Sydney'de saat Greenwich'ten 10 saat ileridedir ve gün ışığına (yaz veya kış) bağlı olarak UTC+10 veya UTC+11 olarak gösterilir. UTC ve GMT terimleri genellikle ofsetleri ifade etmek için birbirinin yerine kullanılır, bu nedenle UTC+2 ve GMT+2 genellikle aynı anlama gelir.

UTC ofseti, zaman dilimi GMT'nin doğusundaysa pozitif, batısındaysa negatiftir.


Saat Dilimi Tanımlayıcıları

//+------------------------------------------------------------------+
//| Saat dilimi tanımlayıcıları|
//+------------------------------------------------------------------+
enum ENUM_ZONE_ID
  {
   ZONE_ID_SYDNEY,     // Sidney
   ZONE_ID_TOKYO,      // Tokyo
   ZONE_ID_FRANKFURT,  // Frankfurt
   ZONE_ID_LONDON,     // Londra
   ZONE_ID_NEWYORK,    // New York
   ZONE_ID_UTC,        // UTC
   ZONE_ID_LOCAL,      // YEREL
   ZONE_ID_BROKER,     // BROKER
   ZONE_ID_CUSTOM      // ÖZEL
  };


Sınıf arayüzü

//+------------------------------------------------------------------+
//| Sınıf CTimeZoneInfo.|
//| Amaç: Belirtilen | için yerel saate erişim sağlayan sınıf
//| konumun yanı sıra saat dilimi bilgisi, saat |
//| cari yıl için değişiklikler.|
//||
//| Kütüphanede kullanılan ofset gösterimi:|
//| Lütfen kütüphanenin pozitif zamanı gösterdiğine dikkat edin |
//| pozitif ofsetlere göre bölgeler ve negatif zaman dilimleri |
//| negatif ofsetlerle.|
//| Aksine, MQL5'in yerleşik TimeGMTOffset() |
//| fonksiyonu GMT+3, | gibi pozitif zaman dilimlerini belirtir.
//| -10800 gibi negatif ofsetlerle veya tam tersi. |
//+------------------------------------------------------------------+
class CTimeZoneInfo
  {
public:
                     CTimeZoneInfo( ENUM_ZONE_ID placeId, datetime pLocalTime = TIME_NOW );
                    ~CTimeZoneInfo( void );

   string            Name( void );                                                       // Zaman diliminin adını döndürür
   string            ToString( bool secs = true, bool tzname = true );                   // TZ/DST ofseti ve tzname ile biçimlendirilmiş bir yerel saat dizesi döndürür
   bool              RefreshTime( void );                                                // Geçerli yerel saati yenile ve saat dilimi bilgilerini doldur
   bool              SetLocalTime( datetime pLocalTime = TIME_NOW );                     // Bu konum için yerel saati belirtilen saate ayarla

   datetime          TimeLocal( void );                                                  // Zaman diliminde yerel saati döndürür
   datetime          TimeUTC( void );                                                    // UTC zamanını döndürür (tüm zaman dilimlerinde aynıdır)
   int               TimeGMTOffset( void );                                              // Pozitif saat dilimleri için pozitif değer (örn. GMT+3), aksi takdirde negatif. (DST'yi içerir)
   int               TimeDaylightSavings( void );                                        // Ayarlanan yerel saatte, zaman dilimi için DST düzeltmesini (saniye cinsinden) döndürür.

   datetime          ConvertLocalTime( ENUM_ZONE_ID destinationId );                     // Bu saat dilimindeki yerel saati farklı bir saat dilimine dönüştür
   bool              GetDaylightSwitchTimes( datetime &dst_start, datetime &dst_end );   // Yıl için Yaz Saati başlangıç ve bitiş saatlerini alın
   datetime          GetDaylightNextSwitch( void );                                      // Bir sonraki Yaz Saati Uygulamasına geçişin yerel saatini al
   void              PrintObject( void );

   //--- nesne oluşturulmasını gerektirmeyen statik yöntemler.
   static datetime   GetCurrentTimeForPlace ( ENUM_ZONE_ID placeId );                    // Belirtilen saat dilimi için geçerli yerel saati al
   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 );   // Verilen yerel saatte bir zaman dilimi için GMT'den toplam tz ofsetini (UTC+DST) döndürür
   static int        TimeDaylightSavings    ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // Verilen yerel saatteki bir zaman dilimi için dst düzeltmesini saniye cinsinden döndürür
   static bool       IsDaylightSavingTime   ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // Belirtilen bir saatin yaz saati uygulamasına denk gelip gelmediğini kontrol eder
   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,              // Kütüphanede bulunmayan bir zaman dilimi tanımlar.
                                        ENUM_ZONE_ID dstSchedule = ZONE_ID_UTC );
   static void       SetUsingGoldSymbol( bool enabled = true );                          // Sunucu TZ/DST tahmini için Altın sembolü kullanma seçeneğini ayarlar
  };


Sınıf arayüzü

//+------------------------------------------------------------------+
//| Sınıf CSessionHours.|
//| Amaç: Yerel işlem seans saatlerine erişmek için sınıf
//| belirtilen konum.|
//| CTimeZoneInfo sınıfından türetilmiştir.|
//| Not: Varsayılan oturum saatleri sabah 8:00 - akşam 5:00 olarak ayarlanmıştır |
//| yeni CSessionHours nesneleri için yerel saat. |
//+------------------------------------------------------------------+
class CSessionHours : public CTimeZoneInfo
  {
public:
                     CSessionHours( ENUM_ZONE_ID placeId );
                    ~CSessionHours( void );

   //--- yerel oturum zamanına erişmek için yöntemler
   bool              RefreshTime( void );                            // Günün geçerli yerel saatini ve oturum saatlerini yenileyin
   bool              SetLocalTime( datetime pLocalTime );

   //--- varsayılan yerel oturum saatlerini geçersiz kılmak için yöntemler
   bool              BeginLocalTime( int pHour, int pMinute );       // Başlangıç saati ve dakikasını kullanarak yerel oturum başlangıç saatini ayarlayın
   bool              EndLocalTime( int pHour, int pMinute );         // Bir bitiş saati ve dakikası kullanarak yerel oturum bitiş saatini ayarlayın

   //--- yerel oturum saatlerine erişmek için yöntemler
   datetime          BeginLocalTime( void );
   datetime          EndLocalTime( void );
   bool              CheckLocalSession( void );                      // Yerel işlem seansının şu anda aktif olup olmadığını kontrol edin.
   int               SecRemainingSession( void );                    // Yerel oturum gün için kapanana kadar saniye cinsinden kalan süre.

   //--- nesne oluşturulmasını gerektirmeyen statik yöntemler.
   static datetime   ForexCloseTime( void );                         // Forex piyasasının bu hafta için kapandığı broker zamanı.
   static int        SecRemainingForex( void );                      // Forex piyasasının bu hafta için kapanmasına saniye cinsinden kalan süre.
  };


Kütüphanede Kullanılan Ofset Notasyonu

Lütfen kütüphanenin pozitif zaman dilimlerini pozitif ofsetlerle ve negatif zaman dilimlerini negatif ofsetlerle gösterdiğini unutmayın.

Bu, GMT+3 gibi pozitif zaman dilimlerini -10800 gibi negatif ofsetlerle belirten MQL5'in yerleşik TimeGMTOffset() işlevinin tersidir ve bunun tersi de geçerlidir.


Sunucu TZ/DST Tahmini İçin Sembol Seçimi

Varsayılan olarak, kütüphane sunucunun zaman dilimi ofsetini tahmin etmek için XAUUSD sembolünü arayacak ve yükleyecektir. XAUUSD, ABD DST ve AB DST programlarının senkronize olmadığı haftalarda (Mart ve Ekim sonu) daha güvenilir sonuçlar sağlayabilir (özellikle AB DST programını takip eden brokerlar için). İsteğe bağlı olarak, aracınız ABD DST programını takip ediyorsa veya hiç program yoksa, grafik sembolünü kullanmak da iyidir. XAUUSD yerine geçerli grafiğin sembolünü kullanmak için CTimeZoneInfo::SetUsingGoldSymbol() işlevini 'false' ile çağırın.

Brokerinizin gün ışığı (DST) programını belirlemek için bu komut dosyasını kullanabilirsiniz https://www.mql5.com/tr/code/48650

//+------------------------------------------------------------------+
//| Tahmin etmek için XAUUSD (Altın) sembolünü kullanma seçeneğini ayarlar |
//| sunucunun TZ/DST'si H1 teklif geçmişinin analiziyle belirlenir. |
//| TRUE : Gold sembolünü ara ve yükle (varsayılan davranış). |
//| FALSE : geçerli grafiğin sembolünü kullanın. |
//+------------------------------------------------------------------+
void CTimeZoneInfo::SetUsingGoldSymbol(const bool enabled = true);

Not:

XAUUSD'nin Forex'ten bir saat sonra başlamasının bir yan etkisi olarak, dst anahtarları bir saat sonra gerçekleşecektir (normal modda değil, yalnızca strateji test cihazında).


Strateji Test Cihazı ile Uyumluluk Hakkında Not

Strateji test cihazında test sırasında,TimeGMT () her zamanTimeTradeServer() simüle edilmiş sunucu saatine eşittir.

TimeZoneInfo kütüphanesi, yerleşik TimeGMT işlevini çağırarak döndürülen zamana göre değil, H1 teklif geçmişinin analizi yoluyla "gerçek" GMT'ye dayalı olarak saat dilimlerindeki uygun zamanları tahmin eder.

Sunucunun TZ / DST tahmini için XAUUSD sembolü kullanılırsa, strateji test cihazında dst anahtarları bir saat sonra gerçekleşecektir.



I. Yerel Saat Dilimleriyle Çalışma

Geçerli saat nasıl alınır?

RefreshTime() metodu , saat diliminin geçerli yerel saatini güncelleyecektir. Geçerli saati nasıl alabileceğimizi göstermek için bir örnek görelim .

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

   CTimeZoneInfo tz(ZONE_ID_TOKYO);
   tz.RefreshTime(); // geçerli saat dilimi bilgisini doldur

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

çıktı:

   // ========== Bir zaman diliminde geçerli saati al ==========
   // Name() : Tokyo
   // TimeLocal() : 2024.02.28 19:58:50
   // ToString() : Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo]


Daha fazla bilgiye ihtiyacınız var mı?

   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());

output:

   // ========== Bir saat dilimi hakkında daha fazla bilgi ==========
   // 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 [New York] (DST)
   // dst_start : 2024.03.10 02:00:00
   // dst_end : 2024.11.03 02:00:00
   // GetDaylightNextSwitch() : 2024.11.03 02:00:00

Notlar:

- TimeUTC() metodu GMT zamanına eşdeğer olan UTC zamanını döndürür.

- TimeLocal() yöntemi, bu zaman diliminin yerel saatini döndürür ( RefreshTime veya SetLocalTime yöntemlerinin çağrılması sonucunda değiştirilmiş olabilir).

- TimeGMTOffset() yöntemi, kış veya yaz saatine geçişi dikkate alarak, bu saat diliminin yerel saati ile GMT saati arasındaki geçerli farkı saniye cinsinden döndürür. Döndürülen ofset, geçerli saat diliminin DST ayarlamasını içerir. Saat dilimi GMT'nin doğusunda (ilerisinde) ise GMT ofseti pozitif, GMT'nin batısında (gerisinde) ise negatiftir.

- TimeDaylightSavings() yöntemi, DST'nin geçerli olduğu bölgelerde yaz saatine geçilmişse, saniye cinsinden yaz saati (DST) ayarlamasını döndürür. Kış (standart) saatine geçiş yapılmışsa (veya saat dilimi DST'yi desteklemiyorsa) 0 döndürür. dst ayarlaması zaten TimeGMTOffset'in bir parçasıdır.


Yerleşik özel saat dilimi daha sonra kullanılmak üzere nasıl yapılandırılır?

CTimeZoneInfo sınıfı, yerleşik özel saat dilimini yapılandırmak için kullanabileceğiniz bir SetCustomTimeZone yöntemi içerir. Daha sonra, özel saat dilimi ZONE_ID_CUSTOM tanımlayıcısı aracılığıyla kullanılabilir. Yerleşik özel saat dilimini belirli bir ada, Greenwich Ortalama Saati'nden (GMT) bir uzaklığa ve bir gün ışığı programı tanımlayıcısına nasıl yapılandırabileceğimizi göstermek için bir örnek görelim.

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

   string        name  = "Custom+3";               // Özel Zaman Dilimi adı
   int           baseGMTOffset  = 10800;           // Özel Zaman Dilimi'nin temel GMT ofseti (saniye cinsinden)
   ENUM_ZONE_ID  daylightRuleId = ZONE_ID_LONDON;  // Özel Zaman Dilimi'nin DST programı

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

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

Çıktı:

   // ========== Yerleşik özel zaman dilimini yapılandırın ==========
   // Parametre 'name' : Özel+3
   // Parametre 'baseGMTOffset' : 10800
   // Parametre 'daylightRuleId' : ZONE_ID_LONDON
   // SetCustomTimeZone() döner : true


Tüm Zaman Dilimlerinde Geçerli Saati Alın

Tüm zaman dilimlerinde geçerli yerel saati nasıl alabileceğimizi gösteren bir örnek görelim.

   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());
     }

çıktı:

   // ========== Tüm Zaman Dilimlerinde Geçerli Saati Al ==========
   // Sydney : 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST)
   // Tokyo : 2024.02.28 19:58 | Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo]
   // Frankfurt : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt]
   // Londra : 2024.02.28 10:58 | Çar, 2024.02.28 10:58:50 GMT+0 [Londra]
   // New York : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York]
   // UTC : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC]
   // Ana Sayfa : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Ana Sayfa]
   // FXOpen-MT5 : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]


Bu, GetCurrentTimeForPlace() statik yöntemi kullanılarak başka bir şekilde yapılabilir. Ayrıca, düz mql datetime değişkenlerini bir dizeye ( TimeToString'e benzer ) biçimlendirmek için kullanılabilecek başka bir statik yöntem FormatTimeForPlace() olduğunu unutmayın, ancak haftanın günü, tarih, saat, saat dilimi adı ve ofsetleri ile. Bu statik yöntemler, bunları çağırmak için nesnelerin oluşturulmasını gerektirmez.

   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));
     }

çıktı:

   // ========== GetCurrentTimeForPlace() ==========
   // Saat : 2024.02.28 21:58 | Çar, 2024.02.28 21:58:50 GMT+11 [Sidney] (DST)
   // Saat : 2024.02.28 19:58 | Çar, 2024.02.28 19:58:50 GMT+9 [Tokyo]
   // Saat : 2024.02.28 11:58 | Çar, 2024.02.28 11:58:50 GMT+1 [Frankfurt]
   // Saat : 2024.02.28 10:58 | Çar, 2024.02.28 10:58:50 GMT+0 [Londra]
   // Saat : 2024.02.28 05:58 | Çar, 2024.02.28 05:58:50 GMT-5 [New York]
   // Saat : 2024.02.28 10:58 | Çar, 2024.02.28 10:58:50 GMT+0 [UTC]
   // Saat : 2024.02.28 12:58 | Çar, 2024.02.28 12:58:50 GMT+2 [Ana Sayfa]
   // Saat : 2024.02.28 12:58 | Çar, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]


Saat dilimi için yerel saat nasıl ayarlanır?

SetLocalTime() metodu belirtilen yerel saati ayarlayacaktır. Zaman dilimi için yerel saati nasıl ayarlayabileceğimizi gösteren bir örnek görelim.

   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());

çıktı:

   // ========== Bir zaman dilimi için yerel saati ayarlayın ==========
   // New York : 2021.07.15 09:31 | Thu, 2021.07.15 09:31:00 GMT-4 [New York] (DST)
   // New York : 2022.01.23 17:04 | Sun, 2022.01.23 17:04:00 GMT-5 [New York]
   // >>Hata: 2023.03.12 02:21 saati New York'ta mevcut değil. Bunun nedeni Yaz Saati Uygulamasının bir saat atlamasıdır.

Aldığımız son hata mesajının nedeni bir sonraki paragrafta açıklanacaktır.


Yaz Saati Uygulaması (DST):

DST, saatlerin yılın bir bölümünde standart saatin ilerisine ayarlandığı mevsimsel bir zaman değişikliği önlemidir.

bkz. https://www. timeanddate.com/time/dst/transition.html

("Summer Skip", "Winter Wind-back")

İlkbaharda DST başladığında, saatlerimiz genellikle bir saat olmak üzere belirli bir süre ileri alınır. Bu, saatte bir saatin atlandığı anlamına gelir. Sonbaharda DST dönemi genellikle sona erer ve saatlerimiz tekrar standart saate ayarlanır.


DST Başlangıcı Örneği

(var olmayan saat)

Amerika Birleşik Devletleri'nde DST her zaman yerel saatle 02:00'de (sabah 2) başlar. Saatler standart zaman olan 1:59:59'a ilk ulaştığı anda 3:00:00 Yaz Saati uygulamasına geçer. Dolayısıyla, 2:00:00 ile 2:59:59 arasındaki saat, geçiş gecesinde mevcut değildir.



II. Saat Dilimi Bilgilerini Alma

1. UTC ofseti ve geçerli DST ofseti

Zaman dilimi adını, UTC ofsetini ve DST yürürlükteyse geçerli DST ofsetini nasıl alabileceğimizi gösteren bir örnek görelim.

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

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime(); // geçerli saat dilimi bilgisini doldur

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

çıktı:

   // ========== UTC ofseti ve geçerli DST ofseti ==========
   // Sidney : GMT+11 | DST+1
   // Tokyo : GMT+9 | DST+0
   // Frankfurt : GMT+1 | DST+0
   // Londra : GMT+0 | DST+0
   // New York : GMT-4 | DST+1
   // UTC : GMT+0 | DST+0
   // Ana Sayfa : GMT+2 | DST+0
   // FXOpen-MT5 : GMT+2 | DST+0

Notlar:

- TimeGMTOffset() yöntemi, kış veya yaz saatine geçişi dikkate alarak, bu saat diliminin yerel saati ile GMT saati arasındaki geçerli farkı saniye cinsinden döndürür. Döndürülen ofset, geçerli saat diliminin DST ayarlamasını içerir. Saat dilimi GMT'nin doğusunda (ilerisinde) ise GMT ofseti pozitif, GMT'nin batısında (gerisinde) ise negatiftir.

-TimeDaylightSavings() yöntemi , DST'nin geçerli olduğu bölgelerde yaz saatine geçilmişse, saniye cinsinden yaz saati (DST) ayarlamasını döndürür. Kış (standart) saatine geçiş yapılmışsa (veya saat dilimi DST'yi desteklemiyorsa) 0 döndürür. dst ayarlaması zaten TimeGMTOffset'in bir parçasıdır.


2. Geçerli yıl için DST geçiş zamanları

DST bilgisini nasıl alabileceğimizi göstermek için bir örnek görelim.

   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(); // geçerli saat dilimi bilgisini doldur

      //--- sadece yaz saati uygulamasına uyan zaman dilimleri için.
      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));
        }
     }

çıktı:

   // ========== İçinde bulunulan yıl için DST geçiş zamanları ==========
   // Sidney : DST 2024.04.07 03:00'te başlar | DST 2024.10.06 02:00'de sona erer
   // Frankfurt : DST 2024.03.31 02:00 tarihinde başlar | DST 2024.10.27 03:00 tarihinde sona erer
   // Londra : DST 2024.03.31 01:00 tarihinde başlar | DST 2024.10.27 02:00 tarihinde sona erer
   // New York : DST 2024.03.10 02:00 tarihinde başlar | DST 2024.11.03 02:00 tarihinde sona erer

3. Bir sonraki DST geçişinin zamanı

Bir sonraki DST geçişinin zamanını nasıl alabileceğimizi göstermek için bir örnek görelim.

   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();

      //--- sadece yaz saati uygulamasına uyan zaman dilimleri için.
      if(nxswitch)
        {
         PrintFormat("%-12s:  Time: %s |  dstNextSwitch: %s", tz.Name(), TimeToString(tz.TimeLocal()), TimeToString(nxswitch));
        }
     }

çıktı:

   // ========== Bir sonraki DST geçişinin zamanı ==========
   // Sydney : Zaman: 2024.02.28 21:58 | dstNextSwitch: 2024.04.07 03:00
   // Frankfurt : Saat: 2024.02.28 11:58 | dstNextSwitch: 2024.03.31 02:00
   // Londra : Saat: 2024.02.28 10:58 | dstNextSwitch: 2024.03.31 01:00
   // New York : Saat: 2024.02.28 05:58 | dstNextSwitch: 2024.03.10 02:00


4. DST Listesi

Bu kütüphanedeki tüm zaman dilimleri için DST bilgilerini bir yıl aralığı için nasıl alabileceğimizi gösteren bir örnek görelim.

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

   datetime dst_start, dst_end;
   int delta_start, delta_end;  // saat saniye cinsinden değişir

   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++)
        {
         //--- sadece yaz saati uygulamasına uyan zaman dilimleri için.
         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);
           }
        }

     }

çıktı:

   // ========== DST Listesi ==========
   // ========= Sidney Yaz Saati (DST) =========
   // DST 2008.04.06 03:00 (-1) tarihinde başlar ve 2008.10.05 02:00 (+1) tarihinde sona erer
   // DST 2009.04.05 03:00 (-1) tarihinde başlar ve 2009.10.04 02:00 (+1) tarihinde sona erer
   // DST 2010.04.04 03:00 (-1) tarihinde başlar ve 2010.10.03 02:00 (+1) tarihinde sona erer
   // DST 2011.04.03 03:00 (-1) tarihinde başlar ve 2011.10.02 02:00 (+1) tarihinde sona erer
   // DST 2012.04.01 03:00 (-1) tarihinde başlar ve 2012.10.07 02:00 (+1) tarihinde sona erer
   // ...
   // ...
   // ...

5. Sunucu GMT Ofseti (Güncel)

Komisyoncunun GMT ofseti, komisyoncu zamanının GMT'den kaç saniye ileride olduğunu gösterir, komisyoncu ofseti = TimeTradeServer() - TimeGMT(). Pozitif değerler, sunucu zamanının GMT'den ileride olduğunu gösterir. Aracının mevcut GMT ofsetini nasıl alabileceğimizi göstermek için bir örnek görelim.

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

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

   Print("Name()          : ", broker.Name());
   Print("TimeLocal()     : ", broker.TimeLocal());  // komisyoncu zamanı
   Print("ToString()      : ", broker.ToString());
   Print("TimeGMTOffset() : ", broker.TimeGMTOffset());

çıktı:

   // ========== Aracının geçerli GMT ofseti ==========
   // Name() : ICMarketsSC-Demo
   // TimeLocal() : 2024.03.08 06:33:06
   // ToString() : Fri, 2024.03.08 06:33:06 GMT+2 [ICMarketsSC-Demo]
   // TimeGMTOffset() : 7200

Not: TimeGMTOffset() için önemli bir not, dst düzeltmesi (UTC+DST) dahil utc ofsetini döndürecek olmasıdır . Pozitif değerler, sunucu zamanının GMT'nin ilerisinde (doğusunda) olduğunu gösterir.


6. Sunucu GMT ofseti (Tarihsel)

Sunucunun geçmiş GMT ofsetleri, sunucu haftasının ilk çubuğunun grafikte görünme zamanı ile New York saatiyle Pazar 17:00'ye karşılık gelen UTC zamanı arasındaki fark olarak hesaplanabilir. Aracının geçmiş GMT ofsetlerini nasıl alabileceğimizi göstermek için bir örnek görelim. Bu örnek için, brokerın geçmiş zamanı olarak grafik mumlarının zamanlarını kullanacağız.

   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());
     }

çıktı:

   // ========== Aracının geçmiş GMT ofsetleri (grafik mumları) ==========
   // bar #1 Time: 2022.03.08 00:00 | offset: 7200 (GMT+2) | Tue, 2022.03.08 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #2 Time: 2022.03.09 00:00 | offset: 7200 (GMT+2) | Wed, 2022.03.09 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #3 Time: 2022.03.10 00:00 | offset: 7200 (GMT+2) | Thu, 2022.03.10 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #4 Time: 2022.03.11 00:00 | offset: 7200 (GMT+2) | Fri, 2022.03.11 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #5 Time: 2022.03.14 00:00 | offset: 10800 (GMT+3) | Mon, 2022.03.14 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // bar #6 Time: 2022.03.15 00:00 | offset: 10800 (GMT+3) | Tue, 2022.03.15 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // bar #7 Time: 2022.03.16 00:00 | offset: 10800 (GMT+3) | Wed, 2022.03.16 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // bar #8 Time: 2022.03.17 00:00 | offset: 10800 (GMT+3) | Thu, 2022.03.17 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // bar #9 Time: 2022.03.18 00:00 | offset: 10800 (GMT+3) | Fri, 2022.03.18 00:00:00 GMT+3 [ICMarketsSC-Demo]

5 numaralı çubukta gördüğünüz gibi, sunucu +2 kış saatinden +3 yaz saatine geçmiştir ve geçiş zamanı ABD DST programını takip etmektedir (Mart ayının 2. Pazarı). Haftada beş D1 m umu vardır ve Cumartesi ve Pazar günleri mum yoktur.Bu sunuculardaki saat, yıl boyunca her zaman New York'tan 7 saat ileridedir ve NY+7 olarak temsil edilir. NY'nin kışın -5 ve yazın -4 olduğunu unutmayın.

Bu, sunucunun geçmişteki GMT ofsetini (geçmiş GMT ofsetleri) belirleyebilen kod tabanındaki ilk kütüphanedir. Hesaplamalarda uygulanan algoritma çok hızlı ve doğrudur ve mümkün olduğunca farklı brokerlerle uyumludur (farklı GMT ofsetleri veya DST programları olan çok sayıda broker üzerinde test edilmiştir).



III. Saat Dilimleri Arasında Dönüşüm

Geçerli yerel saati başka bir saat dilimine dönüştürme

Bu zaman dilimi örneğinin ayarlanmış yerel saatini belirli bir zaman dilimine dönüştürmek için ConvertLocalTime() yöntemini kullanın. Bu metot, belirli bir zaman diliminin yeni saatini döndürür.

"Geçerli" yerel saati belirli bir zaman dilimine nasıl dönüştürebileceğimizi gösteren bir örnek görelim.

   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));

çıktı:

   // ========== Sydney'deki geçerli yerel saati New York'a dönüştür ==========
   // 2024.02.28 21:58 | Çar, 2024.02.28 21:58:50 GMT+11 [Sidney] (DST)
   // 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York]


Belirli bir yerel saati başka bir zaman dilimine dönüştürme

Belirli bir yerel saati belirli bir zaman dilimine nasıl dönüştürebileceğimizi göstermek için bir örnek görelim.

   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));

çıktı:

   // ========== Sydney'deki belirli bir yerel saati New York'a dönüştürme ==========
   // 2016.05.21 14:47 | Sat, 2016.05.21 14:47:08 GMT+10 [Sydney]
   // 2016.05.21 00:47 | Sat, 2016.05.21 00:47:08 GMT-4 [New York] (DST)


Tüm zaman dilimlerindeki geçerli yerel saati aracı saatine dönüştürün

Tüm zaman dilimlerinde geçerli yerel saati broker saatine nasıl dönüştürebileceğimizi göstermek için bir örnek görelim.

   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));
     }

çıktı:

   // ========== Tüm zaman dilimlerinde geçerli yerel saati broker saatine dönüştürün ==========
   // Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
   // Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
   // Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
   // Wed, 2024.02.28 10:58:50 GMT+0 [London] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
   // Wed, 2024.02.28 05:58:50 GMT-5 [New York] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
   // Wed, 2024.02.28 10:58:50 GMT+0 [UTC] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
   // Wed, 2024.02.28 12:58:50 GMT+2 [Home] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
   // Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]



IV. Yerel Oturum Saatleri ile Çalışma

A. CTimeZoneInfo Sınıfı

CSessionHours sınıfı yerine üst CTimeZoneInfo sınıfını kullanmanın daha fazla kodlama gerektirdiği ve bu nedenle hatalara açık olduğu için tercih edilmediğini unutmayın. Tüm zaman dilimlerinde Forex seans saatlerini nasıl alacağımızı ve bunları broker saatine nasıl dönüştüreceğimizi gösteren bir örnek görelim.

   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();

      //--- oturum saatlerini yerel saatle sabah 8:00 - akşam 5:00 olarak ayarlayın
      datetime beginlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "08:00");
      datetime endlocal   = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "17:00");

      //--- broker zamanına dönüştürme
      tz.SetLocalTime(beginlocal);
      datetime beginbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

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

      //--- zaman diliminde haftanın yerel günü
      MqlDateTime st;
      TimeToStruct(localtime, st);
      int dow = st.day_of_week;

      //string state_str = ((dow != SATURDAY && dow != SUNDAY) && (localtime >= beginlocal && localtime < endlocal)) ? "açık" : "kapalı";
      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));

çıktı:

   // ======= Yerel Oturum Saatleri (CTimeZoneInfo Sınıfı) =======
   // Sydney : Çar, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Per, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [oturum kapalı]
   // Tokyo : Wed, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [oturum kapalı]
   // Frankfurt : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [oturum açık]
   // Londra : Çar, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Çar, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [oturum açık]
   // New York : Çar, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Per, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [oturum açık]
   // -----------------------------------
   // komisyoncu zamanı : 2024.02.28 15:32:30
   // komisyoncu zamanı : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]



B. CSessionHours Sınıfı

Amaç: Belirtilen konum için yerel işlem seansı saatlerine erişen sınıf.

CTimeZoneInfo sınıfından türetilmiştir.

Not: Yeni CSessionHours nesneleri için varsayılan seans saatleri yerel saatle sabah 8:00 - akşam 5:00 olarak ayarlanmıştır. Bu varsayılan değerler istenildiği gibi geçersiz kılınabilir.


CSessionHours Nesneleri ile Çalışma

Nesnenin nasıl kullanılacağına dair bir örnek görelim.

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

   CSessionHours tz(ZONE_ID_SYDNEY);
   tz.RefreshTime(); // zaman dilimi ve oturum bilgilerini doldurun

   //--- ebeveynden
   Print("Name()                : ", tz.Name());
   Print("TimeUTC()             : ", tz.TimeUTC());
   Print("TimeLocal()           : ", tz.TimeLocal());
   Print("ToString()            : ", tz.ToString());
   //--- sınıftan
   Print("BeginLocalTime()      : ", tz.BeginLocalTime());
   Print("EndLocalTime()        : ", tz.EndLocalTime());
   Print("CheckLocalSession()   : ", tz.CheckLocalSession());
   Print("SecRemainingSession() : ", tz.SecRemainingSession());
   Print("SecondsToString()     : ", CSessionHours::SecondsToString(tz.SecRemainingSession()));

çıktı:

   // ========== CSessionHours Nesneleri ile Çalışma ==========
   // Name() : Sydney
   // TimeUTC() : 2024.02.28 10:58:50
   // TimeLocal() : 2024.02.28 21:58:50
   // ToString() : Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST)
   // BeginLocalTime() : 2024.02.28 08:00:00
   // EndLocalTime() : 2024.02.28 17:00:00
   // CheckLocalSession() : false
   // SecRemainingSession() : 0
   // SecondsToString() : 00:00:00


Yerel Oturum Saatleri

CSessionHours daha az kodla daha fazla işlevsellik sağlar. CSessionHours Sınıfını kullanarak tüm zaman dilimlerinde Forex seans saatlerini nasıl aldığımızı ve bunları broker saatine nasıl dönüştürdüğümüzü gösteren bir örnek görelim. Broker saatine dönüştürmenin isteğe bağlı bir adım olduğunu ve her oturumun başlangıç ve bitiş saatlerini kontrol etmek için gerekli olmadığını unutmayın.

   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();

      //--- varsayılan oturum saatleri yerel saatle sabah 8:00 - akşam 5:00 olarak ayarlanmıştır
      datetime beginlocal = tz.BeginLocalTime();
      datetime endlocal   = tz.EndLocalTime();

      //--- broker zamanına dönüştürme
      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));

çıktı:

   // ======= Yerel Oturum Saatleri (CSessionHours Sınıfı) =======
   // Sydney : Çar, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Per, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [oturum kapalı]
   // Tokyo : Wed, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [oturum kapalı]
   // Frankfurt : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [oturum açık, 02:27:29'da sona eriyor]
   // Londra : Çar, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Çar, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [oturum açık, 03:27:29'da sona eriyor]
   // New York : Çar, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Per, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [oturum açık, 08:27:29'da sona eriyor]
   // -----------------------------------
   // komisyoncu zamanı : 2024.02.28 15:32:30
   // komisyoncu zamanı : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]
   // Fx kapanışı : Sat, 2024.03.02 00:00:00 GMT+2 [FXOpen-MT5]
   // kapanış : 203249 sn = 2d 08:27:29


Varsayılan yerel oturum saatleri nasıl geçersiz kılınır?

CSessionHours Sınıfında varsayılan oturum saatlerini nasıl geçersiz kılabileceğimizi göstermek için bir örnek görelim.

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

   CSessionHours frankfurt(ZONE_ID_FRANKFURT);

   // varsayılan oturum zamanlarını değiştir
   frankfurt.BeginLocalTime(9, 0);
   frankfurt.EndLocalTime(19, 0);

   frankfurt.RefreshTime(); // yeni oturum saatlerini doldurun

   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());

çıktı:

   // =========== Varsayılan oturum saatlerini geçersiz kılın ===========
   // yeni oturum saatleri : 2024.02.28 Çarşamba 09:00:00 GMT+1 [Frankfurt] | 2024.02.28 Çarşamba 19:00:00 GMT+1 [Frankfurt]
   // geçerli yerel saat : Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt]


Hafta Sonu Kapanış Pozisyonları Nasıl Kontrol Edilir?

SecRemainingForex() statik yöntemi, Forex piyasasının bu hafta için kapanmasına kadar kalan süreyi saniye cinsinden döndürür. Bu yöntem, kapanış koşulunu tekrar tekrar kontrol etmek için OnTick() olay işleyicisinden(veya hafta sonundan hemen önce hiçbir tik gelmemesi durumunda OnTimer( ) 'dan daha iyi ) çağrılmalıdır. Hafta sonunda kapanış pozisyonlarını nasıl kontrol edebileceğimizi gösteren bir örnek görelim.

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

   int InpHours   = 2;   // Hafta sonundan saatler önce
   int InpMinutes = 30;  // Hafta sonundan dakikalar önce

   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));

   // kalan sürenin hedefe ulaşıp ulaşmadığını kontrol edin
   if(sec <= InpHours * 3600 + InpMinutes * 60)
     {
      // CloseAll();
     }

Alternatif olarak, önceki koşul mutlak zamanlar kullanılarak kontrol edilebilir:

   // broker'ın zamanının hedefe ulaştığını kontrol edin
   if(TimeTradeServer() >= CSessionHours::ForexCloseTime() - (InpHours * 3600 + InpMinutes * 60))
     {
      // CloseAll();
     }

çıktı:

   // ======= Hafta Sonu Kapanan Pozisyonlar İçin Kontrol Edin =======
   // Hafta sonuna kalan süre : 3d 03:32:27
   // Kalan süre 02:30:00 veya daha az olursa tümünü kapatın.




Hafta Sonu - Broker'ın Saat Dilimi ve DST Programı

Forex piyasası Pazar günü New York saatiyle 17:00'de açılır (kışın GMT-5 ve yazın GMT-4) ve Cuma günü aynı saatte kapanır. NYC'deki açılış saati kışın Güneş , 10:00 PM UTC 'ye (ve yazın Güneş, 09:00 PM UTC'ye) karşılık gelir. Forex Cuma günü, kışın 10:00 UTC' de (ve yazın 09:00 UTC'de) kapanır. Altın ve gümüş spot piyasası genellikle bir saat sonra başlar. link

Her forex brokerinin kendi saat dilimi ve sunucu saati vardır. Bu nedenle, işlem haftasının başlangıcı (H1 mumları) brokerler arasında değişkendir ve San Francisco'daki (GMT-8) brokerler için Sun, 02:00 PM sunucu saatinden Sidney'deki (GMT + 11) brokerler için Pzt, 09:00 AM sunucu saatine kadar değişebilir. İşlem haftasının sonu daCuma, 02:00 PM sunucu saatinden,Cumartesi, 09:00 AM sunucu saatine kadar değişir.

Her broker kendi Yaz saati uygulamasını (DST) seçmekte özgürdür. Ve DST'nin o saat dilimi için aynı olması gerekmez. Bazen AB saat dilimi ve AB DST yerine ABD DST kullanarak karıştırırlar. ABD programını takip etmeyen brokerlar için, haftanın başlangıcı (ve sonu) için sunucu saati yıl boyunca aynı broker için +/- bir saat değişir. ForexCloseTime() yöntemi, NYC'de Cuma günü saat 17: 00'deki kapanış saatini broker saatine dönüştürerek, zaman sapmalarını ve DST'yi dikkate alarak bu brokerlar arası ve içi varyasyonları ele alır ve böylece doğru sonuçlar sağlar.

Bu nedenle +2 (ve ABD programında yaz aylarında +3) saat dilimi kullanmak, haftada beş D1 mumu olduğu anlamına gelir. Yıl boyunca Cumartesi ve Pazar günleri mum yoktur. Basitçe, bu sunuculardaki zaman her zaman New York'tan 7 saat ileridedir ve NY+7 olarak gösterilir. Şimdiye kadar bu en yaygın ayardır, ancak daha az yaygın olan birçok varyasyon vardır.



Örnek gösterge TestIndi.mq5


iForexSessions - MetaTrader 5 için gösterge

Forex Piyasası Oturumlarında Öne Çıkanlar

Buradan alın https://www.mql5.com/tr/code/48842


Bağlantılar

Dünya saati: https: //www.timeanddate.com/worldclock/

Saat dilimi dönüştürücü: https: //www.timeanddate.com/worldclock/converter-classic.html


Güncellemeler:

2024.03.01 - v.1.40 : CTimeZoneInfo sınıfındaki (test sırasında kullanılan) gereksiz kod kaldırıldı, CSessionHours sınıfına daha fazla yöntem eklendi, TestIndi.mq5 yeni değişiklikleri yansıtacak şekilde güncellendi.

2024.03.03 - v.1.45 : "Yerel Oturum Saatleri ile Çalışma - CTimeZoneInfo Sınıfı" için örnek kod güncellendi.

2024.03.08 - v.1.50 : CTimeZoneInfo sınıfına iki dahili yöntem HistoryBrokerOffset ve FirstBarOfWeek eklendi. Geçmişteki sunucu zamanının işlenmesi (UTC ofseti, metin biçimlendirme, dönüşümler, vb.).

2024.03.15 - v.1.56 : Sydney'deki oturum saatlerinin yıl boyunca nasıl dalgalandığını göstermek için "SydneySession_Script.mq5" komut dosyası eklendi.

2024.03.30 - v.1.65 : Broker GMT ofseti düzeltildi. Şu anda kütüphane, test ettiğim tüm brokerlerde en doğru başlangıç zamanlarına sahip olduğu için H1 çubuklarını yalnızca GOLD grafiğinde tarıyor.

2024.04.01 - v.1.67 : İşlem haftasının ilk saatinde komisyoncu GMT ofsetinin hesaplanmasındaki olası sorun düzeltildi.

2024.04.03 - v.1.70 : Daha hızlı erişim için (örneğin göstergelerden) broker GMT ofsetlerinin bir hash haritasına önbelleğe alınması. Aracı ofset önbelleği, işlem haftası başına bir giriş içerecektir.

2024.04.08 - v.1.72 : Kütüphanenin performansı en az 2-3 kat artırıldı. Artık GetNthSunday yöntemi içinde StringToTime yerine StructToTime kullanılıyor.

2024.04.09 - v.1.75 : GMT+0 brokerlerinde Noel tatili sırasında broker GMT ofsetinin hesaplanmasındaki olası sorun düzeltildi.

2024.04.11 - v.1.77 : GetDaylightSwitchTimes yönteminin hızlandırılması. Artık mevcut yıl için anahtar zamanlarını ezberlemek için statik bir dizi kullanılıyor.

2024.04.12 - v.1.80 : Altın ticareti sağlamayan brokerlarda broker GMT ofsetinin hesaplanmasındaki sorun giderildi.

2024.04.15 - v.1.82 : CTimeZoneInfo sınıfına, yerleşik özel saat dilimini belirli bir ad, GMT ofseti ve DST tanımlayıcısıyla yapılandırmak için kullanabileceğiniz SetCustomTimeZone yöntemi eklendi. Özel saat dilimine ZONE_ID_CUSTOM aracılığıyla erişilebilir.

2024.04.16 - v.1.85 : GetNthSunday dahili yöntemi daha optimize edilmiş GetMonthTime yöntemiyle değiştirildi.

2024.04.17 - v.1.87 : TimeYear dahili yöntemi daha optimize edilmiş GetYear yöntemiyle değiştirildi.

2024.04.18 - v.1.88 : Tarih bileşenlerinden (yıl, ay ve gün) datetime değerleri oluşturmak için CreateDateTime dahili yöntemi eklendi. Bu, StructToTime işlevini çağırmaktan 100-120 kat daha hızlıdır.

2024.10.21 - v.1.90 : EURUSD sembolüne geri dönüş ile GOLD sembolünün algılanması iyileştirildi.

2024.10.22 - v.1.93 : Canlı ticarette hafta sonu boyunca sunucunun GMT ofsetinin daha hızlı belirlenmesi.

2024.10.26 - v.1.95 : İki yeni statik yöntem eklendi: TimeGMTOffset() ve TimeDaylightSavings(). HistoryBrokerOffset() yöntemi TimeServerGMTOffset() olarak yeniden adlandırıldı.

2024.10.28 - v.1.97 : Makro gövdesi içindeki parametrelerin çift değerlendirilmesini önlemek için zamanla ilgili tüm makrolar fonksiyonlara dönüştürüldü. Diğer satırlarda daha fazla kod temizliği.

2024.10.30 - v.1.98 : Bazı brokerlarda XAUEUR tekliflerinden GMT ofsetinin yanlış tahmin edilmesi sorunu düzeltildi.

2024.11.01 - v.1.99 : Sunucunun TZ/DST tahmini için Altın sembolünün varsayılan yüklemesini kapatma seçeneği eklendi. Bunun yerine mevcut grafiğin sembolünü kullanmak için CTimeZoneInfo:: SetUsingGoldSymbol() işlevini 'false' ile çağırın.

2024.11.13 - v.2.00 : Çevrimiçi sunucu tz/dst ve strateji stratejisinde iyileştirilmiş tahmin (TimeGMT kütüphanesi artık gerekli değildir). Kurucu yer ve zaman parametrelerini kabul eder. Datetime tipindeki verilerle çalışmak için yeni public yöntemler. Geliştirilmiş hata işleme ve hata ayıklama desteği.

2024.11.14 - v.2.02 : Sunucu zaman dilimi nesnesi tarafından XAUUSD,H1 tırnak geçmişine erişmeye çalışırken ERR_HISTORY_NOT_FOUND (4401) hatası düzeltildi.

2024.11.17 - v.2.03 : Küçük hata düzeltmeleri.

2024.11.23 - v.2.04 : Küçük iyileştirmeler ve hata düzeltmeleri.

2024.12.05 - v.2.05 : Yeni statik yöntem DaylightSavingsSupported(placeId) eklendi.

2024.12.12 - v.2.10 : HistoryServerGMTOffset() ve HistoryServerDaylightSavings() fonksiyonlarının performansı iyileştirildi ve diğer küçük kod değişiklikleri yapıldı.

2024.12.14 - v.2.11 : FindSymbol() fonksiyonunun performansı iyileştirildi.

2024.12.17 - v.2.12 : HistoryServerGMTOffset() ve HistoryServerDaylightSavings() fonksiyonlarında daha fazla optimizasyon.

2024.12.24 - v.2.13 : HistoryServerGMTOffset() ve HistoryServerDaylightSavings() fonksiyonlarındaki olası sorun düzeltildi.

2025.01.12 - v.2.15 : HistoryServerDaylightSavings() fonksiyonunda strateji test cihazında yüklenen geçmişten daha önceki teklif geçmişini arama sorunu düzeltildi.

2025.10.13 - v.2.17 : Küçük iyileştirmeler ve hata düzeltmeleri.


MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal kod: https://www.mql5.com/en/code/48419

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

MT5 için hafif CVD (Kümülatif Hacim Deltası) - M1 tabanlı, isteğe bağlı sıfırlamalarla mum olarak alış / satış baskısını gösterir.

CFastFile - bayt dizisi ile dosya olarak çalışmak için sınıf CFastFile - bayt dizisi ile dosya olarak çalışmak için sınıf

CFastFile sınıfı, verilerin disk üzerindeki fiziksel bir dosyaya ara yazma ihtiyacını ortadan kaldırır. Bu, verilerle çalışırken önemli bir hızlanma elde etmenizi sağlar.

MA-Env MA-Env

Hareketli Ortalama Zarfları.

İstatistiksel fonksiyonlar statistics.mqh İstatistiksel fonksiyonlar statistics.mqh

Ortalama, varyans, çarpıklık, fazlalık, kovaryans, korelasyon vb. hesaplama gibi istatistiksel fonksiyonları içeren bir kütüphane.