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.
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
| Pole | Kiedy wymagane | Uwagi |
|---|---|---|
action | zawsze | TRADE_ACTION_DEAL, _PENDING, _SLTP, _MODIFY, _REMOVE |
symbol | operacje na instrumencie | nie zakładaj _Symbol w kodzie wielosymbolowym |
volume | otwarcie | wielokrotność SYMBOL_VOLUME_STEP |
type | otwarcie | ORDER_TYPE_BUY, ORDER_TYPE_SELL_LIMIT itd. |
price | otwarcie, modyfikacja | zaokrąglona do SYMBOL_DIGITS |
sl, tp | opcjonalnie | zero znaczy brak |
deviation | zlecenia rynkowe | dopuszczalny poślizg w punktach |
type_filling | zlecenia rynkowe | musi być obsługiwany przez instrument |
position | TRADE_ACTION_SLTP | bilet pozycji, nie zlecenia |
magic | opcjonalnie | identyfikator eksperta |
Kompletne otwarcie pozycji
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.