SymbolInfoSessionTrade
Godziny handlu odczytane z instrumentu zamiast wpisane na sztywno. Jedyny sposób, żeby filtr czasowy działał na każdym instrumencie i u każdego brokera.
bool SymbolInfoSessionTrade(string symbol, ENUM_DAY_OF_WEEK dzien, uint numer, datetime &od, datetime &do);
2 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
Co zwraca
Prawdę, jeśli sesja o podanym numerze istnieje w danym dniu tygodnia, i wtedy wypełnia dwa ostatnie argumenty godzinami jej trwania. Fałsz oznacza, że sesji o tym numerze nie ma — i to jest sposób na przejście po wszystkich.
Bliźniacza SymbolInfoSessionQuote podaje godziny kwotowania, które bywają szersze niż godziny handlu.
Dlaczego to jest ważniejsze, niż się wydaje
Filtry czasowe pisze się zwykle przez wpisanie godzin na sztywno. Taki kod działa na jednym instrumencie u jednego brokera i przestaje wszędzie indziej, bo sesje różnią się między klasami instrumentów, a czas serwera nie jest czasem żadnej giełdy — opisaliśmy to przy iluzji czasu.
Instrument zna swoje godziny i chętnie je poda.
bool SesjaTrwa(const string symbol)
{
datetime teraz = TimeCurrent();
MqlDateTime czas;
TimeToStruct(teraz, czas);
//--- sekundy od poczatku doby
int sekundyDnia = czas.hour * 3600 + czas.min * 60 + czas.sec;
datetime od, doo;
for(uint numer = 0; ; numer++)
{
if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)czas.day_of_week,
numer, od, doo))
break; // nie ma wiecej sesji tego dnia
if(sekundyDnia >= (int)od && sekundyDnia < (int)doo)
return true;
}
return false;
}Wartości są liczone od północy
To jest szczegół, który psuje pierwsze podejście. Argumenty od i doo mają typ datetime, ale zawierają liczbę sekund od początku doby, a nie datę. Wypisanie ich przez TimeToString z pełną datą pokaże pierwszy stycznia 1970 roku i wygląda to jak błąd, którym nie jest.
PrintFormat("sesja %d: %s - %s", numer,
TimeToString(od, TIME_MINUTES),
TimeToString(doo, TIME_MINUTES));Przerwa w środku dnia to osobne sesje
Instrumenty giełdowe mają zwykle dwie sesje dziennie, rozdzielone przerwą. Kod sprawdzający wyłącznie sesję o numerze zero uzna, że w przerwie handel trwa — bo pierwsza sesja jeszcze się nie skończyła w jego rozumieniu.
Pętla po kolejnych numerach, aż funkcja zwróci fałsz, jest jedynym poprawnym sposobem. Liczba sesji nie jest stała i różni się między dniami tygodnia.