Radu MetaTrader a blogja | További ingyenes és hasznos eszközök MetaTraderhez | Kérdésed merült fel? Kérdezz!
MQL4 Könyv tartalomjegyzék | Stratégiák programozása MetaTrader platformra | Fogalomtár | Gyakran Ismételt Kérdések

MQL4 Könyv   Az összetett programokról


Az összetett programok általános jellemzői

 

Nincs egyetlen formális jellemző, ami megkülönböztetné a szokásos és összetett programokat. Általánosságban elmondható, hogy a komplex programok pozitív módon különböznek az eszközök mennyisége és az információ feldolgozása alapján. A komplex programokat szinte csak az előnyös tulajdonságaikkal lehet jellemezni.

A programvégrehajtás rendje

 

A fő szabály az, hogy egy szokásos program kódját a különleges start() függvény tartalmazza, és azt az ügyfélterminál indítja el végrehajtásra. A legtöbb esetben a start() végrehajtási ideje lényegesen rövidebb mit a tickek közti távolság. Ez azt jelenti, hogy az idő legnagyobb részében a program vár egy tick érkezésére. Ezt a folyamatot a működés-szünet arányával jellemezhetjük. A start() Т1 végrehajtási ideje a 10-100 milliszekundum tartományban van, és a tickek közti  Т2 idő átlag 5 másodperc. Így, az EA szünet/működés aránya elérheti a Т2/Т1=1000-et vagy többet (lásd 159. ábrát). Ezért azt kell mondani, hogy egy szokásos EA hatásos működési kapacitása az egész idő 0,1 százaléka, az idő többi részében nem működik.

Némelyik EA összetett számításokat hajthat végre és a start() végrehajtási időtartama hosszabb lehet, és tíz másodpercekig is eltarthat. Ezekben az esetekben a start() függvény nem fog elindulni minden ticknél, hanem csak  azokon a tickeken, amik akkor jöttek, amikor a start() vár rájuk. A 159. ábrán azt az esetet láthatjuk, amikor a tick a start() függvény végrehajtási időszaka alatt érkezik (a t4 pillanatnál) és ez nem indítja el új különleges start()  függvény működését. Legközelebb a start() függvény a t5 pillanatnál fog kezdődni. Az aktuális start() függvény végrehajtás vége és a következő végrehajtásának a kezdete között e miatt szünet keletkezik.


159. ábra. A start() függvény szakaszos és ciklikus végrehajtása közötti különbség.

Van egy módszer, amellyel lényegesen növelni lehet a program hatékonyságát, miközben csökkentjük a működés/szünet arányát. Ezt egy olyan algoritmussal valósítjuk meg, amely szerint a fő kódot (végtelenül) sok alkalom hajtjuk végre a start() végrehajtás alatt (ez csak EA-ban és scriptekben megengedett). A példát az összehurkolt start() függvényről lent láthatjuk:

//--------------------------------------------------------------------
start() // Special function start()
{
while(!IsStopped()) // Until user..
{ // ..stops execution of the program
RefreshRates(); // Data renewal
//......................The main code of the program is specified here
Sleep(5); // Short pause
}
return; // Control is returned to the terminal
}
//--------------------------------------------------------------------

Az egész kódot a "while” ciklusoperátor testben helyezzük el, és az egyetlen mód, hogy kilépjünk a ciklusból, az ügyféltermináltól kapott parancs, hogy fejezze be a programvégrehajtást. Ha a start() függvényt (amire a bemutatott megoldást fölépítettük) egyszer elindítjuk, az végtelen sokáig fog működni, és az ügyfélterminálra a vezérlést csak akkor fogja visszaküldeni, amikor a felhasználó kézzel leválasztja az EA-t az ablakról, vagy néhány másik feltétel teljesül (lásd: Special Functions).

A start() függvényben a ciklus végrehajtása folyamatosan fut, ezért nincs olyan időszak, amikor a program tick váró üzemmódban van (lásd: 159. ábrát), ezzel az eljárással a működés/szünet  aránya egyenlő 1-gyel. Azt a start() függvényt, ami az ismertetett elven alapul, csak egyszer indítjuk el az ügyfélterminálban. Ezért az információ frissítéséhez (a piaci folyamatok követéséhez) minden ciklusban kötelező használni a RefreshRates() függvényt. Azért, hogy elkerüljük a rendszer túlterhelését, minden ciklus végén rövid szünetet kell beiktatni.

A ciklikus programok fejlesztése során sok figyelmet igényel az algoritmus megkomponálása. Például, egy kritikus hiba esetén a szokásos program megszakítja a start() függvény végrehajtását és a vezérlés  visszatér az ügyfélterminálhoz. Egy ciklikus program a vezérlést folyamatosan magánál tartja és minden lehetséges eseményre reagálnia kell, így a kereskedelem tiltására is. De a kereskedés ideiglenes tiltása nem gátolja a program végrehajtását. A működésének egész időszak alatt a programnak az elérhető információ egészét fel kell dolgoznia, a felhasználó beleavatkozásait is beleértve. Általában, egy ilyen program sokkal hatékonyabb egy szokásos programmal összehasonlítva.

Az elérhető eszközök

 

A ciklikus programok használatának csak akkor van értelme, ha a programvégrehajtás folytonosságát valóban kihasználjuk. Például egy ilyen program kontrolálhatja a kereskedő utasításait. A grafikus objektumok koordinátáinak a módosítását, vagy másik programok (scriptek és indikátorok) csatolását használhatjuk a beavatkozásra.

Egy egyszerű program néhány eseményre reagálhat (beleértve a felhasználó beavatkozását) és a különleges start() függvény végrehajtása főszabályként a legközelebbi ticknél indul. Azonban egy ciklikus program azonnal fel tud dolgozni minden eseményt (!). Ebben az esetben az események feldolgozásának  késleltetése rövidebb, mint a start() függvény egy ciklusának a végrehajtási ideje (majdnem mindig kevesebb, mint 10-100 ms).

Egy összetett programban arra használhatjuk a grafikus objektumokat, hogy bemutassuk a megbízások jellemző értékeit. Például minden típusú megbízást zöld vonallal jelölünk a charton, míg a stop értékeket piros vonalakkal. Ha egyidejűleg több megbízás van a képernyőn eléggé nehéz megkülönböztetni, hogy valamely vonal melyik megbízáshoz tartozik. De ha ezeknek a grafikus objektumoknak minden megbízás esetében különböző színt és/vagy vonalstílust adunk sokkal könnyebben eligazodunk a megbízások és stopszintjeik között.

Továbbá ezen objektumok koordinátáinak (kézzel történő) megváltoztatását a megbízás módosítására irányuló utasításként használhatjuk a programban. Például ha a felhasználó elmozdít fölfelé egy olyan vízszintes vonalat, ami egy függőben levő megbízást jelképez, ennek következtében a program küldhet a szerverre egy olyan kereskedelmi kérést, amelyben módosítja a megbízást (az előre beállított nyitó árat növeli az új értékre) (az azonnali végrehajtás miatt az összehurkolt program használata elengedhetetlen). Így egy összetett programmal lehetővé tehetjük a kereskedés egérrel történő végrehajtását.

Az összetett programokban olyan függvényeket is használhatunk, melyekkel külön-külön módosíthatjuk a stop megbízásokat vagy a függő megbízások nyitó árát. Ezekkel a függvényekkel létrehozhatunk a megbízást jelölő vonal közelében egy grafikus objektumot, például egy nyilat, amellyel jelezzük, hogy a függvény végrehajtása folyamatban van.

Grafikus objektumok segítségével megtervezheted a kereskedés menetét. Például, ha az aktuális ártól egy bizonyos távolságra elhelyezel egy „Pivot” jelet ezzel tájékoztatod a programot, hogy be kell zárni a megbízást és nyitni kell egy ellentétest, amikor a piaci ár a megadott szintet eléri. Hasonló módon módosíthatod a programban a limit szintet, a záró árat stb… Olyan grafikus objektumok használata, amelyek megjelenítik egy program beállításait, növelik a kereskedő tájékozottságát a jelenlegi és a megtervezett eseményekről.

Az eseményekkel kapcsolatos hangjelzéseket az összetett programokban szintén használhatunk. A hangjelzések használata a programban lehetővé teszik a kereskedőnek, hogy otthagyja a PC-t és a különböző hangjelzések alapján tájékozódjon az eseményekről (dallamok, lejátszott szöveg.. stb.).

A kereskedés hatékonysága nagyban függ a fontos gazdasági és politikai bejelentések időpontjának ismeretétől. A legtöbb bróker ellátja a kereskedőket a következő héten várható bejelentések időpontjának és a hírek jelentőségének listájával. A közelgő eseményekkel kapcsolatos információt egy fájlba írhatjuk. A működése során a program kiolvashatja az információt a fájlból és a közelgő esemény fontosságától függően különböző kereskedelmi forgatókönyveket hajthat végre. Például a program a függőben levő megbízásokat törölheti a fontos bejelentések előtt, a program befejezheti a kereskedést, módosíthatja a megbízások stop szintjeit stb. - bezárhat minden nyitott megbízást miközben előzetesen tájékoztatja a kereskedőt.

A műveletek automatizált és kézi végrehajtása

 

Egy összetett programot az események feldolgozásának összetettebb algoritmusa jellemez. Különösen ez a fajta program feltételezi, hogy a kereskedő valamilyen módon beavatkozik a kereskedés folyamatába. Például ha a kereskedési stratégia csak egy megbízást enged meg és a kereskedő nyit még egy megbízást, egy összetett program miután észleli ezt a fajta eseményt, elindítja egy olyan algoritmus végrehajtását, amely kezeli ezt a helyzetet. A program először a jogosulatlan beavatkozásról figyelmeztetheti a kereskedőt, és javasolhatja, hogy törölje ezt a rendellenes megbízást. Ha ez nem történik meg, a program (a beállításoktól függően) törölni tudja a rendellenes megbízást, vagy ki tud lépni az automatizált kereskedési módból, amiről előbb tájékoztatja a kereskedőt.

Ha egy program végrehajtását olyan esetben indítjuk, amikor már több nyitott vagy függő megbízásunk van, a beállításoktól függően különböző műveleteket hajthat végre. Például a program a kereskedő jóváhagyása nélkül bezárhat minden ellentétes megbízást. Ha a kereskedési stratégia nem engedi meg a függőben levő megbízásokat, meghatározott szempontok alapján törölheti ezeket – először a piaci árhoz a legközelebbit, aztán a legnagyobbat, stb.

Ha a kereskedő a stratégiája alapján beállítja a kötésméretet és a megbízások beállítandó stop szintjeit, a program (a piaci események folytonos felügyelete mellett) javaslatot tehet a kereskedőnek az automatizált kereskedő mód aktiválására, és ha a kereskedő ezzel egyetért, grafikus objektumok segítségével kiválaszthatja a végrehajtandó kereskedési forgatókönyvet.

Minden kereskedőnek megvan a saját kereskedési preferenciája. Néhány kereskedő csak automatizált kereskedést fojtat, míg mások a fél-automatizáltat, megint mások jobban szeretik a kézi módot. Egy helyesen tervezett programnak ki kell elégítenie minden követelményt, minden felhasználási módnak beállíthatónak kell lennie. Például a program kézi üzemmódban tanácsokat adhat – szöveges információt nyújthat, valamint grafikus objektumok segítségével jelezheti a trend irányt, mutathatja a támasz szinteket stb. A program kérhet engedélyt a kereskedőtől a megbízás nyitása előtt,  javaslatot tehet a kereskedőnek a kézi beavatkozásra (például a kézi stop módosításra) ha félautomata módban működik. Abban az esetben, ha a program mindenféle beavatkozás nélkül automatizált módban működik, bizonyos események bekövetkezésekor átválthat félautomata vagy kézi üzemmódra.

Egy program minden fent említett funkcióját megvalósíthatjuk a speciális MQL4 programnyelv segítségével, amit direkt erre a célra terveztek. Egy helyesen tervezett, összetett program kétségbe vonhatatlan előnye, hogy a kereskedő gyorsan hozzászokik a használatához a kereskedés során.