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

MQL5 / Pozycja

POSITION_SL

Poziom stop lossa pozycji. Zero to nie jest „stop na poziomie zera", tylko brak stopa — i tę różnicę

double PositionGetDouble(POSITION_SL);

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

Cena, przy której serwer zamknie pozycję. Zero oznacza brak stop lossa.

Dlaczego to nie jest oczywiste

Zero to nie jest „stop na poziomie zera", tylko brak stopa — i tę różnicę trzeba obsłużyć w każdym warunku porównującym poziomy. Kod sprawdzający if(nowySL > obecnySL) przy pozycji długiej bez stopa nigdy nie wejdzie w gałąź modyfikacji, bo każdy sensowny poziom jest większy od zera i warunek wygląda na spełniony — ale przy pozycji krótkiej ten sam warunek działa odwrotnie.

Druga rzecz: modyfikacja przez TRADE_ACTION_SLTP ustawia oba poziomy naraz. Wysłanie zapytania z wypełnionym sl i pustym tp kasuje take profit.

Kod

POSITION_SL
if(!PositionSelectByTicket(bilet))
   return;

double stop = PositionGetDouble(POSITION_SL);
double cel  = PositionGetDouble(POSITION_TP);

if(stop == 0.0)
   Print("Pozycja nie ma stop lossa.");

//--- przy modyfikacji przepisujemy oba poziomy, takze ten niezmieniany
MqlTradeRequest zapytanie = {};
MqlTradeResult wynik = {};

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

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

Powiązane