Dostęp do danych historycznych:   RefreshRates()

Funkcja bool RefreshRates() odświeża (aktualizuje) wartości w predefiniowanych zmiennych i predefiniowanych tablicach. Funkcję należy stosować w sytuacjach, kiedy strategia automatyczna lub skrypt mogą długo przeprowadzać obliczenia i istnieje niebezpieczeństwo, że dane w tych zmiennych i tablicach będą już nie aktualne, gdy po jakimś czasie program będzie chciał z nich skorzystać.

Strategie automatyczne i skrypty korzystają z własnych kopii danych historycznych. To jest w momencie uruchomienia programów w MetaTrader 4, na potrzeby każdego z programu osobno są twożone kopie predefiniowanych zmiennych i tablic. Przy każdym kolejnym uruchomieniu strategii automatycznej, np po przyjściu nowego tick-u (pamiętajmy, że skrypt jest uruchamiany tylko raz i nie jest uzależniony od tick-ów), pierwotnie utworzona kopia danych jest aktualizowana. Jeśli od momentu uruchomienia strategii automatycznej lub skryptu przyjdzie jeden lub kilka nowych tick-ów, to bez odświeżenia notowań program będzie miał dostęp już do "przeterminowanych" danych.

Najczęściej funkcja RefreshRates() stosuje się bezpośrednio przed korzystaniem z predefiniowanych zmiennych Ask oraz Bid . Jeśli tego nie zrobić, próba otwarcia lub zamknięcia pozycji po bieżącej cenie rynkowej może skończyć się niepowodzeniem. Więcej informacji można znaleźć w specyfikacji MQL4.


Przykład 1

Poniższy skrypt, zaraz po jego uruchomieniu, wyświetla bieżącą cenę rynkową kupna Ask (1). Następnie funkcja Sleep() wstrzymuje wykonanie programu na 30 sekund (30000 milisekund). Zaraz potem wyświetla Ask bez odświeżenia notowań (2) i po odświeżeniu notowań (3).

#property strict
void OnStart()
  {
//--- wyświetlenie wartości Ask na początku uruchomienia skryptu
   Print("1) Ask = ",Ask);

//--- uśpienie skryptu na 30 sekund
   Sleep(30000);

//--- wyświetlenie wartości Ask po 30 sekundach bez odświeżenia notowań
   Print("2) Po 30 sek bez odświeżenia notowań Ask = ",Ask);

//--- odświeżenie notowań
   RefreshRates();

//--- wyświetlenie wartości Ask po 30 sekundach z odświeżeniem notowań
   Print("3) Po 30 sek z odświeżeniem notowań Ask = ",Ask);
  }

Na rysunku 1 widać, że po wstrzymaniu wykonania skryptu i bez odświeżenia notowań, predefiniowana zmienna Ask nadal ma taką samą wartość jak na początku. Dopiero odświeżenie notowań pozwoliło zaktualizować jej wartość.

Rys. 1. Przykład stosowania funkcji RefreshRates().


Przykład 2

W poniższym skrypcie zaraz po jego uruchomieniu na 30 sekund wstrzymuje się wykonanie programu, a następnie podejmuje się próba otwarcia pozycji. Ponieważ po tym czasie początkowa wartość Ask najprawdopodobniej się zmieni, do nagłówka funkcji OrderSend() na miejsce 4 argumentu Ask zostanie przekazana już nie aktualna cena rynkowa kupna. Pozycja nie zostanie otwarta z powodu błędu 129 (ERR_INVALID_PRICE) (rys. 2).

#property strict
void OnStart()
  {
//--- uśpienie skryptu na 30 sekund
   Sleep(30000);

//--- otworzyć pozycję kupna
   if(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 10, 0, 0) < 0)
      Print("Otwarcie pozycji na kupno nie powiodło się. Błąd = ",GetLastError());
   else
      Print("Otwarto pozycję na kupno.");
  }

Rys. 2. Przykład nie stosowania funkcji RefreshRates().


W programach MQL4 bezpośrednio przed korzystaniem z Ask i Bid zawsze należy wywoływać RefreshRates() !