Előre definiált változók és a RefreshRates függvény
Az MQL4 nyelvben vannak előre definiált változó nevek. Az előre definiált változók visszatükrözik az aktuális chart (szimbólum ábra) állapotát abban a pillanatban, amikor a programjaink (Expert Advisor, script vagy egyéni indikátor) indulnak, vagy a RefreshRates() függvény végrehajtódik.
Az előre definiált változók listája:
Ask - az aktuális szimbólum utoljára ismert eladási ára
Bid - az aktuális szimbólum utoljára ismert vételi ára
Bars - egy aktuális ábrán levő bárok száma
Point –egy pont értéke az aktuális pénznemben
Digits – az aktuális szimbólum árában levő tizedespont utáni számjegyek száma
Az előre definiált tömbök nevei:
Time - az aktuális bár nyitási ideje
Open - az aktuális bár nyitó ára
Close - az aktuális bár záró ára
High - az aktuális bár legnagyobb ára
Low - az aktuális bár minimális ára
Volume - az aktuális bárban lévő tickek száma
Az előre definiált változók neveit nem lehet a felhasználó által létrehozott változók azonosítására használni. Az előre definiált változókat használhatunk a kifejezésekben a változókra vonatkozó szabályok szerint, de egy előre definiált változó értékét nem változtathatjuk meg. Ha megpróbálunk lefordítani egy olyan programot, ami egy olyan értékadó operátort tartalmaz, amelyben egy előre definiált változót helyeztek egy egyenlőségjel jobb oldalán, a Meta Editor hibaüzenetet fog adni. Elérhetőség tekintetében az előre definiált változók globális változók, ezek bármely programrészről elérhetők.
Minden előre definiált változó értékét automatikusan frissíti az ügyfélterminál, abban a pillanatban, amikor a különleges függvényeket elindítja.
Az előre definiált változók előző és aktuális értékei egyenlők lehetnek, de magát az értéket frissíteni fogják. Egy különleges függvény végrehajtásának legelső pillanatában ezeket a változókat frissítik és már az első programsorokból elérhetők.
Az ügyfélterminál az előre definiált változók készletét külön-külön biztosítja mindegyik elindított program számára. Mindegyik elindított program a saját történelmi adatait használja.
Az előre definiált változók értékeit mentik a különleges függvények végrehajtásának egész időszaka alatt. Ezeket az értékeket erőszakosan frissíthetjük a RefreshRates() beépített függvény használatával.
A RefreshRates() függvény
A RefreshRates() beépített függvény lehetővé teszi, hogy frissítsük a történelmi adatok értékeinek helyi másolatát. Más szóval ez a függvény erőszakosan frissíti az aktuális piaci adatokat (Volume, az utolsó szerver idő Time[0], Bid, Ask, stb.).Ezt a függvényt akkor használhatjuk, amikor egy program sokáig végzi a számításait és eközben az adatokat frissíteni kell.
A RefreshRates() függvény TRUE-t küld vissza, ha a végrehajtása pillanatában a terminálnak van új információja (új történelmi adatokkal kapcsolatos információ, ha egy új tick jött a különleges függvények végrehajtás alatt). Ez esetben az előre definiált változók helyi másolatainak a készletét frissíteni fogjak.
A RefreshRates() FALSE-ot küld vissza, ha a végrehajtásának pillanatáig az ügyfélterminál történelmi adatait még nem frissítették. Ekkor az előre definiált változók helyi másolatai nem változnak.
A változók típusai
Helyi (lokális) és globális változók
Lokális változó: a változót egy függvényen belül deklarálták. A lokális változók hatóköre az a függvénytörzs, amiben a változót deklarálták. A lokális változót lehet inicializálni egy állandó vagy egy kifejezés megfelelő típusával.
A globális változó egy olyan változó, amit mindenen függvényen kívül deklaráltak. A globális változók hatóköre az egész program. Egy globális változót csak egy hasonló típusú állandóval lehet inicializálni (kifejezéssel nem). A globális változókat csak egyszer inicializáljuk a különleges függvények végrehajtása előtt.
Ha a program vezérlése egy bizonyos függvényben van, annak a lokális változónak az értéke, amit egy másik függvényben deklaráltak, nem elérhető. Bármilyen globális változó értéke elérhető bármilyen különleges és felhasználói függvényből.
Statikus változók
A fizikai szinten a lokális változókat a hozzájuk tartozó függvények ideiglenes memóriarekeszeiben tároljuk. Van mód arra, hogy egy változót, amit egy függvényen belül deklaráltak az állandó programmemóriában lokalizáljunk, - a deklaráció során módosítani kell a változó típusát a 'static' szó beszúrásával:
static int Number; // Static variable of integer type
A statikus változókat egyszer inicializáljuk. Mindegyik statikus változót csak egy megfelelő típusú állandó inicializálhatja(ebben különbözik egy egyszerű lokális változótól, mert azt inicializálhatja bármilyen kifejezés is). Ha inicializálása nincs, egy statikus változó kezdeti értéke nulla. A statikus változókat egy állandó memóriarészben raktározzák el, az értéke nem veszik el, ha kilépünk a függvényből. Azonban a statikus változóknak vannak olyan korlátozásaik, amelyek a lokális változókra jellemzőek, - a statikus változó hatásköre az a függvény, amiben a változót deklarálják, ebben különböznek azoktól a globális változóktól, amelyeknek az értékei elérhetőek az egész programból.
External (külső) változók
External (külső) változó egy olyan változó, ami a program tulajdonságok ablakából elérhető. Egy külső változót minden függvényen kívül deklarálunk és hatókörük globális - az egész programból elérhetők. Amikor deklarálunk egy külső változót, ezt az érték típusa előtt az 'extern' szóval kell jelezni:
extern int Number; // External variable of integer type
A külső változókat a program fejrészében deklaráljuk, mégpedig minden olyan függvény leírása előtt, amely függvény használja az adott külső változót. A külső változók használata nagyon kényelmes, erre időről időre szükség van, ha egy programot különböző változó értékekkel kell elindítanunk.
Az ügyfélterminál globális változói (GlobalVariables)
Több alkalmazási program működhet az ügyfélterminálban egyidejűleg. Néhány esetben szükségessé válhat néhány adat átadása egyik programból a másikba. Történetesen ezért vannak az MQL4-ben az ügyfélterminálnak globális változói.
A Global variable of Client Terminal egy változó, az az érték, ami elérhető minden alkalmazási programból, amit az ügyfélterminálban elindítottak (rövidített alak: GV).
GlobalVariables tulajdonságai
A GV abban különbözik az egyéb változóktól, hogy bármely programból nemcsak létre lehet hozni, hanem törölni is. A GV értékét a merevlemezen tárolják és mentik az ügyfélterminál bezárásakor. A deklarált GV-t az ügyfélterminál, az utolsó hívástól számított 4 héti tárolja. Ha ez alatt az időszak alatt semelyik program sem használja a változót, az ügyfélterminál törli azt. A GV csak double típusú lehet.
A GlobalVariables függvényei
A GlobalVariables legalapvetőbb 3 függvénye:
GlobalVariableSet()
GlobalVariableGet()
GlobalVariableDel()
Tömbök
Tömbökben csak azonos típusú változókat tárolhatunk. Létrehozhatunk egy dimenziós vagy többdimenziós tömböket is. Egy tömbben levő dimenziók maximális száma négy lehet. Bármilyen adattípust elhelyezhetünk tömbökben.
A tömbelem-index egy vagy több egész értékű állandó, változó vagy kifejezés felsorolása vesszővel elválasztva és szögletes zárójelbe zárva. A tömbelem-index egyértelműen meghatározza egy tömb valamely elemének a helyét. A tömbelem-indexet egy változó (tömbnév) után helyezzük el és a tömbelem integrál részét képzi. Az MQL4-ben az indexelés nullával kezdődik. Példakódok:
int Mas[10][10] //Kétdimenziós tömb deklarálása
Mas[i,j] = 574
bool Mas_b[5] = { false, true, false, true, true }
Előre definiált tömbök
Az előre definiált tömb egy tömb előre meghatározott névvel (Open, Close, High, Low, Volume és Time), amely tömbök elemei tartalmazzák a történelmi bárok megfelelő jellemzőinek az értékeit.
Az adatok, amelyeket az előre definiált tömbök tartalmaznak, nagyon fontos információk és az MQL4 programozásban széles körben használjuk őket. Mindegyik előre definiált tömb egy egy dimenziós tömb, és egy bizonyos bar jellemzőiről tartalmaz történelmi adatot. Mindegyik bárt jellemez a nyitó ár Open[], a záró ár Close[], a maximális ár High[], a minimális ár Low[], a mennyiség (a bárban lévő tickek száma) Volume[] és a nyitási idő Time[]. Például az Open[] előre definiált tömb az ablakban lévő bárok nyitási árairól ad információt.
A Zéró bár az aktuális bár, ami még teljesen nem alakult ki. Az ablakban a zéró bár jobbról az utolsó. Az előre definiált tömb elemek értékei egy bár megfelelő jellemzői és ezek változatlanok (a zéró bár következő jellemzőit kivéve: Close[0], High[0], Low[0], Volume [0]), a bár index aktuális változása visszatükrözi a bár létrejötte óta eltelt időt.