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:
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
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. |