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

0ERR_NO_ERRORNo error returned.
1ERR_NO_RESULTNo error returned, but the result is unknown.
2ERR_COMMON_ERRORCommon error.
3ERR_INVALID_TRADE_PARAMETERSInvalid trade parameters.
4ERR_SERVER_BUSYTrade server is busy.
5ERR_OLD_VERSIONOld version of the client terminal.
6ERR_NO_CONNECTIONNo connection with trade server.
7ERR_NOT_ENOUGH_RIGHTSNot enough rights.
8ERR_TOO_FREQUENT_REQUESTSToo frequent requests.
9ERR_MALFUNCTIONAL_TRADEMalfunctional trade operation.
64ERR_ACCOUNT_DISABLEDAccount disabled.
65ERR_INVALID_ACCOUNTInvalid account.
128ERR_TRADE_TIMEOUTTrade timeout.
129ERR_INVALID_PRICEInvalid price.
130ERR_INVALID_STOPSInvalid stops.
131ERR_INVALID_TRADE_VOLUMEInvalid trade volume.
132ERR_MARKET_CLOSEDMarket is closed.
133ERR_TRADE_DISABLEDTrade is disabled.
134ERR_NOT_ENOUGH_MONEYNot enough money.
135ERR_PRICE_CHANGEDPrice changed.
136ERR_OFF_QUOTESOff quotes.
137ERR_BROKER_BUSYBroker is busy.
138ERR_REQUOTERequote.
139ERR_ORDER_LOCKEDOrder is locked.
140ERR_LONG_POSITIONS_ONLY_ALLOWEDLong positions only allowed.
141ERR_TOO_MANY_REQUESTSToo many requests.
145ERR_TRADE_MODIFY_DENIEDModification denied because order too close to market.
146ERR_TRADE_CONTEXT_BUSYTrade context is busy.
147ERR_TRADE_EXPIRATION_DENIEDExpirations are denied by broker.
148ERR_TRADE_TOO_MANY_ORDERSThe amount of open and pending orders has reached the limit set by the broker.
149ERR_TRADE_HEDGE_PROHIBITEDAn attempt to open a position opposite to the existing one when hedging is disabled.
150ERR_TRADE_PROHIBITED_BY_FIFOAn 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 *