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

MQL5 / Przepisy

Zamknięcie wszystkich pozycji o zadanej godzinie

Filtr czasu oparty o czas serwera, nie o czas twojego komputera, z obsługą rachunków hedging i kontrolą wyniku każdej operacji.

3 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.

Zadanie brzmi prosto: o 22:00 zamknąć wszystko i nie otwierać nic do rana. Dwie rzeczy potrafią to popsuć — użycie niewłaściwego zegara i założenie, że zamknięcie zawsze się uda.

Który zegar

FunkcjaCo zwraca
TimeLocal()czas twojego komputera
TimeCurrent()czas ostatniego znanego ticku, czyli czas serwera
TimeTradeServer()bieżący czas serwera handlowego

Do filtrów sesyjnych właściwe jest TimeCurrent(). TimeLocal() daje wyniki zależne od strefy czasowej użytkownika i od tego, czy ma włączoną zmianę czasu — ekspert testowany w Warszawie zachowa się inaczej na serwerze w Londynie.

Rozbiór czasu na części
MqlDateTime czas;
TimeToStruct(TimeCurrent(), czas);

if(czas.hour >= 22)
   ZamknijWszystko();

Zamykanie

Zamknięcie wszystkich pozycji własnego eksperta
#include <Trade\Trade.mqh>
CTrade handel;

input ulong Magic = 12345;

int ZamknijWszystko()
  {
   int zamkniete = 0;

   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      ulong bilet = PositionGetTicket(i);
      if(bilet == 0 || !PositionSelectByTicket(bilet))
         continue;
      if(PositionGetInteger(POSITION_MAGIC) != (long)Magic)
         continue;

      handel.SetTypeFillingBySymbol(PositionGetString(POSITION_SYMBOL));

      if(handel.PositionClose(bilet))
         zamkniete++;
      else
         PrintFormat("Nie udało się zamknąć %I64u: retcode %d (%s)",
                     bilet, handel.ResultRetcode(), handel.ResultRetcodeDescription());
     }

   return zamkniete;
  }

Pętla w dół jest tu konieczna: zamknięcie pozycji zmienia indeksy pozostałych.

Kompletny filtr czasu

Blokada otwierania poza oknem handlu
input int GodzinaStartu = 8;
input int GodzinaKonca  = 22;

bool WolnoHandlowac()
  {
   MqlDateTime czas;
   TimeToStruct(TimeCurrent(), czas);

   if(czas.day_of_week == 0 || czas.day_of_week == 6)
      return false;                                  // weekend

   if(GodzinaStartu <= GodzinaKonca)
      return (czas.hour >= GodzinaStartu && czas.hour < GodzinaKonca);

   //--- okno przechodzące przez północ, np. od 22 do 6
   return (czas.hour >= GodzinaStartu || czas.hour < GodzinaKonca);
  }

void OnTick()
  {
   static int ostatniaGodzinaZamkniecia = -1;

   MqlDateTime czas;
   TimeToStruct(TimeCurrent(), czas);

   if(czas.hour >= GodzinaKonca && ostatniaGodzinaZamkniecia != czas.hour)
     {
      ZamknijWszystko();
      ostatniaGodzinaZamkniecia = czas.hour;
      return;
     }

   if(!WolnoHandlowac())
      return;

   //--- normalna logika wejść
  }

Zmienna ostatniaGodzinaZamkniecia zapobiega próbie zamykania przy każdym ticku po dwudziestej drugiej. Bez niej ekspert wysyła setki zapytań o zamknięcie nieistniejących pozycji.