Przejdź do treści
MQL5 · MetaTrader 5 · po polsku
kod odczarowany

MQL5 / Funkcje

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.

Czy instrument handluje w tej chwili
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.

Wypisanie godzin sesji czytelnie
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.

Powiązane