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.