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
| Tryb | Znaczenie | Czy wymaga daty |
|---|---|---|
ORDER_TIME_GTC | ważne do odwołania | nie |
ORDER_TIME_DAY | ważne do końca dnia handlowego | nie |
ORDER_TIME_SPECIFIED | do podanej daty i godziny | tak |
ORDER_TIME_SPECIFIED_DAY | do końca podanego dnia | tak |
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.
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.
datetime kiedy = TimeCurrent() + 3600; // godzina od teraz, czas serweraTa 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.