OrderClose i OrderModify — z MQL4 na MQL5
Obu funkcji nie ma. Zamknięcie pozycji to zlecenie przeciwne, a modyfikacja to osobna akcja w strukturze zapytania.
4 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
Zamykanie pozycji
W MQL4 zamknięcie było osobną funkcją. W MQL5 zamknięcie pozycji to zlecenie przeciwne o tym samym wolumenie, wskazujące bilet pozycji.
OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrRed);bool ZamknijPozycje(const ulong bilet)
{
if(!PositionSelectByTicket(bilet))
return false;
const string symbol = PositionGetString(POSITION_SYMBOL);
const long typ = PositionGetInteger(POSITION_TYPE);
const double wolumen = PositionGetDouble(POSITION_VOLUME);
MqlTick tick;
if(!SymbolInfoTick(symbol, tick))
return false;
MqlTradeRequest zapytanie = {};
MqlTradeResult wynik = {};
zapytanie.action = TRADE_ACTION_DEAL;
zapytanie.position = bilet; // to zamyka, a nie otwiera nową
zapytanie.symbol = symbol;
zapytanie.volume = wolumen;
zapytanie.deviation = 20;
if(typ == POSITION_TYPE_BUY)
{
zapytanie.type = ORDER_TYPE_SELL;
zapytanie.price = tick.bid;
}
else
{
zapytanie.type = ORDER_TYPE_BUY;
zapytanie.price = tick.ask;
}
if(!OrderSend(zapytanie, wynik))
{
PrintFormat("Zamknięcie nie wyszło: błąd %d, retcode %d",
GetLastError(), wynik.retcode);
return false;
}
return (wynik.retcode == TRADE_RETCODE_DONE);
}Kluczowe jest pole position. Bez niego serwer potraktuje zapytanie jako otwarcie nowej pozycji w przeciwnym kierunku — na rachunku hedging skończy się to dwiema pozycjami zamiast żadnej.
Prościej robi to biblioteka standardowa:
#include <Trade\Trade.mqh>
CTrade handel;
handel.SetTypeFillingBySymbol(_Symbol);
if(!handel.PositionClose(bilet))
PrintFormat("retcode %d", handel.ResultRetcode());Zamknięcie częściowe
Wystarczy podać mniejszy wolumen — musi być wielokrotnością kroku instrumentu i nie większy niż wolumen pozycji, inaczej dostaniesz 10038.
double krok = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
double polowa = MathFloor((wolumen / 2.0) / krok) * krok;Modyfikacja
W MQL5 modyfikacja pozycji i modyfikacja zlecenia oczekującego to dwie różne akcje. Mylenie ich daje 10013.
| Co zmieniasz | action | Pole wskazujące obiekt |
|---|---|---|
| stop loss i take profit otwartej pozycji | TRADE_ACTION_SLTP | position |
| cenę lub stopy zlecenia oczekującego | TRADE_ACTION_MODIFY | order |
| usunięcie zlecenia oczekującego | TRADE_ACTION_REMOVE | order |
MqlTradeRequest zapytanie = {};
MqlTradeResult wynik = {};
zapytanie.action = TRADE_ACTION_SLTP;
zapytanie.position = bilet;
zapytanie.symbol = _Symbol;
zapytanie.sl = NormalizeDouble(nowySL, _Digits);
zapytanie.tp = NormalizeDouble(tp, _Digits);
if(!OrderSend(zapytanie, wynik) || wynik.retcode != TRADE_RETCODE_DONE)
PrintFormat("Modyfikacja odrzucona: blad %d, retcode %d",
GetLastError(), wynik.retcode);Przy TRADE_ACTION_SLTP podajesz oba poziomy naraz. Pominięcie tp zeruje take profit — to najczęstszy sposób na przypadkowe skasowanie celu przy przesuwaniu stopa. Gotową funkcję, która o tym pamięta, znajdziesz w przepisie na trailing stop.