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

MQL5 / Funkcje

OrderSend

Wysyła zapytanie handlowe. Zwrócenie true nie znaczy, że zlecenie zostało wykonane — o tym mówi dopiero pole retcode.

bool OrderSend(MqlTradeRequest &zapytanie, MqlTradeResult &wynik);

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

Najważniejsza rzecz na tej stronie

OrderSend zwraca true, gdy zapytanie zostało poprawnie przekazane do serwera. Nie znaczy to, że zlecenie zostało wykonane. O tym mówi pole wynik.retcode.

Poprawna kontrola wyniku
if(!OrderSend(zapytanie, wynik))
  {
   PrintFormat("Zapytanie nie wyszło: błąd %d, retcode %d",
               GetLastError(), wynik.retcode);
   return false;
  }

if(wynik.retcode != TRADE_RETCODE_DONE && wynik.retcode != TRADE_RETCODE_PLACED)
  {
   PrintFormat("Serwer odrzucił: retcode %d, %s", wynik.retcode, wynik.comment);
   return false;
  }

PrintFormat("Wykonane. Bilet: %I64u, cena %.5f", wynik.order, wynik.price);

TRADE_RETCODE_DONE (10009) to wykonanie. TRADE_RETCODE_PLACED (10008) oznacza, że zlecenie oczekujące zostało wystawione — też sukces.

Pola struktury zapytania

PoleKiedy wymaganeUwagi
actionzawszeTRADE_ACTION_DEAL, _PENDING, _SLTP, _MODIFY, _REMOVE
symboloperacje na instrumencienie zakładaj _Symbol w kodzie wielosymbolowym
volumeotwarciewielokrotność SYMBOL_VOLUME_STEP
typeotwarcieORDER_TYPE_BUY, ORDER_TYPE_SELL_LIMIT itd.
priceotwarcie, modyfikacjazaokrąglona do SYMBOL_DIGITS
sl, tpopcjonalniezero znaczy brak
deviationzlecenia rynkowedopuszczalny poślizg w punktach
type_fillingzlecenia rynkowemusi być obsługiwany przez instrument
positionTRADE_ACTION_SLTPbilet pozycji, nie zlecenia
magicopcjonalnieidentyfikator eksperta

Kompletne otwarcie pozycji

Zlecenie rynkowe od zera
bool KupRynkowo(const string symbol, const double wolumen,
                const double sl, const double tp, const ulong magic)
  {
   MqlTradeRequest zapytanie = {};
   MqlTradeResult  wynik = {};
   MqlTick tick;

   if(!SymbolInfoTick(symbol, tick))
      return false;

   int cyfry = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);

   zapytanie.action       = TRADE_ACTION_DEAL;
   zapytanie.symbol       = symbol;
   zapytanie.volume       = wolumen;
   zapytanie.type         = ORDER_TYPE_BUY;
   zapytanie.price        = NormalizeDouble(tick.ask, cyfry);
   zapytanie.sl           = (sl > 0) ? NormalizeDouble(sl, cyfry) : 0.0;
   zapytanie.tp           = (tp > 0) ? NormalizeDouble(tp, cyfry) : 0.0;
   zapytanie.deviation    = 20;
   zapytanie.magic        = magic;
   zapytanie.type_filling = ORDER_FILLING_IOC;

   if(!OrderSend(zapytanie, wynik))
     {
      PrintFormat("Błąd %d, retcode %d", GetLastError(), wynik.retcode);
      return false;
     }

   return (wynik.retcode == TRADE_RETCODE_DONE);
  }

Tryb wypełnienia wpisany na sztywno jak wyżej działa u części brokerów. Sposób na dobranie go automatycznie opisaliśmy przy błędzie 10030.

OrderCheck zamiast zgadywania

OrderCheck przepuszcza zapytanie przez tę samą walidację co serwer, ale bez wysyłania. Podczas pisania kodu jest znacznie szybszą drogą do przyczyny niż czytanie dziennika po fakcie.

Powiązane