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

MQL5 / Z MQL4 na MQL5

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ć

MQL4
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ęcieCo to jestFunkcje
Zlecenie (order)polecenie wysłane na serwer, w tym oczekująceOrdersTotal, OrderGetTicket
Pozycja (position)skutek wykonanych zleceń, czyli otwarta ekspozycjaPositionsTotal, PositionGetTicket
Transakcja (deal)pojedyncze wykonanie, wpis w historiiHistorySelect, HistoryDealGetTicket
Trzy pojęcia, których MQL4 nie rozróżniałZlecenie jest poleceniem, transakcja jego wykonaniem, a pozycja skutkiem. Każde ma własne funkcje dostępu i własny numer.Zleceniepolecenie wysłane naserwerTransakcjapojedyncze wykonanie,wpis w historiiPozycjaotwarta ekspozycja narynkuwykonanieotwarcie lub zmianaOrdersTotal, OrderGetTicketHistorySelect,HistoryDealGetTicketPositionsTotal,PositionGetTicketNumer zlecenia nie jest numerem pozycji. Drogę od jednego do drugiego wyznacza poleDEAL_POSITION_ID transakcji.

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

Pętla po otwartych pozycjach
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

Pętla po zleceniach oczekujących
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.

Transakcje z ostatniego tygodnia
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

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

Powiązane