Fan sayfamıza katılın
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
- Görüntülemeler:
- 33
- Derecelendirme:
- Yayınlandı:
-
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.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)
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 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
Hareketli Ortalama Zarfları.
İstatistiksel fonksiyonlar statistics.mqh
Ortalama, varyans, çarpıklık, fazlalık, kovaryans, korelasyon vb. hesaplama gibi istatistiksel fonksiyonları içeren bir kütüphane.
