Meridian Session Clock
- Kütüphaneler
- Sürüm: 1.0
- Etkinleştirmeler: 5
Bir MQL4 zaman kütüphanesi: UTC ile 12 saat dilimi arasında yaz saatine göre doğru dönüşümler, brokerınızın sunucu saatinin bir modeli (fiyat geçmişinden otomatik algılanır), Sydney, Tokyo, London ve New York seansları ile kendi seanslarınız; açık durumu, başlangıç ve bitiş saatleri ve OHLC aralığı, FX işlem günü ve hafta sonu. TimeGMT() işlevinden farklı olarak Strateji Test Cihazında canlı ile aynı sonuçları verir. Asla işlem açmaz, çizim yapmaz ve dosya yazmaz. Derlenmiş Meridian_Session_Clock.ex4 dosyasını alırsınız; bu sayfa eksiksiz API başvurusudur.
Hızlı başlangıç
- Meridian_Session_Clock.ex4 dosyasını MQL4/Libraries klasörüne kopyalayın (Dosya > Veri klasörünü aç).
- Aşağıdaki #import bloğunu EA, gösterge veya script dosyanıza yapıştırın.
- OnInit: MSC_DetectBroker("EURUSD", 104, base, conf, used), sunucu saatini biliyorsanız MSC_SetBroker(MSC_US_DST, 120).
- Sunucu saatlerini kullanın (TimeCurrent(), Time[i]): MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()).
- Doğrulama: aşağıdaki örneği Strateji Test Cihazında çalıştırın; günlük her barda algılanan modeli ve London saatlerini yazar.
İçe aktarma bildirimi (kopyalamaya hazır)
#import "Meridian_Session_Clock.ex4"
int MSC_ZoneOffset(int zone, datetime utc);
bool MSC_IsDST(int zone, datetime utc);
datetime MSC_ToZone(datetime utc, int zone);
datetime MSC_FromZone(datetime local, int zone);
datetime MSC_NextChange(int zone, datetime utc);
string MSC_ZoneName(int zone);
bool MSC_SetBroker(int model, int base_minutes);
int MSC_DetectBroker(string symbol, int weeks, int &base_minutes, double &confidence, int &weeks_used);
int MSC_BrokerOffset(datetime utc);
datetime MSC_ServerToUTC(datetime server_time);
datetime MSC_UTCToServer(datetime utc);
int MSC_SessionAdd(int zone, int start_minute, int end_minute, int days_mask);
void MSC_SessionClear();
string MSC_SessionName(int session);
bool MSC_SessionIsOpen(int session, datetime server_time);
datetime MSC_SessionStart(int session, datetime server_time, int index);
datetime MSC_SessionEnd(int session, datetime server_time, int index);
int MSC_SessionRange(string symbol, int timeframe, int session, datetime server_time, int index, double &result[]);
datetime MSC_TradingDayStart(datetime server_time);
bool MSC_IsWeekend(datetime server_time);
int MSC_LastError();
string MSC_ErrorText(int code);
#import
enum MSC_ZONE { MSC_UTC, MSC_LONDON, MSC_FRANKFURT, MSC_ATHENS, MSC_MOSCOW, MSC_DUBAI, MSC_SINGAPORE, MSC_TOKYO,
MSC_SYDNEY, MSC_WELLINGTON, MSC_NEW_YORK, MSC_CHICAGO };
enum MSC_MODEL { MSC_FIXED, MSC_US_DST, MSC_EU_DST };
enum MSC_SESSION { MSC_SYDNEY_SESSION, MSC_TOKYO_SESSION, MSC_LONDON_SESSION, MSC_NEW_YORK_SESSION }; Kavramlar
- Üç tür zaman: utc; server (broker sunucu saati: TimeCurrent, bar saatleri); local (bir dilimdeki duvar saati).
- Dilimler 0-11: UTC, London, Frankfurt, Athens, Moscow, Dubai, Singapore (Hong Kong, Şanghay da), Tokyo, Sydney, Wellington, New York, Chicago. Yaz saati, ABD 2007, Sydney 2000 / 2006 / 2008, Auckland 2007 / 2008 ve Moscow 2011 / 2014 değişiklikleri dahil, 2000'den beri her dilimin yasasını izler. Desteklenen 2000-2099; diğer tarihler aynı kurallarla hesaplanır ve -2 işaretler.
- İleri alma ile atlanan veya geri alma ile tekrarlanan yerel saat, değişiklikten önce geçerli olan farkla okunur (Mart değişiklik günü New York 02:30 = 07:30 UTC; Kasım günü 01:30 = 05:30 UTC, ilk görülme).
- Broker saati = UTC + fark. Modeller: 0 FIXED (tüm yıl taban), 1 US DST (ABD yazında taban + 60: "New York close" brokerları, GMT+2 / GMT+3), 2 EU DST (Avrupa yazında taban + 60). Varsayılan 1, taban 120.
- Seanslar bir dilimin yerel saatinde, başlangıç gününe göre Pazartesi-Cuma tanımlanır: 0 SYDNEY 07:00-16:00 Sydney, 1 TOKYO 09:00-18:00 Tokyo, 2 LONDON 08:00-17:00 London, 3 NEW YORK 08:00-17:00 New York; özel id 4-15. Bir örnek başlangıçtan (dahil) bitişe (hariç) sürer. index 0 = verilen saatte veya önce başlamış son örnek (açık veya bitmiş), -1 bir önceki, +1 bir sonraki; -260 ile 260 arası.
API başvurusu
Tüm fonksiyonlar MSC_LastError değerini günceller. Hatalı dilim veya seans id'si -1 ile birlikte 0, false, "UNKNOWN" veya -1 verir.
MSC_ZoneOffset, MSC_IsDST, MSC_ToZone, MSC_FromZone
utc anında dilimin UTC'ye farkı (dakika); yaz saatinin geçerli olup olmadığı (Moscow 2011-2014, kalıcı UTC+4, yaz saati sayılmaz); utc + fark olarak yerel saat; yukarıdaki kuralla yerel saatten UTC'ye.
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange ve MSC_ZoneName
utc'den sonraki ilk fark değişikliği (UTC olarak), üç yıl içinde yoksa 0 (UTC, Dubai, Singapore, Tokyo, 2014 sonrası Moscow). Bir dilimin adı, yukarıdaki listedeki gibi.
MSC_SetBroker
model 0-2, base_minutes -720 ile 840 arası, 15'lik adımlarla. Aksi halde false ve -1.
MSC_DetectBroker
symbol ("" = grafik sembolü) için her hafta sonu boşluğundan (36 saat veya fazla) sonraki ilk H1 barını, en yeniden geriye, weeks kadar (4-520, 0 = 104) okur. FX pazar günü New York saatiyle 17:00'de açılır, böylece her hafta bir fark verir; en çok haftaya uyan model ve taban kazanır (eşitlikte: US DST, sonra EU DST, sonra FIXED). Modeli döndürür ve haftaların en az %60'ı uyarsa uygular; aksi halde -1 ile -5 NOT DETECTED (base_minutes ve confidence yine doldurulur). H1 geçmişi yoksa -3 NO DATA. 24/5 işlem gören bir ana FX paritesi kullanın: metaller ve endeksler pazar günü daha geç açılır ve bir saat fazla okur (testlerde XAUUSD 120 yerine 180 taban verdi). Saat değişikliklerinin dahil olması için 52 hafta veya daha fazlasını kullanın; tatil haftaları güveni düşürür. Strateji Test Cihazında yalnızca test cihazının yüklediği geçmiş görünür (weeks_used kaç hafta okunduğunu söyler).
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset, MSC_ServerToUTC, MSC_UTCToServer
utc anında sunucu farkı (dakika); sunucu saatinden UTC'ye (değişiklik çevresindeki saat için yukarıdaki kural); UTC'den sunucu saatine.
MSC_SessionAdd, MSC_SessionClear, MSC_SessionName
Seans ekler: zone, yerel gece yarısından sonra dakika olarak başlangıç ve bitiş (0-1439, farklı; bitiş başlangıçtan küçükse gece seansı), başlangıç günlerinin days_mask değeri (bit 0 Pazar ... bit 6 Cumartesi, 62 = Pazartesi-Cuma, 1-127). 4-15 arası id döndürür, ya da -1 ile birlikte -1 veya -4 SESSION LIMIT. MSC_SessionClear özel seansları siler (id'ler 4'ten itibaren yeniden kullanılır). Adlar: SYDNEY, TOKYO, LONDON, NEW YORK, CUSTOM n.
int fra = MSC_SessionAdd(MSC_FRANKFURT, 7 * 60, 15 * 60 + 30, 62); // 07:00-15:30 Frankfurt
MSC_SessionIsOpen, MSC_SessionStart, MSC_SessionEnd
Örnek 0'ın server_time'ı içerip içermediği; index örneğinin başlangıç veya bitişinin sunucu saati. Hatada 0.
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
index örneğinin OHLC değerleri; symbol ("" = grafik) için timeframe (0 = grafik; M1, M5, M15, M30 veya H1) üzerinde açılış saati örneğin içinde kalan barlardan. result[] 7 değer alır: 0 açılış, 1 en yüksek, 2 en düşük, 3 kapanış, 4 en yüksekteki ilk barın saati, 5 en düşükteki ilk barın saati, 6 bar sayısı. Bar sayısını döndürür; içeride bar yoksa 0 ile -3 NO DATA; hatalı timeframe, seans veya index için -1. Süren bir örnek şimdiye kadarki barları kullanır.
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart ve MSC_IsWeekend
server_time anında veya öncesindeki son New York 17:00'nin sunucu saati (FX gününün başlangıcı). Hafta sonu = New York saatiyle Cuma 17:00'den Pazar 17:00'ye.
MSC_LastError ve MSC_ErrorText
Son çağrının kodu; metin: 0 OK, -1 INVALID PARAMETER, -2 OUT OF RANGE, -3 NO DATA, -4 SESSION LIMIT, -5 NOT DETECTED, aksi halde UNKNOWN.
Çalışan entegrasyon örneği
Bir Expert Advisor; önce yukarıdaki içe aktarma bloğunu ve enum satırlarını yapıştırın.
datetime last = 0;
int OnInit()
{
int base, used; double conf;
int m = MSC_DetectBroker("EURUSD", 104, base, conf, used);
if(m < 0) MSC_SetBroker(MSC_US_DST, 120);
PrintFormat("model %d base %d conf %.2f weeks %d: %s", m, base, conf, used, MSC_ErrorText(MSC_LastError()));
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(Time[0] == last) return;
last = Time[0];
datetime now = TimeCurrent();
PrintFormat("London %s - %s server, open %d, FX day since %s, weekend %d",
TimeToString(MSC_SessionStart(MSC_LONDON_SESSION, now, 0)), TimeToString(MSC_SessionEnd(MSC_LONDON_SESSION, now, 0)),
MSC_SessionIsOpen(MSC_LONDON_SESSION, now), TimeToString(MSC_TradingDayStart(now)), MSC_IsWeekend(now));
} Mimari ve notlar
- Saf hesaplama: kurallar tablodan aranmaz, hesaplanır; bu yüzden hiçbir şey indirilmez. Broker modeli ve seans tablosu kütüphaneyi içe aktaran her program için ayrı tutulur.
- MetaTrader 4, her sembol ve zaman dilimi; EA'lar, göstergeler, scriptler. Strateji Test Cihazında ve optimizasyonda güvenlidir: DLL, dosya, web isteği, grafik nesnesi, zamanlayıcı veya global değişken yok. Yalnızca MSC_DetectBroker ve MSC_SessionRange bar okur.
- Sınırlar: 16 seans (4 yerleşik), örnek index -260 ile 260 arası, yıllar 2000-2099.
- Tipik kurulumlar. Seans filtresi: yalnızca MSC_SessionIsOpen(MSC_LONDON_SESSION, now) iken işlem yapın. Asya aralığı kırılımı: London açılışında MSC_TOKYO_SESSION için MSC_SessionRange, index 0 (Tokyo o sırada hâlâ açık). Günlük mantık: MSC_TradingDayStart anında sıfırlayın. Backtestler: OnInit içinde MSC_DetectBroker veya MSC_SetBroker çağırın, asla TimeGMT() kullanmayın.
- Ekran görüntüleri ve video bu kütüphane üzerine kurulmuş bir tanıtım EA'sını gösterir; satın alıma dahil değildir.
Risk uyarısı
Seans saatleri piyasaların genellikle ne zaman aktif olduğunu anlatır, fiyatların nasıl hareket edeceğini değil. Brokerınızın tatil takvimini kontrol edin; önce bir demo hesapta test edin.
