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);