OrderSelect — z MQL4 na MQL5
W MQL4 jedna funkcja obsługiwała wszystko. W MQL5 zlecenia, pozycje i historia to trzy osobne światy z osobnymi funkcjami.
3 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
To jest najtrudniejszy fragment migracji, bo nie chodzi o zamianę nazwy funkcji, tylko o zmianę pojęć.
Stara postać
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
continue;
if(OrderSymbol() != Symbol() || OrderMagicNumber() != 12345)
continue;
double zysk = OrderProfit();
}OrdersTotal() w MQL4 zwracało wszystko naraz: otwarte pozycje i zlecenia oczekujące. Tryb MODE_TRADES albo MODE_HISTORY decydował, czy patrzymy na bieżące, czy na zamknięte.
Trzy światy MQL5
| Pojęcie | Co to jest | Funkcje |
|---|---|---|
| Zlecenie (order) | polecenie wysłane na serwer, w tym oczekujące | OrdersTotal, OrderGetTicket |
| Pozycja (position) | skutek wykonanych zleceń, czyli otwarta ekspozycja | PositionsTotal, PositionGetTicket |
| Transakcja (deal) | pojedyncze wykonanie, wpis w historii | HistorySelect, HistoryDealGetTicket |
W MQL5 OrdersTotal() zwraca tylko zlecenia oczekujące. Otwarte pozycje liczy PositionsTotal(). Kod przepisany bez tej wiedzy po prostu nigdy nie znajduje niczego i nie zgłasza błędu.
Nowa postać: pozycje
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong bilet = PositionGetTicket(i);
if(bilet == 0)
continue;
if(PositionGetString(POSITION_SYMBOL) != _Symbol)
continue;
if(PositionGetInteger(POSITION_MAGIC) != 12345)
continue;
double zysk = PositionGetDouble(POSITION_PROFIT);
}PositionGetTicket(i) zwraca bilet i przy okazji wybiera pozycję, więc osobne PositionSelect nie jest potrzebne. Szczegóły przy PositionSelectByTicket.
Nowa postać: zlecenia oczekujące
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
ulong bilet = OrderGetTicket(i);
if(bilet == 0)
continue;
if(OrderGetString(ORDER_SYMBOL) != _Symbol)
continue;
double cena = OrderGetDouble(ORDER_PRICE_OPEN);
long typ = OrderGetInteger(ORDER_TYPE);
}Nowa postać: historia
Historii nie da się przeglądać bez wcześniejszego wczytania zakresu dat. To najczęściej pomijany krok — bez HistorySelect licznik zwraca zero.
if(!HistorySelect(TimeCurrent() - 7 * 24 * 3600, TimeCurrent()))
{
Print("Nie udało się wczytać historii.");
return;
}
for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
{
ulong bilet = HistoryDealGetTicket(i);
if(bilet == 0)
continue;
double zysk = HistoryDealGetDouble(bilet, DEAL_PROFIT);
long wejscie = HistoryDealGetInteger(bilet, DEAL_ENTRY);
}Tabela zamian
| MQL4 | MQL5 |
|---|---|
OrderSelect(i, SELECT_BY_POS, MODE_TRADES) | PositionGetTicket(i) albo OrderGetTicket(i) |
OrderSelect(bilet, SELECT_BY_TICKET) | PositionSelectByTicket(bilet) |
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) | HistorySelect(...) plus HistoryDealGetTicket(i) |
OrderSymbol() | PositionGetString(POSITION_SYMBOL) |
OrderMagicNumber() | PositionGetInteger(POSITION_MAGIC) |
OrderLots() | PositionGetDouble(POSITION_VOLUME) |
OrderOpenPrice() | PositionGetDouble(POSITION_PRICE_OPEN) |
OrderStopLoss() | PositionGetDouble(POSITION_SL) |
OrderProfit() | PositionGetDouble(POSITION_PROFIT) |
OrderType() | PositionGetInteger(POSITION_TYPE) |
OrderTicket() | PositionGetInteger(POSITION_TICKET) |