Errory při používání 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.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *