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

MQL5 / Z MQL4 na MQL5

RefreshRates — z MQL4 na MQL5

Funkcji RefreshRates nie ma, bo nie ma już czego odświeżać. Ceny pobiera się na żądanie przez SymbolInfoTick.

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

Po co to było

W MQL4 Bid i Ask były zmiennymi wypełnianymi przy wejściu do funkcji start(). Podczas długiej operacji — pętli ponawiającej zlecenie, oczekiwania po rekwotowaniu — ich wartości się starzały. RefreshRates() wypełniało je na nowo.

MQL4
while(proba < 3)
  {
   RefreshRates();
   int bilet = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0);
   if(bilet > 0)
      break;
   proba++;
  }

Dlaczego zniknęło

W MQL5 nie ma zmiennych Bid i Ask. Cena jest pobierana w momencie, w którym o nią pytasz, więc nie ma stanu do odświeżania. Odpowiednikiem RefreshRates() jest po prostu ponowne wywołanie funkcji pobierającej cenę.

Świeża cena przy każdej próbie
for(int proba = 0; proba < 3; proba++)
  {
   MqlTick tick;
   if(!SymbolInfoTick(_Symbol, tick))
      break;

   zapytanie.price = NormalizeDouble(tick.ask, _Digits);

   if(OrderSend(zapytanie, wynik) && wynik.retcode == TRADE_RETCODE_DONE)
      break;
  }

Jak sprawdzić, czy cena nie jest przestarzała

Pole tick.time mówi, kiedy kwotowanie przyszło. Przy pracy na instrumencie innym niż ten na wykresie warto to sprawdzać:

Odrzucenie starego kwotowania
MqlTick tick;
if(!SymbolInfoTick(symbol, tick))
   return false;

if(TimeCurrent() - tick.time > 60)
  {
   Print("Ostatnie kwotowanie starsze niż minuta — nie wysyłam zlecenia.");
   return false;
  }

Ten sam wzorzec przydaje się przy 10021, gdzie serwer odmawia z powodu braku aktualnych kwotowań.

Powiązane