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

MQL5 / Pozycja

POSITION_TP

Poziom take profitu pozycji. Najczęstszy sposób przypadkowego skasowania celu: modyfikacja stop lossa.

double PositionGetDouble(POSITION_TP);

1 fragment kodu z tej strony przeszedł przez kompilator MetaEditor build 6090, 2026-08-05.

Cena, przy której serwer zamknie pozycję z zyskiem. Zero oznacza brak take profitu.

Dlaczego to nie jest oczywiste

Najczęstszy sposób przypadkowego skasowania celu: modyfikacja stop lossa. Akcja TRADE_ACTION_SLTP ustawia oba poziomy jednocześnie, a pole niewypełnione w zapytaniu to zero, czyli „brak". Kod przesuwający stopa, który nie przepisuje bieżącego take profitu, kasuje go przy pierwszej modyfikacji — cicho, bez błędu i bez komunikatu.

To jest usterka, którą widać dopiero po czasie: pozycja, która miała się zamknąć na celu, zostaje otwarta do skutku.

Kod

POSITION_TP
if(!PositionSelectByTicket(bilet))
   return;

double obecnyCel = PositionGetDouble(POSITION_TP);

MqlTradeRequest zapytanie = {};
MqlTradeResult wynik = {};

zapytanie.action   = TRADE_ACTION_SLTP;
zapytanie.position = bilet;
zapytanie.symbol   = PositionGetString(POSITION_SYMBOL);
zapytanie.sl       = NormalizeDouble(nowySL, _Digits);

//--- przepisujemy cel, nawet gdy go nie zmieniamy
zapytanie.tp       = NormalizeDouble(obecnyCel, _Digits);

if(!OrderSend(zapytanie, wynik) || wynik.retcode != TRADE_RETCODE_DONE)
   PrintFormat("Modyfikacja odrzucona, retcode %d", wynik.retcode);

Powiązane