retcode 10009
10009 — TRADE_RETCODE_DONE
Kod sukcesu, po którym trzeba jeszcze odczytać, co się faktycznie stało. Wykonanie potrafi różnić się od zamówienia ceną i wolumenem.
2 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
CTrade::OrderSend: market buy 0.10 EURUSD [done at 1.09327]Co ten kod znaczy
Serwer wykonał zapytanie. To jedyny kod, po którym można iść dalej — ale nie jedyny, po którym trzeba przestać czytać.
Wykonanie to nie to samo co zamówienie
Struktura wyniku zawiera to, co faktycznie się stało, a te liczby regularnie różnią się od tego, o co prosiłeś:
| Pole | Co zawiera |
|---|---|
wynik.order | numer zlecenia, które powstało |
wynik.deal | numer transakcji, czyli faktycznego wykonania |
wynik.volume | wolumen faktycznie wykonany |
wynik.price | cena faktycznego wykonania |
wynik.bid, wynik.ask | ceny rynkowe w chwili wykonania |
wynik.comment | komentarz serwera |
Różnica między ceną z zapytania a wynik.price to poślizg. Różnica między wolumenem z zapytania a wynik.volume to wykonanie częściowe — przy trybie IOC bywa zwracane właśnie z kodem 10009, a nie 10010.
Pomiar jakości wykonania
To jest jedyne wiarygodne źródło wiedzy o tym, ile naprawdę kosztuje twoje wejście na rynek. Backtest tego nie pokaże — tester nie modeluje poślizgów.
double PoslizgWPunktach(const MqlTradeRequest &zapytanie,
const MqlTradeResult &wynik)
{
double punkt = SymbolInfoDouble(zapytanie.symbol, SYMBOL_POINT);
if(punkt <= 0.0 || wynik.price <= 0.0 || zapytanie.price <= 0.0)
return 0.0;
//--- poslizg na niekorzysc jest dodatni niezaleznie od kierunku
double znak = (zapytanie.type == ORDER_TYPE_BUY) ? 1.0 : -1.0;
return znak * (wynik.price - zapytanie.price) / punkt;
}
void ZapiszWykonanie(const MqlTradeRequest &zapytanie,
const MqlTradeResult &wynik)
{
if(wynik.retcode != TRADE_RETCODE_DONE)
return;
PrintFormat("wykonanie | %s | zamowiono %.2f po %.5f | dostano %.2f po %.5f "
"| poslizg %.1f pkt | spread %.1f pkt",
zapytanie.symbol, zapytanie.volume, zapytanie.price,
wynik.volume, wynik.price,
PoslizgWPunktach(zapytanie, wynik),
(wynik.ask - wynik.bid) / SymbolInfoDouble(zapytanie.symbol, SYMBOL_POINT));
}Po miesiącu takich wpisów masz odpowiedź na pytanie, na które nie odpowie żaden raport z testu: ile średnio tracisz na samym wejściu i czy strata rośnie o określonych porach.
Sukces bywa też pod innym numerem
Sprawdzanie wyłącznie równości z 10009 odrzuci poprawnie wystawione zlecenie oczekujące, które wraca jako 10008. Warunek powinien przyjmować oba.
bool udane = (wynik.retcode == TRADE_RETCODE_DONE ||
wynik.retcode == TRADE_RETCODE_PLACED);