MQL4 könyv   Beépített függvények  Tömbök és előre definiált tömbök

Tömbök és előre definiált tömbök

Nagyon fontos megjegyezni, hogy az MQL4-ben minden ilyen típusú elem indexálása mindig nullával kezdődik.

Ezek alapján nem szabad összekeverni a tömbelem-index értékét a tömbben lévő elemek számával (lásd: Tömbök). Például, egy tömb deklarálása:
 int Erray_OHL[3];  // Array declaration

Ez azt jelenti, hogy az egy dimenziós Erray_OHL tömb három elemet tartalmaz. Az elemek indexelése nullával kezdődik, az első elem indexe 0 (Erray_OHL [0]), a második indexe 1 (Erray_OHL[1]), és a harmadik indexe 2 (Erray_OHL[2]). A tömbelem index maximális értéke egyel kisebb a tömbben lévő elemek számánál. Ebben az esetben a tömb egy dimenziós, a maximális index 2, mert a tömb elemeinek a száma 3.

Ugyanez a helyzet a tömbben lévő dimenziók számával is. Például, ha egy tömböt a következőképpen deklarálunk:

 int Erray_OHL[3][8]; // Array declaration

Ennek a tömbnek két dimenziója van. Az első dimenzióban megadjuk a sorok számát (ebben a példában 3), és a második dimenzióban a sorokban lévő elemek számát (vagy az oszlopok számát, ami ebben a példában 8). A dimenziók számozása az indexekéhez hasonló. Az első dimenzió száma 0, és a másodiké 1. A dimenziók számát például az ArrayRange() függvényben használjuk.

ArrayRange() függvény

 int ArrayRange(object array[], int range_index)

A függvény visszaküldi a tömb megadott dimenziója elemeinek a számát.

Az ArrayRange() függvény használatát a következő feladat megoldásával demonstrálhatjuk:

Feladat

38. feladat: A Mas_1 tömb egy 3x5 mátrix értékeit tartalmazza. Adjunk a Mas_2 tömb elemeinek olyan értékeket melyek egyelőek az eredeti mátrix elemértékeivel. Önkényesen megválasztott értékekkel dolgozhatunk.

Adjunk a mátrixoknak valamilyen kezdeti értéket és helyezzük el őket a Mas_1 és Mas_2 tömbökben a következő formában:

Indexes 0 1 2 3 4
0 1 2 3 4 5
1 11 12 13 14 15
2 21 22 23 24 25
Indexes 0 1 2
0 1 11 21
1 2 12 22
2 3 13 23
3 4 14 24
4 5 15 25
A kiindulási mátrix a Mas_1 tömbben. Az átalakított mátrix, Mas_2 tömb.

151. ábra. A kiinduló és az átalakított mátrixok.

Ebben az esetben a problémát úgy oldjuk meg, hogy a mátrix átalakítás szabályai szerint átírjuk az első mátrix értékeit a másodikba, mégpedig úgy, hogy az elemek az első mátrixoszlopokból a második mátrix soraiba kerülnek. A mátrix átalakítási feladat megoldását a matrix.mq4 expertben valósítjuk meg:
//--------------------------------------------------------------------
// matrix.mq4
// The code should be used for educational purpose only.
//--------------------------------------------------------------- 1 --
int start() // Special function start()
 {
 int Mas_1[3][5]={1,2,3,4,5, 11,12,13,14,15, 21,22,23,24,25};
 int Mas_2[5][3];
 int R0= ArrayRange( Mas_1, 0); // Number of elements in first dim.
 int R1= ArrayRange( Mas_1, 1); // Number of elements in second dim.
 
 for(int i=0; i

Két tömböt hozunk létre a start() függvényben. A Mas_1 tömbnek 3 sora van, amelyek 5 elemet tartalmaznak, és a MAS_2 tömbnek 5 sora, mindegyik sor 3 elemet tartalmaz. Az értékek átírását a következő lépésben hajtjuk végre:

 Mas_2[[j][i] = Mas_1[i][j]; // Matrix transposition

Annak érdekében, hogy kiszámítsuk az ismétlések számát mindkét ciklusoperátorhoz, tudnunk kell mindkét tömb elemeinek a számát. Ebben a példában használhatnának a 3 és 5 állandókat. Mindazonáltal a programtervezésnek ez módszere helytelen. Egy program ettől eltérő értékeket is tartalmazhat, és ezeket az értékeket minden esetben kézzel beállítani nagyon körülményes. Egy programot úgy kell tervezni, hogy a szükséges módosításokat egy helyen tudjuk elvégezni, és az ettől függő módosításokat, ha szükséges, a program saját maga elvégezze. Ebben az esetben csak azokat az adatokat kell módosítani, amelyek létrehozzák és inicializálják a tömböket és nem szükséges a kódot módosítani az egyéb helyen.

A Mas_1 tömb első és második dimenziója elemeinek a számát a következő számítások végrehajtásával határozzuk meg:

 int R0 = ArrayRange( Mas_1, 0); // Number of elements in first dim.
 int R1 = ArrayRange( Mas_1, 1); // Number of elements in second dim.

Megjegyzés: a 0 értéket használjuk az első dimenzióra és az 1 értéket használjuk a másodikra. Az R0 és R1 változók értékeit arra használjuk, hogy meghatározzuk a "for" ciklusok ismétlései számát.

A Mas_2 tömbelemek értékeit a Comment() függvény segítségével jelenítjük meg a képernyőn.


 152. ábra. A matrix.mq4 végrehajtásának eredménye.

A tömbműveleteket végző függvények


Függvények Rövid leírás
ArrayBsearch A függvény visszaküldi a tömb első dimenziójából az azt az indexet ahol a keresett értéket először megtalálta. Ha tömbelem a megadott értékkel nem létezik, akkor a függvény vissza fogja küldeni azt az indexet ahol a legközelebbi értékű elem található.
ArrayCopy Ez függvény tömböt másol egy másikba. A tömböknek ugyanazon típusúaknak kell lenniük. A double[], int[], datetime[], color[] és bool[] típusú tömböket ugyanolya típusú tömbökbe másolhatjuk. A függvény visszaküldi a másolt elemek számát.
ArrayCopyRates A függvény a báradatokat a RateInfo[][6] kétdimenziós tömbbe másolja és visszaküldi a másolt bárok számát. Ha a művelet nem sikerül -1-et küld vissza.
ArrayCopySeries A függvény egy előre definiált tömböt egy felhasználói tömbbe másol és visszaküldi a másolt elemek számát.
ArrayDimension Visszaküldi egy több dimenziós tömb dimenzióinak számát.
ArrayGetAsSeries A függvény TRUE-t küld vissza, ha a tömb elrendezése olyan, mint az előre definiált tömböké (a tömb elemeit az utolsó elemtől az első felé indexelték), ha nem, akkor visszaküldi a FALSE-t.
ArrayInitialize Beállít egy (azonos) értéket a tömb minden elemére. Visszaküldi az inicializált elemek számát.
ArrayIsSeries Visszaküldi TRUE-t ha a vizsgált tömb előre definiált tömb (Time[], Open[],Close[],High[],Low[] Volume[]), különben visszaküldi a FALSE-t.
ArrayMaximum Megkeresi a maximális értékű elemet. A függvény visszaküldi a tömb maximális elemének az indexét.
ArrayMinimum Megkeresi a minimális értékű elemet. A függvény visszaküldi a tömb minimális elemének az indexét.
ArrayRange Visszaküldi az elemek számát a tömb megadott dimenziójában. A dimenzió mérete 1-el nagyobb, mint a legnagyobb index, mert az indexelés nullával kezdődik.
ArrayResize Beállítja a tömb első dimenziójának az új méretét. Visszaküldi a tömbelemek új számát, ha a függvény végrehajtása kész, ha a végrehajtás nem sikerül és a tömb mérete nem változik -1-et küld vissza.
ArraySetAsSeries Beállítja az indexelés irányát a tömbben.
ArraySize Visszaküldi egy tömb elemeinek a számát.
ArraySort A számszerű tömböket az első dimenziójuk alapján sorba rendezi. Az előre definiált tömbök nem rendezhetők sorba.

Az előre definiált tömbök elérési függvényei

Függvények Összefoglaló információ
iBars Visszaküldi a megadott charton lévő bárok számát.
iBarShift Idő alapján keres meg egy bárt. A függvény visszaküldi annak a bárnak az indexét, amely bárban a megadott időpont van. Ha a megadott időponthoz nem talál bárt („ lyuk” az előtörténetben) , az exact paramétertől függően vagy az időponthoz legközelebbi bár indexét vagy -1-et küld vissza.
iClose Visszaküldi a shift paraméterrel meghatározott bár záró árát az aktuális chartról (szimbólum, időkeret) 0-t küld vissza, ha hiba történik.
iHigh Visszaküldi a shift paraméterrel meghatározott bár maximum árát az aktuális chartról (szimbólum, időkeret) 0-t küld vissza, ha hiba történik.
iHighest Visszaküldi az adott intervallumon belüli megtalált maximális érték indexét (az aktuális bárhoz viszonyítva).
iLow Visszaküldi a shift paraméterrel meghatározott bár minimum árát az aktuális chartról (szimbólum, időkeret) 0-t küld vissza, ha hiba történik.
iLowest Visszaküldi az adott intervallumon belül megtalált minimális érték indexét (az aktuális bárhoz viszonyítva).
iOpen Visszaküldi a shift paraméterrel meghatározott bár nyitó árát az aktuális chartról (szimbólum, időkeret) 0-t küld vissza, ha hiba történik.
iTime Visszaküldi a shift paraméterrel meghatározott bár nyitási idejét az aktuális chartról (szimbólum, időkeret) 0-t küld vissza, ha hiba történik.
iVolume Visszaküldi a shift paraméterrel meghatározott bárban lévő tickek számát az aktuális chartról (szimbólum, időkeret) 0-t küld vissza, ha hiba történik.