MQL4 könyv   Programozás MQL4-ben    Programszerkezet

Programszerkezet

Az előző részekben megtanultuk az MQL4 programnyelv néhány alapvető fogalmát. Most azt tanulmányozzuk, hogy egy programnak általában milyen a szerkezete. Ezen probléma megoldásához most meg fogjuk vizsgálni a programok szerkezeti elrendezését. Ahogy már fent említettük, a főprogram-kódot, amit a programozó írt, a felhasználói és a különleges függvényekbe helyezzük. A Függvények részben megvitattuk a beépített és felhasználói függvények fogalmát és tulajdonságait. Röviden: egy felhasználói függvénynek van  leírása, a függvényhívást arra használjuk, hogy elindítsa a függvény végrehajtását a programban. Bármilyen beépített vagy felhasználói függvényt csak akkor hajthatunk végre, miután azt meghívtuk; ebben az esetben azt mondjuk, hogy a függvényt egy program végrehajtásáért hívta. 

A különleges függvények tulajdonságait részletesen a Különleges függvények részben írjuk le. Itt csak a velük kapcsolatos fontosabb ismereteket fogjuk megtanulni. A különleges függvény egy olyan függvény, amit az ügyfélterminál hív, hogy azt végrehajtsa. A beépített függvényektől eltérően a különleges függvényeknek van függvényleírásuk és a különleges függvények nem hívhatók a programból. A különleges függvényeket végrehajtásra csak az ügyfélterminál hívhatja, (technikailag van arra lehetőség, hogy egy különleges függvényt a programból hívjunk, de ez a módszer helytelen és itt nem fogjuk azt megtárgyalni). Amikor egy programot elindítanak egy szimbólum ablakban, az ügyfélterminál a vezérlést átadja a különleges függvények közül az egyiknek. Végül ezt a függvényt végrehajtja.

Az MQL4 programozási szabálya a következő:

Figyelem!

A programkódot függvényekbe kell írni.

Azok az eszközök, programsorok (operátorok és függvényhívások) amelyek a függvényeken kívül vannak nem hajthatók végre. Ha egy ilyen programot akarunk lefordítani, a MetaEditor hibaüzenetet ad és a végrehajtható *.ex4 állományt nem fogja létrehozni.

Vizsgáljuk meg egy egyszerű program funkcionális felépítését - Expert Advisor:


31. ábra. Egy program szerkezet terve (Expert Advisor).


Egy MQL4program legfontosabb blokkjai:

1. A program fejrésze.

2. Különleges függvény init().

3. Különleges függvény start().

4. Különleges függvény deinit().

5. Felhasználói függvények.

Továbbiakban csak ezeknek a funkcionális blokkoknak a belső tartalmát fogjuk elemezni (egy program integrált részeit), és minden külső objektum (például, az ügyfélterminál információs felülete vagy a hardver) most számunkra érdektelen.

A MetaTrader 4 információs környezete

Az MT4ügyfélterminál információs környezete nem a program alkotórésze. Az információs környezet a rendelkezésre álló paraméterek készlete, amely paramétereket a program felhasználhat. Például egy olyan ár-adat, ami egy új tickkel jött, a kereskedelem volumene, információ az előzményekről, a legnagyobb és legkisebb árakról, azok a paraméterek, amik kereskedési feltételeket jellemezik. Az információs környezet adatait frissíti az ügyfélterminál, amikor kapcsolatban állt a szerverrel és egy új tick érkezik.

Programszerkezet

Fejrész

A fejrész a program kezdetén lévő sorokból áll (az első sorral kezdődik) és néhány leírást tartalmaz. Ezek a sorok a programmal kapcsolatos általános információkat tartalmaznak. Például ez a rész tartalmazza a globális változók deklarációját és inicializációját (azt, hogy milyen információt szükséges tartalmaznia a fejrésznek, később fogjuk megvitatni). A fejrész a legelső függvényleírásig tart (felhasználói vagy különleges függvény).

Különleges függvények

Általában a program fejrésze után a különleges függvényeket írjuk le. A különleges függvényleírások hasonlítanak egy szokásos felhasználói függvény leíráshoz, de a különleges függvényeknek előre definiált neveik vannak: init(), start() és deinit(). A különleges függvényekben a számítások egyes blokkjai az ügyfélterminál nformációs környezetével valaminti a felhasználói függvényekkel is kapcsolatokban vannak. A különleges függvényeket részletesen bemutatjuk a Különleges függvények részben.

Felhasználói függvények

A felhasználói függvények leírását általában a különleges függvények leírása után helyezük el. Egy programban levő felhasználói függvények száma nem korlátozott. Ez a séma csak két felhasználói függvényt tartalmaz, de egy program tartalmazhat 10-et vagy 500-at, vagy egyet sem. Ha felhasználói függvényeket nem használnak egy programban, a program szerkezete egyszerűbb lesz: fejrész és a különleges függvények leírás.

Standard (beépített) függvények

Ahogy korábban említettük, a beépített függvényeknek csak a függvényhívását tüntetjük föl. A beépített függvényeknek, különleges és a felhasználói függvényekkel ellentétben nem adunk függvényleírás. A standard (beépített) függvények leírása el van rejtve, nem látja a programozó és azért nem tud változtatni rajta. Ezeket csak a MetaEditor érheti el. A program fordítása alatt MetaEditor létre fog hozni egy végrehajtható állományt, amiben minden hívott beépített függvényt teljes terjedelmében be fog illeszteni.

A programrészek elrendezése

A fejrésznek az első sorokban kell elhelyezkednie. A különleges és felhasználói függvényleírások elrendezése nem számít. 32. ábra mutatja a funkcionális blokkok egy szokásos elrendezését: fejrész, különleges függvények, felhasználói függvények. A 33. ábra más programszerkezeti változatokat mutat. Minden példában a fejrész jön először, míg a függvényeket véletlen sorrendben írhatjuk le.

32. ábra. Egy programban levő funkcionális blokkok szokásos elrendezése (ajánlott).


33. ábra. A funkcionális blokkok lehetséges szervezése egy programban (véletlen sorrend).

Jegyezzük meg:

Figyelem!

A függvények közül semelyik nem írható le egy másik függvényben. Tilos a programban olyan függvényleírások használata, amiket egy másik függvényben helyeztek el.

Lent példák a függvényleírások helytelen elrendezésére.


34. ábra. Példák egy programban levő függvény helytelen elrendezésére.

Ha egy programozó tévedésből egy olyan programot hoz létre, ahol a függvények közül bármelyiknek a leírása egy másik függvényen belül van, a fordítás során a MetaEditor egy hibaüzenetet fog mutatni, és a végrehajtható állományt nem fogja létrehozni.

Kódvégrehajtási sorrend

Fejrész és különleges függvények

A programvégrehajtás kezdetén  a programfejrészben lévő sorok végrehajtódnak.

Az előkészületek után, amiket a fejrészben leírtak, az ügyfélterminál átadja a vezérlést az init() különleges függvénybe és a függvényt végrehajtja (a vezérlésátadást a szerkezeti tervnél nagy sárga nyilak mutatják). Az init() különleges függvényt  a programművelet kezdetén csak egyszer hívják és hajtják végre. Általában ez a függvény olyan kódot tartalmaz, amit csak egyszer kell végrehajtani, mielőtt a program fő működése elkezdődik. Például, amikor az init() függvényt végrehajtják, néhány globális változót inicializálnak, grafikus objektumokat rajzolnak, üzeneteket mutathatnak. Az init() függvényben lévő programsorok végrehajtása után ez a függvény befejezi a futását és az irányítás  visszatér az ügyfélterminálhoz.

A leghosszabb végrehajtási idő a start()  függvény végrehajtásának az időszakára esik. Bizonyos feltételek esetén (a különleges függvények jellemzőit lásd a Különleges függvények részben), egy új ticknek az ügyfélterminálnak a szerverről történt fogadása után, az ügyfélterminál végrehajtásra hívja a start() különleges függvényt. Ez a függvény (mint a többi függvény) az ügyfélterminál információs környezetéhez tud fordulni, számításokat tud elvégezni, megbízásokat tud bezárni és nyitni, vagyis végrehajthat bármilyen műveletet, amit az MQL4megenged. Amikor a start() különleges függvényt végrehajtják vezérlőutasítás is keletkezhet (piros nyíl). Ezek lehetnek kereskedelmi utasítások a megbízások nyitására bezárására vagy módosítsára.

Miután az EA start() különleges függvényének  a kódja teljesen végrehajtódik, a start() függvény  befejezi a működését és az irányítást visszaküldi az ügyfélterminálnak. A terminál magánál fogja tartani az irányítást és nem indít el semmilyen különleges függvényt. Egy szünet keletkezik, ami alatt a program nem működik. Később, amikor egy új tick jön az ügyfélterminál a vezérlést ismét át fogja adni a start() különleges függvénynek , a függvény még egyszer végrehajtódik és miután a végrehajtása kész, az irányítást vissza fogja küldeni az ügyfélterminálnak. A következő ticknél a start() függvényt ismét el fogja indítani az ügyfélterminál.

A start() különleges függvénynek ügyfélterminál általi hívása addig ismétlődik, amíg a program hozzá van kapcsoljva egy szimbólumábrához , ez akár heteken, hónapokon át folytatódhat. Ezen időszak alatt az Expert Advisor automatikusan kereskedik, vagyis ellátja fő feladatát. A folyamatábrán a start() függvénynek a többszörös végrehajtását a sárga nyilak jelzik, amelyek körbeveszik a start() különleges függvényt.

Amikor a kereskedő leválaszt egy Expert Advisort egy chartról, az ügyfélterminál egyszer elindítja a deinit() különleges függvényt. Ennek a függvénynek a végrehajtása nélkülözhetetlen egy EA helyes bezárásához. Működése alatt a program például létrehozhat grafikus tárgyakat és az ügyfélterminál globális változóit. Ezért a deinit() függvény kódja olyan programsorokat tartalmaz, amelynek végrehajtása a fölösleges objektumok és változók törlésével végződik. A deinit() különleges függvény végrehajtása után, a vezérlés visszatér az ügyfélterminálhoz.

A végrehajtott különleges függvények fordulhatnak az információkörnyezethez (a vékony kék nyilak a sémán) és hívhatnak felhasználói függvényeket (a vékony sárga nyilak). Jegyezzük meg: a különleges függvényeket végrehajtásra az ügyfélterminál hívja, a sorrendjük előre definiált: először az init(), azután a start() ismétlődő hívása és végül a deinit(). Azokat a feltételeket amelyek esetén az ügyfélterminál különleges függvényeket hív a Különleges függvények részben írjuk le.

Felhasználói függvények

Felhasználói függvényeket akkor hajtanak végre mikor valamely függvény egy felhasználói függvényhívást tartalmaz. Ebben az esetben vezérlés időlegesen átkerül a felhasználói függvénybe és miután a függvény végrehajtásának vége van, a vezérlés visszatér a hívás helyére (a vékony narancs nyíl a sémán). A felhasználói függvények hívása nem csak egy különleges függvény leírásából lehetséges, hanem egy másik felhasználói függvény leírásából is. A felhasználói függvények másik felhasználói függvényből történő hívása a programozásban megengedhető és széles körben használt módszer.

Felhasználói függvények végrehajtása nem hívható az ügyfélterminálból. Bármilyen felhasználói függvényt végrehajtható egy különleges függvény végrehajtása során és vezérlő utasításokat is küldhetnek vissza az ügyfélterminálra. Felhasználói függvények szintén használhatják az ügyfélterminál információs környezet változóinak értékeit (a vékony kék nyíl a sémán).

Ha egy program tartalmazza egy felhasználói függvény leírását, de ennek a függvénynek hívása nincs, ezt a felhasználói függvényt ki fogják hagyni a kész programból a fordításnál és nem fogja használni azt a program a működése során.

Figyelem!

Jegyezzük meg: a különleges függvényeket az ügyfélterminál hívja végrehajtásra. A felhasználói függvények végrehajtódnak, ha különleges függvényekből vagy egy másik felhasználói függvényből hívják, de soha nem hívja őket az ügyfélterminál. Kereskedelmi megbízást a különleges és a felhasználói függvény egyaránt tud adni.