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

MQL5 / Funkcje

PositionSelectByTicket

Wybiera pozycję po bilecie i udostępnia jej właściwości. Wyjaśniamy, dlaczego pętla po indeksach potrafi pominąć pozycję.

bool PositionSelectByTicket(ulong bilet);

3 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.

Do czego to służy

W MQL5 właściwości pozycji odczytuje się przez funkcje PositionGetDouble, PositionGetInteger i PositionGetString, które działają na „aktualnie wybranej" pozycji. Wybór robi jedna z trzech funkcji:

FunkcjaWybiera po
PositionSelect(symbol)nazwie instrumentu
PositionSelectByTicket(bilet)numerze biletu
PositionGetTicket(indeks)indeksie na liście, i od razu wybiera

Dlaczego pętla po indeksach bywa zawodna

Klasyczny wzorzec wygląda tak:

Wzorzec, który potrafi pominąć pozycję
for(int i = PositionsTotal() - 1; i >= 0; i--)
  {
   string symbol = PositionGetSymbol(i);
   //--- ...
  }

Problem: jeśli w trakcie pętli któraś pozycja zostanie zamknięta — na przykład przez stop loss po stronie serwera — indeksy pozostałych się przesuwają. Pętla w dół łagodzi to przy usuwaniu z końca, ale nie eliminuje wyścigu.

Bezpieczniejszy wzorzec pobiera bilet i dopiero na jego podstawie wybiera pozycję. Bilet jest niezmienny przez całe życie pozycji.

Wzorzec odporny na zmiany listy
void PrzejrzyjPozycje(const ulong magic)
  {
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      ulong bilet = PositionGetTicket(i);
      if(bilet == 0)
         continue;                       // pozycja zniknęła w międzyczasie

      if(!PositionSelectByTicket(bilet))
         continue;

      if(PositionGetInteger(POSITION_MAGIC) != (long)magic)
         continue;
      if(PositionGetString(POSITION_SYMBOL) != _Symbol)
         continue;

      double otwarcie = PositionGetDouble(POSITION_PRICE_OPEN);
      double stop     = PositionGetDouble(POSITION_SL);
      long   typ      = PositionGetInteger(POSITION_TYPE);

      PrintFormat("Bilet %I64u  typ %s  otwarcie %.5f  SL %.5f",
                  bilet, (typ == POSITION_TYPE_BUY ? "kupno" : "sprzedaż"),
                  otwarcie, stop);
     }
  }

Rachunki netting i hedging

Na rachunku typu netting jeden instrument ma najwyżej jedną pozycję — PositionSelect(_Symbol) w zupełności wystarcza. Na rachunku hedging pozycji na jednym instrumencie może być wiele i wtedy praca po biletach jest jedynym poprawnym podejściem. Typ rachunku sprawdzisz tak:

bool hedging = (AccountInfoInteger(ACCOUNT_MARGIN_MODE)
                == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);

Kod pisany wyłącznie pod netting rozsypuje się na rachunku hedging i odwrotnie — to jedna z częstszych przyczyn zgłoszeń „u mnie nie działa".

Powiązane