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:
| Funkcja | Wybiera 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:
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.
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".