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