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
| Funkcja | Co 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.
MqlDateTime czas;
TimeToStruct(TimeCurrent(), czas);
if(czas.hour >= 22)
ZamknijWszystko();Zamykanie
#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
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.