Nejčastější chyby a jejich řešení

Málokdy se podaří napsat funkční program hned na první pokus. Většinou je potřeba nejprve vyřešit chyby, případně varování, na které nás upozorní kompilátor. V tomto díle si představíme ty nejklasičtější a řekneme si, kde je jejich příčina a jak postupovat při jejich opravě. Na závěr se podíváme i na chyby, které vrací terminál nebo server brokera, tedy ve většině chyby při exekuci obchodních příkazů.

Chyby kompilátoru

Takto vypadá okno s výpisem logu kompilátoru. Okno se nachází v Panelu nástrojů MetaEditoru a při každé kompilaci na nás automaticky vyskočí. Řádky se znakem jednosměrky jsou chybami, které je třeba opravit před použitím programu. Dokud nebudou opraveny všechny chyby, nebude program možné ani spustit. Řádky se žlutým trojúhelníkem jsou potom varování, která nás upozorňují na možnou chybu nebo neefektivitu, ale program půjde i s nimi spustit. Poklepáním na řádek chyby/varování se kurzor přesune na místo chyby v kódu. Souřadnice jsou vypsány také ve sloupcích Řádek a Sloupec.

Následující skupina chyb obvykle znamená chybu v syntaxi. Předpokládáme, že syntax známe, proto se obvykle jedná o překlepy a nepozornosti, které se snadno vyřeší.

 

Jde o část kódu, kde kontrola očekává nějaký výraz nebo název, ale nenajde jej tam. Může se jednat třeba o zapomenutou čárku tam, kde má být název proměnné pro deklaraci:

 

Semicolon je anglicky středník, proto tuto chybu získáme v případě, že zapomeneme za nějakou operací napsat středník. Chyba však ovlivní celou strukturu programu (podobně jako když nenapíšeme tečku se z jedné věty v článku mohou stát náhle tři) a může proto způsobit lavinu dalších chyb, které po opravení této zmizí. Tyto základní chyby v syntaxi je proto vhodné opravovat jako první a ve směru shora.

 

Tato chyba se objevuje tam, kde program očekává operátor a nenajde jej tam. Například v této části kódu chybu způsobila neuzavřená závorka, kdy kontrola očekávala pokračování podmínky, ale narazila už na složenou závorku, která označuje začátek těla operátoru.

 

 

Důsledkem je i následující chyba, která upozorňuje právě na neuzavřenou závorku:

 

Můžete narazit také na následující sérii chyb:

 

 

Ta vznikne, pokud program v hlavičce operátoru nenajde podmínku. Tradičně se to stává třeba při záměně porovnávacího operátoru „==“ a přiřazovacího operátoru „=“. Pokud se nám to stane právě v hlavičce například operátoru if-else, z podmínky se stane operace a vznikne tato chyba. Vzhledem k podobnosti obou výrazů je často obtížné odhalit takto banální problém.

 

Tato chyba znamená nesprávný počet parametrů funkce. Pokud nevíme, co s tím, je vhodné se podívat do dokumentace na výčet parametrů (docs.mql4.com).

 

 

Tyto chyby označují chybnou vrácenou hodnotu funkce. První případ nastane, pokud funkce nevrací nic, přitom není typu void (tedy musí něco vrátit). Řešením je operátor return s hodnotou v závorce, např. return(lots); přičemž typ vracené hodnoty musí odpovídat typu funkce.

A naopak druhá chyba označuje případ, kdy nám funkce vrací hodnotu, přestože se jedná o typ void, který nic vracet nemá. Pak je řešením osamocený operátor return;.

Pokud return úplně chybí, dostaneme tuto chybu:

 

Tím program upozorňuje, že někde je v programu slepá ulička. Může to nastat právě při absenci operátoru return ve funkci, ale také třeba při následující situaci:

 

 

Funkce return je definována pro hodnotu proměnné buys větší než 0 a menší než -2. Co když bude ale buys rovno -2,-1 nebo 0? Taková akce není definována, a tak se opět program může dostat do slepé uličky.

Varování kompilátoru

Jak již bylo uvedeno, varování nevadí funkčnosti programu, upozorňují nás však na možné neefektivity programu, které občas ničemu nevadí, ale jindy mohou mít za následek jeho špatné fungování.

 

Toto upozornění se ukazuje, pokud používáme globální proměnné deklarované v hlavičce programu, ale zároveň nadeklarujeme stejný název proměnné uvnitř některé funkce. Deklarace uvnitř funkce potom nemá smysl, protože jak víme, globální proměnné jsou k dispozici všem funkcím programu.

 

Toto upozornění se týká především funkcí OrderSelect() a OrderSend() a znamená, že by měla být zkontrolována jejich vrácená hodnota. Obvykle se to řeší tak, že se funkce umístí do operátoru if a zkontroluje se, že třeba funkce OrderSend nevrací -1. Pokud totiž ano, znamená to, že otevření obchodu skončilo s chybou. Pak by bylo dobré se dozvědět, o jakou chybu se jednalo. To nám řekne jedině funkce GetLastError(). Chybový kód, který vrátí tato funkce je pak navíc třeba sdělit uživateli prostřednictvím funkcí Alert() nebo Print() apod. Dobrý příklad je v této části kódu:

 

 

 

 

V poslední kapitole si rozebereme právě nejčastější chybové kódy funkce GetLastError(). Většina z nich souvisí právě s prací obchodními pozicemi.

Chybové kódy funkce GetLastError()

Na tomto místě si uvedeme nejčastější chybové kódy, které dostáváme při práci s pozicemi prostřednictvím funkce GetLastError() a jejich řešení. Pro celý seznam chybových kódů navštivte stránku https://book.mql4.com/appendix/errors.

3 (Invalid trade parameters): označuje obvykle chybu v parametrech obchodní funkce, jako chybný počet nebo chybné hodnoty. Řešení lze obvykle nalézt v kontrole požadovaných parametrů v dokumentaci.

129 (Invalid price): chybná cena, je potřeba zkontrolovat parametr Price obchodní funkce. Klasicky bývá chyba v záměně ceny Bid a Ask nebo v použití ceny jiného instrumentu, než na kterém se pokoušíme operovat s pozicí.

130 (Invalid stops): chybné výstupní příkazy stoploss a/nebo takeprofit. Klasicky jde o jejich záměnu, kdy např. v případě otevření short se snažíme nastavit stoploss pod otevírací cenu, což samozřejmě nejde.

131 (Invalid trade volume): chybný objem pozice. Tradičně když se pokoušíme otevřít například mikrolot na instrumentu, kde je nejnižší možná velikost pozice minilot.

132 (Market is closed): chyba pokud se pokoušíme otevřít pozici mimo obchodní hodiny daného instrumentu.

133 (Trading is disabled): situace, kdy terminál nebo strategie nemají povoleno obchodování.

134 (Not enough money): nedostatečný margin pro otevření nové pozice.

135 (Price changed), 136 (Off quotes), 138 (Requote): všechny chyby se vyskytují v případě skluzů a gapů při plnění příkazu, které jsou mimo naši nastavenou úroveň tolerance.

145 (Modification denied because an order is too close to market): spolu s chybou 130 může nastat v případě, kdy se pokoušíme umístit stoploss nebo profittarget příliš blízko aktuální ceně. Limit, co je ještě blízko a co už ne je u každého brokera jiný. Limit aktuálního brokera lze zjistit pomocí funkce MarketInfo(MODE_STOPLEVEL).

Pokud si s chybou přece jen nebudeme vědět rady, vždy jsou k dispozici odkazy v tomto článku a případně také fórum komunity MQL (https://www.mql5.com/en/forum), kde vám s většinou dotazů poradí. Opět ale je potřeba umět anglicky nebo rusky.

Nemám chyby, program přesto nefunguje, jak má

Pokud jste vyřešili všechny chyby a varování kompilátoru i případné chyby, které vrací terminál nebo server brokera, stále nemusí program fungovat tak, jak byste si přáli. Třeba se ani nepokusí otevřít pozici tam, kde by podle vás měl. Jak postupovat v takovém případě? Předně je samozřejmě potřeba projít si znovu kód a zkontrolovat, jestli vše dává smysl. Pokud žádný problém neodhalíme, je potřeba testovat a zkoušet, dokud neodhalíme příčinu. Například pokud má za určitých podmínek otevřít pozici a neudělá to, musíme zkontrolovat, zda podmínky pro otevření skutečně byly splněny. K tomu je potřeba vyvolat proměnné, které v podmínce jsou, a to prostřednictvím funkcí Alert(), Comment() apod. před touto podmínkou. Jedině takto zjistíme, proč se program chová tak, jak se chová. Potom samozřejmě musíme dále pátrat po tom, proč je v určité proměnné hodnota jaká je a jak tam dostat tu správnou. Někdy jde o zdlouhavý a vyčerpávající proces, který nás ale zároveň vždy posune dál a do příště díky němu budeme vědět, na co si dát pozor.

Tento díl série je poslední. Série by měla stačit na pochopení základů jazyka a umožnit programovat základní programy i jednoduché obchodní systémy. Zároveň se čtenář dozvěděl i kde čerpat další informace, jak se orientovat v dokumentaci a jak řešit chyby. Další díly budou přibývat jako nadstavba série pro pokročilejší programátory.