MQL4 könyv   Egy szokásos program létrehozása  Hibafeldolgozó függvény

Hibafeldolgozó függvény

Azokat a hibákat, amelyek a kereskedelmi kérések végrehajtása alatt előfordulnak, két csoportba sorolhatjuk: nem kritikus hibák és kritikus hibák. A nem kritikus hibák azok, amelyek a szervernél történnek. Miután őket kiküszöbölték, továbbra is tudunk kereskedni. Például, egy kérést visszautasíthat a bróker, ha az aktuális árról pillanatnyilag nincs információja. Ez a helyzet létrejöhet egy lassú piacon, mikor a tickek ritkán érkeznek. Vagy éppen ellenkezőleg, a bróker azért nem tudja végrehajtani a megbízásokat, mert egy élénk piacon túl sok kereskedelmi kérést kap. Ilyenkor a megbízást késve, vagy egyáltalán nem hajtják végre. Ilyen esetben az Expert Advisor folytathatja a működését, és egy kicsit később megismételheti a kérést a hibakód feldolgozása után.

A kritikus hiba minden olyan hiba, ami lehetetlenné teszi a további kereskedést. Például, ha egy számlát zároltak, akkor nincs értelme kereskedelmi kéréseket küldeni. Ilyen esetben az EA-nak meg kell jelenítenie a megfelelő üzenetet és nem kell megismételnie a kérést. A hibafeldolgozó függvény használata nélkülözhetetlen egy szokásos EA-ban.

Errors() hibafeldolgozó felhasználói függvény

bool Errors( int Error )

A függvény visszaküldi a TRUE-t, ha a hiba nem kritikus. Különben visszaküldi a FALSE-t.
Az Error paraméternek lehet bármilyen értéke és egyezhet bármilyen hibakóddal, ami a kereskedelem során előfordul.

Az Errors() hibafeldolgozó felhasználói függvény az Errors.mqh inciude fájlban megvalósítva: 

//--------------------------------------------------------------------
// Errors.mqh
// The code should be used for educational purpose only.
//--------------------------------------------------------------- 1 --
// Error processing function.
// Returned values:
// true - if the error is overcomable (i.e. work can be continued)
// false - if the error is critical (i.e. trading is impossible)
//--------------------------------------------------------------- 2 --
bool Errors(int Error) // Custom function
 {
 // Error // Error number 
 if(Error==0)
 return(false); // No error
 Inform(15,Error); // Message
//--------------------------------------------------------------- 3 --
 switch(Error)
 { // Overcomable errors:
 case 129: // Wrong price
 case 135: // Price changed
 RefreshRates(); // Renew data
 return(true); // Error is overcomable
 case 136: // No quotes. Waiting for the tick to come
 while(RefreshRates()==false) // Before new tick
 Sleep(1); // Delay in the cycle
 return(true); // Error is overcomable
 case 146: // The trade subsystem is busy
 Sleep(500); // Simple solution
 RefreshRates(); // Renew data
 return(true); // Error is overcomable
 // Critical errors:
 case 2 : // Common error
 case 5 : // Old version of the client terminal
 case 64: // Account blocked
 case 133: // Trading is prohibited
 default: // Other variants
 return(false); // Critical error
 }
//--------------------------------------------------------------- 4 --
 }
//--------------------------------------------------------------------

Az Errors() hibafeldolgozó függvény algoritmusának létrehozása során fölmerül a kérdés: A függvénynek milyen értéket kell visszaküldenie, ha az adott paraméter értéke 0 (nincs hiba). Egy helyesen kódolt EA-ban ez a helyzet nem fordul elő. Azonban, a kód módosítása során néha lehet a hiba értéke 0 (ha olyankor hívjuk a függvényt, amikor valójában nincs hiba). Tehát ésszerű hozzáadni néhány sort a függvényhez a kód kezdetén (a 2-3 blokkban), arra az esetre, ha az Error változó nulla lenne.

Az Errors() függvény válasza az Error változó nulla értékére a hibafeldolgozó algoritmustól függ. Az Errors() függvény visszatérési értékét figyelembe veszi az EA a kereskedelmet végrehajtható függvényében. Ha az Errors() függvény visszatérési értéke 'true' (a hiba nem kritikus), akkor a program újra próbálkozik kereskedelem végrehajtásával. Ha ez az érték 'false' akkor a kereskedelmi függvény végrehajtása megszakad, és a vezérlés visszakerül a hívó függvénybe, azután a start() függvénybe, azután az ügyfélterminálra. Ha a visszaküldött érték kezelésének ez a két alternatívája van, akkor abban az esetben, amikor nincs hiba (Error=0), a második alternatívát kell választani, és 'false’ értéket kell visszaküldeni. Ez a garancia arra, hogy az egy egyszer végrehajtott kérés nem lesz megismételve.

Amint a hibáról az üzenetet megjeleníti az Inform() függvény, a vezérlés a 3-4 blokkba a 'switch' operátorhoz kerül. A  különböző hibakódok más ’case’ variáció végrehajtását eredményezik. Például, ha 136 hiba történik, ez azt jelenti, hogy a brókernek nincs információja az aktuális árról, ezért nem tud megfelelő döntést hozni. Ez a helyzet nem fog megváltozni, amíg nem jön egy új tick, úgyhogy fölösleges megismételni ugyanazt a kereskedelmi kérést, mert azt úgysem fogják végrehajtani. A helyes megoldás ebben az esetben a szünet tartása - az EA minden kezdeményezésének felfüggesztése. Egyszerű módszer egy új tick észlelésére a RefreshRates() függvény visszatérési értékének vizsgálata. A vezérlést vissza fogjuk küldeni a hívott függvénybe, amiben a kereskedelmi kérést megismételjük, (a megfelelő elemzés után, ha ez szükséges), amint az új tick érkezik.

Ha egy olyan hiba történik, amiről a programozó úgy véli, hogy kritikus hiba, a függvény visszatérési értéke 'false'. Ebben az esetben a kérést nem fogjuk megismételni, tehát szükségtelen bármit is tenni az Errors() függvényben. Minden hibát, amit nem dolgoztunk fel kritikus hibának tekintünk. Kiterjeszthetjük a feldolgozott hibák listáját (lásd:  Hibakódok).