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

MQL5 / Błędy

retcode 10022

10022 — TRADE_RETCODE_INVALID_EXPIRATION

Tryb wygasania musi być obsługiwany przez instrument, a data podawana w czasie serwera. Dwa warunki, z których każdy zawodzi osobno.

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

CTrade::OrderSend: buy limit 0.10 EURUSD at 1.09100 [invalid expiration]

Co ten kod znaczy

Pola type_time i expiration w zapytaniu nie tworzą kombinacji, którą serwer przyjmie. Powodów jest kilka i warto je rozdzielić, bo objaw jest ten sam.

Cztery tryby wygasania

TrybZnaczenieCzy wymaga daty
ORDER_TIME_GTCważne do odwołanianie
ORDER_TIME_DAYważne do końca dnia handlowegonie
ORDER_TIME_SPECIFIEDdo podanej daty i godzinytak
ORDER_TIME_SPECIFIED_DAYdo końca podanego dniatak

Nie każdy instrument obsługuje wszystkie. Dostępne tryby zwraca maska SYMBOL_EXPIRATION_MODE — i sprawdza się ją iloczynem bitowym, tak jak maskę wypełnienia.

Dobór trybu obsługiwanego przez instrument
bool UstawWygasanie(MqlTradeRequest &zapytanie, const datetime kiedy)
  {
   long tryby = SymbolInfoInteger(zapytanie.symbol, SYMBOL_EXPIRATION_MODE);

   if(kiedy > 0 &&
      (tryby & SYMBOL_EXPIRATION_SPECIFIED) == SYMBOL_EXPIRATION_SPECIFIED)
     {
      zapytanie.type_time  = ORDER_TIME_SPECIFIED;
      zapytanie.expiration = kiedy;
      return true;
     }

   if((tryby & SYMBOL_EXPIRATION_DAY) == SYMBOL_EXPIRATION_DAY)
     {
      zapytanie.type_time = ORDER_TIME_DAY;
      return true;
     }

   //--- do odwolania jest dostepne praktycznie zawsze
   zapytanie.type_time = ORDER_TIME_GTC;
   return true;
  }

Data jest w czasie serwera

To jest przyczyna, której nikt nie podejrzewa. expiration interpretowane jest w czasie serwera brokera, a nie twojego komputera. Wyliczenie „za godzinę" na podstawie TimeLocal() przy różnicy stref wynoszącej dwie godziny daje datę w przeszłości — a data z przeszłości to nieprawidłowa data wygaśnięcia.

Zawsze od czasu serwera
datetime kiedy = TimeCurrent() + 3600;    // godzina od teraz, czas serwera

Ta sama pomyłka w drugą stronę daje zlecenie żyjące dłużej, niż zakładałeś — cichsze i przez to gorsze.

Zbyt bliska data też jest nieprawidłowa

Część serwerów wymaga, żeby zlecenie żyło co najmniej kilka minut. Wygaśnięcie ustawione na dziesięć sekund od teraz zostanie odrzucone, mimo że formalnie leży w przyszłości. Bezpieczny margines to kilkanaście minut, a przy strategiach potrzebujących krótszego życia zlecenia właściwszym rozwiązaniem jest tryb do odwołania i samodzielne usuwanie zlecenia przez TRADE_ACTION_REMOVE.

Powiązane