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

MQL5 / Błędy

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ś:

PoleCo zawiera
wynik.ordernumer zlecenia, które powstało
wynik.dealnumer transakcji, czyli faktycznego wykonania
wynik.volumewolumen faktycznie wykonany
wynik.pricecena faktycznego wykonania
wynik.bid, wynik.askceny rynkowe w chwili wykonania
wynik.commentkomentarz 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.

Zapis poślizgu przy każdym wykonaniu
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.

Oba kody sukcesu
bool udane = (wynik.retcode == TRADE_RETCODE_DONE ||
              wynik.retcode == TRADE_RETCODE_PLACED);

Powiązane