Funkcje operujące na tablicach

W języku MQL4 dostępne są tablice jedno oraz wielowymiarowe, maksymalnie do 4 wymiarów. Każdy element tablicy (w każdym z wymiarów) oznaczany jest indeksem poczynając od wartość 0, a kończąc na indeksie o jeden mniejszym niż rozmiar tablicy np. dla tablicy 100 elementów indeks pierwszego elementu wynosi 0, a ostatniego 99.

Poniżej zamieszczono opis szeregu funkcji, które ułatwiają posługiwanie się tablicami, należy jednak pamiętać, że funkcje służą do operowania na tablicach zdefiniowanych przez użytkownika. Nie można ich bezpośrednio wykorzystywać do operowania na tablicach będących zmiennymi predefiniowanymi (Time[], Open[], High[], Low[], CLose[], Volume[]).

Array Bsearch

Funkcja wyszukuje określonej wartości w tablicy. Jeżeli element o podanej wartości nie istnieje w tablicy, funkcja zwraca wskaźnik najbliższej wartości, najmniejszych elementów, między którymi znajduje się wartość poszukiwana. Funkcja ta nie może być używana do tablic ciągów i tablic serii (z wyjątkiem tablicy serii bar open time).

Uwaga! Funkcja przeszukuje binarnie tylko posortowane tablice. Do sortowania tablic numerycznych wykorzystania funkcję ArraySort().

Składnia:

int ArrayBsearch( double array[], double value, int count=WHOLE_ARRAY, int
start=0, int direction=MODE_ASCEND)
Parametry:
array[] – tablica która będzie przeszukiwana
value – wartość która ma zostać znaleziona w tablicy
count – ilość elementów które maja zostać przeszukane w tablicy
(WHOLE_ARRAY - domyślnie wszystkie)
start – indeks pierwszego elementu od którego nastąpi przeszukiwanie
direction – kierunek przeszukiwania MODE_ASCEND – od najmniejszego do
największego, MODE_DESCEND – od największego do najmniejszego
Wartość zwracana:
Indeks wyszukanej wartości, lub wartości najbliższej wyszukiwanej

Przykład:

datetime tablica_czas[];
int shift = 10, przesuniecie_dzien;
ArrayCopySeries(tablica_czas,MODE_TIME,Symbol(),PERIOD_D1);
{
daytimes, MODE_TIME Symbol(), PERIOD_D1)
if ( Time[dhift] >= tablica_czas[0] ) przesuniecie_dzien = 0;
else ( przesuniecie_dzien = ArrayBsearch(tablica_czas, Time[shift],
WHOLE_ARRAY, 0, MODE_DESCEND)
if( Period() < PERIOD_D1 ) przesuniecie_dzien++;
}
Print(TimeToStr(Time[shift]), "odpowiada" , przesuniecie_dzien, "Czas na
świeczce" TimeToStr(tablica_czas[przesuniecie_dzien]));

ArrayCopy

Funkcja kopiuje elementy jednej tablicy do drugiej. Tablice muszą być tego samego typu, ale tablice typu double[], int[], datetime[], color[] i bool[] mogą być kopiowane, jak tablice tego samego typu. Zwracana wartość to ilość skopiowanych elementów.

Składnia

int ArrayCopy( object & dest[], object source[], int start_dest=0, int
start_source=0, int count=WHOLE_ARRAY)
Parametry:
dest[] – tablica docelowa do której nastąpi kopiowanie elementów
source[] – tablica źródłowa z której są kopiowane elementy
start_dest – indeks pierwszego element kopiowanego w tablicy docelowej,
domyślnie pierwszy element, indeks 0.
start_source – indeks pierwszego element do kopiowania w tablicy źródłowej,
domyślnie pierwszy element, indeks 0
count – ilość elementów które maja zostać skopiowane, (WHOLE_ARRAY –
domyślnie cała tablica)
Wartość zwracana:
Ilość skopiowanych elementów, lub -1 jeśli nic nie skopiowano

Przykład:

double array1[][6];
double array2[10][6];
// array2 tablica docelowa
ArrayCopyRates(array1);
ArrayCopy(array2,array1,0,0,60);
// w tablicy docelowej array2 zostanie umieszczonych pierwszych 10
elemntów z tablicy array1
ArrayCopy(array2,array1,0,Bars*6-60,60);
// w tablicy docelowej array2 zostanie umieszczonych ostatnich 10
elementów z tablicy array1

ArrayCopyRates

Funkcja kopiuje specjalną tablicę danych typu OHLC (tablica wielowymiarowa), które są dostępne na wykresie. Zwracana wartość to ilość skopiowanych elementów lub -1 jeśli kopiowanie nie powiodło się.

Do tablicy odwołujemy się tak jakby była tablicą dwuwymiarową, z czego pierwszy wymiar tablicy to indeks słupka, a drugi to indeks określający wartość tak jak poniżej:
0 – time
1 – open
2 – low
3 – high
4 – close
5 – volume

Jeśli podany zakres czasowy nie odpowiada ilości danych dostępnych na aktualnym wykresie, to nastąpi próba pobrania brakujących danych z serwera i jednocześnie wygenerowany zostanie błąd typu ERR_HISTORY_WILL_UPDATED (4066 – brak wymaganych danych w historii wykresu) oraz ustawiona zmienna last_error. Po wystąpieniu takiego błędu należy ponownie wywołać funkcję ArrayCopyRates().

Uwaga!
Tablice danych typu OHLC zwykle wykorzystuje się w celu przekazywania danych do funkcji z bibliotek DLL. Tablice przekazywane są przez referencję, a nie przez wartość, czyli podczas przekazywania jako parametr funkcji nie jest przesyłana kopia całej tablicy, tylko wskaźnik miejsca w pamięci reprezentujący tablicę.

Składnia

int ArrayCopyRates( double & dest_array[], string symbol=NULL, int
timeframe=0)
Parametry:
dest_array[] – dwuwymiarowa tablica do której zostaną skopiowane elementy
symbol – symbol rynku, danych do skopiowania
timeframe – zakres czasowy wykresu danych do skopiowania
Wartość zwracana:
Ilość skopiowanych elementów, lub -1 jeśli nic nie skopiowano

Przykład:

Double tablica1[][6];
ArrayCopyRates(tablica1, EURUSD, PERIOD_H1);
Print("Aktualny słupek", TimeToStr(tablica1[0][0]), "Cena otwarcia",
tablica1[0][1]);

ArrayCopySeries

Funkcja kopiuje jedną z serii danych z typu OHLC w drugą tablicę serii danych. Zwracana wartość to ilość skopiowanych elementów lub -1 jeśli błąd kopiowania.

W rzeczywistość dane tablicowe nie są kopiowane w dwa różne obszary pamięci (nie jest alokowane nowe miejsce w pamięci) tylko są reprezentowane jako pojedynczy wskaźnik na początek pamięci przechowującej dane tablicowe.
Jeśli podany zakres czasowy nie odpowiada ilości danych dostępnych na aktualnym wykresie to nastąpi próba pobrania brakujących danych z serwera i jednocześnie wygenerowany zostanie błąd typu ERR_HISTORY_WILL_UPDATED (4066 – brak wymaganych danych w historii wykresu) oraz ustawiona zmienna last_error. Po wystąpieniu takiego błędu należy ponownie wywołać funkcję ArrayCopySeries().

Uwaga! Jeśli series_index jest MODE_TIME tablica, która ma zostać przekazana do funkcji, musi być typu datetime.

Składnia

int ArrayCopySeries( double & array[], int series_index, string
symbol=NULL, int timeframe=0)
Parametry:
array[] – adres tablicy do skopiowania
series_index – indeks, identyfikator serii danych do skopiowania
symbol – symbol rynku którego dane będą kopiowane
timeframe – zakres czasowy kopiowanych danych
Wartość zwracana:
Ilość skopiowanych elementów tablicy, serii

Przykład:

datetime daytimes[];
int shift=10,dayshift,error;
//---- the Time[] array was sroted in the descending order
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
error=GetLastError();
if(error==4066)
{
//---- make two more attempts to read
for(int i=0;i<2; i++)
{
Sleep(5000);
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
//---- check the current daily bar time
datetime last_day=daytimes[0];
if(Year()==TimeYear(last_day) && Month()==TimeMonth(last_day) &&
Day()==TimeDay(last_day)) break;
}
}
if(Time[shift]>=daytimes[0]) dayshift=0;
else
{
dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);
if(Period()<PERIOD_D1) dayshift++;
}
Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened
at ", TimeToStr(daytimes[dayshift]));

ArrayDimension

Funkcja zwraca ilość wymiarów w tablicy wielowymiarowej.

Składnia

int ArrayDimension( object array[])
Parametry:
array[] – tablica w której nastąpi sprawdzenie ilości wymiarów
Wartość zwracana:
Ilość wymiarów tablicy

Przykład:

int tablica_wielowymiarowa[10][5];
int ilosc_wymiarow;
ilosc_wymiarow = ArrayDimension(tablica_wielowymiarowa);
Print("Ilość wymiarów tablicy =",ilosc_wymiarow);

ArrayGetAsSeries

Funkcja sprawdza czy podana jako parametr wywołania tablica jest tablicą serii danych typu OHLC wówczas zwraca wartość true (prawda), czy jest zwykłą jednowymiarową tablicą wówczas zwraca false (fałsz).

Tablice typu seria OHLC są indeksowane odwrotnie, to znaczy ostatni indeks tablicy to 0 ( zero), w przeciwieństwie do zwykłych tablic, gdzie pierwszy element tablicy to 0 (zero), a ostatni wymiar -1.

Składnia

bool ArrayGetAsSeries( object array[] )
Parametry:
array[] – tablica która będzie sprawdzana
Wartość zwracana:
ture – jeśli tablica typu serie
false – jeśli tablica standardow

Przykład:

if( ArrayGetAsSeries(tablica1) == true )
Print( "tablica1 jest typu serie OHLC");
else Print( "tablica1 jest normalnie indeksowana (od lewej do prawej)");

ArrayIsSeries

Funkcja sprawdza czy tablica przechowuje dane typu OHLC Time[], Open[], Cloze [], High[], Low[] lub Volume[], wówczas zwraca wartość true (prawda) w przeciwnym przypadku false (fałsz).
 

Składnia

bool ArrayIsSeries( object array[] )
Parametry:
array[] – tablica która będzie sprawdzana
Wartość zwracana:
true – jeśli tablica zawiera serie typu OHLC
fale – jeśli nie jest to tablica typu OHL

 

Przykład:

if(ArrayIsSeries(tablica1) == false)
ArrayInitialize(tablica1, 0);
else { Print( "tablica nie jest typu OHLC i nie może być zainicjowana!");
return (-1); }

ArrayInitialize

Funkcja inicjalizuje, ustawia wszystkie elementy tablicy numerycznej i nadaje im taką samą wartość. Funkcja zwraca liczbę elementów zainicjowanych.

Uwaga! Nie zaleca się zainicjować buforów wskaźników dla danych tablicowych wykresu, ponieważ są one inicjalizowane automatycznie wartością EMPTY_VALUE.
 

Składnia

int ArrayInitialize( double &array[], double value)
Parametry:
array[] – tablica której elementy będą inicjalizowane
value – wartość jaką mają być zainicjalizowane elementy tablicy
Wartość zwracana:
Liczba zainicjalizowanych elementów

 

Przykład:

//---- Inicjalizacja wszystkich elementów tablicy wartością 2.1
double moja_tablica[10];
ArrayInitialize(moja_tablica, 2.1)

ArrayMaximum

Funkcja wyszukuje największą wartość elementu w tablicy i zwraca indeks tego elementu w tablicy
 

Składnia

int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)
Parametry:
array[] – tablica do przeszukanai
count – ilość elementów tablicy które mają być wyszukane (WHOLE_ARRAY –
wszystkie elementy tablicy)
start – początkowy indeks do przeszukiwania
Wartość zwracana:
Indeks elementu o największej wartości

 

Przykład:

double num_array[15] = (4,1,6,3,9,4,1,6,3,9,4,1,6,3,9);
int maxValueIdx = ArrayMaximum(num_array);
Print( "Maksymalna wartość w tablicy to =", num_array[maxValueIdx]);

ArrayMinimum

Funkcja wyszukuje najmniejszą wartość elementu w tablicy i zwraca indeks tego elementu w tablicy.

Składnia

int ArrayMinimum( double array[], int count=WHOLE_ARRAY, int start=0)
Parametry:
array[] – tablica do przeszukania
count – ilość elementów tablicy które mają być wyszukane (WHOLE_ARRAY –
wszystkie elementy tablicy)
start – początkowy indeks do przeszukiwania
Wartość zwracana:
Indeks elementu o najmniejszej wartości

 

Przykład:

double num_array[15] = (4,1,6,3,9,4,1,6,3,9,4,1,6,3,9);
int maxValueIdx = ArrayMinimum(num_array);
Print( "Minimalna wartość w tablicy to =", num_array[maxValueIdx]);

ArrayRange

Funkcja zwraca liczbę elementów zawartych w danym wymiarze tablicy. Ponieważ indeksy są numerowane od zera, rozmiar wymiaru jest więc o 1 większy niż największy indeks.
 

Składnia

int ArrayRange( object array[], int range_index)
Parametry:
array[] – tablica do sprawdzenia ilości elementów
range_index – indeks wymiaru

Wartość zwracana:
Ilość elementów w wymiarze

Przykład:

int dim_size, podwójne num_array [10,10,10]; dim_size=ArrayRange
(num_array, 1);

Array Resize

Funkcja ustawia nowy rozmiar tablicy jednowymiarowej. Jeśli wykona się pomyślnie to zwróci nową liczbę elementów zawartych w tablicy, w przeciwnym razie -1.
Uwaga! Jeśli zmieniamy wielkość tablicy na poziomie lokalnej funkcji to należy pamiętać, że rozmiar ten nie zostanie zapamiętany przy kolejnych wywołaniach funkcji.

Składnia

int ArrayResize( object &array[], int new_size)
Parametry:
array[] – tablica do zmiany rozmiaru
new_size – nowy rozmiar tablicy
Wartość zwracana:
Ilość elementów nowego rozmiaru, lub -1 jeśli błąd zmiany rozmiar tablicy

Przykład:

double tablica1[][4]
int liczba_elementow = ArrayResize(tablica1, 20);
pront( "Nowy rozmiar tablicy =", liczba_elementow);

ArraySetAsSeries

Funkcja ustawia typ tablicy (kierunek indeksowania), jeśli podamy wartość true to tablica zostanie ustawiona jako typ OHLC czyli ostatni element tablicy ma indeks 0 (zero), a jeśli false to pierwszy element tablicy ma indeks 0 (zero).
 

Składnia

bool ArraySetAsSeries( double &array[], bool set)
Parametry:
array – tablica do ustawienie typu
set – parametr true/false ustawiający typ tablicy
Wartość zwracana:
Poprzednia wartość typu tablicy

Przykład:

double macd_buffer[300];
double signal_buffer[300];
int i,limit=ArraySize(macd_buffer);
ArraySetAsSeries(macd_buffer,true);
for(i=0; i<limit; i++)
macd_buffer[i] = iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-
iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++)
signal_buffer[i]=iMAOnArray(macd_buffer,limit,9,0,MODE_SMA,i);

ArraySize

Funkcja zwraca wielkość tablicy, liczbę elementów zawartych w tablicy jednowymiarowej.

Składnia

int ArraySize( object array[] )Parametry:
array[] tablica której wielkość będzie sprawdzana
Wartość zwracana:
Ilość elementów w tablicy

Przykład:

int liczba_elementow = ArraySize(tablica1);
for(int i=0; i<liczba_elementow; i++)
{
Print("Wartość elementu tablicy =",tablica1[i]);
}

ArraySort

Funkcja sortuje elementy tablicy jednowymiarowej zwykłej, czyli tablice typu serie danych OHLC nie mogą być sortowane.

Składnia

int ArraySort( double &array[], int count=WHOLE_ARRAY, int start=0, int
sort_dir=MODE_ASCEND)
Parametry:
array[] – tablica której element będą sortowane
count – ilość elementów które mają być posortowane (WHOLE_ARRAY – sortowane
będą wszystkie element tablicy)
start – pierwszy element do sortowani
sort_dir – kierunek sortowania MODE_ASCEND – rosnąco, MODE_DESCEND -
malejąco
Wartość zwracana:
Ilość posortowanych elementów lub -1 jeśli błąd sortowania, lub brak
elementów w tablicy

Przykład

double num_array[5]={4,1,6,3,9};
// tablica nieposortowana 4,1,6,3,9
ArraySort(num_array);
// tablica posortowana 1,3,4,6,9
ArraySort(num_array,WHOLE_ARRAY,0,MODE_DESCEND);
// tablica posortowana malejąco 9,6,4,3,1

Niniejszy materiał, przygotowany przez DM BOŚ S.A. ma charakter wyłącznie informacyjny, prezentowany jest w celach edukacyjnych i nie stanowi porady prawnej oraz nie jest rekomendacją osobistą w ramach świadczenia usługi doradztwa inwestycyjnego zgodnie z przepisami prawa. DM BOŚ S.A. nie udziela gwarancji dokładności, aktualności, oraz kompletności niniejszych informacji. Zaleca się przeprowadzenie we własnym zakresie niezależnego przeglądu informacji z niniejszego materiału.

1/1