OrderSend — z MQL4 na MQL5
W MQL4 dziesięć argumentów i zwracany bilet. W MQL5 struktura i kod zwrotny. Gotowe tłumaczenie linijka po linijce.
2 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
Stara postać
MQL4
int bilet = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3,
Bid - 200 * Point, Bid + 400 * Point,
"komentarz", 12345, 0, clrGreen);
if(bilet < 0)
Print("Błąd: ", GetLastError());Nowa postać
MQL5
MqlTradeRequest zapytanie = {};
MqlTradeResult wynik = {};
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
zapytanie.action = TRADE_ACTION_DEAL;
zapytanie.symbol = _Symbol;
zapytanie.volume = 0.1;
zapytanie.type = ORDER_TYPE_BUY;
zapytanie.price = NormalizeDouble(tick.ask, _Digits);
zapytanie.sl = NormalizeDouble(tick.bid - 200 * _Point, _Digits);
zapytanie.tp = NormalizeDouble(tick.bid + 400 * _Point, _Digits);
zapytanie.deviation = 3;
zapytanie.magic = 12345;
zapytanie.comment = "komentarz";
zapytanie.type_filling = ORDER_FILLING_IOC;
if(!OrderSend(zapytanie, wynik) || wynik.retcode != TRADE_RETCODE_DONE)
PrintFormat("Błąd %d, retcode %d", GetLastError(), wynik.retcode);Co się zmieniło naprawdę
| MQL4 | MQL5 |
|---|---|
OP_BUY | ORDER_TYPE_BUY |
| zwracany bilet zlecenia | wynik.order, wynik.deal |
bilet < 0 oznacza błąd | wynik.retcode opisuje wynik |
Ask, Bid jako zmienne | SymbolInfoTick albo SymbolInfoDouble |
| brak trybu wypełnienia | type_filling obowiązkowe |
| kolor strzałki w argumencie | brak, wykres rysuje terminal |
Najważniejsza różnica pojęciowa: w MQL4 zlecenie i pozycja to jedno. W MQL5 zlecenie (order) jest poleceniem, transakcja (deal) jego wykonaniem, a pozycja (position) skutkiem. Jeden bilet zlecenia nie jest biletem pozycji i mieszanie ich to najczęstszy błąd w przepisywanym kodzie.
Prościej: klasa CTrade
Do prostych zastosowań biblioteka standardowa robi to za ciebie:
#include <Trade\Trade.mqh>
CTrade handel;
handel.SetExpertMagicNumber(12345);
handel.SetTypeFillingBySymbol(_Symbol);
handel.Buy(0.1, _Symbol, 0.0, sl, tp, "komentarz");CTrade sam wypełnia strukturę i sprawdza wynik, a handel.ResultRetcode() zwraca kod zwrotny. Cena podana jako 0.0 znaczy „bieżąca rynkowa".