- Bossafx.pl
- Edukacja
- Automatyzacja handlu MQL4
- Funkcje MQL4
- Funkcje operujące na tablicach
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.