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