retcode 10004
10004 — TRADE_RETCODE_REQUOTE
Cena zmieniła się między wysłaniem zapytania a jego przetworzeniem. Typowe dla rachunków z wykonaniem natychmiastowym.
1 fragment kodu z tej strony przeszedł przez kompilator MetaEditor build 6090, 2026-08-05.
Co ten kod znaczy
Serwer dostał zapytanie z ceną, która w momencie przetwarzania już nie obowiązywała, i zaproponował nową. To nie jest błąd w kodzie — to normalna reakcja rynku, na którą kod musi być przygotowany.
Skąd się bierze
- rachunek z wykonaniem natychmiastowym (
SYMBOL_TRADE_EXECUTION_INSTANT) i zbyt małedeviation - wysyłanie zlecenia w chwili publikacji danych makro
- cena pobrana kilka linijek wcześniej i użyta po długich obliczeniach
Co z tym zrobić
Nowe ceny serwer zwraca w polach wynik.bid i wynik.ask. Powtórzenie zapytania z tymi cenami ma sens, ale wyłącznie z licznikiem prób:
for(int proba = 0; proba < 3; proba++)
{
MqlTick tick;
if(!SymbolInfoTick(_Symbol, tick))
break;
zapytanie.price = NormalizeDouble(tick.ask, _Digits);
if(OrderSend(zapytanie, wynik) && wynik.retcode == TRADE_RETCODE_DONE)
return true;
if(wynik.retcode != TRADE_RETCODE_REQUOTE &&
wynik.retcode != TRADE_RETCODE_PRICE_CHANGED)
break; // inny powód, powtarzanie nic nie da
}Pętla bez licznika prób przy rozchwianym rynku potrafi wysłać kilkaset zapytań w sekundę i skończyć się kodem 10024.
Zwiększenie deviation zmniejsza liczbę rekwotowań kosztem gorszej ceny wykonania. Wartość rzędu 20–30 punktów jest rozsądnym startem dla par walutowych.