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

MQL5 / Z MQL4 na MQL5

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.

MQL4
OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrRed);
Zamknięcie pozycji wprost przez OrderSend
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:

To samo przez CTrade
#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.

Zamknięcie połowy pozycji
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 zmieniaszactionPole wskazujące obiekt
stop loss i take profit otwartej pozycjiTRADE_ACTION_SLTPposition
cenę lub stopy zlecenia oczekującegoTRADE_ACTION_MODIFYorder
usunięcie zlecenia oczekującegoTRADE_ACTION_REMOVEorder
Zmiana stopów otwartej pozycji
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.

Powiązane