Errory při používání AOS (EA) (díl 12.)
V dnešním dílu se budeme zabývat errory v MQL4. V předchozích dílech jsme si ukázali, jak naprogramovat vlastní EA. Zatím jsme se setkali s errory přímo v kódu, které jsme odstraňovali, abychom vůbec mohli naší EA spustit. Bohužel tím, že se nám podaří odstranit všechny chyby v kódu to zcela nekončí. V reálném obchodování EA se setkáme s řadou dalších errorů, které budou souviset s trhem a jeho vývojem, kotací ceny apod. Zapneme EA, nastanou podmínky pro vstup do trhu, ale příkaz se neprovede.
Co s tím?
Nejprve musíme zjistit, co způsobilo chybu a pak ji můžeme zkusit odstranit. Každá chyba má jsou číselnou hodnotu, viz. následující tabulka:
| 
 Value  | 
 Constant  | 
 Description  | 
| 0 | ERR_NO_ERROR | No error returned. | 
| 1 | ERR_NO_RESULT | No error returned, but the result is unknown. | 
| 2 | ERR_COMMON_ERROR | Common error. | 
| 3 | ERR_INVALID_TRADE_PARAMETERS | Invalid trade parameters. | 
| 4 | ERR_SERVER_BUSY | Trade server is busy. | 
| 5 | ERR_OLD_VERSION | Old version of the client terminal. | 
| 6 | ERR_NO_CONNECTION | No connection with trade server. | 
| 7 | ERR_NOT_ENOUGH_RIGHTS | Not enough rights. | 
| 8 | ERR_TOO_FREQUENT_REQUESTS | Too frequent requests. | 
| 9 | ERR_MALFUNCTIONAL_TRADE | Malfunctional trade operation. | 
| 64 | ERR_ACCOUNT_DISABLED | Account disabled. | 
| 65 | ERR_INVALID_ACCOUNT | Invalid account. | 
| 128 | ERR_TRADE_TIMEOUT | Trade timeout. | 
| 129 | ERR_INVALID_PRICE | Invalid price. | 
| 130 | ERR_INVALID_STOPS | Invalid stops. | 
| 131 | ERR_INVALID_TRADE_VOLUME | Invalid trade volume. | 
| 132 | ERR_MARKET_CLOSED | Market is closed. | 
| 133 | ERR_TRADE_DISABLED | Trade is disabled. | 
| 134 | ERR_NOT_ENOUGH_MONEY | Not enough money. | 
| 135 | ERR_PRICE_CHANGED | Price changed. | 
| 136 | ERR_OFF_QUOTES | Off quotes. | 
| 137 | ERR_BROKER_BUSY | Broker is busy. | 
| 138 | ERR_REQUOTE | Requote. | 
| 139 | ERR_ORDER_LOCKED | Order is locked. | 
| 140 | ERR_LONG_POSITIONS_ONLY_ALLOWED | Long positions only allowed. | 
| 141 | ERR_TOO_MANY_REQUESTS | Too many requests. | 
| 145 | ERR_TRADE_MODIFY_DENIED | Modification denied because order too close to market. | 
| 146 | ERR_TRADE_CONTEXT_BUSY | Trade context is busy. | 
| 147 | ERR_TRADE_EXPIRATION_DENIED | Expirations are denied by broker. | 
| 148 | ERR_TRADE_TOO_MANY_ORDERS | The amount of open and pending orders has reached the limit set by the broker. | 
| 149 | ERR_TRADE_HEDGE_PROHIBITED | An attempt to open a position opposite to the existing one when hedging is disabled. | 
| 150 | ERR_TRADE_PROHIBITED_BY_FIFO | An attempt to close a position contravening the FIFO rule. | 
Abychom zjistili, k jaké chybě došlo, tak musíme do našeho kódu zaimplementovat následující podmínku.
Určitě si pamatujete, že když jsme „umísťovali“ příkaz do trhu, tak jsme použili proměnnou ticket = OrderSend(….). Pokud se příkaz z nějakého důvodu neprovede, tak proměnná ticket dosáhne hodnoty -1. A toho můžeme využít, proto hned za příkaz OrderSend dáme následující kód:
if (ticket==-1){err=GetLastError();Print(„Send error(„,err,“)_“,Text);
Zavedeme novou proměnou err a pokud ticket = -1 (tzn. že se příkaz OrderSend neprovedl správně), přiřadíme proměnné err hodnotu vzniklé chyby. Poté příkazem Print „vytiskneme“ číslo chyby tak, abychom věděli, k jaké chybě došlo. Pro přehlednost zadáváme do tisku následující texty: „Send error“ nebo text „Modify error“ či „Delete error“ abychom věděli, který typ příkazu způsobil chybu. Poté se vytiskne číslo chyby, tedy hodnota proměnné err a nakonec doplňujeme proměnnou Text, kterou používáme např. u příkazu OrderSend. Důvodem je to, že pokud máme spuštěno více EA najednou, tak potřebujeme vědět, u které EA/strategie chyba vznikla. Zápis chyby pak najdeme na záložce deník a zápis může vypadat takto:
Send error (129)_Gap system, nebo
Modify error (132)_SDS system(2) apod.
Takže hned vidíme, že chyba vznikla při zadávání příkazu u Gap systemu, nebo že došlo k chybě při modifikaci u SDS systemu apod.
Podívejme se na tuto podmínku a to, jak bychom jí mohli zaimplementovat do kódu.
V tomto článku bychom chtěli ještě upozornit na jednu chybu, která souvisí s tím, zda používáte 4 nebo 5-ti místného brokera. Na tento problém jsme narazili v době, kdy se začali objevovat brokeři, kteří kotovali cenu na 5 míst. Ačkoliv u 4-místného brokera můžete běžně cenu zadávat ve vazbě na Ask či Bid. Tzn. můžeme v příkazu v OrderSend zadat vstup do longu za Ask a PT stanovit na cenu Ask+PT a SL stanovit jako Ask-SL (tak, jak jsme si to ukazovali při tvorbě naší pokusné strategie v předchozích dílech). Tento zápis bude u 4-místného brokera bezproblémově fungovat, avšak u 5-ti místného ne. U 5-ti místného brokera nelze nastavit PT a SL odvozený od Bid a Ask ceny při vstupu. To znamená, že nejdřív se musí zadat příkaz na vstup za Bid (u short) nebo Ask (u longu) a následně příkaz modifikovat a zadat SL a PT.
Ukažme si to na následujícím kódu. Místo zápisu SL a PT dáme nuly a po zadání příkazu ho ihned zmodifikujeme:
Opět použijeme smyčku s příkazem for…, vyhledáme aktivní příkaz, který má magic number shodný s naší strategií a následně PT a SL upravíme pomocí příkazu Modify.
V příštím díle seriálu si ukážeme, jak naprogramovat jednoduchý indikátor.





