\nVolume<\/a>[]<\/td>\n | Prom\u011bnn\u00e1 typu pole obsahuj\u00edc\u00ed objemy v\u0161ech sv\u00ed\u010dek na grafu<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n Po kliknut\u00ed na n\u00e1zev prom\u011bnn\u00e9 se dostanete na jej\u00ed podrobn\u00fd popis na str\u00e1nk\u00e1ch mql.com (v angli\u010dtin\u011b). Mo\u017en\u00e1 jste se pozastavili nad prom\u011bnn\u00fdmi typu pole. To je v\u0161ak natolik rozs\u00e1hl\u00e1 a d\u016fle\u017eit\u00e1 oblast, \u017ee j\u00ed bude v\u011bnov\u00e1na cel\u00e1 dal\u0161\u00ed kapitola. Nyn\u00ed je\u0161t\u011b kr\u00e1tce k rozd\u011blen\u00ed prom\u011bnn\u00fdch na glob\u00e1ln\u00ed a lok\u00e1ln\u00ed.<\/p>\n Glob\u00e1ln\u00ed vs. lok\u00e1ln\u00ed prom\u011bnn\u00e9<\/h3>\nZda je dan\u00e1 prom\u011bnn\u00e1 glob\u00e1ln\u00ed nebo lok\u00e1ln\u00ed z\u00e1vis\u00ed na tom, ve kter\u00e9 \u010d\u00e1sti programu je deklarov\u00e1na. Je-li prom\u011bnn\u00e1 deklarov\u00e1na v hlavi\u010dce k\u00f3du mimo t\u011bla ve\u0161ker\u00fdch funkc\u00ed (o struktu\u0159e programu jste \u010detli ve \u010dtvrt\u00e9m d\u00edle), jedn\u00e1 se o prom\u011bnnou glob\u00e1ln\u00ed. Takov\u00e1 prom\u011bnn\u00e1 je k dispozici v\u0161em funkc\u00edm programu \u2013 hlavn\u00edm i u\u017eivatelsk\u00fdm. Jin\u00fdmi slovy, lze ji pou\u017e\u00edt se stejn\u00fdm n\u00e1zvem i aktu\u00e1ln\u00ed hodnotou ve v\u0161ech \u010d\u00e1stech programu. Tento typ glob\u00e1ln\u00ed prom\u011bnn\u00e9 se ale nesmi zam\u011b\u0148ovat s glob\u00e1ln\u00edmi prom\u011bnn\u00fdmi dostupn\u00e9 dokonce pro cel\u00fd termin\u00e1l a v\u0161echny jeho dal\u0161\u00ed programy. S t\u011bmi se pracuje pomoc\u00ed sady funkc\u00ed. \u00a0Naopak lok\u00e1ln\u00ed prom\u011bnn\u00e1 je ka\u017ed\u00e1 prom\u011bnn\u00e1, kter\u00e1 je definov\u00e1na uvnit\u0159 n\u011bkter\u00e9 funkce. Ta je potom k dispozici pouze pro tuto funkci. Pokud ji pou\u017eijeme v jin\u00e9 funkci, nebude rozpozn\u00e1na, respektive kompil\u00e1tor to ozna\u010d\u00ed za chybu a donut\u00ed v\u00e1s ji opravit. V t\u00e9to jin\u00e9 funkci m\u016f\u017ee b\u00fdt klidn\u011b zavedena prom\u011bnn\u00e1 se stejn\u00fdm n\u00e1zvem, ale jej\u00ed hodnota se bude odv\u00edjet pouze od operac\u00ed v t\u00e9to funkci. Pokud pot\u0159ebujete p\u0159ev\u00e9st hodnotu n\u011bjak\u00e9 prom\u011bnn\u00e9 z jedn\u00e9 funkce do jin\u00e9, lze to prov\u00e9st pomoc\u00ed parametr\u016f vol\u00e1n\u00ed funkce. O nich ale a\u017e v kapitole o funkc\u00edch. Jak bylo \u0159e\u010deno v\u00fd\u0161e, v dal\u0161\u00ed kapitole problematiku prom\u011bnn\u00fdch je\u0161t\u011b roz\u0161\u00ed\u0159\u00edme o prom\u011bnn\u00e9 typu pole, kter\u00e9 se pou\u017e\u00edvaj\u00ed u tolik d\u016fle\u017eit\u00fdch p\u0159eddefinovan\u00fdch prom\u011bnn\u00fdch jako Open, High, Low, Close, Time a Volume.<\/p>\n Prom\u011bnn\u00e9 typu pole<\/h2>\nCo je to prom\u011bnn\u00e1 typu pole? Jak se indexuj\u00ed jej\u00ed hodnoty? V\u00a0\u010dem se li\u0161\u00ed deklarace a inicializace oproti norm\u00e1ln\u00ed prom\u011bnn\u00e9? Jak vyvol\u00e1m konkr\u00e9tn\u00ed hodnotu ze souboru hodnot? Pro\u010d takov\u00e9 prom\u011bnn\u00e9 existuj\u00ed a v\u00a0\u010dem mi usnadn\u00ed pr\u00e1ci?<\/em> Jednu celou kapitolu je pot\u0159eba vy\u010dlenit na prom\u011bnn\u00e9 typu pole, zvl\u00e1\u0161t\u011b pak na ty p\u0159eddefinovan\u00e9, kter\u00e9 jsou na\u0161t\u011bst\u00ed jejich nejjednodu\u0161\u0161\u00edm p\u0159\u00edpadem. Je tomu tak proto, \u017ee tyto prom\u011bnn\u00e9 jsou pou\u017e\u00edv\u00e1ny pro vyvol\u00e1n\u00ed charakteristick\u00fdch hodnot sv\u00ed\u010dek v grafu, kter\u00e9 jsou nutn\u00e9 pro tvorbu v\u011bt\u0161iny obchodn\u00edch syst\u00e9m\u016f a indik\u00e1tor\u016f.<\/p>\nProm\u011bnn\u00e1 typu pole obecn\u011b<\/h3>\nB\u011b\u017en\u00e1 prom\u011bnn\u00e1 v\u00a0sob\u011b m\u016f\u017ee sou\u010dasn\u011b n\u00e9st pouze jedinou hodnotu. Oproti tomu prom\u011bnn\u00e1 typu pole v\u00a0sob\u011b nese cel\u00fd indexovan\u00fd soubor hodnot, kter\u00fd nav\u00edc m\u016f\u017ee b\u00fdt a\u017e \u010dty\u0159rozm\u011brn\u00fd. D\u00edky index\u016fm posl\u00e9ze m\u016f\u017eeme vyvolat konkr\u00e9tn\u00ed hodnotu ze souboru, kterou zrovna pot\u0159ebujeme. V\u00a0jednom okam\u017eiku lze m\u00edt p\u0159\u00edstup pouze k\u00a0jedin\u00e9 z\u00a0hodnot souboru. \u010c\u00edm v\u00edce rozm\u011br\u016f m\u00e1 soubor, t\u00edm v\u00edce sou\u0159adnic index m\u00e1. Je to stejn\u00e9, jako kdy\u017e hled\u00e1me bod na dvourozm\u011brn\u00e9 plo\u0161e, t\u0159eba na map\u011b. Taky mus\u00edme zadat zem\u011bpisnou d\u00e9lku a \u0161\u00ed\u0159ku. Kdy\u017e ale hled\u00e1me bod v\u00a0t\u0159\u00edrozm\u011brn\u00e9m prostoru, pot\u0159ebujeme u\u017e sou\u0159adnice t\u0159i. Oproti zem\u011bpisn\u00fdm sou\u0159adnic\u00edm by to mohlo b\u00fdt t\u0159eba je\u0161t\u011b patro budovy. Hezky to ilustruje obr\u00e1zek ze str\u00e1nek mql.com:<\/p>\n  Obr\u00e1zek a) ilustruje jednorozm\u011brn\u00fd soubor hodnot prom\u011bnn\u00e9 typu pole, b) dvourozm\u011brn\u00fd a c) t\u0159\u00edrozm\u011brn\u00fd. Pro \u00fa\u010dely t\u00e9to s\u00e9rie n\u00e1m bude na\u0161t\u011bst\u00ed sta\u010dit pr\u00e1ce s jednorozm\u011brn\u00fdmi soubory.<\/p><\/div>\n Deklarace a inicializace<\/h3>\nDeklarace prom\u011bnn\u00e9 typu pole se oproti b\u011b\u017en\u00e9 deklaraci li\u0161\u00ed jen v\u00a0jedn\u00e9 v\u011bci. Oproti datov\u00e9mu typu a n\u00e1zvu prom\u011bnn\u00e9 mus\u00ed b\u00fdt uveden je\u0161t\u011b po\u010det hodnot souboru, a to v\u00a0hranat\u00fdch z\u00e1vork\u00e1ch. Inicializace prob\u00edh\u00e1 rovn\u011b\u017e jen m\u00edrn\u011b odli\u0161n\u011b. Chceme-li soubor hodnot vlo\u017eit ru\u010dn\u011b, provedeme to jejich v\u00fd\u010dtem ve slo\u017een\u00fdch z\u00e1vork\u00e1ch. int Rada[4] = {9,8,7,6}; Takto jsme nadeklarovali jednorozm\u011brnou prom\u011bnnou Rada celo\u010d\u00edseln\u00e9ho typu, kter\u00e1 obsahuje hodnoty 1, 2, 3 a 4. Indexace prob\u00edh\u00e1 zleva doprava od nuly. Konkr\u00e9tn\u00ed hodnota je pozd\u011bji v\u00a0programu vyvol\u00e1na n\u00e1zvem \u0159ady a indexem v\u00a0hranat\u00e9 z\u00e1vorce. Vysledek = Rada[1]; Po proveden\u00ed tohoto p\u0159i\u0159azen\u00ed nabude prom\u011bnn\u00e1 Vysledek hodnoty 8, jeliko\u017e hodnota prom\u011bnn\u00e9 Rada s\u00a0indexem 1 je 8 (prvn\u00ed hodnota, tedy 9, m\u00e1 index 0). Ru\u010dn\u00ed deklarace v\u0161ak nen\u00ed moc praktick\u00e1 hlavn\u011b pro obrovsk\u00e9 soubory hodnot a moc se nepou\u017e\u00edv\u00e1. \u0160ikovn\u011bj\u0161\u00ed zp\u016fsob inicializace prom\u011bnn\u00e9 typu pole tkv\u00ed v\u00a0cyklech. Ty n\u00e1s \u010dekaj\u00ed a\u017e v\u00a0d\u00edle o oper\u00e1torech, ale p\u0159esto si pro ilustraci uk\u00e1\u017eeme, jak by takov\u00e1 inicializace mohla vypadat. for (x = 0; x < Bars; x++) { Rada[x] = (High[x]+Low[x])\/2 } V\u00a0tomto p\u0159\u00edpad\u011b poslou\u017e\u00ed cyklus for, kter\u00fd funguje tak, \u017ee z\u00a0hlavi\u010dky (z\u00e1vorka naho\u0159e) vezme prvn\u00ed v\u00fdraz (x = 0), provede iteraci cyklu (exekuuje k\u00f3d uveden\u00fd ve slo\u017een\u00fd z\u00e1vorce), potom provede t\u0159et\u00ed v\u00fdraz v\u00a0kulat\u00e9 z\u00e1vorce (x++, co\u017e je x+1), provede dal\u0161\u00ed iteraci cyklu a takto postupuje st\u00e1le dokola, dokud je spln\u011bna podm\u00ednka ve druh\u00e9m v\u00fdrazu kulat\u00e9 z\u00e1vorky (x < Bars). O prom\u011bnn\u00e9 Bars jsme si ji\u017e \u0159\u00edkali \u2013 jedn\u00e1 se o po\u010det sv\u00ed\u010dek v\u00a0grafu. Jak vid\u00edme, ka\u017ed\u00e1 iterace je provedena s\u00a0x vy\u0161\u0161\u00edm o jednu hodnotu a posledn\u00ed iterace je provedena pro x = Bars-1, proto\u017ee posl\u00e9ze ji\u017e nen\u00ed spln\u011bna podm\u00ednka druh\u00e9ho v\u00fdrazu. P\u0159i ka\u017ed\u00e9 iteraci cyklu je hodnot\u011b prom\u011bnn\u00e9 Rada s\u00a0indexem x p\u0159i\u0159azena hodnota, kter\u00e1 vyplyne z\u00a0rovnice (High[x]+Low[x])\/2, co\u017e nen\u00ed nic jin\u00e9ho, ne\u017e pr\u016fm\u011br High a Low sv\u00ed\u010dky s\u00a0indexem x. V\u00fdsledkem tedy bude jednorozm\u011brn\u00e1 prom\u011bnn\u00e1 typu pole \u201eRada\u201c, kter\u00e1 v\u00a0sob\u011b bude obsahovat soubor pr\u016fm\u011br\u016f high a low v\u0161ech sv\u00ed\u010dek v\u00a0grafu. T\u00edm se kr\u00e1sn\u011b dost\u00e1v\u00e1me k\u00a0velice d\u016fle\u017eit\u00e9 problematice\u00a0takzvan\u00fdch \u010dasov\u00fdch \u0159ad a jejich indexaci.<\/p>\n P\u0159eddefinovan\u00e9 prom\u011bnn\u00e9 \u010dasov\u00fdch \u0159ad<\/h3>\nJak jsme si \u0159ekli u\u017e v\u00a0minul\u00e9m d\u00edle, jazyk MQL obsahuje n\u011bkolik p\u0159eddefinovan\u00fdch prom\u011bnn\u00fdch, kter\u00e9 nen\u00ed t\u0159eba deklarovat ani inicializovat. N\u011bkter\u00e9 z\u00a0nich jsou typu pole, a p\u0159edev\u0161\u00edm pro n\u011b vznikl tento d\u00edl. Pro jistotu v\u00a0n\u00e1sleduj\u00edc\u00ed tabulce zopakuji, o jak\u00e9 prom\u011bnn\u00e9 se jedn\u00e1.<\/p>\n \n\n\nProm\u011bnn\u00e1<\/strong><\/td>\nHodnota<\/strong><\/td>\n<\/tr>\n\nTime<\/a><\/strong><\/td>\n\u010casy otev\u0159en\u00ed v\u0161ech sv\u00ed\u010dek grafu<\/td>\n<\/tr>\n | \nOpen<\/a><\/strong><\/td>\nOtev\u00edrac\u00ed ceny v\u0161ech sv\u00ed\u010dek grafu<\/td>\n<\/tr>\n | \nHigh<\/a><\/strong><\/td>\nNejvy\u0161\u0161\u00ed ceny v\u0161ech sv\u00ed\u010dek grafu<\/td>\n<\/tr>\n | \nLow<\/a><\/strong><\/td>\nNejni\u017e\u0161\u00ed ceny v\u0161ech sv\u00ed\u010dek grafu<\/td>\n<\/tr>\n | \nClose<\/a><\/strong><\/td>\nZav\u00edrac\u00ed ceny v\u0161ech sv\u00ed\u010dek grafu<\/td>\n<\/tr>\n | \nVolume<\/a><\/strong><\/td>\nObjemy v\u0161ech sv\u00ed\u010dek grafu<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n Seznam je v\u00e1m dost mo\u017en\u00e1 pov\u011bdom\u00fd. Pokud toti\u017e v\u00a0Metatraderu v\u00a0grafu najedete kurzorem my\u0161i na konkr\u00e9tn\u00ed sv\u00ed\u010dku, zobraz\u00ed se tooltip pr\u00e1v\u011b s t\u011bmito jej\u00edmi specifiky. Stejn\u00e1 specifika tak\u00e9 sou\u010dasn\u011b vid\u00edte na stavov\u00e9m \u0159\u00e1dku vpravo. D\u00edky t\u011bmto prom\u011bnn\u00fdm m\u016f\u017eeme v\u00a0k\u00f3du snadno vyvolat hodnotu jak\u00e9hokoliv z\u00a0t\u011bchto specifik jak\u00e9koliv sv\u00ed\u010dky na grafu, kde je program spu\u0161t\u011bn. Jak hodnotu vyvolat u\u017e v\u00edme, te\u010f pot\u0159ebujeme jen v\u011bd\u011bt, na z\u00e1klad\u011b jak\u00e9ho kl\u00ed\u010de se tyto hodnoty sv\u00ed\u010dek indexuj\u00ed. Indexace sv\u00ed\u010dek prob\u00edh\u00e1 od nuly vzestupn\u011b zprava. To znamen\u00e1, \u017ee aktu\u00e1ln\u00ed \u00fase\u010dka, kter\u00e1 se pr\u00e1v\u011b vytv\u00e1\u0159\u00ed, m\u00e1 index 0. Posledn\u00ed hotov\u00e1 \u00fase\u010dka m\u00e1 index 1 atd. V\u0161e ilustruje n\u00e1sleduj\u00edc\u00ed obr\u00e1zek a tabulka:<\/p>\n <\/p>\n
<\/p>\n
Na obr\u00e1zku je minutov\u00fd graf, kde \u010d\u00edsla nad sv\u00ed\u010dkami odpov\u00eddaj\u00ed jej\u00edm index\u016fm. V tabulce jsou potom konkr\u00e9tn\u00ed specifika sv\u00ed\u010dek s dan\u00fdmi indexy. Z obr\u00e1zku a tabulky plyne, \u017ee chceme-li z\u00edskat nap\u0159\u00edklad otev\u00edrac\u00ed cenu aktu\u00e1ln\u00ed sv\u00ed\u010dky, pot\u0159ebujeme hodnotu Open[0], kter\u00e1 je aktu\u00e1ln\u011b 1,54370. Volume sv\u00ed\u010dky s indexem 19 – Volume[19] m\u00e1 aktu\u00e1ln\u00ed hodnotu 82 a podobn\u011b. Pokud se vr\u00e1t\u00edme k p\u0159\u00edkladu v\u00fd\u0161e s prom\u011bnnou Rada a aplikujeme jej na tuto konkr\u00e9tn\u00ed situaci, pak po proveden\u00ed tohoto v\u00fdrazu Rada[2] = (High[2]+Low[2])\/2 Bude do prom\u011bnn\u00e9 Rada s indexem 2 ulo\u017eena hodnota (1,54352 + 1,54324)\/2 = 1,54338. S t\u00edmto typem prom\u011bnn\u00fdch se setk\u00e1me v t\u00e9to s\u00e9rii je\u0161t\u011b mnohokr\u00e1t, tak\u017ee pokud jste t\u00e9matu pln\u011b neporozum\u011bli, nevad\u00ed, v praxi bude v\u0161e jasn\u011bj\u0161\u00ed.<\/p>\n Oper\u00e1tory I<\/h2>\nCo jsou to oper\u00e1tory? K \u010demu jsou pot\u0159eba? Jak\u00e9 oper\u00e1tory rozli\u0161ujeme?<\/em> Dle definice jsou oper\u00e1tory \u010d\u00e1sti programu, kter\u00e9 obsahuj\u00ed p\u0159edpis konverze dat ur\u010ditou metodou za ur\u010dit\u00fdch podm\u00ednek. Tato definice n\u00e1m ale asi p\u0159\u00edli\u0161 ne\u0159ekne, a tak jsem op\u011bt pro nezdr\u017eov\u00e1n\u00ed zbyte\u010dnou teori\u00ed a p\u0159ejit\u00ed rovnou ke konkr\u00e9tn\u00edm oper\u00e1tor\u016fm a jejich v\u00fdznamu pro program. Analogicky by se oper\u00e1tory daly p\u0159irovnat k\u00a0v\u011bt\u00e1m a odstavc\u016fm, jestli\u017ee cel\u00fd k\u00f3d je \u010dl\u00e1nek. Ka\u017ed\u00fd oper\u00e1tor m\u00e1 sv\u016fj specifick\u00fd \u00fakol. Nap\u0159\u00edklad p\u0159i\u0159azovac\u00ed oper\u00e1tor dan\u00fd znakem \u201e=\u201c m\u00e1 za \u00fakol p\u0159i\u0159adit ur\u010ditou hodnotu dan\u00e9 prom\u011bnn\u00e9. Podm\u00ednkov\u00e9 oper\u00e1tory maj\u00ed za \u00fakol rozhodovat o pravd\u011b nebo nepravd\u011b ur\u010dit\u00e9ho v\u00fdrazu a podle toho konat nebo nekonat dal\u0161\u00ed akce. Cyklick\u00e9 oper\u00e1tory zase opakuj\u00ed exekuci stejn\u00e9ho k\u00f3du dle zadan\u00fdch ur\u010dit\u00fdch podm\u00ednek. Jednoduch\u00e9 oper\u00e1tory jako s\u010d\u00edt\u00e1n\u00ed, p\u0159i\u0159azov\u00e1n\u00ed, porovn\u00e1v\u00e1n\u00ed atd. u\u017e zn\u00e1me z\u00a0minul\u00e9ho d\u00edlu, tento proto bude v\u011bnov\u00e1n p\u0159edev\u0161\u00edm t\u011bm slo\u017een\u00fdm, jejich\u017e pochopen\u00ed je kl\u00ed\u010dov\u00e9 pro tvorbu efektivn\u00edch program\u016f.<\/p>\nJednoduch\u00fd vs. slo\u017een\u00fd<\/h3>\nJednoduch\u00fd oper\u00e1tor je ukon\u010den\u00fd st\u0159edn\u00edkem. D\u00edky st\u0159edn\u00edku po\u010d\u00edta\u010d pozn\u00e1, kde kon\u010d\u00ed jeden oper\u00e1tor (jedna operace) a za\u010d\u00edn\u00e1 dal\u0161\u00ed. Dle analogie z\u00a0prvn\u00edho odstavce je to tedy pomysln\u00e1 jednoduch\u00e1 v\u011bta. P\u0159\u00edkladem m\u016f\u017ee b\u00fdt zmi\u0148ovan\u00e9 p\u0159i\u0159azen\u00ed hodnoty, vol\u00e1n\u00ed funkce, se\u010dten\u00ed dvou hodnot apod. V\u011bt\u0161inu operac\u00ed, kter\u00e9 prov\u00e1d\u00edme pomoc\u00ed jednoduch\u00fdch oper\u00e1tor\u016f, jsme ji\u017e shrnuli v\u00a0minul\u00e9m d\u00edle. Na dal\u0161\u00ed se pod\u00edv\u00e1me pozd\u011bji. Naproti tomu slo\u017een\u00fd oper\u00e1tor lze p\u0159irovnat k\u00a0cel\u00e9mu odstavci. D\u011bl\u00ed se na takzvanou hlavi\u010dku (nezam\u011b\u0148ovat s hlavi\u010dkou cel\u00e9ho k\u00f3du)\u00a0a t\u011blo oper\u00e1toru. V\u00a0hlavi\u010dce jsou definov\u00e1ny vlastnosti oper\u00e1toru \u2013 obvykle se jedn\u00e1 o podm\u00ednky, za kter\u00fdch se\u00a0bude exekuovat t\u011blo. T\u011blo je slo\u017eeno v\u011bt\u0161inou z\u00a0n\u011bkolika jednoduch\u00fdch oper\u00e1tor\u016f odd\u011blen\u00fdch st\u0159edn\u00edkem (v\u011bty odstavce). Cel\u00e9 t\u011blo je potom ulo\u017eeno ve slo\u017een\u00fdch z\u00e1vork\u00e1ch tak, aby program poznal, kde skupina oper\u00e1tor\u016f p\u0159idru\u017een\u00e1 hlavi\u010dce za\u010d\u00edn\u00e1 a kon\u010d\u00ed. Mezi nejpou\u017e\u00edvan\u011bj\u0161\u00ed oper\u00e1tory pat\u0159\u00ed podm\u00ednkov\u00e9 a cyklick\u00e9. Slo\u017een\u00e9 oper\u00e1tory jsou v\u00a0programu vyzna\u010deny jasn\u011b modrou barvou, podobn\u011b jako zkratky datov\u00fdch typ\u016f. Ve zbytku tohoto d\u00edlu a v\u00a0d\u00edle dal\u0161\u00edm si p\u0159edstav\u00edme a vysv\u011btl\u00edme v\u0161echny hlavn\u00ed oper\u00e1tory.<\/p>\n Podm\u00ednkov\u00fd oper\u00e1tor if-else<\/h3>\nOper\u00e1tor if-else je nejpou\u017e\u00edvan\u011bj\u0161\u00edm slo\u017een\u00fdm oper\u00e1torem. Pomoc\u00ed n\u011bho m\u016f\u017eeme vytvo\u0159it rozhodovac\u00ed mechanismus, kter\u00fd vykon\u00e1 n\u011bjakou akci (n\u00e1mi zadanou skupinu operac\u00ed), pokud je spln\u011bna ur\u010dit\u00e1 podm\u00ednka a p\u0159\u00edpadn\u011b vykon\u00e1 jinou akci, pokud tato podm\u00ednka spln\u011bna nen\u00ed. Obecn\u011b m\u00e1 oper\u00e1tor if-else n\u00e1sleduj\u00edc\u00ed tvar: if (\u201epodm\u00ednka\u201c) { blok oper\u00e1tor\u016f k vypln\u011bn\u00ed, pokud je podm\u00ednka spln\u011bna; } else { blok oper\u00e1tor\u016f k vypln\u011bn\u00ed, pokud podm\u00ednka spln\u011bna nen\u00ed; } \u00a0 Rozli\u0161ujeme t\u0159i struktury podm\u00ednkov\u00e9ho oper\u00e1toru if-else podle toho, jak\u00e9 \u010d\u00e1sti obsahuje. N\u00ed\u017ee jsou v\u0161echny p\u0159edstaveny na jednoduch\u00e9m p\u0159\u00edkladu. Za\u010dneme z\u00e1kladn\u00edm typem. if (Bid > Level) { Alert(„Cena p\u0159ekro\u010dila stanovenou \u00farove\u0148“); Level = 0; } else { Print(\u201eCena dosud stanovenou \u00farove\u0148 nep\u0159ekro\u010dila\u201c); } Prvn\u00ed \u0159\u00e1dek, tedy if (Bid > Level) p\u0159edstavuje hlavi\u010dku. V z\u00e1vorce za identifik\u00e1torem if je zad\u00e1na podm\u00ednka, kter\u00e1 bude oper\u00e1torem nejprve vyhodnocena. V tomto p\u0159\u00edpad\u011b mus\u00ed rozhodnout, zda plat\u00ed, \u017ee aktu\u00e1ln\u00ed cena Bid je vy\u0161\u0161\u00ed ne\u017e hodnota prom\u011bnn\u00e9 Level. Pokud tomu tak je a podm\u00ednka je tedy spln\u011bna, vykon\u00e1 se blok operac\u00ed ve slo\u017een\u00e9 z\u00e1vorce pod hlavi\u010dkou. V na\u0161em p\u0159\u00edpad\u011b se exekuuje funkce Alert, kter\u00e1 traderovi zobraz\u00ed prost\u0159ednictv\u00edm dialogu upozorn\u011bn\u00ed s textem um\u00edst\u011bn\u00fdm v z\u00e1vorce a hodnota prom\u011bnn\u00e9 Level se nastav\u00ed na nulu. Ob\u011b operace mus\u00ed kon\u010dit st\u0159edn\u00edkem. Pokud podm\u00ednka spln\u011bna nen\u00ed, tedy pokud je cena Bid ni\u017e\u0161\u00ed nebo rovna hodnot\u011b prom\u011bnn\u00e9 Level, vykon\u00e1 se blok operac\u00ed ve slo\u017een\u00e9 z\u00e1vorce za identifik\u00e1torem else. V tomto p\u0159\u00edpad\u011b vykon\u00e1 pouze funkci Print, kter\u00e1 zap\u00ed\u0161e z\u00e1znam do programov\u00e9ho logu (z\u00e1lo\u017eka Den\u00edk v termin\u00e1lu). Z\u00e1znam odpov\u00edd\u00e1 zadan\u00e9mu parametru funkce, kter\u00fd se vepisuje do z\u00e1vorky. Tvar oper\u00e1toru if-else m\u016f\u017ee ale \u010d\u00e1st else \u00fapln\u011b postr\u00e1dat. if (Bid > Level) { Alert(„Cena p\u0159ekro\u010dila stanovenou \u00farove\u0148“); Level = 0; } V tomto p\u0159\u00edpad\u011b by byl postup stejn\u00fd v p\u0159\u00edpad\u011b spln\u011bn\u00ed podm\u00ednky, ale odli\u0161n\u00fd v p\u0159\u00edpad\u011b, \u017ee by podm\u00ednka spln\u011bna nebyla. Z d\u016fvodu absence \u010d\u00e1sti oper\u00e1toru else nen\u00ed d\u00e1no, co m\u00e1 program v takov\u00e9m p\u0159\u00edpad\u011b d\u011blat. Nebude proto d\u011blat nic, respektive bude pokra\u010dovat v exekuci dal\u0161\u00edho k\u00f3du, a\u0165 u\u017e n\u00e1sleduje za oper\u00e1torem cokoliv. Nakonec existuje je\u0161t\u011b jednodu\u0161\u0161\u00ed tvar: if (Bid > Level)\u00a0 Alert(„Cena p\u0159ekro\u010dila stanovenou \u00farove\u0148“); Exekuce je zde takov\u00e1, \u017ee pokud je podm\u00ednka v hlavi\u010dce spln\u011bna, vykon\u00e1 se funkce Alert. V\u0161imn\u011bme si ale, \u017ee zde chyb\u00ed slo\u017een\u00e9 z\u00e1vorky. Nyn\u00ed u\u017e je v\u00e1m asi jasn\u00fd jejich v\u00fdznam. Podle slo\u017een\u00fdch z\u00e1vorek oper\u00e1tor pozn\u00e1, co v\u0161echno m\u00e1 exekuovat. Pokud slo\u017een\u00e9 z\u00e1vorky nejsou, exekuuje se pouze prvn\u00ed operace, dal\u0161\u00ed jsou z hlediska exekuce ji\u017e mimo t\u011blo oper\u00e1toru a vyhodnocen\u00ed podm\u00ednky na n\u011b nem\u00e1 vliv.<\/p>\n Cyklick\u00fd oper\u00e1tor while<\/h3>\nWhile je jednodu\u0161\u0161\u00edm ze dvou cyklick\u00fdch oper\u00e1tor\u016f. Jeho \u00fa\u010delem je vykon\u00e1vat blok oper\u00e1tor\u016f st\u00e1le dokola, dokud je spln\u011bna zadan\u00e1 podm\u00ednka. Obecn\u011b je jeho tvar takov\u00fdto: while (\u201epodm\u00ednka\u201c) { blok oper\u00e1tor\u016f k vypln\u011bn\u00ed; } Podm\u00ednka je op\u011bt zad\u00e1na v\u00a0z\u00e1vorce v\u00a0hlavi\u010dce. N\u00e1sleduje blok oper\u00e1tor\u016f um\u00edst\u011bn\u00fd ve slo\u017een\u00fdch z\u00e1vork\u00e1ch. Ten se exekuuje neust\u00e1le dokola, dokud je podm\u00ednka v\u00a0hlavi\u010dce spln\u011bna. Jedna exekuce cyklu se naz\u00fdv\u00e1 iterace<\/strong>. Kontrola podm\u00ednky je provedena na konci ka\u017ed\u00e9 iterace. Pokud je spln\u011bna, exekuuje se znovu, pokud u\u017e nen\u00ed, blok se p\u0159esko\u010d\u00ed a pokra\u010duje se v\u00a0n\u00e1sleduj\u00edc\u00edm k\u00f3du programu. P\u0159\u00edklad je uveden pod oper\u00e1torem for, kter\u00fdm lze oper\u00e1tor while ve v\u011bt\u0161in\u011b p\u0159\u00edpad\u016f nahradit.<\/p>\nCyklick\u00fd oper\u00e1tor for<\/h3>\nfor (V\u00fdraz1; \u201epodm\u00ednka\u201c; V\u00fdraz2) { blok oper\u00e1tor\u016f k vypln\u011bn\u00ed; } V\u00a0hlavi\u010dce tentokr\u00e1t najdeme t\u0159i v\u00fdrazy odd\u011blen\u00e9 st\u0159edn\u00edkem. P\u0159i exekuci tohoto oper\u00e1toru nejd\u0159\u00edve program vykon\u00e1 V\u00fdraz 1, tedy vlevo v\u00a0hlavi\u010dce. Pot\u00e9 vykon\u00e1 blok oper\u00e1tor\u016f ve slo\u017een\u00fdch z\u00e1vork\u00e1ch, p\u0159i\u010dem\u017e na konci ka\u017ed\u00e9 iterace vykon\u00e1 V\u00fdraz2, kter\u00fd je v\u00a0hlavi\u010dce \u00fapln\u011b vpravo. Iterace vykon\u00e1v\u00e1 neust\u00e1le dokola, dokud je spln\u011bna podm\u00ednka, kter\u00e1 je um\u00edst\u011bna uprost\u0159ed hlavi\u010dky. Na n\u00e1sleduj\u00edc\u00edm p\u0159\u00edklad\u011b si uk\u00e1\u017eeme, \u017ee oper\u00e1tory while a for jsou vz\u00e1jemn\u011b nahraditeln\u00e9. Srovnejte tuto \u010d\u00e1st k\u00f3du s\u00a0oper\u00e1torem while:<\/p>\n <\/p>\n
\u2026a tuto \u010d\u00e1st s\u00a0oper\u00e1torem for:<\/p>\n <\/p>\n
Kdy\u017e si pozorn\u011b projdete tyto dva bloky k\u00f3du, m\u011bli byste doj\u00edt k z\u00e1v\u011bru, \u017ee ob\u011b \u010d\u00e1sti k\u00f3du se exekuuj\u00ed s naprosto stejn\u00fdm v\u00fdsledkem. Ob\u011b \u010d\u00e1sti za\u010dnou deklarac\u00ed prom\u011bnn\u00e9 x a p\u0159i\u0159azen\u00ed hodnoty 1. Pak se vykon\u00e1v\u00e1 blok operac\u00ed neust\u00e1le dokola, p\u0159i\u010dem\u017e na konci ka\u017ed\u00e9 iterace je hodnota x zv\u00fd\u0161ena o 1. Iteruje se do t\u00e9 doby, dokud plat\u00ed, \u017ee x je men\u0161\u00ed ne\u017e hodnota prom\u011bnn\u00e9 PocetUsecek. Tak\u00e9 byste m\u011bli doj\u00edt k tomu, \u017ee hodnota prom\u011bnn\u00e9 Soucet bude na konci rovna pr\u016fm\u011bru high a low v\u0161ech sv\u00ed\u010dek grafu, co\u017e je c\u00edlem obou blok\u016f k\u00f3du. Na p\u0159\u00edkladech mimo jin\u00e9 vid\u00edme, pro\u010d se v praxi \u010dast\u011bji pou\u017e\u00edv\u00e1 oper\u00e1tor for. Tv\u00e1\u0159\u00ed se sice slo\u017eit\u011bji, ale je prakti\u010dt\u011bj\u0161\u00ed a \u00fasporn\u011bj\u0161\u00ed na m\u00edsto. To byly nejv\u00fdznamn\u011bj\u0161\u00ed oper\u00e1tory, bez kter\u00fdch se \u017e\u00e1dn\u00fd program\u00e1tor neobejde. V p\u0159\u00ed\u0161t\u00ed kapitole si uk\u00e1\u017eeme zb\u00fdvaj\u00edc\u00ed oper\u00e1tory, aby byl jejich v\u00fd\u010det kompletn\u00ed, a nakousneme posledn\u00ed z\u00e1sadn\u00ed kapitolu, kterou je t\u0159eba probrat, ne\u017e se pust\u00edme do praktick\u00e9ho programov\u00e1n\u00ed – funkce.<\/p>\n Operace<\/h2>\nCo je to operace? Jak\u00e9 jsou druhy operac\u00ed? Jak\u00e9 operace m\u016f\u017eeme v\u00a0k\u00f3du pou\u017e\u00edvat? Jak to, \u017ee operace X = X + 2 je v\u00a0po\u0159\u00e1dku?<\/em> Tato kapitola by m\u011bla b\u00fdt pro v\u011bt\u0161inu z v\u00e1s sp\u00ed\u0161e odpo\u010dinkov\u00e1. Je pot\u0159eba si ujasnit, jak\u00e9 operace m\u016f\u017eeme v MQL k\u00f3du pou\u017e\u00edvat a jak\u00fdm zp\u016fsobem. \u0158ekneme si taky o n\u011bkter\u00fdch specific\u00edch, kter\u00e1 nejsou \u00fapln\u011b intuitivn\u00ed, pokud s programov\u00e1n\u00edm za\u010d\u00edn\u00e1te. Tv\u016frci jazyka MQL d\u011bl\u00ed operace do sedmi kategori\u00ed, my si prozat\u00edm vysta\u010d\u00edme se \u010dty\u0159mi hlavn\u00edmi. Jsou to operace, kter\u00e9 pov\u011bt\u0161inou zn\u00e1te ze z\u00e1kladn\u00ed a st\u0159edn\u00ed \u0161koly. Je v\u0161ak pot\u0159eba ujasnit n\u011bkter\u00e9 jejich vlastnosti.<\/p>\nAritmetick\u00e9<\/h3>\nHned prvn\u00ed kategorie operac\u00ed je v\u0161em dob\u0159e zn\u00e1m\u00e1. P\u0159i prov\u00e1d\u011bn\u00ed v\u00fdpo\u010dt\u016f m\u016f\u017eeme pou\u017e\u00edvat aritmetick\u00fdch symbol\u016f tak, jak to zn\u00e1me ze \u0161koly, tedy + pro s\u010d\u00edt\u00e1n\u00ed, – pro od\u010d\u00edt\u00e1n\u00ed, * pro n\u00e1soben\u00ed a \/ pro d\u011blen\u00ed. Jsou tu jen t\u0159i specifika, kter\u00e1 ze \u0161koly nezn\u00e1me. Symbol % jako\u017eto symbol operace vrac\u00ed zbytek po d\u011blen\u00ed a d\u00e1le se hodn\u011b vyu\u017e\u00edvaj\u00ed symboly ++ a –, kter\u00e9 sn\u00ed\u017e\u00ed, respektive zv\u00fd\u0161\u00ed prom\u011bnnou o 1. Pro jistotu je\u0161t\u011b mal\u00e1 tabulka:<\/p>\n \n\n\nSymbol<\/strong><\/td>\nOperace<\/strong><\/td>\nP\u0159\u00edklad<\/strong><\/td>\nAnalogie<\/strong><\/td>\n<\/tr>\n\n%<\/td>\n | Zbytek po d\u011blen\u00ed<\/td>\n | minuta = \u010das % 60<\/td>\n | <\/td>\n<\/tr>\n | \n++<\/td>\n | Zv\u00fd\u0161en\u00ed hodnoty prom\u011bnn\u00e9 o 1<\/td>\n | y++<\/td>\n | y = y + 1<\/td>\n<\/tr>\n | \n—<\/td>\n | Sn\u00ed\u017een\u00ed hodnoty prom\u011bnn\u00e9 o 1<\/td>\n | y–<\/td>\n | y = y – 1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\nP\u0159i\u0159azovac\u00ed<\/h3>\nP\u0159i\u0159azovac\u00edmi operacemi m\u011bn\u00edme\u00a0hodnotu prom\u011bnn\u00e9. D\u011bje se to klasicky prost\u0159ednictv\u00edm symbolu =.\u00a0Nyn\u00ed upozorn\u00edm na jeden neintuitivn\u00ed rys programov\u00e1n\u00ed, se kter\u00fdm se za\u010d\u00e1te\u010dn\u00edci ob\u010das nemohou sm\u00ed\u0159it. V\u00fdraz A = B + C v\u00a0k\u00f3du neozna\u010duje rovnici. Pokud by tomu tak bylo, pak by v\u00fdraz X = X + 2 byl nesmysln\u00fd. To v\u0161ak nen\u00ed. Jeliko\u017e symbol = ozna\u010duje p\u0159i\u0159azovac\u00ed operaci, nikoli symbol rovnosti,\u00a0program si v\u00fdraz vylo\u017e\u00ed jako \u201eprom\u011bnn\u00e9 X p\u0159i\u0159a\u010f v\u00fdraz X+2\u201c. Pokud tedy X p\u0159ed vykon\u00e1n\u00edm t\u00e9to operace je 2, po n\u00ed bude 4. Pokud bude operace vykon\u00e1na znovu, pak nov\u00e9 X bude 6. A tak d\u00e1le. Toto pravidlo se uplat\u0148uje v\u00a0n\u00e1sleduj\u00edc\u00ed tabulce p\u0159i\u0159azovac\u00edch operac\u00ed.<\/p>\n \n\n\nSymbol<\/strong><\/td>\nOperace<\/strong><\/td>\nP\u0159\u00edklad<\/strong><\/td>\nAnalogie<\/strong><\/td>\n<\/tr>\n\n=<\/td>\n | P\u0159i\u0159azen\u00ed hodnoty prom\u011bnn\u00e9 x prom\u011bnn\u00e9 y<\/td>\n | \u0443 = x<\/td>\n | <\/td>\n<\/tr>\n | \n+=<\/td>\n | Zv\u00fd\u0161en\u00ed hodnoty y o x<\/td>\n | \u0443 += x<\/td>\n | y = y + x<\/td>\n<\/tr>\n | \n-=<\/td>\n | Sn\u00ed\u017een\u00ed hodnoty y o x<\/td>\n | y -= x<\/td>\n | y = y – x<\/td>\n<\/tr>\n | \n*=<\/td>\n | Zn\u00e1soben\u00ed hodnoty y x-kr\u00e1t<\/td>\n | y *= x<\/td>\n | y = y * x<\/td>\n<\/tr>\n | \n\/=<\/td>\n | D\u011blen\u00ed hodnoty y hodnotou prom\u011bnn\u00e9 x<\/td>\n | y \/= x<\/td>\n | y = y \/ x<\/td>\n<\/tr>\n | \n%=<\/td>\n | Zbytek po d\u011blen\u00ed y prom\u011bnnou x<\/td>\n | y %= x<\/td>\n | y = y % x<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\nRela\u010dn\u00ed<\/h3>\nRela\u010dn\u00ed neboli porovn\u00e1vac\u00ed operace vyu\u017e\u00edv\u00e1me k\u00a0porovn\u00e1n\u00ed hodnot dvou a v\u00edce prom\u011bnn\u00fdch. Vyu\u017eit\u00ed najdou p\u0159edev\u0161\u00edm v\u00a0hlavi\u010dk\u00e1ch slo\u017een\u00fdch oper\u00e1tor\u016f, kter\u00fdm se budeme v\u011bnovat od p\u0159\u00ed\u0161t\u00edho d\u00edlu. V\u011bt\u0161inu symbol\u016f op\u011bt zn\u00e1me ze \u0161koln\u00edch lavic, jin\u00e9 jsou ryze z\u00a0program\u00e1torsk\u00e9ho sv\u011bta. V tabulce\u00a0vid\u00edte, \u017ee symbol rovnosti\u00a0je ==, m\u00edsto o\u010dek\u00e1van\u00e9ho =, kter\u00e9 symbolizuje operaci p\u0159i\u0159azen\u00ed. Pozor na z\u00e1m\u011bnu t\u011bchto dvou symbol\u016f, jedn\u00e1 se o velmi \u010dastou chybu, kter\u00e1 se ale ne v\u017edy snadno odhaluje.<\/p>\n \n\n\nSymbol<\/strong><\/td>\nOperace<\/strong><\/td>\nP\u0159\u00edklad<\/strong><\/td>\n<\/tr>\n\n==<\/td>\n | Pravda, pokud x je rovno y<\/td>\n | x == y<\/td>\n<\/tr>\n | \n!=<\/td>\n | Pravda, pokud x nen\u00ed rovno y<\/td>\n | x != y<\/td>\n<\/tr>\n | \n<<\/td>\n | Pravda, pokud je x men\u0161\u00ed ne\u017e y<\/td>\n | x < y<\/td>\n<\/tr>\n | \n><\/td>\n | Pravda, pokud je x v\u011bt\u0161\u00ed ne\u017e y<\/td>\n | x > y<\/td>\n<\/tr>\n | \n<=<\/td>\n | Pravda, pokud je x men\u0161\u00ed nebo rovno y<\/td>\n | x <= y<\/td>\n<\/tr>\n | \n>=<\/td>\n | Pravda, pokud je x v\u011bt\u0161\u00ed nebo rovno y<\/td>\n | x >= y<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\nLogick\u00e9 (Boolean)<\/h3>\nO logick\u00fdch neboli booleanovsk\u00fdch operac\u00edch jste pravd\u011bpodobn\u011b sly\u0161eli na \u0161kole st\u0159edn\u00ed. Op\u011bt se pou\u017eij\u00ed hlavn\u011b u slo\u017een\u00fdch oper\u00e1tor\u016f. Jsou to tyto t\u0159i:<\/p>\n \n\n\nSymbol<\/strong><\/td>\nOperace<\/strong><\/td>\nP\u0159\u00edklad<\/strong><\/td>\nPopis<\/strong><\/td>\n<\/tr>\n\n!<\/td>\n | NOT (negace)<\/td>\n | \u0445!=0<\/td>\n | Pravda, pokud x nen\u00ed rovno 0<\/td>\n<\/tr>\n | \n||<\/td>\n | OR (disjunkce)<\/td>\n | x < 5 || x > 7<\/td>\n | Pravda, pokud plat\u00ed, \u017ee x < 5 NEBO x > 7<\/td>\n<\/tr>\n | \n&&<\/td>\n | AND (konjunkce)<\/td>\n | x == 3 && y < 5<\/td>\n | Pravda , pokud plat\u00ed, \u017ee x je rovno 3 A Z\u00c1ROVE\u0147 y < 5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n V\u00fd\u010det z\u00e1kladn\u00edch operac\u00ed je t\u00edmto pro n\u00e1s hotov\u00fd. Je\u0161t\u011b dod\u00e1m, \u017ee operac\u00ed je rovn\u011b\u017e vol\u00e1n\u00ed funkc\u00ed, tu si v\u0161ak rozebereme, a\u017e budeme m\u00edt za sebou funkce.<\/p>\n Oper\u00e1tory II<\/h2>\nV p\u0159edchoz\u00ed kapitole jsme si uk\u00e1zali z\u00e1kladn\u00ed oper\u00e1tory, bez kter\u00fdch se neobejde t\u00e9m\u011b\u0159 \u017e\u00e1dn\u00fd program. \u0160lo o podm\u00ednkov\u00fd oper\u00e1tor if-else a dva cyklick\u00e9 oper\u00e1tory while a for. V t\u00e9to kapitole se zam\u011b\u0159\u00edme na zb\u00fdvaj\u00edc\u00ed, m\u016f\u017eeme \u0159\u00edci m\u00e9n\u011b d\u016fle\u017eit\u00e9 oper\u00e1tory a ud\u011bl\u00e1me prvn\u00ed \u00favod do funkc\u00ed.<\/em><\/p>\nOper\u00e1tory break a continue<\/h3>\nOper\u00e1tory break a continue se pou\u017e\u00edvaj\u00ed v\u00fdhradn\u011b uvnit\u0159 cyklick\u00fdch oper\u00e1tor\u016f. Lze je tedy pou\u017e\u00edt pouze ve spojen\u00ed se slo\u017een\u00fdmi oper\u00e1tory while, for a switch. Oba oper\u00e1tory pat\u0159\u00ed mezi jednoduch\u00e9, sta\u010d\u00ed tedy jen napsat jejich n\u00e1zev a za n\u011bj um\u00edstit st\u0159edn\u00edk. Break m\u00e1 za \u00fakol \u201en\u00e1siln\u011b\u201c ukon\u010dit \u010dinnost cyklick\u00e9ho oper\u00e1toru. Vyu\u017eije se nap\u0159\u00edklad v\u00a0p\u0159\u00edpad\u011b, \u017ee je za n\u011bjak\u00e9 podm\u00ednky vhodn\u00e9 cyklick\u00fd oper\u00e1tor ukon\u010dit d\u0159\u00edve, ne\u017e se podm\u00ednka jeho \u010dinnosti stane neplatn\u00e1. Nap\u0159\u00edklad v\u00a0t\u00e9to \u010d\u00e1sti k\u00f3du je exekuce oper\u00e1toru for ukon\u010dena v p\u0159\u00edpad\u011b, \u017ee je v historii pozic nalezena pozice, kter\u00e1 odpov\u00edd\u00e1 zadan\u00fdm krit\u00e9ri\u00edm. Bez oper\u00e1toru break by cyklus pokra\u010doval v proch\u00e1zen\u00ed seznamu historick\u00fdch pozic a\u017e do konce, co\u017e ale nen\u00ed pot\u0159eba. Takto se \u010dinnost oper\u00e1toru ukon\u010d\u00ed ihned po nalezen\u00ed hledan\u00e9 pozice, co\u017e je mnohem efektivn\u011bj\u0161\u00ed.<\/p>\n <\/p>\n
Oper\u00e1tor continue pro zm\u011bnu ukon\u010duje pouze exekuci jedn\u00e9 iterace cyklu. Pou\u017eijeme ho v\u00a0p\u0159\u00edpad\u011b, kdy chceme za n\u011bjak\u00e9 podm\u00ednky vypustit exekuci zb\u00fdvaj\u00edc\u00ed \u010d\u00e1sti cyklu a p\u0159ej\u00edt rovnou k\u00a0dal\u0161\u00ed iteraci. M\u016f\u017eeme op\u011bt uv\u00e9st \u010d\u00e1st k\u00f3du, kde se tento oper\u00e1tor vyskytuje.<\/p>\n <\/p>\n
Tento \u0159\u00e1dek \u0159\u00edk\u00e1, \u017ee pokud je p\u00e1tek a z\u00e1rove\u0148 v\u00edce ne\u017e 23 hodin nebo sobota nebo ned\u011ble a z\u00e1rove\u0148 m\u00e9n\u011b ne\u017e 22 hodin, tak program nap\u00ed\u0161e do horn\u00ed lev\u00e9 \u010d\u00e1sti grafu „Neobchoduje se, neaktualizuje se“ a ukon\u010d\u00ed iteraci cyklu a p\u0159ejde na dal\u0161\u00ed iteraci. Tento \u0159\u00e1dek by m\u011bl smysl nap\u0159\u00edklad ve speci\u00e1ln\u00ed funkci OnTimer(), kter\u00e1 se vykon\u00e1v\u00e1 periodicky. Pokud by byly spln\u011bny podm\u00ednky, tedy pokud by \u010das byl mimo obchodn\u00ed hodiny, nem\u011blo by smysl v iteraci pokra\u010dovat a p\u0159e\u0161lo by se k dal\u0161\u00ed. Takto by program \u0161et\u0159il mnoho zdroj\u016f do doby, ne\u017e by se obchodovat za\u010dalo.<\/p>\n Oper\u00e1tor return<\/h3>\nReturn je zcela z\u00e1sadn\u00ed jednoduch\u00fd oper\u00e1tor u funkc\u00ed. V\u011bt\u0161ina funkc\u00ed vrac\u00ed ur\u010ditou hodnotu. Kterou hodnotu m\u00e1 funkce vr\u00e1tit ur\u010duje pr\u00e1v\u011b oper\u00e1tor return. Uk\u00e1zku uvid\u00edme hned\u00a0v n\u00e1sleduj\u00edc\u00edm odstavci a p\u0159edev\u0161\u00edm pak v n\u00e1sleduj\u00edc\u00edm d\u00edle.<\/p>\n Oper\u00e1tor switch<\/h3>\nOper\u00e1tor switch m\u00e1 za \u00fakol zjednodu\u0161it pr\u00e1ci tam, kde by rozhodovac\u00ed mechanismus vy\u017eadoval p\u0159\u00edli\u0161 velk\u00e9 mno\u017estv\u00ed podm\u00ednkov\u00fdch oper\u00e1tor\u016f. V hlavi\u010dce nap\u00ed\u0161eme prom\u011bnnou, jej\u00ed\u017e hodnota ovlivn\u00ed dal\u0161\u00ed \u010dinnost oper\u00e1toru. N\u00e1sledn\u011b rozep\u00ed\u0161eme, co m\u00e1 program ud\u011blat v p\u0159\u00edpadech, \u017ee bude hodnota prom\u011bnn\u00e9 rovna n\u011bjak\u00e9 hodnot\u011b.<\/p>\n <\/p>\n
Tento p\u0159\u00edklad oper\u00e1toru switch, kter\u00fd je sou\u010d\u00e1st\u00ed u\u017eivatelsk\u00e9\u00a0funkce, m\u00e1 za \u00fakol rozhodnout, jakou hodnotu funkce vr\u00e1t\u00ed\u00a0v z\u00e1vislosti na\u00a0hodnot\u011b prom\u011bnn\u00e9 „typ“. Z praktick\u00e9ho hlediska se jedn\u00e1 o oper\u00e1tor, kter\u00fd pojmenuje typ pozice. Typy pozice jsou toti\u017e v MQL zak\u00f3dov\u00e1ny indexy od 0 do 7. Kter\u00fd typ pozice index ozna\u010duje, je vid\u011bt v na\u0161em p\u0159\u00edkladu. Switch funguje tak, \u017ee zjist\u00ed hodnotu prom\u011bnn\u00e9 „typ“ a pot\u00e9 vyhled\u00e1 tuto hodnotu za v\u00fdrazem „case“. Kdy\u017e ji najde, vykon\u00e1 sadu oper\u00e1tor\u016f za dvojte\u010dkou ve stejn\u00e9m \u0159\u00e1dku (v tomto p\u0159\u00edpad\u011b vr\u00e1t\u00ed n\u00e1zev typu pozice). Pokud ji nenajde, vezme sadu oper\u00e1tor\u016f za v\u00fdrazem „default“. Ka\u017ed\u00fd \u0159\u00e1dek je ukon\u010den oper\u00e1torem break, proto\u017ee je jasn\u00e9, \u017ee jakmile switch na\u0161el po\u017eadovan\u00fd \u0159\u00e1dek, nen\u00ed t\u0159eba hledat d\u00e1l.<\/p>\n Funkce a vol\u00e1n\u00ed na funkci<\/h2>\nV p\u0159edchoz\u00edch kapitol\u00e1ch jsme si ji\u017e p\u0159edstavili z\u00e1kladn\u00ed typy funkc\u00ed, kter\u00e9 v programech vyu\u017e\u00edv\u00e1me. Jsou to funkce speci\u00e1ln\u00ed, kter\u00e9 nemohou chyb\u011bt v \u017e\u00e1dn\u00e9m programu, d\u00e1le funkce standardn\u00ed neboli p\u0159eddefinovan\u00e9 a funkce u\u017eivatelsk\u00e9. Nejprve se budeme v\u011bnovat obecn\u00e9mu \u00favodu do problematiky funkc\u00ed, d\u00e1le se pod\u00edv\u00e1me na funkce standardn\u00ed, bl\u00ed\u017ee si rozebereme obchodn\u00ed funkce a nakonec je\u0161t\u011b u\u017eivatelsk\u00e9.<\/em><\/p>\nFunkce<\/h3>\nFunkce obecn\u011b je \u010d\u00e1st k\u00f3du, kter\u00e1 m\u00e1 za \u00fakol p\u0159edepsan\u00fdm zp\u016fsobem vy\u0159e\u0161it n\u011bjak\u00fd probl\u00e9m nebo zad\u00e1n\u00ed a obvykle vr\u00e1tit ur\u010ditou hodnotu. Obecn\u00fd tvar funkce vypad\u00e1 n\u00e1sledovn\u011b: int Moje_funkce(double par1, string par2, int par3) { blok ur\u010den\u00fd k\u00a0exekuci \u2013 t\u011blo funkce return(vracena_hodnota); } Prvn\u00ed \u0159\u00e1dek se ozna\u010duje jako hlavi\u010dka a v\u00a0n\u00ed je definov\u00e1n datov\u00fd typ funkce, kter\u00fd odpov\u00edd\u00e1 datov\u00e9mu typu vr\u00e1cen\u00e9 hodnoty (v tomto p\u0159\u00edpad\u011b int, tedy cel\u00e9 \u010d\u00edslo), n\u00e1sledn\u011b n\u00e1zev funkce a v\u00a0z\u00e1vorce seznam parametr\u016f s\u00a0p\u0159\u00edslu\u0161n\u00fdmi datov\u00fdmi typy. N\u00e1sleduj\u00ed slo\u017een\u00e9 z\u00e1vorky a v\u00a0nich ulo\u017een\u00e9 t\u011blo funkce, tedy jej\u00ed samotn\u00e1 podstata \u2013 skupina oper\u00e1tor\u016f, operac\u00ed,\u00a0dal\u0161\u00edch funkc\u00ed atd. V\u00a0t\u011ble mus\u00ed b\u00fdt um\u00edst\u011bn oper\u00e1tor return a za n\u00edm v\u00a0z\u00e1vorce hodnota, kterou m\u00e1 funkce vr\u00e1tit (nejedn\u00e1-li se o funkci typu void). Oper\u00e1tor return slou\u017e\u00ed z\u00e1rove\u0148 i jako ukon\u010den\u00ed funkce, po kter\u00e9m kontrola funkci opou\u0161t\u00ed a vrac\u00ed se do p\u016fvodn\u00edho k\u00f3du. V\u011bt\u0161ina funkc\u00ed pracuje se vstupy, takzvan\u00fdmi parametry, kter\u00e9 j\u00ed mus\u00edme zadat. Parametry se zad\u00e1vaj\u00ed za n\u00e1zev funkce do z\u00e1vorky, odd\u011bluj\u00ed se \u010d\u00e1rkou.\u00a0Parametr umo\u017e\u0148uje p\u0159evod n\u011bjak\u00e9 hodnoty prom\u011bnn\u00e9 z okoln\u00edho k\u00f3du dovnit\u0159 funkce, aby s n\u00ed mohla\u00a0pracovat.\u00a0Nap\u0159\u00edklad takto vypad\u00e1 hlavi\u010dka funkce se dv\u011bma parametry. double Podil(double zisk_dny, int ztrat_dny) Jsou ale i funkce, kter\u00e9 \u017e\u00e1dn\u00e9 parametry pro svou pr\u00e1ci nepot\u0159ebuj\u00ed. V\u00a0z\u00e1vorce prost\u011b nebudou m\u00edt nic, ale samotn\u00e1 z\u00e1vorka tam b\u00fdt mus\u00ed, aby program poznal, \u017ee jde o hlavi\u010dku funkce a nikoli o prom\u011bnnou. Takov\u00e1 funkce m\u016f\u017ee vypadat n\u00e1sledovn\u011b:<\/p>\n <\/p>\n
Jde o funkci, kter\u00e1 v historii vyhled\u00e1 pozice s typem 5 a v\u00edce, co\u017e jsou deposity a v\u00fdb\u011bry. Jejich hodnoty se\u010dte, ulo\u017e\u00ed do prom\u011bnn\u00e9 Kapit\u00e1l a tuto vr\u00e1t\u00ed. Na funkci lze\u00a0nahl\u00ed\u017eet t\u0159eba jako na tisk\u00e1rnu.\u00a0Pot\u0159ebuje vstupy – parametry (tonery, pap\u00edr, elekt\u0159inu) a v\u00fdstupem bude vyti\u0161t\u011bn\u00fd dokument. U funkce je v\u00fdstupem n\u011bjak\u00e1 z\u00edskan\u00e1 hodnota – \u010d\u00edslo, text, kter\u00fdkoliv z\u00a0p\u0159\u00edpustn\u00fdch datov\u00fdch typ\u016f, kter\u00e9 jsme rozeb\u00edrali v\u00a0p\u00e1t\u00e9m d\u00edle. Datov\u00fd typ, kter\u00fd funkce vrac\u00ed, ur\u010duje datov\u00fd typ cel\u00e9 funkce. Oboj\u00ed mus\u00ed b\u00fdt v\u00a0souladu. Stejn\u011b jako existuj\u00ed funkce, kter\u00e9 nepot\u0159ebuj\u00ed vstupy, existuj\u00ed i funkce, kter\u00e9 nevracej\u00ed \u017e\u00e1dnou hodnotu. \u0158\u00edk\u00e1 se jim funkce typu \u201evoid\u201c. Jejich \u00fa\u010delem potom nen\u00ed vr\u00e1tit hodnotu, ale exekuce samotn\u00e1. Jde nap\u0159\u00edklad o hojn\u011b vyu\u017e\u00edvanou standardn\u00ed funkci Alert(), kter\u00e1 v\u00a0termin\u00e1lu zobraz\u00ed upozorn\u011bn\u00ed se zadan\u00fdm textem. Jako takov\u00e1 ale nevrac\u00ed do k\u00f3du\u00a0\u017e\u00e1dnou hodnotu. Mezi funkce typu void pat\u0159\u00ed mimochodem i speci\u00e1ln\u00ed funkce OnDeinit() nebo t\u0159eba OnTick(). I tak ale funkce typu void mohou obsahovat oper\u00e1tor return. Ten se hod\u00ed t\u0159eba v\u00a0p\u0159\u00edpad\u011b, \u017ee je vhodn\u00e9 za ur\u010dit\u00e9 podm\u00ednky funkci ukon\u010dit d\u0159\u00edve, tedy kdy\u017e za ur\u010dit\u00e9 podm\u00ednky nen\u00ed pot\u0159eba funkci d\u00e1le exekuovat (je to vlastn\u011b analogie s\u00a0oper\u00e1torem break v\u00a0cyklu). Jen za t\u00edmto oper\u00e1torem bude chyb\u011bt z\u00e1vorka s\u00a0vracenou hodnotou. Op\u011bt neu\u0161kod\u00ed p\u0159\u00edklad s\u00a0\u010d\u00e1st\u00ed funkce:<\/p>\n <\/p>\n
Toto je uk\u00e1zka z p\u0159\u00edkladov\u00e9ho obchodn\u00edho syst\u00e9mu Moving Average, kter\u00fd je sou\u010d\u00e1st\u00ed ka\u017ed\u00e9ho MetaEditoru. \u0158\u00e1dky 138 a 139 jednodu\u0161e \u0159\u00edkaj\u00ed, \u017ee pokud je na grafu m\u00e9n\u011b ne\u017e 100 sv\u00ed\u010dek nebo je zak\u00e1z\u00e1no automatick\u00e9 obchodov\u00e1n\u00ed, funkce OnTick m\u00e1 b\u00fdt ukon\u010dena (a kontrola tedy m\u00e1 b\u00fdt p\u0159ed\u00e1na funkci OnDeinit a program ukon\u010den). Funkce obsahuje ka\u017ed\u00fd program. Pokud ne jin\u00e9, tak speci\u00e1ln\u00ed ur\u010dit\u011b. O speci\u00e1ln\u00edch funkc\u00edch jako\u017eto tahounech ve\u0161ker\u00e9 exekuce jsme ji\u017e napsali mnoho. Dod\u00e1m jen, \u017ee z v\u00fd\u0161e uveden\u00e9ho by v\u00e1m m\u011blo vyplynout, \u017ee cel\u00fd program je vlastn\u011b jedna velk\u00e1 funkce vzhledem k tomu, \u017ee ve\u0161ker\u00e1 \u010d\u00e1st, kter\u00e1 se exekuuje (tedy v\u0161e krom\u011b hlavi\u010dky programu), se odehr\u00e1v\u00e1 uvnit\u0159 speci\u00e1ln\u00edch funkc\u00ed.<\/p>\n Vol\u00e1n\u00ed na funkci (function call)<\/h3>\nAby program v\u011bd\u011bl, kdy m\u00e1 funkci exekuovat, je pot\u0159eba se je\u0161t\u011b sezn\u00e1mit s\u00a0jejich spou\u0161t\u011b\u010di. Jsou to oper\u00e1tory, kter\u00fdm se \u0159\u00edk\u00e1 Function call, tedy vol\u00e1n\u00ed funkce. Jedin\u00fdmi funkcemi, na kter\u00e9 se nevol\u00e1, jsou funkce speci\u00e1ln\u00ed. Respektive, vol\u00e1 na n\u011b s\u00e1m termin\u00e1l podle ur\u010dit\u00e9ho kl\u00ed\u010de. Nap\u0159\u00edklad p\u0159i spu\u0161t\u011bn\u00ed programu se zavol\u00e1 speci\u00e1ln\u00ed funkce OnInit(), p\u0159i p\u0159\u00edchoz\u00edm ticku OnTick(), p\u0159i spu\u0161t\u011bn\u00ed skriptu OnStart() a tak d\u00e1le. V\u00a0p\u0159edchoz\u00ed kapitole jsme si uk\u00e1zali, jak vypad\u00e1 samotn\u00e1 funkce, nyn\u00ed si uk\u00e1\u017eeme tvar oper\u00e1toru vol\u00e1n\u00ed funkce. Ten je n\u00e1sleduj\u00edc\u00ed: Moje_funkce (par1, par2, par3); Oper\u00e1tor sest\u00e1v\u00e1 z\u00a0n\u00e1zvu volan\u00e9 funkce a hodnot p\u0159ed\u00e1van\u00fdch parametr\u016f. Ukon\u010den je samoz\u0159ejm\u011b jako ka\u017ed\u00fd jin\u00fd oper\u00e1tor st\u0159edn\u00edkem. Po\u010det a datov\u00e9 typy parametr\u016f vol\u00e1n\u00ed funkce a dan\u00e9 funkce mus\u00ed souhlasit, jinak kompil\u00e1tor ozn\u00e1m\u00ed chybu. Kr\u00e1sn\u011b to ilustruje n\u00e1sleduj\u00edc\u00ed obr\u00e1zek, kter\u00fd jsem si vyp\u016fj\u010dil z\u00a0book.mql4.com. Z\u00a0n\u011bj je tak\u00e9 vid\u011bt, \u017ee p\u0159ed\u00e1van\u00fd parametr m\u016f\u017ee b\u00fdt jak\u00fdkoliv datov\u00fd typ a m\u016f\u017ee to b\u00fdt konstanta, v\u00fdraz nebo prom\u011bnn\u00e1.<\/p>\n <\/p>\n
Z\u00e1rove\u0148 vid\u00edme, \u017ee jakmile kontrola zaregistruje vol\u00e1n\u00ed funkce, exekuce se p\u0159esune k t\u011blu t\u00e9to funkce. Ta m\u016f\u017ee b\u00fdt v p\u0159\u00edpad\u011b u\u017eivatelsk\u00e9 funkce um\u00edst\u011bna kdekoliv v programu, samoz\u0159ejm\u011b mimo t\u011bla jin\u00fdch funkc\u00ed. Ov\u0161em v p\u0159\u00edpad\u011b, \u017ee jde o funkci standardn\u00ed neboli p\u0159eddefinovanou, tak funkce samotn\u00e1 v programu v\u016fbec nen\u00ed pot\u0159eba, sta\u010d\u00ed na ni jen zavolat. M\u016f\u017eeme si to p\u0159edstavit tak, \u017ee k\u00f3dy t\u011bchto funkc\u00ed jsou ji\u017e hotov\u00e9 a zabudovan\u00e9 p\u0159\u00edmo v Metatraderu.<\/p>\n Standardn\u00ed funkce<\/h2>\nStandardn\u00ed funkce jsou z\u00a0hlediska program\u00e1tora nejpohodln\u011bj\u0161\u00ed. Nen\u00ed pot\u0159eba definovat ani jejich n\u00e1zev, ani mno\u017estv\u00ed a typ parametr\u016f, ani datov\u00fd typ. To v\u0161e je ji\u017e definov\u00e1no tv\u016frci jazyka. Sta\u010d\u00ed prost\u011b jen v\u00a0programu na tuto funkci zavolat, tedy napsat jej\u00ed n\u00e1zev, do z\u00e1vorky zadat spr\u00e1vn\u00e9 hodnoty parametr\u016f (pokud jsou vy\u017eadov\u00e1ny) a program u\u017e bude v\u011bd\u011bt, co m\u00e1 ud\u011blat.<\/em> P\u0159i psan\u00ed k\u00f3du se p\u0159eddefinovan\u00e9 funkce barevn\u011b odli\u0161\u00ed. Funkc\u00ed tohoto typu je kolem 250. Jak se ale dozv\u00edme, kter\u00e9 parametry funkce chce, v\u00a0jak\u00e9m po\u0159ad\u00ed a jak\u00e9ho jsou typu? A jak se v\u016fbec dozv\u00edme, co kter\u00e1 funkce d\u011bl\u00e1? \u010cinnost funkce obvykle plyne z\u00a0n\u00e1zvu, po\u010det parametr\u016f a jejich typ potom vid\u00edme v\u00a0tooltipu p\u0159i psan\u00ed k\u00f3du. Konkr\u00e9tn\u011b se objev\u00ed po naps\u00e1n\u00ed otev\u00edrac\u00ed z\u00e1vorky funkce a aktu\u00e1ln\u00ed parametr se zv\u00fdrazn\u00ed tu\u010dn\u011b:<\/p>\n <\/p>\n
P\u0159esto je obvykle o n\u011bco pohodln\u011bj\u0161\u00ed, zvl\u00e1\u0161\u0165 pokud funkci je\u0161t\u011b nezn\u00e1me,\u00a0vyhledat si svou funkci na str\u00e1nk\u00e1ch docs.mql4.com. V\u00a0lev\u00e9m menu si m\u016f\u017eeme vybrat kategorii funkce a z\u00edsk\u00e1me v\u0161echny dostupn\u00e9 funkce dan\u00e9 kategorie. Po rozkliknut\u00ed funkce pak najdeme ve\u0161ker\u00e9 pot\u0159ebn\u00e9 informace k\u00a0jej\u00edmu pou\u017eit\u00ed. Nap\u0159\u00edklad v\u00a0kategorii Technical Indicators najdeme v\u0161echny funkce, kter\u00e9 vracej\u00ed hodnoty technick\u00fdch indik\u00e1tor\u016f, co\u017e jsou mimochodem velice u\u017eite\u010dn\u00e9 funkce pro obchodn\u00ed syst\u00e9my, kter\u00e9 vyu\u017e\u00edvaj\u00ed n\u011bjak\u00e9ho indik\u00e1toru. Pod\u00edvejme se, co zjist\u00edme, kdy\u017e otev\u0159eme nap\u0159\u00edklad funkci iMA. Pochopiteln\u011b v\u00a0t\u00e9to f\u00e1zi u\u017e nebude sta\u010dit \u010de\u0161tina, ale je pot\u0159eba z\u00e1kladn\u00ed znalost angli\u010dtiny, ru\u0161tiny nebo \u010d\u00edn\u0161tiny. Mo\u017en\u00e1 tv\u016frci str\u00e1nek jazykovou nab\u00eddku do budoucna roz\u0161\u00ed\u0159\u00ed, ale s\u00a0\u010de\u0161tinou bych moc nepo\u010d\u00edtal navzdory tomu, \u017ee MetaEditor byl ned\u00e1vno p\u0159elo\u017een i do \u010de\u0161tiny.<\/p>\n <\/p>\n
Prvn\u00ed odstavec stru\u010dn\u011b a jasn\u011b popisuje, co m\u00e1 funkce za \u00fakol. V\u00a0tomto p\u0159\u00edpad\u011b je \u00fakolem funkce vypo\u010d\u00edtat ze zadan\u00fdch parametr\u016f klouzav\u00fd pr\u016fm\u011br a vr\u00e1tit jeho hodnotu. N\u00e1sleduje tvar funkce, ze kter\u00e9ho pozn\u00e1me datov\u00fd typ funkce a po\u0159ad\u00ed a datov\u00e9 typy parametr\u016f. Pro p\u0159ehlednost a kv\u016fli vysv\u011btluj\u00edc\u00edm koment\u00e1\u0159\u016fm zde m\u00e1 ka\u017ed\u00fd parametr jeden \u0159\u00e1dek, v\u00a0praxi je lze samoz\u0159ejm\u011b ps\u00e1t za sebe do jednoho \u0159\u00e1dku. Dal\u0161\u00ed blok je v\u00fd\u010dtem jednotliv\u00fdch parametr\u016f s\u00a0popisem a v\u011bt\u0161inou i s\u00a0hodnotami, kter\u00e9 za tento parametr lze dosadit. Nap\u0159\u00edklad o prvn\u00edm parametru \u201esymbol\u201c typu string, tedy textov\u00fd \u0159et\u011bzec, se dozv\u00edme, \u017ee ozna\u010duje n\u00e1zev symbolu, z\u00a0jeho\u017e dat je hodnota indik\u00e1toru vypo\u010d\u00edt\u00e1na. Pokud dosad\u00edme NULL, vezme se symbol grafu, na kter\u00e9m strategie b\u011b\u017e\u00ed. Nebo za parametr \u201ema_method\u201c typu cel\u00e9 \u010d\u00edslo mus\u00edme dosadit k\u00f3d metody, na z\u00e1klad\u011b kter\u00e9ho se pr\u016fm\u011br bude po\u010d\u00edtat. P\u0159ipojen je i odkaz na tabulku, kde je rozeps\u00e1no, kter\u00fd k\u00f3d p\u0159\u00edslu\u0161\u00ed kter\u00e9 metod\u011b. Velice d\u016fle\u017eit\u00fd je \u0159\u00e1dek Returned value, ve kter\u00e9m se dozv\u00edme, jakou hodnotu n\u00e1m funkce vr\u00e1t\u00ed. V\u00a0tomto p\u0159\u00edpad\u011b vr\u00e1t\u00ed numerickou hodnotu klouzav\u00e9ho pr\u016fm\u011bru typu double, tedy ve form\u011b desetinn\u00e9ho \u010d\u00edsla. V\u00a0posledn\u00edm bloku je potom p\u0159\u00edklad pou\u017eit\u00ed dan\u00e9 funkce. Na z\u00e1v\u011br si je\u0161t\u011b uve\u010fme p\u0159ehled \u010dasto pou\u017e\u00edvan\u00fdch standardn\u00edch funkc\u00ed se stru\u010dn\u00fdm\u00a0popisem jejich pou\u017eit\u00ed. AccountInfoDouble()<\/strong> \u2013 slou\u017e\u00ed pro vracen\u00ed r\u016fzn\u00fdch informac\u00ed o \u00fa\u010dtu, kter\u00e9 maj\u00ed formu desetinn\u00e9ho \u010d\u00edsla jako equity, profit apod. Typ informace zad\u00e1v\u00e1me do parametru. Podobn\u00e9 jsou je\u0161t\u011b AccountInfoInteger()<\/strong> a AccountInfoString()<\/strong>, kter\u00e9 vracej\u00ed informace celo\u010d\u00edseln\u00e9 a textov\u00e9. Nap\u0159\u00edklad funkce AccountInfoString(ACCOUNT_CURRENCY) vr\u00e1t\u00ed zkratku m\u011bny \u00fa\u010dtu. Alert()<\/strong> \u2013 zobraz\u00ed u\u017eivateli klasick\u00e9 okno s upozorn\u011bn\u00edm a p\u0159ehraje zvukov\u00fd t\u00f3n. Parametry funkce jsou argumenty zobrazen\u00e9 v\u00a0upozorn\u011bn\u00ed. Text mus\u00ed b\u00fdt uveden v\u00a0uvozovk\u00e1ch. Nap\u0159. Alert(\u201eOtev\u0159en \u201c,SmerPozice,\u201c za \u201c,OteviraciCena). Takto postaven\u00e1 funkce upozorn\u00ed tradera na sm\u011br a otev\u00edrac\u00ed cenu nov\u00e9 pozice, pakli\u017ee jsou samoz\u0159ejm\u011b ulo\u017eeny p\u0159\u00edslu\u0161n\u00e9 hodnoty v\u00a0prom\u011bnn\u00fdch SmerPozice a OteviraciCena.<\/p>\n <\/p>\n
Comment()<\/strong> \u2013 zobraz\u00ed n\u00e1pis v\u00a0lev\u00e9 horn\u00ed \u010d\u00e1sti grafu. Pro parametry plat\u00ed tot\u00e9\u017e co u funkce Alert().<\/p>\n <\/p>\n
DoubleToStr()<\/strong> \u2013 zaokrouhl\u00ed hodnotu typu double na ur\u010dit\u00fd po\u010det desetinn\u00fdch m\u00edst. Prvn\u00edm parametrem je hodnota, druh\u00fdm v\u00fdsledn\u00fd po\u010det desetinn\u00fdch m\u00edst. MarketInfo()<\/strong> – podobn\u011b jako AccountInfo() <\/strong>tato funkce umo\u017e\u0148uje vyvolat informace o instrumentech, kter\u00e9 jsou zobrazeny v panelu Trh, jako nap\u0159\u00edklad jejich spread, ceny, minim\u00e1ln\u00ed velikost pozice, minim\u00e1ln\u00ed vzd\u00e1lenost stop p\u0159\u00edkaz\u016f\u00a0apod. ObjectCreate()<\/strong> \u2013 slou\u017e\u00ed pro tvorbu r\u016fzn\u00fdch grafick\u00fdch prvk\u016f do grafu (tvary, texty, \u0161ipky atd.). Parametry ur\u010duj\u00ed typ p\u0159edm\u011btu, jeho um\u00edst\u011bn\u00ed a dal\u0161\u00ed vlastnosti. Print()<\/strong> \u2013 zap\u00ed\u0161e z\u00e1znam do programov\u00e9ho logu (z\u00e1lo\u017eka Den\u00edk v\u00a0termin\u00e1lu). Parametr viz funkce Alert() SendMail()<\/strong> \u2013 Ode\u0161le email na adresu nastavenou v termin\u00e1lu (N\u00e1stroje -> Mo\u017enosti -> Email). Parametry jsou p\u0159edm\u011bt a text emailu. Ide\u00e1ln\u00ed t\u0159eba na upozorn\u011bn\u00ed na ur\u010ditou situaci na trhu. StringConcatenate() <\/strong>\u2013 Ze zadan\u00fdch argument\u016f vytvo\u0159\u00ed textov\u00fd \u0159et\u011bzec. Vyu\u017eit\u00ed najde t\u0159eba pro sestaven\u00ed \u0159et\u011bzce k\u00a0pou\u017eit\u00ed ve funkci SendMail(). TimeCurrent()<\/strong> \u2013 vr\u00e1t\u00ed aktu\u00e1ln\u00ed \u010das serveru brokera ve form\u00e1tu datetime. \u017d\u00e1dn\u00fd parametr nepot\u0159ebuje. Obdobou je funkce TimeLocal(),<\/strong> kter\u00e1 vr\u00e1t\u00ed \u010das po\u010d\u00edta\u010de. Z\u00e1m\u011brn\u011b jsem vynechal funkce obchodn\u00ed, kter\u00fdm p\u0159\u00ed\u0161t\u011b v\u011bnuji samostatn\u00fd d\u00edl. P\u0159edpokl\u00e1d\u00e1m, \u017ee v\u011bt\u0161ina z\u00a0v\u00e1s se tento jazyk u\u010d\u00ed pro programov\u00e1n\u00ed obchodn\u00edch syst\u00e9m\u016f, proto se na tyto funkce pod\u00edv\u00e1me podrobn\u011b.<\/p>\nObchodn\u00ed funkce<\/h2>\nV\u011bt\u0161ina z n\u00e1s se jazyk MQL u\u010d\u00ed za \u00fa\u010delem programov\u00e1n\u00ed automatick\u00fdch obchodn\u00edch syst\u00e9m\u016f. Ty se samoz\u0159ejm\u011b neobejdou bez funkc\u00ed, kter\u00e9 zaji\u0161\u0165uj\u00ed otev\u00edr\u00e1n\u00ed, uzav\u00edr\u00e1n\u00ed a spr\u00e1vu obchodn\u00edch pozic. Tyto funkce se souhrnn\u011b naz\u00fdvaj\u00ed obchodn\u00ed funkce, v dokumentaci docs.mql4.com je najdeme ve skupin\u011b Trade functions. Ty nejd\u016fle\u017eit\u011bj\u0161\u00ed z nich si v t\u00e9to kapitole rozebereme.<\/em><\/p>\nOrderSend()<\/h3>\nFunkce OrderSend() je jedinou funkc\u00ed, kter\u00e1 dok\u00e1\u017ee otev\u0159\u00edt pozici nebo zadat limitn\u00ed pokyn. V\u00a0p\u0159\u00edpad\u011b \u00fasp\u011b\u0161n\u00e9ho otev\u0159en\u00ed pozice vr\u00e1t\u00ed \u010d\u00edslo tiketu otev\u0159en\u00e9 pozice, jinak -1. Z\u00a0tohoto d\u016fvodu je vhodn\u00e9 funkci um\u00edstit nap\u0159. do podm\u00ednkov\u00e9ho oper\u00e1toru, kter\u00fd v\u00a0p\u0159\u00edpad\u011b v\u00fdsledku funkce -1 zjist\u00ed pomoc\u00ed funkce GetLastError(), kde se stala chyba. Funkce m\u00e1 n\u00e1sleduj\u00edc\u00ed tvar:<\/p>\n <\/p>\n
Vid\u00edme pom\u011brn\u011b velk\u00e9 mno\u017estv\u00ed parametr\u016f, poj\u010fme si je popsat. symbol<\/strong> \u2013 zkratka symbolu, na kter\u00e9m se m\u00e1 pozice otev\u0159\u00edt (nap\u0159. \u201eEURUSD\u201c, z\u00e1le\u017e\u00ed na brokerovi, jak instrument zna\u010d\u00ed ve sv\u00e9 platform\u011b). \u010casto se za parametr vkl\u00e1d\u00e1 funkce Symbol(), kter\u00e1 vr\u00e1t\u00ed n\u00e1zev symbolu grafu, na kter\u00e9m strategie b\u011b\u017e\u00ed. cmd <\/strong>\u2013 Ozna\u010duje typ p\u0159\u00edkazu podle n\u00e1sleduj\u00edc\u00ed tabulky. Zadat m\u016f\u017eeme jak hodnotu ID, tak i ve form\u011b \u010d\u00edsla.<\/p>\n\n\n\nID<\/strong><\/td>\nHodnota<\/strong><\/td>\nPopis<\/strong><\/td>\n<\/tr>\n\nOP_BUY<\/td>\n | 0<\/td>\n | N\u00e1kup Market<\/td>\n<\/tr>\n | \nOP_SELL<\/td>\n | 1<\/td>\n | Prodej Market<\/td>\n<\/tr>\n | \nOP_BUYLIMIT<\/td>\n | 2<\/td>\n | Limitn\u00ed p\u0159\u00edkaz Buy Limit<\/td>\n<\/tr>\n | \nOP_SELLLIMIT<\/td>\n | 3<\/td>\n | Limitn\u00ed p\u0159\u00edkaz Sell Limit<\/td>\n<\/tr>\n | \nOP_BUYSTOP<\/td>\n | 4<\/td>\n | Limitn\u00ed p\u0159\u00edkaz Buy Stop<\/td>\n<\/tr>\n | \nOP_SELLSTOP<\/td>\n | 5<\/td>\n | Limitn\u00ed p\u0159\u00edkaz Sell Stop<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n volume <\/strong>\u2013 ozna\u010duje velikost pozice v\u00a0lotech. M\u016f\u017ee to b\u00fdt samoz\u0159ejm\u011b p\u0159\u00edmo napsan\u00e9 \u010d\u00edslo, vzorec, nebo u\u017eivatelsk\u00e1\u00a0funkce, kter\u00e1 m\u00e1 za \u00fakol podle r\u016fzn\u00fdch parametr\u016f trhu a \u00fa\u010dtu vypo\u010d\u00edtat optim\u00e1ln\u00ed velikost. Setk\u00e1me se s n\u00ed nap\u0159\u00edklad v uk\u00e1zkov\u00e9 strategii Moving Average. Hodnota mus\u00ed b\u00fdt povolena brokerem, jinak se pozice neotev\u0159e, funkce vr\u00e1t\u00ed -1 a GetLastError() vr\u00e1t\u00ed chybu 131 (ERR_INVALID_TRADE_VOLUME). price <\/strong>\u2013 ano, je pot\u0159eba zadat i otev\u00edrac\u00ed cenu, a to bu\u010f Ask nebo Bid. Program toti\u017e nev\u00ed, kter\u00e1 z\u00a0t\u011bchto cen je spr\u00e1vn\u00e1 pro otev\u0159en\u00ed dan\u00e9 pozice. Pro \u00faplnost dod\u00e1v\u00e1m, \u017ee nakupujeme za cenu Bid a prod\u00e1v\u00e1me za Ask. Cena Bid nebo Ask plat\u00ed pro instrument grafu, na kter\u00e9m b\u011b\u017e\u00ed strategie. Pokud chceme otev\u0159\u00edt pozici jin\u00e9ho instrumentu (a m\u00e1me tedy v parametru symbol jeho n\u00e1zev), pak mus\u00edme cenu zjistit pomoc\u00ed funkce MarketInfo(symbol, Bid\/Ask). Pokud cenu zad\u00e1me \u0161patn\u011b, funkce op\u011bt skon\u010d\u00ed chybou. slippage \u2013 <\/strong>ud\u00e1v\u00e1 maxim\u00e1ln\u00ed odchylku v\u00a0pipech od po\u017eadovan\u00e9 ceny, tedy maxim\u00e1ln\u00ed v\u00e1mi akceptovateln\u00fd skluz. Pokud bude vy\u0161\u0161\u00ed, pozice se neotev\u0159e. stoploss \u2013 <\/strong>cena, na kterou bude um\u00edst\u011bn p\u0159\u00edkaz Stoploss. Obvykle se v praxi zad\u00e1v\u00e1 jako vzd\u00e1lenost od vstupn\u00ed ceny, nap\u0159. \u201eAsk + 10*Point\u201c v p\u0159\u00edpad\u011b kr\u00e1tk\u00e9 pozice. \u010casto se tak\u00e9 jedn\u00e1 o v\u00fdsledek komplikovan\u011bj\u0161\u00ed funkce, jak \u00farove\u0148 tohoto p\u0159\u00edkazu spo\u010d\u00edtat. Je pot\u0159eba d\u00e1t pozor na to, aby stoploss byl pod cenou v p\u0159\u00edpad\u011b longov\u00e9 pozice a nad cenou v p\u0159\u00edpad\u011b shortu. Pokud bychom parametr zadali \u0161patn\u011b, nemus\u00edte se ob\u00e1vat, \u017ee by se pozice otev\u0159ela bez stoplossu. Neotev\u0159e se v\u016fbec, skon\u010d\u00ed chybou. takeprofit <\/strong>– cena, na kterou bude um\u00edst\u011bn p\u0159\u00edkaz Takeprofit. Op\u011bt se obvykle zad\u00e1v\u00e1 jako vzd\u00e1lenost od vstupn\u00ed ceny, nap\u0159. \u201eBid + TakeProfit*Point\u201c v p\u0159\u00edpad\u011b dlouh\u00e9 pozice, kde prom\u011bnn\u00e1 TakeProfit m\u016f\u017ee b\u00fdt t\u0159eba u\u017eivatelsky nastaven\u00e1. comment \u2013 <\/strong>koment\u00e1\u0159 k\u00a0dan\u00e9 pozici ve form\u011b \u0159et\u011bzce, mus\u00ed b\u00fdt tedy v\u00a0uvozovk\u00e1ch. magic <\/strong>\u2013 \u201emagick\u00e9 \u010d\u00edslo\u201c, kter\u00e9 lze pou\u017e\u00edt nap\u0159\u00edklad pro odli\u0161en\u00ed obchod\u016f otev\u0159en\u00fdch konkr\u00e9tn\u00ed strategi\u00ed. V\u00fdchoz\u00ed hodnotou je nula, tedy \u017e\u00e1dn\u00e9 magick\u00e9 \u010d\u00edslo. expiration<\/strong> \u2013 datum a \u010das expirace limitn\u00edho p\u0159\u00edkazu. Nej\u010dast\u011bji se zad\u00e1v\u00e1 jako rozd\u00edl oproti \u010dasu zad\u00e1n\u00ed p\u0159\u00edkazu TimeCurrent() nebo TimeLocal(), tedy nap\u0159. \u201eTimeCurrent()+3600\u201c pro expiraci za hodinu. arrow_color<\/strong> \u2013 sem zad\u00e1v\u00e1me p\u0159\u00edpadnou barvu \u0161ipky, kterou chceme zobrazit na grafu v dob\u011b otev\u0159en\u00ed pozice. Klasicky bychom mohli zadat clrRed pro shorty a clrGreen pro longy. Pokud nech\u00e1me pole pr\u00e1zdn\u00e9 nebo zad\u00e1me nulu, \u017e\u00e1dn\u00e1 \u0161ipka nebude zobrazena. Pro \u00faplnost uvedu dva p\u0159\u00edklady, v\u00a0jak\u00e9m tvaru m\u016f\u017ee funkce b\u00fdt:<\/p>\n <\/p>\n
Tato funkce otev\u00edr\u00e1 pouze longy na p\u00e1ru GBP\/JPY a SL a TP umis\u0165uje ve vzd\u00e1lenosti 15 pips. Posledn\u00ed 4 parametry \u00fapln\u011b chyb\u00ed, tak\u017ee se p\u0159ij\u00edmaj\u00ed jejich v\u00fdchoz\u00ed hodnoty. Konkr\u00e9tn\u011b tedy tato funkce bude bez koment\u00e1\u0159e, magick\u00e9ho \u010d\u00edsla i bez \u0161ipek v grafu. Te\u010f se pod\u00edvejme na \u010d\u00e1st k\u00f3du v kontextu i s ov\u011b\u0159ov\u00e1n\u00edm \u00fasp\u011bchu a zobrazen\u00ed p\u0159\u00edpadn\u00e9 chybov\u00e9 hl\u00e1\u0161ky:<\/p>\n <\/p>\n
Vid\u00edme, \u017ee funkce OrderSend() zde otev\u00edr\u00e1 shorty na instrumentu dle grafu, na kter\u00e9m b\u011b\u017e\u00ed. Pro velikost pozice se zavol\u00e1 funkce Objem(). \u00darovn\u011b stoplossu i profit targetu jsou ji\u017e p\u0159edem ulo\u017eeny v prom\u011bnn\u00fdch. D\u00e1le vid\u00edme, \u017ee v\u00fdsledek funkce se \u0161ikovn\u011b ulo\u017e\u00ed do prom\u011bnn\u00e9 ticket a potom je analyzov\u00e1n. Pokud je vy\u0161\u0161\u00ed ne\u017e 0, znamen\u00e1 to, \u017ee pozice byla \u00fasp\u011b\u0161n\u011b otev\u0159ena a pomoc\u00ed funkce Print() je o tom zaps\u00e1n z\u00e1znam do logu. Pokud je ale ticket men\u0161\u00ed ne\u017e 0, znamen\u00e1 to, \u017ee se n\u011bkde stala chyba. Potom se do logu vytiskne hl\u00e1\u0161en\u00ed o chyb\u011b a \u010d\u00edslo t\u00e9to chyby z\u00edskan\u00e9 funkc\u00ed GetLastError(). K\u00f3dy chyb lze analyzovat na str\u00e1nce https:\/\/book.mql4.com\/appendix\/errors<\/p>\n OrderSelect()<\/h3>\nTato funkce je velmi d\u016fle\u017eit\u00e1 pro na\u010dten\u00ed konkr\u00e9tn\u00ed pozice (otev\u0159en\u00e9 nebo uzav\u0159en\u00e9) a dal\u0161\u00ed pr\u00e1ci s n\u00ed (uzav\u00edr\u00e1n\u00ed, zm\u011bna, z\u00edsk\u00e1n\u00ed informac\u00ed atd.). V\u011bt\u0161inou b\u00fdv\u00e1 um\u00edst\u011bna v\u00a0cyklu, kter\u00fd pozice postupn\u011b proj\u00ed\u017ed\u00ed. Vrac\u00ed true v\u00a0p\u0159\u00edpad\u011b \u00fasp\u011b\u0161n\u00e9ho v\u00fdb\u011bru a false v\u00a0p\u0159\u00edpad\u011b ne\u00fasp\u011bchu. Parametr\u016f m\u00e1me ji\u017e m\u00e9n\u011b:<\/p>\n <\/p>\n
index<\/strong> \u2013 tento parametr z\u00e1vis\u00ed na druh\u00e9m paramatru. Bu\u010fto se bude jednat o po\u0159adov\u00e9 \u010d\u00edslo nebo o konkr\u00e9tn\u00ed \u010d\u00edslo tiketu. select \u2013 <\/strong>ud\u00e1v\u00e1, na z\u00e1klad\u011b \u010deho se m\u00e1 pozice vybrat. Jsou dv\u011b mo\u017enosti: SELECT_BY_POS \u2013 vybrat dle indexu v tabulce pozic,\u00a0de facto podle po\u0159adov\u00e9ho \u010d\u00edsla; SELECT_BY_TICKET \u2013 vybrat dle \u010d\u00edsla tiketu. pool \u2013 <\/strong>ud\u00e1v\u00e1, ve kter\u00e9 tabulce se m\u00e1 hledat. M\u00e1 smysl pouze, pokud p\u0159edchoz\u00ed parametr je SELECT_BY_POS. Mo\u017en\u00e9 jsou op\u011bt dv\u011b hodnoty: MODE_TRADES (v\u00fdchoz\u00ed) \u2013 vybrat z tabulky Obchod, tj. z otev\u0159en\u00fdch pozic a \u010dekaj\u00edc\u00edch limitn\u00edch pokyn\u016f; MODE_HISTORY \u2013 vybrat z tabulky Historie \u00fa\u010dtu, tj. ze seznamu uzav\u0159en\u00fdch pozic a zru\u0161en\u00fdch pokyn\u016f. \u010c\u00e1st k\u00f3du obsahuj\u00edc\u00ed tuto funkci pak m\u016f\u017ee vypadat t\u0159eba takto:<\/p>\n <\/p>\n
Cyklus proj\u00ed\u017ed\u00ed v\u0161echny pozice v\u00a0tabulce Historie \u00fa\u010dtu a funkce OrderSelect v\u017edy na\u010dte jednu z\u00a0nich. V\u0161echny dal\u0161\u00ed obchodn\u00ed funkce uvnit\u0159 podm\u00ednkov\u00e9ho oper\u00e1toru se potom budou vztahovat pr\u00e1v\u011b k\u00a0vybran\u00e9 pozici. M\u016f\u017ee j\u00edt o funkce jako OrderProfit() vracej\u00edc\u00ed profit t\u00e9to pozice, OrderOpenTime() vracej\u00edc\u00ed datum a \u010das otev\u0159en\u00ed pozice apod.<\/p>\n OrderClose()<\/h3>\nJakmile um\u00edme pozici otev\u0159\u00edt a na\u010d\u00edst, bude ur\u010dit\u011b dobr\u00e9 se nau\u010dit pozice tak\u00e9 uzav\u00edrat (pokud n\u00e1m nesta\u010d\u00ed zav\u00edr\u00e1n\u00ed pomoc\u00ed stoploss\u016f a profit target\u016f). Bude to jednoduch\u00e9:<\/p>\n <\/p>\n
S\u00a0parametry se zach\u00e1z\u00ed naprosto stejn\u011b, jako v\u00a0p\u0159\u00edpad\u011b OrderSend(). Jak vid\u00edte, abyste uzav\u0159eli konkr\u00e9tn\u00ed pozici, mus\u00edte z\u00edskat jej\u00ed ticket. Pokud v\u00e1\u0161 syst\u00e9m umo\u017e\u0148uje m\u00edt otev\u0159enou v\u017edy jen jednu pozici, lze pou\u017e\u00edt prom\u011bnnou, kam se tiket ulo\u017e\u00ed p\u0159i jej\u00edm otev\u0159en\u00ed. Pokud tomu ale tak nen\u00ed, nezb\u00fdv\u00e1 ne\u017e pozici nejd\u0159\u00edve vybrat pomoc\u00ed funkce OrderSelect() a potom m\u016f\u017eeme do parametru ticket<\/strong> um\u00edstit funkci OrderTicket(). Na z\u00e1v\u011br je\u0161t\u011b kr\u00e1tce zm\u00edn\u00edme n\u011bkter\u00e9 dal\u0161\u00ed d\u016fle\u017eit\u00e9 obchodn\u00ed funkce. OrderCloseBy()<\/strong> \u2013 uzav\u0159e pozici a otev\u0159e novou pozici v\u00a0opa\u010dn\u00e9m sm\u011bru, OrderDelete()<\/strong> \u2013 zru\u0161\u00ed otev\u0159en\u00fd limitn\u00ed p\u0159\u00edkaz, OrderModify()<\/strong> \u2013 zm\u011bn\u00ed p\u0159\u00edslu\u0161nou otev\u0159enou pozici nebo limitn\u00ed p\u0159\u00edkaz (nap\u0159. posun stoplossu, zm\u011bna expirace apod.), OrdersHistoryTotal()<\/strong> \u2013 vrac\u00ed po\u010det z\u00e1znam\u016f v tabulce Historie \u00fa\u010dtu, OrdersTotal()<\/strong> \u2013 vrac\u00ed po\u010det otev\u0159en\u00fdch pozic a aktivn\u00edch \u010dekaj\u00edc\u00edch p\u0159\u00edkaz\u016f. Ostatn\u00ed funkce, kter\u00e9 nalezneme v\u00a0p\u0159\u00edslu\u0161n\u00e9 skupin\u011b, ji\u017e vracej\u00ed informace o konkr\u00e9tn\u00ed na\u010dten\u00e9 pozici. Nezapome\u0148te, \u017ee pro na\u010dten\u00ed do mezipam\u011bti lze pou\u017e\u00edt jedin\u011b funkci OrderSelect(). V\u00a0dal\u0161\u00edm d\u00edle zjist\u00edme, co m\u00e1me d\u011blat v\u00a0p\u0159\u00edpad\u011b, \u017ee funkce, kterou bychom pot\u0159ebovali, nen\u00ed mezi standardn\u00edmi p\u0159eddefinovan\u00fdmi funkcemi. V\u00a0takov\u00e9m p\u0159\u00edpad\u011b si ji mus\u00edme vytvo\u0159it sami a p\u0159\u00ed\u0161t\u011b si pov\u00edme, jak\u00e1 u toho mus\u00edme respektovat pravidla.<\/p>\nU\u017eivatelsk\u00e9 funkce<\/h2>\nJi\u017e v d\u0159\u00edv\u011bj\u0161\u00edch kapitol\u00e1ch jsme uvedli, \u017ee u\u017eivatelsk\u00e9 funkce jsou takov\u00e9 funkce, kter\u00e9 mus\u00edme v r\u00e1mci programu nadefinovat. T\u00edm se li\u0161\u00ed od funkc\u00ed standardn\u00edch, kter\u00e9 definovat nemus\u00edme, sta\u010d\u00ed na n\u011b jen zavolat pomoc\u00ed oper\u00e1toru vol\u00e1n\u00ed funkce. Z tohoto pohledu lze za u\u017eivatelsk\u00e9 funkce pova\u017eovat tak\u00e9 funkce speci\u00e1ln\u00ed, jeliko\u017e i ty definujeme sami, krom\u011b jejich typu a n\u00e1zvu. Jejich jedinou odli\u0161nost\u00ed je, \u017ee je nemus\u00edme volat, vol\u00e1 na n\u011b s\u00e1m termin\u00e1l MT4. Teoreticky lze speci\u00e1ln\u00ed funkci zavolat i ru\u010dn\u011b z programu, ale sami tv\u016frci jazyka to nedoporu\u010duj\u00ed. V\u0161e shrnuje n\u00e1sleduj\u00edc\u00ed tabulka:<\/p>\n \n\n\nTyp funkce<\/strong><\/td>\nP\u0159edpis funkce v programu<\/strong><\/td>\nVol\u00e1n\u00ed funkce<\/strong><\/td>\n<\/tr>\n\nSpeci\u00e1ln\u00ed<\/strong><\/td>\nAno<\/td>\n | Ne<\/td>\n<\/tr>\n | \nStandardn\u00ed<\/strong><\/td>\nNe<\/td>\n | Ano<\/td>\n<\/tr>\n | \nU\u017eivatelsk\u00e1<\/strong><\/td>\nAno<\/td>\n | Ano<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n U\u017eivatelskou funkci si tedy mus\u00edme p\u0159edepsat a pro jej\u00ed exekuci\u00a0j\u00ed mus\u00edme tak\u00e9 zavolat. Jak vypad\u00e1 oper\u00e1tor vol\u00e1n\u00ed funkce i p\u0159edpis funkce jsme se dozv\u011bd\u011bli ji\u017e v\u00a0jeden\u00e1ct\u00e9m d\u00edle, tedy \u00favodn\u00edm d\u00edle o funkc\u00edch. Pro p\u0159ipomenut\u00ed ale n\u00ed\u017ee p\u0159id\u00e1me obr\u00e1zek, na kter\u00e9m je tvar obou z\u00e1le\u017eitost\u00ed vid\u011bt. Stejn\u011b tak je na n\u011bm vid\u011bt, jak prob\u00edh\u00e1 transfer parametr\u016f mezi oper\u00e1torem vol\u00e1n\u00ed funkce a hlavi\u010dkou p\u0159edpisu funkce. Plyne z\u00a0n\u011bj, \u017ee prom\u011bnn\u00e9 uvnit\u0159 na\u0161\u00ed funkce jsou naprosto nez\u00e1visl\u00e9 na v\u0161ech prom\u011bnn\u00fdch mimo funkci (s v\u00fdjimkou prom\u011bnn\u00fdch glob\u00e1ln\u00edch \u2013 viz \u0161est\u00fd d\u00edl o prom\u011bnn\u00fdch). V\u0161echny prom\u011bnn\u00e9, kter\u00e9 pou\u017eijeme ve funkci, mus\u00edme nadeklarovat. P\u0159esto ale m\u016f\u017eeme pou\u017e\u00edt hodnoty prom\u011bnn\u00fdch nebo v\u00fdraz\u016f mimo na\u0161\u00ed funkci, a to pr\u00e1v\u011b s\u00a0pomoc\u00ed parametr\u016f. Z\u00a0obr\u00e1zku by m\u011blo b\u00fdt v\u0161e jasn\u00e9:<\/p>\n Je\u0161t\u011b tak\u00e9 pro jistotu p\u0159ipomenu, \u017ee p\u0159edpis u\u017eivatelsk\u00e9 funkce mus\u00ed b\u00fdt um\u00edst\u011bn mimo t\u011bla ostatn\u00edch funkc\u00ed. Vyu\u017eit\u00ed u\u017eivatelsk\u00e9 funkce si uk\u00e1\u017eeme na jednoduch\u00e9m progr\u00e1mku, jeho\u017e \u00fakolem je ze zadan\u00fdch stran odv\u011bsen vypo\u010d\u00edtat d\u00e9lku p\u0159epony pravo\u00fahl\u00e9ho troj\u00faheln\u00edku dle zn\u00e1m\u00e9 Pythagorovy v\u011bty c^2 = a^2 + b^2, kde c je d\u00e9lkou p\u0159epony, a s b jsou d\u00e9lkami odv\u011bsen. Mo\u017enost\u00ed, jak skript sestavit, je mnoho. Za\u010dneme tou bez vyu\u017eit\u00ed u\u017eivatelsk\u00e9 funkce:<\/p>\n
<\/p>\n
Z koment\u00e1\u0159\u016f v k\u00f3du by m\u011bl b\u00fdt postup jasn\u00fd. Pro v\u00fdpo\u010det odmocniny slou\u017e\u00ed v MQL funkce MathSqrt(), v\u00fdsledek je u\u017eivateli ozn\u00e1men funkc\u00ed Alert(). Nyn\u00ed si uk\u00e1\u017eeme, jak je mo\u017en\u00e9 cel\u00fd program zkonstruovat s vyu\u017eit\u00edm u\u017eivatelsk\u00e9 funkce: Pro v\u00fdpo\u010det p\u0159epony C je zavol\u00e1na funkce Pythagoras, kter\u00e1 za vyu\u017eit\u00ed parametr\u016f, tedy hodnot odv\u011bsen, p\u0159eponu vypo\u010d\u00edt\u00e1 a vr\u00e1t\u00ed v\u00fdsledek. Ten je pot\u00e9 prezentov\u00e1n u\u017eivateli. Princip nez\u00e1vislosti prom\u011bnn\u00fdch jsme zn\u00e1zornili tak, \u017ee ve funkci Start() jsou n\u00e1zvy stran ozna\u010deny velk\u00fdmi p\u00edsmeny, kde\u017eto uvnit\u0159 funkce Pythagoras() p\u00edsmeny mal\u00fdmi. Zvoleny by v\u0161ak mohly b\u00fdt jak\u00e9koliv jin\u00e9 n\u00e1zvy, jak si n\u00e1sledn\u011b uk\u00e1\u017eeme. Na programov\u00e1n\u00ed je \u00fa\u017easn\u00e9 to, \u017ee k\u00f3d, jeho\u017e exekuce p\u0159inese stejn\u00fd v\u00fdsledek, m\u016f\u017ee v\u00edce program\u00e1tor\u016f sestavit diametr\u00e1ln\u011b odli\u0161n\u011b. Poj\u010fme se pod\u00edvat na dal\u0161\u00ed 2 zaj\u00edmav\u00e9 mo\u017enosti, jak m\u016f\u017ee vypadat t\u011blo funkce Pythagoras.<\/p>\n <\/p>\n
V t\u00e9to verzi jednak zd\u016fraz\u0148ujeme nez\u00e1vislost prom\u011bnn\u00fdch na vn\u011bj\u0161\u00edch prom\u011bnn\u00fdch pou\u017eit\u00edm \u00fapln\u011b jin\u00fdch n\u00e1zv\u016f. P\u0159edev\u0161\u00edm je ale n\u011bkolikr\u00e1t znovu pou\u017eita prom\u011bnn\u00e1 alfa jako uchovatel hodnoty, \u010d\u00edm\u017e se sna\u017e\u00edme uk\u00e1zat, \u017ee teoreticky nen\u00ed pot\u0159eba dal\u0161\u00edch prom\u011bnn\u00fdch, kter\u00e9 by uchov\u00e1valy hodnotu c^2 a c. Z\u00e1le\u017e\u00ed jen na hodnot\u011b, kterou funkce vr\u00e1t\u00ed a je jedno, kter\u00e1 prom\u011bnn\u00e1 j\u00ed uchov\u00e1. Hodnota prom\u011bnn\u00e9 alfa se b\u011bhem funkce dvakr\u00e1t zm\u011bn\u00ed, na konci m\u00e1 v\u0161ak pr\u00e1v\u011b hodnotu d\u00e9lky p\u0159epony. Na celkov\u00e9m v\u00fdsledku to tedy v\u016fbec nic nem\u011bn\u00ed, ale je to obvykle m\u00e9n\u011b p\u0159ehledn\u00e9 a m\u00e9n\u011b \u201ep\u011bkn\u00e9\u201c, z\u00e1le\u017e\u00ed na vkusu program\u00e1tora.<\/p>\n <\/p>\n
Takto vypad\u00e1 nej\u00fasporn\u011bj\u0161\u00ed a nejelegantn\u011bj\u0161\u00ed varianta funkce, kdy cel\u00fd v\u00fdpo\u010det je um\u00edst\u011bn v\u00a0oper\u00e1toru return. Ne v\u017edy je to ale mo\u017en\u00e9 a ne pro ka\u017ed\u00e9ho je tato varianta p\u0159ehledn\u00e1 a intuitivn\u00ed, proto se \u010dasto pou\u017e\u00edvaj\u00ed rozepsan\u00e9 varianty. Kdy\u017e se zbav\u00edme u\u017eivatelsk\u00e9 funkce a pou\u017eijeme toto \u0159e\u0161en\u00ed, zjist\u00edme, \u017ee cel\u00fd probl\u00e9m se d\u00e1 vy\u0159e\u0161it pouh\u00fdmi n\u011bkolika \u0159\u00e1dky. N\u00e1sleduj\u00edc\u00ed uk\u00e1zka p\u0159edstavuje cel\u00fd k\u00f3d. K\u00f3d je vylep\u0161en\u00fd je\u0161t\u011b o to, \u017ee d\u00e9lky odv\u011bsen zad\u00e1v\u00e1 s\u00e1m u\u017eivatel.<\/p>\n <\/p>\n
Jednoduch\u00fd program<\/h2>\nZ p\u0159edchoz\u00edch kapitol ji\u017e zn\u00e1me v\u0161echny z\u00e1kladn\u00ed prvky, kter\u00e9 programovac\u00ed jazyk MQL pou\u017e\u00edv\u00e1 pro tvorbu obchodn\u00edch syst\u00e9m\u016f a dal\u0161\u00edch program\u016f do platformy Metatrader. V\u00edme, jak deklarovat a inicializovat prom\u011bnn\u00e9. Zn\u00e1me pou\u017eiteln\u00e9 operace. M\u00e1me jasno ve struktu\u0159e programu a n\u00e1le\u017eitostech pro r\u016fzn\u00e9 typy program\u016f. V\u00edme, k \u010demu slou\u017e\u00ed kter\u00e9 oper\u00e1tory. V neposledn\u00ed \u0159ad\u011b zn\u00e1me z\u00e1kladn\u00ed funkce, um\u00edme si vytvo\u0159it funkci vlastn\u00ed anebo v\u00edme, kde si naj\u00edt standardn\u00ed funkci, kterou pot\u0159ebujeme. Zb\u00fdv\u00e1 ji\u017e jen tr\u00e9novat, zkou\u0161et, p\u0159ekon\u00e1vat p\u0159ek\u00e1\u017eky, u\u010dit se a vylep\u0161ovat sv\u00e9 programy. Posledn\u00ed kapitoly proto budou ryze praktick\u00e9. Nejprve si uk\u00e1\u017eeme stavbu jednoduch\u00e9ho programu, kter\u00fd bude m\u00edt za \u00fakol n\u00e1s informovat o pr\u016fm\u011brn\u00e9m rozp\u011bt\u00ed posledn\u00edch X period. Nejd\u0159\u00edve takov\u00fd program nap\u00ed\u0161eme a pak vymysl\u00edme, jak bychom ho mohli vylep\u0161it. Prvn\u00ed zad\u00e1n\u00ed zn\u00ed n\u00e1sledovn\u011b:<\/p>\n \n- Sestavte program, kter\u00fd jednor\u00e1zov\u011b vypo\u010d\u00edt\u00e1 pr\u016fm\u011brn\u00e9 rozp\u011bt\u00ed posledn\u00edch 20 kompletn\u00edch sv\u00ed\u010dek grafu a ozn\u00e1m\u00ed v\u00fdsledek.<\/strong><\/li>\n<\/ol>\n
Proto\u017ee se m\u00e1 jednat o jednor\u00e1zovou akci, v\u00edme, \u017ee pot\u0159ebujeme vytvo\u0159it skript. Kdy\u017e n\u00e1m MetaEditor vytvo\u0159\u00ed p\u0159edlohu pro skript, je jasn\u00e9, \u017ee ve\u0161ker\u00fd k\u00f3d um\u00edst\u00edme do speci\u00e1ln\u00ed funkce OnStart(). Program bude vhodn\u00e9 rozd\u011blit na t\u0159i \u010d\u00e1sti. V\u00a0prvn\u00ed \u010d\u00e1sti nadeklarujeme, p\u0159\u00edpadn\u011b inicializujeme prom\u011bnn\u00e9. Ve druh\u00e9 \u010d\u00e1sti se\u010dteme rozp\u011bt\u00ed on\u011bch 20 posledn\u00edch sv\u00ed\u010dek. K\u00a0tomu n\u00e1m dopom\u016f\u017ee cyklick\u00fd oper\u00e1tor for a vyu\u017eijeme prom\u011bnn\u00e9 uzp\u016fsoben\u00e9 na pr\u00e1ci s\u00a0\u010dasov\u00fdmi \u0159adami. V\u00a0posledn\u00ed \u010d\u00e1sti v\u00fdsledn\u00fd sou\u010det vyd\u011bl\u00edme 20, \u010d\u00edm\u017e z\u00edsk\u00e1me pr\u016fm\u011brn\u00e9 rozp\u011bt\u00ed a nakonec o v\u00fdsledku informujeme u\u017eivatele skriptu. S\u00a0\u010d\u00e1st\u00ed k\u00f3du jsme se ji\u017e setkali v\u00a0jednom z\u00a0p\u0159edchoz\u00edch d\u00edl\u016f. Pod\u00edvejme se, jak by v\u00fdsledn\u00fd k\u00f3d mohl vypadat. Ka\u017ed\u00fd \u0159\u00e1dek je vysv\u011btlen pomoc\u00ed koment\u00e1\u0159e.<\/p>\n <\/p>\n
\n- P\u0159etvo\u0159te program tak, aby informaci o rozp\u011bt\u00ed neust\u00e1le aktualizoval a zobrazoval v\u00a0grafu, ani\u017e by bylo t\u0159eba \u010dekat na prvn\u00ed tick.<\/strong><\/li>\n<\/ol>\n
Nyn\u00ed se ji\u017e nebude jednat o jednor\u00e1zovou akci, ale o pravideln\u011b aktualizovanou informaci. T\u00edm p\u00e1dem mus\u00edme opustit skript a vytvo\u0159it strategii, kter\u00e1 se exekuuje, v\u00a0tomto p\u0159\u00edpad\u011b p\u0159epo\u010d\u00edt\u00e1, s\u00a0ka\u017ed\u00fdm p\u0159\u00edchoz\u00edm tickem (jindy se pr\u016fm\u011br z\u00a0principu zm\u011bnit nem\u016f\u017ee). Tento po\u017eadavek spl\u0148uje program typu indik\u00e1tor nebo automatick\u00fd obchodn\u00ed syst\u00e9m (strategie). O indik\u00e1tor se nejedn\u00e1, zvol\u00edme tedy druhou variantu. Vytvo\u0159\u00edme nov\u00fd program, \u0161ablona n\u00e1m p\u0159edstav\u00ed strukturu s\u00a0funkcemi OnInit(), OnDeinit() a OnTick(). K\u00f3d, kter\u00fd jsme v\u00a0p\u0159edchoz\u00edm p\u0159\u00edpad\u011b m\u011bli v\u00a0OnStart(), m\u016f\u017eeme zkop\u00edrovat do OnTick(). Tak bude zaji\u0161t\u011bno, \u017ee se exekuuje v\u017edy p\u0159i nov\u00e9m ticku. Je\u0161t\u011b jedna \u00faprava je ale pot\u0159eba. Funkci Alert() mus\u00edme nahradit funkc\u00ed Comment(), aby byl spln\u011bn po\u017eadavek zobrazov\u00e1n\u00ed v\u00a0grafu. M\u00e1 to ale i jin\u00fd dobr\u00fd d\u016fvod, kter\u00fd v\u00e1m bude jasn\u00fd, kdy\u017e funkci Alert() v\u00a0tomto programu nech\u00e1te a spust\u00edte jej. Malou nev\u00fdhodou je, \u017ee aby se informace za sou\u010dasn\u00e9 podoby k\u00f3du zobrazila, mus\u00ed se po\u010dkat na prvn\u00ed p\u0159\u00edchoz\u00ed tick. To m\u016f\u017ee b\u00fdt nep\u0159\u00edjemn\u00e9 na m\u00e9n\u011b likvidn\u00edch trz\u00edch, nebo kdy\u017e z\u00a0n\u011bjak\u00e9ho d\u016fvodu testujeme \u010di analyzujeme v dob\u011b, kdy jsou trhy zav\u0159en\u00e9. Lze to vy\u0159e\u0161it tak, \u017ee k\u00f3d funkce OnTick() nakop\u00edrujeme i do funkce OnInit(). Tento k\u00f3d se exekuuje ji\u017e p\u0159i spou\u0161t\u011bn\u00ed programu, hodnota proto bude vypo\u010d\u00edt\u00e1na je\u0161t\u011b p\u0159ed p\u0159\u00edchodem prvn\u00edho ticku. Pro zefektivn\u011bn\u00ed programu je potom lep\u0161\u00ed ze spole\u010dn\u00fdch prom\u011bnn\u00fdch ob\u011bma funkc\u00edm (v tomto p\u0159\u00edpad\u011b Mezisoucet, Soucet, Prumer a x) vytvo\u0159it glob\u00e1ln\u00ed prom\u011bnn\u00e9, kter\u00e9 se tak stanou p\u0159\u00edstupn\u00fdmi pro v\u0161echny funkce programu a nen\u00ed t\u0159eba je dvakr\u00e1t deklarovat a inicializovat. Toho dos\u00e1hneme p\u0159esunut\u00edm dvou \u0159\u00e1dk\u016f s\u00a0deklaracemi do hlavi\u010dky programu. Odpov\u00eddaj\u00edc\u00ed dva \u0159\u00e1dky potom m\u016f\u017eeme smazat z\u00a0obou funkc\u00ed. Obr\u00e1zek hlavi\u010dky uvid\u00edme v\u00a0dal\u0161\u00edm zad\u00e1n\u00ed.<\/p>\n \n- Vylep\u0161ete program tak, aby trader m\u011bl mo\u017enost s\u00e1m si zvolit po\u010det period, za kterou se bude pr\u016fm\u011br po\u010d\u00edtat a aby v\u00fdsledn\u00e1 hodnota byla zaokrouhlen\u00e1 na dv\u011b desetinn\u00e1 m\u00edsta.<\/strong><\/li>\n<\/ol>\n
Prvn\u00ed po\u017eadavek vy\u017eaduje jednoduchou \u00fapravu. Sta\u010d\u00ed m\u00edsto konstanty 20 pou\u017e\u00edt glob\u00e1ln\u00ed prom\u011bnnou, kter\u00e1 bude deklarov\u00e1na v\u00a0hlavi\u010dce programu a vlo\u017eit p\u0159ed n\u00ed modifik\u00e1tor input. Ten zajist\u00ed, \u017ee se prom\u011bnn\u00e1 objev\u00ed v\u00a0seznamu vstup\u016f, kter\u00e9 zad\u00e1v\u00e1 u\u017eivatel. \u010c\u00edslovku 20 pak v\u00a0programu jednodu\u0161e nahrad\u00edme n\u00e1zvem t\u00e9to prom\u011bnn\u00e9. Zaokrouhlen\u00ed v\u00fdsledn\u00e9 hodnoty dos\u00e1hneme bu\u010fto s\u00a0pomoc\u00ed funkce NormalizeDouble(), DoubleToStr() nebo DoubleToString(). Funkce NormalizeDouble() mi v\u0161ak ob\u010das z\u00a0n\u011bjak\u00e9ho d\u016fvodu nefungovala spr\u00e1vn\u011b, pou\u017e\u00edv\u00e1m proto druh\u00e9 dv\u011b jmenovan\u00e9. T\u011blo v\u00a0r\u00e1mci funkc\u00ed OnInit() a OnTick() po obou \u00faprav\u00e1ch m\u016f\u017ee vypadat takto:<\/p>\n <\/p>\n
Hlavi\u010dka programu je n\u00e1sleduj\u00edc\u00ed:<\/p>\n <\/p>\n
Sestavili jsme prvn\u00ed smyslupln\u00fd program, kter\u00fd si m\u016f\u017eete vylep\u0161ovat a roz\u0161i\u0159ovat podle sv\u00fdch pot\u0159eb a fantazie. Program m\u016f\u017eete snadno doplnit nap\u0159\u00edklad informacemi o otev\u0159en\u00fdch \u010di uzav\u0159en\u00fdch pozic\u00edch, o spreadu, o \u010dasu do konce sv\u00ed\u010dky a dal\u0161\u00ed a dal\u0161\u00ed funkcionality. M\u016f\u017eete tak\u00e9 dovolit u\u017eivateli, aby si zvolil velikost p\u00edsma, barvu a dal\u0161\u00ed vlastnosti, s jak\u00fdmi se informace bude zobrazovat. To by si vy\u017e\u00e1dalo opu\u0161t\u011bn\u00ed funkce Comment(), vytvo\u0159en\u00ed grafick\u00e9ho objektu typu text a v p\u0159\u00edpad\u011b zm\u011bny hodnoty pr\u016fm\u011bru, zm\u011bnu vlastnosti tohoto objektu. Pomalu se bl\u00ed\u017e\u00edme k t\u00e9matu, kv\u016fli kter\u00e9mu tuto s\u00e9rii p\u00ed\u0161u a kv\u016fli kter\u00e9mu bylo pot\u0159eba absolvovat v\u0161echny lekce, a toti\u017e k automatick\u00fdm obchodn\u00edm syst\u00e9m\u016fm. Spolu s Metatraderem si toti\u017e stahujeme i dva uk\u00e1zkov\u00e9 jednoduch\u00e9 obchodn\u00ed syst\u00e9my p\u0159\u00edmo od Metaquotes. Pr\u00e1v\u011b ony dva si rozebereme a vysv\u011btl\u00edme si jednotliv\u00e9 segmenty, kter\u00e9 lze pou\u017e\u00edt i ve va\u0161ich vlastn\u00edch obchodn\u00edch syst\u00e9mech.<\/p>\n Rozbor obchodn\u00edho syst\u00e9mu I<\/h2>\nKone\u010dn\u011b jsme se dostali\u00a0 ke konkr\u00e9tn\u00edm obchodn\u00edm syst\u00e9m\u016fm. P\u0159edpokl\u00e1d\u00e1me, \u017ee pokud se u\u010d\u00edte programovac\u00ed jazyk MQL, je va\u0161\u00edm c\u00edlem pr\u00e1v\u011b programov\u00e1n\u00ed obchodn\u00edch syst\u00e9m\u016f. AOS rozhodn\u011b p\u0159in\u00e1\u0161ej\u00ed va\u0161emu tradingu nov\u00e9 mo\u017enosti a sama automatizace jako takov\u00e1 v sob\u011b nese spoustu v\u00fdhod. Automatick\u00fd backtest je rozhodn\u011b pohodln\u011bj\u0161\u00ed ne\u017e ru\u010dn\u00ed a b\u011bhem n\u011bkolika vte\u0159in prozrad\u00ed, zda m\u00e1 smysl danou my\u0161lenku d\u00e1le rozv\u00edjet. V posledn\u00edch dvou d\u00edlech si rozebereme dva obchodn\u00ed syst\u00e9my, kter\u00e9 byste po sta\u017een\u00ed Metatraderu m\u011bli naj\u00edt i mezi sv\u00fdmi soubory. Jmenuj\u00ed se Moving Average a MACD Sample a nejdete je v Experts ve slo\u017ece dat va\u0161\u00ed platformy (jej\u00ed\u017e obsah uvid\u00edte po spu\u0161t\u011bn\u00ed MetaEditoru). Poskytuj\u00ed inspiraci p\u0159\u00edmo od Metaquotes, jak by mohl jednoduch\u00fd AOS v Metatraderu se v\u0161emi n\u00e1le\u017eitostmi vypadat, z\u00e1rove\u0148 ale d\u00e1vaj\u00ed najevo, \u017ee ka\u017ed\u00fd obchodn\u00ed syst\u00e9m m\u016f\u017ee b\u00fdt postaven naprosto odli\u0161n\u011b. Za\u010dneme jednodu\u0161\u0161\u00edm MACD Sample. K\u00f3d rozd\u011bl\u00edme na n\u011bkolik \u010d\u00e1st\u00ed. Pod obr\u00e1zkem v\u017edy n\u00e1sleduje popis dan\u00e9 \u010d\u00e1sti, \u010d\u00edsla v z\u00e1vork\u00e1ch ozna\u010duj\u00ed pro lep\u0161\u00ed orientaci \u010d\u00edsla \u0159\u00e1dk\u016f k\u00f3du dle obr\u00e1zku.<\/p>\n <\/p>\n
Hlavi\u010dka obsahuje krom\u011b informac\u00ed o autorovi (6-7) extern\u00ed prom\u011bnn\u00e9 (9-14), kter\u00e9 m\u00e1 zadat u\u017eivatel obchodn\u00edho syst\u00e9mu. Jedn\u00e1 se o prom\u011bnn\u00e9 money managementu a risk managementu a o nastaven\u00ed parametr\u016f indik\u00e1toru MACD.<\/p>\n <\/p>\n
N\u00e1sleduje funkce OnTick(), kde na za\u010d\u00e1tku jsou klasicky deklarov\u00e1ny prom\u011bnn\u00e9, kter\u00e9 se ve funkci pou\u017eij\u00ed (20-23).\u00a0Po skupin\u011b koment\u00e1\u0159\u016f (24-31) n\u00e1sleduje kontroln\u00ed blok, kter\u00fd zamezuje zbyte\u010dn\u00e9 exekuci programu (32-41). Nen\u00ed nutn\u00fd, ale je vhodn\u00e9 n\u011bjak\u00fd podobn\u00fd ve sv\u00e9m programu m\u00edt. V\u00a0tomto p\u0159\u00edpad\u011b se exekuce hned na za\u010d\u00e1tku ukon\u010d\u00ed, pokud je v\u00a0grafu m\u00e9n\u011b ne\u017e 100 sv\u00ed\u010dek anebo pokud u\u017eivatel zadal p\u0159\u00edkaz Take Profit men\u0161\u00ed ne\u017e 10. Program toto vyhodnot\u00ed jako chybu, nap\u00ed\u0161e o tom z\u00e1znam do programov\u00e9ho logu funkc\u00ed Print() (34 a 39) a ukon\u010d\u00ed exekuci. V\u00a0dal\u0161\u00edm bloku jsou vypo\u010d\u00edt\u00e1ny hodnoty, za z\u00e1klad\u011b kter\u00fdch se bude program rozhodovat, zda otev\u0159\u00edt nebo uzav\u0159\u00edt pozici, a jsou ulo\u017eeny do prom\u011bnn\u00fdch (43-48). Autor n\u00e1m z\u00e1rove\u0148 vysv\u011btluje pro\u010d \u2013 zjednodu\u0161uje to k\u00f3d a zrychluje exekuci (42). Konkr\u00e9tn\u011b jde o sou\u010dasn\u00e9 a p\u0159edchoz\u00ed hodnoty indik\u00e1toru MACD a klouzav\u00e9ho pr\u016fm\u011bru.<\/p>\n <\/p>\n
N\u00e1sleduje kone\u010dn\u011b blok rozhodov\u00e1n\u00ed o otev\u0159en\u00ed pozice (50-88). V\u0161e je ulo\u017eeno v\u00a0podm\u00ednce, kter\u00e1 se pt\u00e1, zda je ji\u017e n\u011bjak\u00e1 pozice otev\u0159ena (51). Z\u00a0toho plyne, \u017ee tento AOS dovoluje m\u00edt otev\u0159enou v\u017edy jen jednu pozici. Faktem ale je, \u017ee i kdyby tam tato podm\u00ednka nebyla, v\u00edce pozic ne\u017e jednu by ani ze sv\u00e9 podstaty otev\u0159\u00edt nemohl. S\u00a0touto podm\u00ednkou se ale op\u011bt vyhneme zbyte\u010dn\u00e9 exekuci n\u011bkter\u00fdch oper\u00e1tor\u016f, kdy\u017e u\u017e bude pozice otev\u0159ena. Dal\u0161\u00ed podm\u00ednka se t\u00fdk\u00e1 dostupn\u00e9 mar\u017ee (54-58). Pokud nem\u00e1me dostatek prost\u0159edk\u016f, nem\u00e1 smysl d\u00e1le pokra\u010dovat a zkoumat, zda p\u0159i\u0161el sign\u00e1l pro otev\u0159en\u00ed pozice. Uzav\u0159en\u00ed pozice je ale mimo tuto podm\u00ednku, co\u017e je v\u00a0po\u0159\u00e1dku.<\/p>\n <\/p>\n
Po kontrole dostupn\u00fdch prost\u0159edk\u016f n\u00e1s \u010dek\u00e1 kone\u010dn\u011b rozhodovac\u00ed mechanismus otev\u0159en\u00ed pozice. Pokud je spln\u011bna s\u00e9rie podm\u00ednek, kter\u00e1 odpov\u00edd\u00e1 n\u00e1kupn\u00edmu sign\u00e1lu (60-61), je zavol\u00e1na funkce OrderSend() s\u00a0ur\u010dit\u00fdmi parametry (63). Pokud se poda\u0159\u00ed pozici otev\u0159\u00edt, dostane \u010d\u00edslo tiketu a ulo\u017e\u00ed se do prom\u011bnn\u00e9 ticket (st\u00e1le 63). Kdy\u017e se tak stane, v\u00a0logu se objev\u00ed hl\u00e1\u0161ka o \u00fasp\u011b\u0161n\u00e9m otev\u0159en\u00ed pozice s\u00a0\u010d\u00edslem p\u0159\u00edslu\u0161n\u00e9ho tiketu (64-68). Pokud se n\u011bkde objev\u00ed chyba, rovn\u011b\u017e je o tom odesl\u00e1na informace do logu. Pomoc\u00ed funkce GetLastError() je chyba v takov\u00e9m p\u0159\u00edpad\u011b\u00a0identifikov\u00e1na a exekuce ukon\u010dena (69-71). Pokud je toti\u017e spln\u011bna podm\u00ednka pro long, t\u011b\u017eko bude spln\u011bna tak\u00e9 pro short. N\u00e1sleduje toto\u017en\u00fd blok, kter\u00fd se exekuuje v\u00a0p\u0159\u00edpad\u011b sign\u00e1lu pro short (74-87). Prvn\u00ed d\u016fle\u017eit\u00fd blok t\u00edmto m\u00e1me za sebou. Jak v\u0161ak auto\u0159i spr\u00e1vn\u011b v\u00a0koment\u00e1\u0159i poznamen\u00e1vaj\u00ed (89), vstoupit do trhu spr\u00e1vn\u011b je d\u016fle\u017eit\u00e9, ale je\u0161t\u011b d\u016fle\u017eit\u011bj\u0161\u00ed je z\u00a0n\u011bj spr\u00e1vn\u011b vystoupit. \u010cek\u00e1 n\u00e1s tedy blok, kter\u00fd kontroluje otev\u0159enou pozici a ov\u011b\u0159uje, zda nen\u00ed \u010das ji uzav\u0159\u00edt, p\u0159\u00edpadn\u011b upravit.<\/p>\n <\/p>\n
V\u0161e je uzav\u0159eno v cyklu for (90-151), kter\u00fd m\u00e1 za \u00fakol ud\u011blat tolik iterac\u00ed, kolik je otev\u0159en\u00fdch pozic. Mo\u017en\u00e1 si \u0159eknete \u201epro\u010d, kdy\u017e m\u016f\u017ee b\u00fdt otev\u0159ena v\u017edy jen jedna pozice?\u201c. Z toho d\u016fvodu, \u017ee otev\u0159en\u00e9 pozice v termin\u00e1lu nemus\u00ed poch\u00e1zet jen z \u010dinnosti tohoto obchodn\u00edho syst\u00e9mu. My v\u0161ak chceme prohled\u00e1vat pouze tyto. V prvn\u00ed podm\u00ednce (92-93) na\u010d\u00edt\u00e1me konkr\u00e9tn\u00ed pozici do pam\u011bti. Pokud se na\u010dten\u00ed nepoda\u0159\u00ed, oper\u00e1tor continue zah\u00e1j\u00ed rovnou dal\u0161\u00ed iteraci cyklu. Pokud se poda\u0159\u00ed na\u010d\u00edst pozici, je zji\u0161t\u011bno, zda se nejedn\u00e1 o limitn\u00ed p\u0159\u00edkaz (94) a z jak\u00e9ho instrumentu poch\u00e1z\u00ed (95). Pokud se jedn\u00e1 o long (98), pod\u00edv\u00e1me se na n\u011bj bl\u00ed\u017ee. Pak u\u017e se kone\u010dn\u011b kontroluje, zda jsou spln\u011bny podm\u00ednky pro uzav\u0159en\u00ed obchodu (101-102). Pokud ano, pozici uzav\u0159eme, zap\u00ed\u0161eme o tom z\u00e1znam a ukon\u010d\u00edme exekuci (105-107). Pokud ne, auto\u0159i vlo\u017eili k\u00f3d, kter\u00fd funguje jako TrailingStop (110-122). Pokud je u\u017eivatelem \u00farove\u0148 Trailing Stopu zad\u00e1n (110), zkontroluje se, jestli je obchod v dostate\u010dn\u00e9m zisku (112) a jestli je nad p\u0159\u00edpadn\u00fdm stoplossem (114). Je-li tomu tak, pozice se modifikuje a exekuce ukon\u010d\u00ed (117-119). Pokud je podm\u00ednka na \u0159\u00e1dku 98 vyhodnocena jako neplatn\u00e1, je jasn\u00e9, \u017ee n\u00e1\u0161 p\u0159\u00edkaz je short a n\u00e1sleduje analogick\u00fd blok 124-149, kde je rozhodov\u00e1no o jeho uzav\u0159en\u00ed a o posunut\u00ed stoplossu.<\/p>\n Rozbor obchodn\u00edho syst\u00e9mu II<\/h2>\nDruh\u00fd ze zmi\u0148ovan\u00fdch uk\u00e1zkov\u00fdch obchodn\u00edch syst\u00e9m\u016f, Moving Average, funguje v z\u00e1sad\u011b podobn\u011b, ale je zkonstruov\u00e1n zcela odli\u0161n\u011b.\u00a0Princip fungov\u00e1n\u00ed obou syst\u00e9m\u016f je podobn\u00fd, \u0159\u00edd\u00ed se tradi\u010dn\u00edm pou\u017eit\u00edm indik\u00e1toru MACD, respektive p\u0159ek\u0159\u00ed\u017een\u00edm klouzav\u00e9ho pr\u016fm\u011bru cenou. Pro\u010d rozeb\u00edr\u00e1me zrovna tyto dva? Krom\u011b toho, \u017ee je m\u00e1 v platform\u011b ka\u017ed\u00fd, je jedn\u00edm z d\u016fvod\u016f ten, \u017ee z hlediska program\u00e1torsk\u00e9ho jsou naps\u00e1ny \u00fapln\u011b jin\u00fdm zp\u016fsobem. \u010cten\u00e1\u0159 tak z\u00edsk\u00e1 de facto dva odli\u0161n\u00e9 pohledy na jednu v\u011bc, co\u017e by m\u011blo rozvinout kreativitu a poskytnout inspiraci. Rozbor budeme prov\u00e1d\u011bt stejn\u011b jako v minul\u00e9m d\u00edle \u2013 \u0159\u00e1dek po \u0159\u00e1dku tak, jak program k\u00f3d exekuuje. Popis v\u017edy n\u00e1sleduje pod obr\u00e1zkem rozeb\u00edran\u00e9 \u010d\u00e1sti. V z\u00e1vork\u00e1ch jsou pro p\u0159ehlednost uvedeny p\u0159\u00edslu\u0161n\u00e9 \u0159\u00e1dky k\u00f3du, na kter\u00e9 je odkazov\u00e1no. Za\u010dneme samoz\u0159ejm\u011b hlavi\u010dkou.<\/p>\n <\/p>\n
V\u00a0hlavi\u010dce jsou nejprve tradi\u010dn\u011b uvedeny informace o tv\u016frci k\u00f3du (1-8). N\u00e1sleduje p\u0159\u00edkaz #define, pomoc\u00ed kter\u00e9ho d\u00e1v\u00e1 autor pro jednoduchost jm\u00e9no ur\u010dit\u00e9 konstant\u011b, kter\u00e1 se v\u00a0k\u00f3du objev\u00ed v\u00edcekr\u00e1t (10), v\u00a0tomto p\u0159\u00edpad\u011b jako takzvan\u00e9 magick\u00e9 \u010d\u00edslo obchodu. To se pou\u017e\u00edv\u00e1 nap\u0159\u00edklad pro odli\u0161en\u00ed obchod\u016f poch\u00e1zej\u00edc\u00edch z\u00a0jedn\u00e9 konkr\u00e9tn\u00ed strategie. V\u00a0dal\u0161\u00edm bloku je v\u00fdpis v\u0161ech u\u017eivatelem zad\u00e1van\u00fdch prom\u011bnn\u00fdch (12-16). Aby je mohl zadat u\u017eivatel, sta\u010d\u00ed p\u0159ed deklaraci vlo\u017eit p\u0159\u00edkaz input. Na dal\u0161\u00edm \u0159\u00e1dku n\u00e1sleduje funkce CalculateCurrentOrders(). My v\u0161ak v\u00edme, \u017ee program nejprve exekuuje speci\u00e1ln\u00ed funkci OnInit(). Ta v\u00a0programu \u00fapln\u011b chyb\u00ed, tak\u017ee n\u00e1sleduje speci\u00e1ln\u00ed funkce OnTick().<\/p>\n <\/p>\n
Zde vid\u00edme prvn\u00ed podstatn\u00fd rozd\u00edl oproti syst\u00e9mu MACD Sample. Cel\u00fd k\u00f3d MACD Sample k\u00a0exekuci je um\u00edst\u011bn uvnit\u0159 funkce OnTick(), kde\u017eto zdej\u0161\u00ed funkce OnTick() se omez\u00ed jen na p\u00e1r \u0159\u00e1dk\u016f. Nejprve program kontroluje, zda je v\u00a0grafu v\u00edce ne\u017e 100 sv\u00ed\u010dek a zda je povoleno automatick\u00e9 obchodov\u00e1n\u00ed (138). Pokud je jedna z podm\u00ednek poru\u0161ena, exekuce ihned kon\u010d\u00ed (139). N\u00e1sleduje rozhodov\u00e1n\u00ed. Pokud funkce CalculateCurrentOrders() s\u00a0parametrem n\u00e1zvu symbolu grafu (ten vrac\u00ed funkce Symbol()) vr\u00e1t\u00ed nulu, je zavol\u00e1na funkce CheckForOpen() (141). Pokud vr\u00e1t\u00ed cokoliv jin\u00e9ho, je zavol\u00e1na funkce CheckForClose() (142). Z\u00a0t\u011bchto dvou \u0159\u00e1dk\u016f plyne, \u017ee strategie m\u016f\u017ee m\u00edt nar\u00e1z otev\u0159en\u00fd pouze jeden obchod, stejn\u011b jako tomu bylo u MACD Sample. Poj\u010fme se nyn\u00ed pod\u00edvat na ony t\u0159i funkce, kter\u00e9 jsou uvnit\u0159\u00a0t\u00e9to funkce vol\u00e1ny.<\/p>\n <\/p>\n
Funkce CalculateCurrentOrders(), do kter\u00e9 vstupuje parametr \u201esymbol\u201c obsahuj\u00edc\u00ed n\u00e1zev grafu, na kter\u00e9m strategie b\u011b\u017e\u00ed, je oby\u010dejn\u00e1 u\u017eivatelsk\u00e1 funkce, kter\u00e1 m\u00e1 za \u00fakol spo\u010d\u00edtat po\u010det otev\u0159en\u00fdch pozic. Toho dosahuje cyklem, kter\u00fd proj\u00ed\u017ed\u00ed v\u0161echny pozice v\u00a0tabulce obchod (tj. jak otev\u0159en\u00e9, tak \u010dekaj\u00edc\u00ed limitn\u00ed). Pro \u00fa\u010dely cyklu je pou\u017eito pomocn\u00e9 prom\u011bnn\u00e9 i (24). Po v\u00fdb\u011bru pozice je zji\u0161t\u011bno, zda je otev\u0159ena na stejn\u00e9m symbolu, na kter\u00e9m b\u011b\u017e\u00ed strategie a z\u00e1rove\u0148 zda je jej\u00ed magick\u00e9 \u010d\u00edslo shodn\u00e9 s\u00a0na\u0161\u00edm (27). T\u00edm je zaji\u0161t\u011bno, \u017ee obchody, kter\u00e9 pro\u0161ly t\u00edmto s\u00edtem, byly otev\u0159eny touto strategi\u00ed na tomto grafu. Zb\u00fdv\u00e1 ji\u017e jen zjistit, zda je dan\u00e1 pozice long (29) nebo short (30) a pokud ano, p\u0159i\u010d\u00edst do p\u0159\u00edslu\u0161n\u00e9 prom\u011bnn\u00e9 jedni\u010dku. Vr\u00e1cen bude po\u010det long\u016f nebo z\u00e1porn\u00e1 hodnota po\u010dtu short\u016f (34,35). Z\u00edsk\u00e1me tak de facto expozici, kterou strategie vytvo\u0159ila.<\/p>\n <\/p>\n
Tato funkce m\u00e1, jak n\u00e1zev napov\u00edd\u00e1, za \u00fakol zjistit, zda jsou v\u00a0trhu podm\u00ednky pro otev\u0159en\u00ed pozice. Zaj\u00edmav\u00fd je \u0159\u00e1dek 78. Ten \u0159\u00edk\u00e1, \u017ee pokra\u010dovat ve funkci se m\u00e1 pouze u prvn\u00edho ticku nov\u00e9 sv\u00ed\u010dky. Jde tedy\u00a0o obchodn\u00ed syst\u00e9m, kter\u00fd exekuuje sign\u00e1ly pouze na nov\u00e9 sv\u00ed\u010dce. V\u00a0p\u0159\u00edpad\u011b prvn\u00edho ticku nov\u00e9 sv\u00ed\u010dky tedy program nejprve zjist\u00ed aktu\u00e1ln\u00ed hodnotu klouzav\u00e9ho pr\u016fm\u011bru s\u00a0parametry, kter\u00e9 zadal u\u017eivatel programu, a ulo\u017e\u00ed ji do prom\u011bnn\u00e9 \u201ema\u201c (80). N\u00e1sledn\u011b se zji\u0161\u0165uje, zda byl p\u0159ek\u0159\u00ed\u017een klouzav\u00fd pr\u016fm\u011br a p\u0159\u00edpadn\u011b kter\u00fdm sm\u011brem. Pokud open posledn\u00ed hotov\u00e9 sv\u00ed\u010dky bylo v\u00fd\u0161e ne\u017e pr\u016fm\u011br, ale close bylo ji\u017e n\u00ed\u017ee (82), znamen\u00e1 to, \u017ee cena protnula pr\u016fm\u011br sm\u011brem dol\u016f, co\u017e znamen\u00e1 prodejn\u00ed sign\u00e1l (84,85). Opa\u010dn\u00e1 situace je \u0159e\u0161ena na \u0159\u00e1dc\u00edch 88-91. Pro v\u00fdpo\u010det objemu pozice je v\u00a0obou p\u0159\u00edpadech zavol\u00e1na funkce LotsOptimized(). Funkce p\u0159edstavuje ur\u010dit\u00fd nadstandard pro money management a v\u00a0tomto d\u00edle ji rozeb\u00edrat nebudeme.<\/p>\n <\/p>\n
Funkce, kter\u00e1 kontroluje podm\u00ednky pro uzav\u0159en\u00ed pozice, m\u00e1 v podstat\u011b stejnou konstrukci jako CheckForOpen(). Kontrola op\u011bt prob\u00edh\u00e1 jen p\u0159i prvn\u00edm ticku nov\u00e9 sv\u00ed\u010dky (102). Op\u011bt je zji\u0161t\u011bna posledn\u00ed hodnota klouzav\u00e9ho pr\u016fm\u011bru (104) a porovn\u00e1na s otev\u00edrac\u00ed a zav\u00edrac\u00ed cenou posledn\u00ed sv\u00ed\u010dky (113 a 122). Nejd\u0159\u00edve je ale pot\u0159eba vybrat pozici, kterou budeme kontrolovat pro uzav\u0159en\u00ed. To prob\u00edh\u00e1 podobn\u00fdm cyklem jako ve funkci CalculateCurrentOrders(). Rozd\u00edl je pouze v druh\u00e9 podm\u00ednce, kter\u00e1 je pojata opa\u010dn\u00fdm zp\u016fsobem (109). Pokud magick\u00e9 \u010d\u00edslo nebo symbol grafu nesouhlas\u00ed s magick\u00fdm \u010d\u00edslem strategie a s grafem, na kter\u00e9m b\u011b\u017e\u00ed, vynut\u00ed se nov\u00e1 iterace cyklu (p\u0159ejde se na dal\u0161\u00ed pozici), nebo\u0165 takov\u00e1 pozice n\u00e1s nezaj\u00edm\u00e1. Jakmile m\u00e1me pozici, kter\u00e1 n\u00e1s zaj\u00edm\u00e1, sta\u010d\u00ed zjistit, zda se jedn\u00e1 o long (111) nebo o short (120), a potom zkontrolovat, jak je na tom klouzav\u00fd pr\u016fm\u011br v\u016f\u010di cen\u011b. Pokud cena p\u0159ek\u0159\u00ed\u017eila pr\u016fm\u011br shora (113), je to sign\u00e1l k uzav\u0159en\u00ed longu (115,116). Pokud jej p\u0159ek\u0159\u00ed\u017eila zespoda (122), je to sign\u00e1l k uzav\u0159en\u00ed shortu (124,125). Pokud je n\u011bjak\u00e1 pozice uzav\u0159ena, cyklus lze ukon\u010dit (118,127), nebo\u0165 strategie m\u016f\u017ee m\u00edt otev\u0159enou nanejv\u00fd\u0161 jednu pozici. T\u00edm jsou u konce oba rozbory obchodn\u00edch syst\u00e9m\u016f.<\/p>\n Tester strategi\u00ed<\/h2>\nM\u00e1me-li jednou naprogramovan\u00fd obchodn\u00ed syst\u00e9m nebo alespo\u0148 jeho z\u00e1klad, jist\u011b bude vhodn\u00e9 jej otestovat na historick\u00fdch datech. D\u00edky tomu zav\u010dasu zjist\u00edme, zda v\u016fbec m\u00e1 smysl jeho dal\u0161\u00ed v\u00fdvoj, ale tak\u00e9 odhal\u00edme p\u0159\u00edpadn\u00e9 program\u00e1torsk\u00e9 chyby, kter\u00e9 neodhalil kompil\u00e1tor. Pokud je v\u0161e v po\u0159\u00e1dku, bude dobr\u00e9 tak\u00e9 optimalizovat parametry obchodn\u00edho syst\u00e9mu, abychom zjistili nejvhodn\u011bj\u0161\u00ed kombinaci parametr\u016f a t\u00edm vyt\u011b\u017eili maximum z jeho potenci\u00e1lu. V\u00a0t\u011bchto \u00fakolech v\u00e1m pom\u016f\u017ee posledn\u00ed d\u00edl t\u00e9to s\u00e9rie o programov\u00e1n\u00ed v\u00a0jazyce MQL, kter\u00fd ji\u017e nebude p\u0159\u00edmo o programov\u00e1n\u00ed, ale logicky k\u00a0t\u00e9to s\u00e9rii pat\u0159\u00ed.<\/p>\n Testov\u00e1n\u00ed<\/h3>\nModul pro testov\u00e1n\u00ed automatick\u00fdch obchodn\u00edch syst\u00e9m\u016f, ale tak\u00e9 indik\u00e1tor\u016f na historick\u00fdch datech najdeme v\u00a0termin\u00e1lu pod n\u00e1zvem Tester strategi\u00ed s\u00a0ikonou . Po kliknut\u00ed na n\u00ed se pod grafy otev\u0159e n\u00e1sleduj\u00edc\u00ed okno:<\/p>\n <\/p>\n
V\u00a0nejv\u011bt\u0161\u00edm rozev\u00edrac\u00edm seznamu vybereme obchodn\u00ed syst\u00e9m, kter\u00fd chceme testovat. D\u00e1le je pot\u0159eba zadat testovan\u00fd instrument, timeframe testovan\u00e9ho grafu a model neboli p\u0159esnost. Pokud nebude pro zadan\u00fd datum dostupn\u00fd p\u0159\u00edslu\u0161n\u00fd timeframe, tester vezme prvn\u00ed vy\u0161\u0161\u00ed. \u010c\u00edm p\u0159esn\u011bj\u0161\u00ed model vybereme, t\u00edm d\u00e9le bude test trvat, ale t\u00edm spolehliv\u011bj\u0161\u00ed v\u00fdsledky obdr\u017e\u00edme. D\u00e1le m\u016f\u017eeme nastavit datum, od kter\u00e9ho, p\u0159\u00edpadn\u011b do kter\u00e9ho bude syst\u00e9m podroben testu. Pokud checkbox Pou\u017e\u00edt datum od\u0161krtneme, pou\u017eije se ve\u0161ker\u00e1 dostupn\u00e1 historie. M\u016f\u017eeme si tak\u00e9 zvolit konkr\u00e9tn\u00ed v\u00fd\u0161i spreadu, pokud nechceme pou\u017e\u00edt aktu\u00e1ln\u00ed spread instrumentu. Checkbox vizu\u00e1ln\u00ed zobrazov\u00e1n\u00ed pou\u017eijeme v\u00a0p\u0159\u00edpad\u011b, \u017ee test chceme vid\u011bt p\u0159\u00edmo v\u00a0grafu, \u0161oup\u00e1tkem potom nastav\u00edme rychlost zobrazov\u00e1n\u00ed. Checkbox Optimalizace rozebereme pozd\u011bji, p\u0159i b\u011b\u017en\u00e9m testu ho neza\u0161krt\u00e1v\u00e1me. V\u00a0prav\u00e9 \u010d\u00e1sti testeru se nach\u00e1z\u00ed n\u011bkolik tla\u010d\u00edtek. To nejd\u016fle\u017eit\u011bj\u0161\u00ed, Vlastnosti strategie\u2026,\u00a0 je hned naho\u0159e. Odk\u00e1\u017ee n\u00e1s na okno, kde vyb\u00edr\u00e1me tak d\u016fle\u017eit\u00e9 parametry testu jako po\u010d\u00e1te\u010dn\u00ed kapit\u00e1l, m\u011bnu a parametry obchodn\u00edho syst\u00e9mu, co\u017e jsou hodnoty extern\u00edch prom\u011bnn\u00fdch, kter\u00e9 zad\u00e1v\u00e1 u\u017eivatel. Na ostatn\u00ed nastaven\u00ed se pod\u00edv\u00e1me za okam\u017eik. Smysl zb\u00fdvaj\u00edc\u00edch tla\u010d\u00edtek by m\u011bl b\u00fdt z\u0159ejm\u00fd. Jakmile m\u00e1me v\u0161e pot\u0159ebn\u00e9 nastaveno, test odklepneme tla\u010d\u00edtkem Za\u010d\u00e1tek. Jako p\u0159\u00edklad otestujeme \u00fasp\u011b\u0161nost uk\u00e1zkov\u00e9ho obchodn\u00edho syst\u00e9mu MACD Sample, kter\u00fd byste m\u011bli nal\u00e9zt i ve sv\u00e9m Metatraderu. K\u00f3d tohoto obchodn\u00edho syst\u00e9mu jsme rozeb\u00edrali v\u00a0p\u0159edminul\u00e9m d\u00edle. Pod\u00edvejme se, jak se mu da\u0159ilo v\u00a0roce 2015 na n\u011bmeck\u00e9m indexu DAX, a to nejp\u0159esn\u011bj\u0161\u00edm mo\u017en\u00fdm zp\u016fsobem. Po\u010d\u00e1te\u010dn\u00ed kapit\u00e1l ponech\u00e1me 10\u00a0000 USD. Parametr TakeProfit nastav\u00edme na 1000 (100 bod\u016f), TrailingStop na 500, ostatn\u00ed parametry ponech\u00e1me ve v\u00fdchoz\u00edm nastaven\u00ed.<\/p>\n <\/p>\n
Rychlost testu z\u00e1vis\u00ed na zvolen\u00e9 p\u0159esnosti a na v\u00fdpo\u010detn\u00edm v\u00fdkonu po\u010d\u00edta\u010de. V\u00a0tomto smyslu je \u0161koda, \u017ee Metatrader 4 dok\u00e1\u017ee vyu\u017e\u00edvat pouze jedno j\u00e1dro procesoru po\u010d\u00edta\u010de. Po dokon\u010den\u00ed se ozve legra\u010dn\u00ed v\u00fdchoz\u00ed zvuk a v\u00a0modulu p\u0159ibydou t\u0159i nov\u00e9 z\u00e1lo\u017eky. V\u00fdsledky <\/strong>–\u00a0 Zde se objev\u00ed v\u00fdpis v\u0161ech p\u0159\u00edkaz\u016f tak, jak by je strategie postupn\u011b generovala \u2013 otev\u0159en\u00ed pozice, modifikace i uzav\u0159en\u00ed s\u00a0r\u016fzn\u00fdmi podrobnostmi.<\/p>\n <\/p>\n
Graf<\/strong> \u2013 V\u00a0t\u00e9to z\u00e1lo\u017ece uvid\u00edme v\u00fdvoj kapit\u00e1lu \u00fa\u010dtu reprezentovan\u00fd modrou k\u0159ivkou (\u010desky pojmenov\u00e1no jako z\u016fstatek). V\u00a0p\u0159\u00edpad\u011b, \u017ee obchodn\u00ed syst\u00e9m generuje vysok\u00e9 otev\u0159en\u00e9 zisky\/ztr\u00e1ty, m\u016f\u017ee b\u00fdt z\u0159eteln\u00e1 tak\u00e9 zelen\u00e1 k\u0159ivka, kter\u00e1 zapo\u010d\u00edt\u00e1v\u00e1 pr\u00e1v\u011b otev\u0159en\u00fd stav \u00fa\u010dtu (majetek). N\u00e1\u0161 syst\u00e9m s\u00a0dan\u00fdmi parametry v\u00a0po\u010d\u00e1tku dan\u00e9ho obdob\u00ed v\u00edcem\u00e9n\u011b stagnoval, potom za\u010dal ztr\u00e1cet.<\/p>\n <\/p>\n
P\u0159ehled<\/strong> je nejd\u016fle\u017eit\u011bj\u0161\u00ed \u010d\u00e1st vyhodnocen\u00ed, na kter\u00e9 vid\u00edme v\u0161echny hlavn\u00ed parametry testu, kter\u00e9 m\u016f\u017eeme d\u00e1le analyzovat.<\/p>\n <\/p>\n
Optimalizace<\/h3>\nBylo by zdlouhav\u00e9 d\u011blat des\u00edtky test\u016f s\u00a0r\u016fzn\u00fdmi parametry, abychom zjistili, kter\u00e9 parametry jsou pro dan\u00fd syst\u00e9m a instrument nejvhodn\u011bj\u0161\u00ed. Metatrader to ud\u011bl\u00e1 na\u0161t\u011bst\u00ed za n\u00e1s, my mu mus\u00edme jen \u0159\u00edct, kter\u00e9 parametry chceme optimalizovat, jak\u00e9 budou jejich hrani\u010dn\u00ed hodnoty a jak velik\u00e9 budou kroky, po kter\u00fdch se budou parametry m\u011bnit. Termin\u00e1l pak provede s\u00e9rii test\u016f a zobraz\u00ed v\u00fdsledky, ze kter\u00fdch vyplyne, jak\u00e9 v\u00fdsledky vykazuje ta kter\u00e1 kombinace parametr\u016f. Samoz\u0159ejm\u011b bychom nem\u011bli syst\u00e9my optimalizovat pouze podle zisku, ale sp\u00ed\u0161e podle risk faktor\u016f jako maxim\u00e1ln\u00ed drawdown apod. To je ale sou\u010d\u00e1st\u00ed jin\u00e9ho pov\u00edd\u00e1n\u00ed o tradingu. Dejme tomu, \u017ee chceme zjistit vhodn\u00e9 nastaven\u00ed profit targetu a stop lossu pro obchodn\u00ed syst\u00e9m MACD Sample na DAXu za minul\u00fd rok. Nastaven\u00ed z\u016fstane stejn\u00e9, jak\u00e9 jsme pou\u017eili p\u0159i b\u011b\u017en\u00e9m testu, tentokr\u00e1t ale za\u0161krtneme checkbox Optimalizace. Parametry optimalizace nastav\u00edme ve Vlastnostech strategie. V\u00a0z\u00e1lo\u017ece testov\u00e1n\u00ed nastav\u00edme optimalizovan\u00fd parametr. Ve v\u00fdchoz\u00edm nastaven\u00ed je to Balance, tester tedy bude hledat kombinaci parametr\u016f, kter\u00e1 by p\u0159inesla nejvy\u0161\u0161\u00ed zisk. My, proto\u017ee jsme rizikov\u011b averzn\u00ed, budeme optimalizovat drawdown \u00fa\u010dtu, nastav\u00edme tedy Maximal Drawdown.<\/p>\n <\/p>\n
Na z\u00e1lo\u017ece Vlo\u017eit parametry si tentokr\u00e1t v\u0161imneme dal\u0161\u00edch sloupc\u016f, kter\u00e9 n\u00e1s p\u0159i prost\u00e9m testu nezaj\u00edmaly. Za\u0161krtneme parametry, kter\u00e9 chceme optimalizovat, v\u00a0na\u0161em p\u0159\u00edpad\u011b tedy TakeProfit a TrailingStop. Sloupec Hodnota nyn\u00ed nehraje u optimalizovan\u00fdch parametr\u016f roli, d\u016fle\u017eit\u00e9 jsou dal\u0161\u00ed t\u0159i. V\u00a0nich je pot\u0159eba nastavit nejni\u017e\u0161\u00ed a nejvy\u0161\u0161\u00ed testovanou hodnotu a po jak velk\u00fdch kroc\u00edch m\u00e1 tester postupovat. \u010c\u00edm men\u0161\u00ed bude krok, t\u00edm v\u00edce kombinac\u00ed bude tester prov\u00e1d\u011bt a t\u00edm d\u00e9le bude cel\u00fd proces trvat. \u0158ekn\u011bme, \u017ee budeme cht\u00edt naj\u00edt vhodnou kombinaci na\u0161ich dvou parametr\u016f, p\u0159i\u010dem\u017e budeme cht\u00edt prov\u011b\u0159it stoplosy 500,1000,1500 a 2000 a Profit targety od 1000 do 5000 po 500. V\u00a0p\u0159\u00edpad\u011b stoplossu se jedn\u00e1 o 4 hodnoty, u targetu o 9 hodnot. Celkem by tedy tester m\u011bl porovnat v\u00fdsledky 4*9 = 36 kombinac\u00ed. Tabulka parametr\u016f bude ve spr\u00e1vn\u00e9m nastaven\u00ed vypadat n\u00e1sledovn\u011b:<\/p>\n <\/p>\n
Na posledn\u00ed z\u00e1lo\u017ece Optimalizace potom lze nastavit limity n\u011bkter\u00fdch parametr\u016f \u00fa\u010dtu. Jakmile m\u00e1me v\u0161e pot\u0159ebn\u00e9 nastaveno, klikneme na Za\u010d\u00e1tek. Optimalizace pochopiteln\u011b trv\u00e1 mnohem d\u00e9le ne\u017e samotn\u00fd test. V\u00a0na\u0161em p\u0159\u00edpad\u011b prov\u00e1d\u00ed tester 36 test\u016f za sebou a porovn\u00e1v\u00e1 v\u00fdsledky. V\u00a0p\u0159\u00edpad\u011b rozs\u00e1hl\u00fdch optimalizac\u00ed na podrobn\u00fdch datech se m\u016f\u017ee prot\u00e1hnout i na mnoho hodin. Po dokon\u010den\u00ed optimalizace p\u0159ibydou dal\u0161\u00ed dv\u011b z\u00e1lo\u017eky \u2013 V\u00fdsledek optimalizace a Graf optimalizace. V\u00fdsledek optimalizace \u2013 <\/strong>Zde vid\u00edme tabulku s\u00a0informacemi o v\u00fdsledc\u00edch test\u016f jednotliv\u00fdch kombinac\u00ed. Jsou se\u0159azeny podle parametru, kter\u00fd jsme cht\u011bli optimalizovat, a to od nejlep\u0161\u00edho v\u00fdsledku po nejhor\u0161\u00ed.<\/p>\n <\/p>\n
Graf optimalizace \u2013<\/strong> zde uvid\u00edme grafick\u00fd v\u00fdsledek optimalizace. Ten se m\u016f\u017ee zna\u010dn\u011b li\u0161it podle toho, kolik parametr\u016f optimalizujeme. Z na\u0161eho testu obdr\u017e\u00edme graf, na jeho\u017e vodorovn\u00e9 ose vid\u00edme po\u0159adov\u00e9 \u010d\u00edslo testu a na svisl\u00e9 maxim\u00e1ln\u00ed drawdown, tedy optimalizovan\u00fd parametr. Po najet\u00ed kurzorem na modrou kuli\u010dku se dozv\u00edme, kter\u00fdm parametr\u016fm dan\u00fd v\u00fdsledek odpov\u00edd\u00e1.<\/p>\n <\/p>\n
Jak s v\u00fdsledky test\u016f a optimalizac\u00ed nalo\u017eit, to u\u017e je \u00fakol pro v\u00e1s a pro jin\u00e9 \u010dl\u00e1nky a s\u00e9rie. J\u00e1 v\u011b\u0159\u00edm, \u017ee tato s\u00e9rie v\u00e1m poskytla srozumiteln\u00fd z\u00e1klad pro tvorbu, testov\u00e1n\u00ed a vylep\u0161ov\u00e1n\u00ed rozli\u010dn\u00fdch obchodn\u00edch syst\u00e9m\u016f, indik\u00e1tor\u016f a jin\u00fdch \u0161ikovn\u00fdch progr\u00e1mk\u016f v Metatraderu, kter\u00e9 v\u00e1m pomohou dos\u00e1hnout va\u0161eho obchodn\u00edho potenci\u00e1lu. Pokud najdete obchodn\u00ed syst\u00e9m, kter\u00fd bude spl\u0148ovat risk parametry projektu FTMO, nev\u00e1hejte p\u0159ijmout na\u0161i V\u00fdzvu, nebo\u0165 i \u0161ikovn\u00e9 v\u00fdvoj\u00e1\u0159e automatick\u00fdch syst\u00e9m\u016f r\u00e1di prost\u0159ednictv\u00edm na\u0161eho projektu podpo\u0159\u00edme.<\/p>\n Nej\u010dast\u011bj\u0161\u00ed chyby a jejich \u0159e\u0161en\u00ed<\/h2>\nM\u00e1lokdy se poda\u0159\u00ed napsat funk\u010dn\u00ed program hned na prvn\u00ed pokus. V\u011bt\u0161inou je pot\u0159eba nejprve vy\u0159e\u0161it chyby, p\u0159\u00edpadn\u011b varov\u00e1n\u00ed, na kter\u00e9 n\u00e1s upozorn\u00ed kompil\u00e1tor. Proto si p\u0159edstav\u00edme ty nejklasi\u010dt\u011bj\u0161\u00ed a \u0159ekneme si, kde je jejich p\u0159\u00ed\u010dina a jak postupovat p\u0159i jejich oprav\u011b. Na z\u00e1v\u011br se pod\u00edv\u00e1me i na chyby, kter\u00e9 vrac\u00ed termin\u00e1l nebo server brokera, tedy ve v\u011bt\u0161in\u011b chyby p\u0159i exekuci obchodn\u00edch p\u0159\u00edkaz\u016f.<\/p>\n Chyby kompil\u00e1toru<\/h3>\n <\/p>\n
Takto vypad\u00e1 okno s\u00a0v\u00fdpisem logu kompil\u00e1toru. Okno se nach\u00e1z\u00ed v\u00a0Panelu n\u00e1stroj\u016f\u00a0MetaEditoru a p\u0159i ka\u017ed\u00e9 kompilaci na n\u00e1s automaticky vysko\u010d\u00ed. \u0158\u00e1dky se znakem jednosm\u011brky jsou chybami, kter\u00e9 je t\u0159eba opravit p\u0159ed pou\u017eit\u00edm programu. Dokud nebudou opraveny v\u0161echny chyby, nebude program mo\u017en\u00e9 ani spustit. \u0158\u00e1dky se \u017elut\u00fdm troj\u00faheln\u00edkem jsou potom varov\u00e1n\u00ed, kter\u00e1 n\u00e1s upozor\u0148uj\u00ed na mo\u017enou chybu nebo neefektivitu, ale program p\u016fjde i s\u00a0nimi spustit. Poklep\u00e1n\u00edm na \u0159\u00e1dek chyby\/varov\u00e1n\u00ed se kurzor p\u0159esune na m\u00edsto chyby v\u00a0k\u00f3du. Sou\u0159adnice jsou vyps\u00e1ny tak\u00e9 ve sloupc\u00edch \u0158\u00e1dek a Sloupec. N\u00e1sleduj\u00edc\u00ed skupina chyb obvykle znamen\u00e1 chybu v\u00a0syntaxi. P\u0159edpokl\u00e1d\u00e1me, \u017ee syntax zn\u00e1me, proto se obvykle jedn\u00e1 o p\u0159eklepy a nepozornosti, kter\u00e9 se snadno vy\u0159e\u0161\u00ed. \u00a0 Jde o \u010d\u00e1st k\u00f3du, kde kontrola o\u010dek\u00e1v\u00e1 n\u011bjak\u00fd v\u00fdraz nebo n\u00e1zev, ale nenajde jej tam. M\u016f\u017ee se jednat t\u0159eba o zapomenutou \u010d\u00e1rku tam, kde m\u00e1 b\u00fdt n\u00e1zev prom\u011bnn\u00e9 pro deklaraci: \u00a0 Semicolon je anglicky st\u0159edn\u00edk, proto tuto chybu z\u00edsk\u00e1me v\u00a0p\u0159\u00edpad\u011b, \u017ee zapomeneme za n\u011bjakou operac\u00ed napsat st\u0159edn\u00edk. Chyba v\u0161ak ovlivn\u00ed celou strukturu programu (podobn\u011b jako kdy\u017e nenap\u00ed\u0161eme te\u010dku se\u00a0z\u00a0jedn\u00e9 v\u011bty v \u010dl\u00e1nku mohou\u00a0st\u00e1t n\u00e1hle t\u0159i) a m\u016f\u017ee\u00a0proto zp\u016fsobit lavinu dal\u0161\u00edch chyb, kter\u00e9 po opraven\u00ed t\u00e9to zmiz\u00ed. Tyto z\u00e1kladn\u00ed chyby v\u00a0syntaxi je proto vhodn\u00e9 opravovat jako prvn\u00ed a ve sm\u011bru shora. \u00a0 Tato chyba se objevuje\u00a0tam, kde program o\u010dek\u00e1v\u00e1 oper\u00e1tor a nenajde jej tam. Nap\u0159\u00edklad v t\u00e9to \u010d\u00e1sti k\u00f3du chybu zp\u016fsobila neuzav\u0159en\u00e1 z\u00e1vorka, kdy kontrola o\u010dek\u00e1vala pokra\u010dov\u00e1n\u00ed podm\u00ednky, ale narazila u\u017e na slo\u017eenou z\u00e1vorku, kter\u00e1 ozna\u010duje za\u010d\u00e1tek t\u011bla oper\u00e1toru. \u00a0 \u00a0 D\u016fsledkem je i n\u00e1sleduj\u00edc\u00ed chyba, kter\u00e1 upozor\u0148uje pr\u00e1v\u011b na neuzav\u0159enou z\u00e1vorku: \u00a0M\u016f\u017eete narazit tak\u00e9 na n\u00e1sleduj\u00edc\u00ed s\u00e9rii chyb:<\/p>\n <\/p>\n
Ta vznikne, pokud program v\u00a0hlavi\u010dce oper\u00e1toru nenajde podm\u00ednku. Tradi\u010dn\u011b se to st\u00e1v\u00e1 t\u0159eba\u00a0p\u0159i z\u00e1m\u011bn\u011b porovn\u00e1vac\u00edho oper\u00e1toru \u201e==\u201c a p\u0159i\u0159azovac\u00edho oper\u00e1toru \u201e=\u201c. Pokud se n\u00e1m to stane pr\u00e1v\u011b v\u00a0hlavi\u010dce nap\u0159\u00edklad oper\u00e1toru if-else, z\u00a0podm\u00ednky se stane operace a vznikne tato chyba. Vzhledem k\u00a0podobnosti obou v\u00fdraz\u016f je \u010dasto obt\u00ed\u017en\u00e9 odhalit takto ban\u00e1ln\u00ed probl\u00e9m. \u00a0 Tato chyba znamen\u00e1 nespr\u00e1vn\u00fd po\u010det parametr\u016f funkce. Pokud nev\u00edme, co s t\u00edm, je vhodn\u00e9 se pod\u00edvat do dokumentace na v\u00fd\u010det parametr\u016f (docs.mql4.com).<\/p>\n <\/p>\n
Tyto chyby ozna\u010duj\u00ed chybnou vr\u00e1cenou hodnotu funkce. Prvn\u00ed p\u0159\u00edpad nastane, pokud funkce nevrac\u00ed nic, p\u0159itom nen\u00ed typu void (tedy mus\u00ed n\u011bco vr\u00e1tit). \u0158e\u0161en\u00edm je oper\u00e1tor return s hodnotou v z\u00e1vorce, nap\u0159. return(lots); p\u0159i\u010dem\u017e typ vracen\u00e9 hodnoty mus\u00ed odpov\u00eddat typu funkce. A naopak druh\u00e1 chyba ozna\u010duje p\u0159\u00edpad, kdy n\u00e1m funkce vrac\u00ed hodnotu, p\u0159esto\u017ee se jedn\u00e1 o typ void, kter\u00fd nic vracet nem\u00e1. Pak je \u0159e\u0161en\u00edm osamocen\u00fd oper\u00e1tor return;.<\/p>\n Pokud return \u00fapln\u011b chyb\u00ed, dostaneme tuto chybu: <\/p>\n T\u00edm program upozor\u0148uje, \u017ee n\u011bkde je v\u00a0programu slep\u00e1 uli\u010dka. M\u016f\u017ee to nastat pr\u00e1v\u011b p\u0159i absenci oper\u00e1toru return ve funkci, ale tak\u00e9 t\u0159eba p\u0159i n\u00e1sleduj\u00edc\u00ed situaci: <\/p>\n Funkce return je definov\u00e1na pro hodnotu prom\u011bnn\u00e9 buys v\u011bt\u0161\u00ed ne\u017e 0 a men\u0161\u00ed ne\u017e -2. Co kdy\u017e bude ale buys rovno -2,-1 nebo 0? Takov\u00e1 akce nen\u00ed definov\u00e1na, a tak se op\u011bt program m\u016f\u017ee dostat do slep\u00e9 uli\u010dky.<\/p>\n Varov\u00e1n\u00ed kompil\u00e1toru<\/h3>\nJak ji\u017e bylo uvedeno, varov\u00e1n\u00ed nevad\u00ed funk\u010dnosti programu, upozor\u0148uj\u00ed n\u00e1s v\u0161ak na mo\u017en\u00e9 neefektivity programu, kter\u00e9 ob\u010das ni\u010demu nevad\u00ed, ale jindy mohou m\u00edt za n\u00e1sledek jeho \u0161patn\u00e9 fungov\u00e1n\u00ed. \u00a0 Toto upozorn\u011bn\u00ed se ukazuje, pokud pou\u017e\u00edv\u00e1me glob\u00e1ln\u00ed prom\u011bnn\u00e9 deklarovan\u00e9 v\u00a0hlavi\u010dce programu, ale z\u00e1rove\u0148 nadeklarujeme stejn\u00fd n\u00e1zev prom\u011bnn\u00e9 uvnit\u0159 n\u011bkter\u00e9 funkce. Deklarace uvnit\u0159 funkce potom nem\u00e1 smysl, proto\u017ee jak v\u00edme, glob\u00e1ln\u00ed prom\u011bnn\u00e9 jsou k\u00a0dispozici v\u0161em funkc\u00edm programu. \u00a0 Toto upozorn\u011bn\u00ed se t\u00fdk\u00e1 p\u0159edev\u0161\u00edm funkc\u00ed OrderSelect() a OrderSend() a znamen\u00e1, \u017ee by m\u011bla b\u00fdt zkontrolov\u00e1na jejich vr\u00e1cen\u00e1 hodnota. Obvykle se to \u0159e\u0161\u00ed tak, \u017ee se funkce um\u00edst\u00ed do oper\u00e1toru if a zkontroluje se, \u017ee t\u0159eba funkce OrderSend nevrac\u00ed -1. Pokud toti\u017e ano, znamen\u00e1 to, \u017ee otev\u0159en\u00ed obchodu skon\u010dilo s\u00a0chybou. Pak by bylo dobr\u00e9 se dozv\u011bd\u011bt, o jakou chybu se jednalo. To n\u00e1m \u0159ekne jedin\u011b funkce GetLastError(). Chybov\u00fd k\u00f3d, kter\u00fd vr\u00e1t\u00ed tato funkce je pak nav\u00edc t\u0159eba sd\u011blit u\u017eivateli prost\u0159ednictv\u00edm funkc\u00ed Alert() nebo Print() apod. Dobr\u00fd p\u0159\u00edklad je v\u00a0t\u00e9to \u010d\u00e1sti k\u00f3du:<\/p>\n <\/p>\n
Chybov\u00e9 k\u00f3dy funkce GetLastError()<\/h3>\nNa tomto m\u00edst\u011b si uvedeme nej\u010dast\u011bj\u0161\u00ed chybov\u00e9 k\u00f3dy, kter\u00e9 dost\u00e1v\u00e1me p\u0159i pr\u00e1ci s\u00a0pozicemi prost\u0159ednictv\u00edm funkce GetLastError() a jejich \u0159e\u0161en\u00ed. Pro cel\u00fd seznam chybov\u00fdch k\u00f3d\u016f nav\u0161tivte str\u00e1nku https:\/\/book.mql4.com\/appendix\/errors<\/a>. 3 (Invalid trade parameters): ozna\u010duje obvykle chybu v parametrech obchodn\u00ed funkce, jako chybn\u00fd po\u010det nebo chybn\u00e9 hodnoty. \u0158e\u0161en\u00ed lze obvykle nal\u00e9zt v kontrole po\u017eadovan\u00fdch parametr\u016f v dokumentaci. 129 (Invalid price): chybn\u00e1 cena, je pot\u0159eba zkontrolovat parametr Price obchodn\u00ed funkce. Klasicky b\u00fdv\u00e1 chyba v z\u00e1m\u011bn\u011b ceny Bid a Ask nebo v pou\u017eit\u00ed ceny jin\u00e9ho instrumentu, ne\u017e na kter\u00e9m se pokou\u0161\u00edme operovat s pozic\u00ed. 130 (Invalid stops): chybn\u00e9 v\u00fdstupn\u00ed p\u0159\u00edkazy stoploss a\/nebo takeprofit. Klasicky jde o jejich z\u00e1m\u011bnu, kdy nap\u0159. v p\u0159\u00edpad\u011b otev\u0159en\u00ed short se sna\u017e\u00edme nastavit stoploss pod otev\u00edrac\u00ed cenu, co\u017e samoz\u0159ejm\u011b nejde. 131 (Invalid trade volume): chybn\u00fd objem pozice. Tradi\u010dn\u011b kdy\u017e se pokou\u0161\u00edme otev\u0159\u00edt nap\u0159\u00edklad mikrolot na instrumentu, kde je nejni\u017e\u0161\u00ed mo\u017en\u00e1 velikost pozice minilot. 132 (Market is closed): chyba pokud se pokou\u0161\u00edme otev\u0159\u00edt pozici mimo obchodn\u00ed hodiny dan\u00e9ho instrumentu. 133 (Trading is disabled): situace, kdy termin\u00e1l nebo strategie nemaj\u00ed povoleno obchodov\u00e1n\u00ed. 134 (Not enough money): nedostate\u010dn\u00fd margin pro otev\u0159en\u00ed nov\u00e9 pozice. 135 (Price changed), 136 (Off quotes), 138 (Requote): v\u0161echny chyby se vyskytuj\u00ed v p\u0159\u00edpad\u011b skluz\u016f a gap\u016f p\u0159i pln\u011bn\u00ed p\u0159\u00edkazu, kter\u00e9 jsou mimo na\u0161i nastavenou \u00farove\u0148 tolerance. 145 (Modification denied because an order is too close to market): spolu s chybou 130 m\u016f\u017ee nastat v p\u0159\u00edpad\u011b, kdy se pokou\u0161\u00edme um\u00edstit stoploss nebo profittarget p\u0159\u00edli\u0161 bl\u00edzko aktu\u00e1ln\u00ed cen\u011b. Limit, co je je\u0161t\u011b bl\u00edzko a co u\u017e ne je u ka\u017ed\u00e9ho brokera jin\u00fd. Limit aktu\u00e1ln\u00edho brokera lze zjistit pomoc\u00ed funkce MarketInfo(MODE_STOPLEVEL). Pokud si s chybou p\u0159ece jen nebudeme v\u011bd\u011bt rady, v\u017edy jsou k dispozici odkazy v tomto odstavci a p\u0159\u00edpadn\u011b tak\u00e9 f\u00f3rum komunity MQL (https:\/\/www.mql5.com\/en\/forum<\/a>), kde v\u00e1m s\u00a0v\u011bt\u0161inou dotaz\u016f porad\u00ed. Op\u011bt ale je pot\u0159eba um\u011bt anglicky nebo rusky.<\/p>\nNem\u00e1m chyby, program p\u0159esto nefunguje, jak m\u00e1<\/h3>\nPokud jste vy\u0159e\u0161ili v\u0161echny chyby a varov\u00e1n\u00ed kompil\u00e1toru i p\u0159\u00edpadn\u00e9 chyby, kter\u00e9 vrac\u00ed termin\u00e1l nebo server brokera, st\u00e1le nemus\u00ed program fungovat tak, jak byste si p\u0159\u00e1li. T\u0159eba se ani nepokus\u00ed otev\u0159\u00edt pozici tam, kde by podle v\u00e1s m\u011bl. Jak postupovat v takov\u00e9m p\u0159\u00edpad\u011b? P\u0159edn\u011b je samoz\u0159ejm\u011b pot\u0159eba proj\u00edt si znovu k\u00f3d a zkontrolovat, jestli v\u0161e d\u00e1v\u00e1 smysl. Pokud \u017e\u00e1dn\u00fd probl\u00e9m neodhal\u00edme, je pot\u0159eba testovat a zkou\u0161et, dokud neodhal\u00edme p\u0159\u00ed\u010dinu. Nap\u0159\u00edklad pokud m\u00e1 za ur\u010dit\u00fdch podm\u00ednek otev\u0159\u00edt pozici a neud\u011bl\u00e1 to, mus\u00edme zkontrolovat, zda podm\u00ednky pro otev\u0159en\u00ed skute\u010dn\u011b byly spln\u011bny. K tomu je pot\u0159eba vyvolat prom\u011bnn\u00e9, kter\u00e9 v podm\u00ednce jsou, a to prost\u0159ednictv\u00edm funkc\u00ed Alert(), Comment() apod. p\u0159ed touto podm\u00ednkou. Jedin\u011b takto zjist\u00edme, pro\u010d se program chov\u00e1 tak, jak se chov\u00e1. Potom samoz\u0159ejm\u011b mus\u00edme d\u00e1le p\u00e1trat po tom, pro\u010d je v ur\u010dit\u00e9 prom\u011bnn\u00e9 hodnota jak\u00e1 je a jak tam dostat tu spr\u00e1vnou. N\u011bkdy jde o zdlouhav\u00fd a vy\u010derp\u00e1vaj\u00edc\u00ed proces, kter\u00fd n\u00e1s ale z\u00e1rove\u0148 v\u017edy posune d\u00e1l a do p\u0159\u00ed\u0161t\u011b d\u00edky n\u011bmu budeme v\u011bd\u011bt, na co si d\u00e1t pozor. Pokud jste do\u010detli a\u017e sem, m\u011blo by v\u00e1m to sta\u010dit na pochopen\u00ed z\u00e1klad\u016f jazyka a umo\u017enit programovat z\u00e1kladn\u00ed programy i jednoduch\u00e9 obchodn\u00ed syst\u00e9my. Z\u00e1rove\u0148 jste se dozv\u011bd\u011bli, kde \u010derpat dal\u0161\u00ed informace, jak se orientovat v dokumentaci a jak \u0159e\u0161it chyby. D\u00e1le u\u017e to bude sp\u00ed\u0161e nadstavba pro pokro\u010dilej\u0161\u00ed program\u00e1tory.<\/p>\n Ostatn\u00ed speci\u00e1ln\u00ed funkce<\/h2>\nDote\u010f jsme zm\u00ednili pouze z\u00e1kladn\u00ed a nej\u010dast\u011bji pou\u017e\u00edvan\u00e9 speci\u00e1ln\u00ed funkce (OnInit(), OnDeinit(), OnTick() a OnStart()). V nov\u00e9m MQL4 v\u0161ak p\u0159ibylo oproti star\u00e9 verzi jazyka n\u011bkolik nov\u00fdch speci\u00e1ln\u00edch funkc\u00ed, kter\u00e9 mohou b\u00fdt velice u\u017eite\u010dn\u00e9. Jim se bude v\u011bnovat pr\u00e1v\u011b tato kapitola. Je\u0161t\u011b p\u0159ed jejich v\u00fdkladem za\u010dneme mal\u00fdm v\u00fdletem do historie. Star\u00e1 verze jazyka rozli\u0161ovala pouze 3 speci\u00e1ln\u00ed funkce, a to init(), start() a deinit(), se kter\u00fdmi se st\u00e1le m\u016f\u017eete setkat ve star\u0161\u00edch programech a i nov\u00e1 verze MQL4 je st\u00e1le z d\u016fvodu zp\u011btn\u00e9 kompatibility respektuje. Init() a deinit() m\u011bly stejn\u00fd v\u00fdznam jako jejich dne\u0161n\u00ed ekvivalenty s p\u0159edponou On, tedy volaly se p\u0159i spu\u0161t\u011bn\u00ed respektive ukon\u010den\u00ed programu. Kdy se volala funkce start() potom z\u00e1le\u017eelo na typu programu. Pokud se jednalo o skript, zavolala se p\u0159i spu\u0161t\u011bn\u00ed, tedy stejn\u011b jako dne\u0161n\u00ed OnStart(). Pokud se ale jednalo o strategii, volal se start() ka\u017ed\u00fd tick, stejn\u011b jako nyn\u011bj\u0161\u00ed funkce OnTick(). A kone\u010dn\u011b, pokud se jednalo o indik\u00e1tor, volal se tak\u00e9 p\u0159i ka\u017ed\u00e9m ticku, dne\u0161n\u00edm ekvivalentem je ov\u0161em funkce OnCalculate(). Pr\u00e1v\u011b touto funkc\u00ed za\u010dneme.<\/p>\n OnCalculate()<\/h3>\nJe obdobou funkce OnTick() pro program typu indik\u00e1tor. Vol\u00e1 se tak\u00e9 p\u0159i ka\u017ed\u00e9m ticku. Je to logick\u00e9, proto\u017ee kdy jindy je pot\u0159eba p\u0159epo\u010d\u00edtat hodnotu indik\u00e1toru ne\u017e p\u0159i nov\u00e9 p\u0159\u00edchoz\u00ed cen\u011b. I j\u00e1 jsem se samoz\u0159ejm\u011b ptal, jak\u00fd je rozd\u00edl oproti funkci OnTick(). V\u0161e tkv\u00ed v\u00a0parametrech a typu funkce. Zat\u00edmco OnTick() je typu void a nem\u00e1 \u017e\u00e1dn\u00e9 parametry, OnCalculate() je typu int a m\u00e1 n\u011bkolik parametr\u016f, kter\u00e9 lze pou\u017e\u00edt pro v\u00fdpo\u010dty hodnot indik\u00e1toru. D\u00edky tomu je funkce mnohem efektivn\u011bj\u0161\u00ed pro programy typu indik\u00e1tor. Poj\u010fme se na ony parametry pod\u00edvat.<\/p>\n <\/p>\n
Prvn\u00ed parametr rates_total odpov\u00edd\u00e1 po\u010dtu sv\u00ed\u010dek na grafu, kde je indik\u00e1tor spu\u0161t\u011bn. Umo\u017e\u0148uje tak zabr\u00e1nit nap\u0159\u00edklad zbyte\u010dn\u00fdm v\u00fdpo\u010dt\u016fm. Druh\u00fd, velice d\u016fle\u017eit\u00fd parametr prev_calculated v sob\u011b obsahuje hodnotu, kter\u00e1 byla vypo\u010d\u00edt\u00e1na p\u0159i p\u0159edchoz\u00ed exekuci funkce OnCalculate(). Jeho pou\u017eit\u00ed umo\u017en\u00ed zna\u010dn\u00e9 zefektivn\u011bn\u00ed indik\u00e1toru, jeliko\u017e nen\u00ed nutn\u00e9 znovu p\u0159epo\u010d\u00edt\u00e1vat hodnoty vypo\u010d\u00edtan\u00e9 pro sv\u00ed\u010dky, kter\u00e9 se nezm\u011bnily od p\u0159edchoz\u00edho v\u00fdpo\u010dtu. Pro v\u011bt\u0161inu indik\u00e1tor\u016f to jsou v\u0161echny sv\u00ed\u010dky krom\u011b t\u00e9 aktu\u00e1ln\u00ed. Ostatn\u00ed parametry v sob\u011b nesou \u010dasov\u00e9 \u0159ady p\u0159\u00edslu\u0161n\u00fdch prom\u011bnn\u00fdch jednotliv\u00fdch sv\u00ed\u010dek p\u0159esn\u011b tak, jak je zn\u00e1me z kapitoly\u00a0o prom\u011bnn\u00fdch. Jak vidno, parametry tvo\u0159en\u00e9 na m\u00edru programu typu indik\u00e1tor d\u011blaj\u00ed tento program zna\u010dn\u011b efektivn\u011bj\u0161\u00ed a jednodu\u0161\u0161\u00ed, ne\u017e kdyby exekuci m\u011bla na starost \u010dist\u011b funkce OnTick(). V\u00edce se o OnCalculate() a programov\u00e1n\u00ed indik\u00e1tor\u016f dozv\u00edme v samostatn\u00e9 kapitole.<\/p>\n OnTimer()<\/h3>\nVelice zaj\u00edmav\u00e1 speci\u00e1ln\u00ed funkce, kter\u00e1 v\u00a0p\u016fvodn\u00ed verzi MQL4 nem\u011bla obdobu. Jak plyne z\u00a0n\u00e1zvu, tato funkce funkce je vol\u00e1na pravideln\u011b po ur\u010dit\u00e9m \u010dase. Umo\u017e\u0148uje, aby \u010d\u00e1st k\u00f3du v\u00a0jej\u00edm r\u00e1mci byla exekuov\u00e1na pravideln\u011b\u00a0a nez\u00e1visle na d\u011bn\u00ed na trhu nebo v platform\u011b. M\u016f\u017eeme se tak t\u0159eba ka\u017edou hodinu nechat emailem informovat o stavu \u00fa\u010dtu, ka\u017ed\u00fd den si poslat report apod. Mo\u017en\u00e1 si \u0159\u00edk\u00e1te, \u017ee toto dote\u010f \u0161lo tak\u00e9 celkem bez probl\u00e9mu \u0159e\u0161it. \u017de se zm\u011bnil den pozn\u00e1m jednodu\u0161e t\u0159eba tak, \u017ee se zm\u011bn\u00ed v\u00fdsledek funkce Day() a obdobn\u011b. Ale co kdy\u017e pot\u0159ebuji n\u011bjakou \u00falohu \u0159e\u0161it ka\u017ed\u00e9 t\u0159i hodiny, dv\u011b minuty, \u0161est sekund nebo dokonce v\u00a0\u0159\u00e1dech milisekund? A co kdy\u017e pot\u0159ebuji, aby to fungovalo i o v\u00edkendu a mimo obchodn\u00ed hodiny dan\u00e9ho instrumentu? To v\u0161e je ji\u017e mo\u017en\u00e9 pr\u00e1v\u011b d\u00edky funkci OnTimer(), kter\u00e1 je vol\u00e1na pouze na z\u00e1klad\u011b uplynul\u00e9ho \u010dasu, nezaj\u00edm\u00e1 ji, co se d\u011bje na trhu. Periodick\u00e9 vol\u00e1n\u00ed funkce OnTimer(), pokud ji m\u00e1me v\u00a0programu, spust\u00edme funkc\u00ed EventSetTimer(), jej\u00edm\u017e parametrem je po\u010det sekund, po kter\u00fdch se m\u00e1 funkce OnTimer() volat. Pokud tvo\u0159\u00edme program se za\u0161krtnutou volbou OnTimer(), pr\u016fvodce n\u00e1m vygeneruje EventSetTimer(60) do funkce OnInit(), kde by m\u011bl b\u00fdt, nen\u00ed to v\u0161ak nutnost\u00ed. Vid\u011bl jsem i programy, kde se timer spou\u0161t\u011bl z\u00a0OnTick() za ur\u010dit\u00fdch podm\u00ednek. Ukon\u010den\u00ed timeru prov\u00e1d\u00ed funkce EventKillTimer(), kter\u00e1 je obvykle um\u00edst\u011bna v\u00a0r\u00e1mci OnDeinit(), ale op\u011bt to nen\u00ed nutnost. Pokud na EventKillTimer() zapomeneme, timer je ukon\u010den n\u00e1sil\u00edm p\u0159i ukon\u010den\u00ed programu. Dobr\u00e9 je v\u011bd\u011bt tak\u00e9 to, \u017ee prvn\u00ed zavol\u00e1n\u00ed timeru prob\u011bhne a\u017e po uplynut\u00ed nastaven\u00e9 \u010dekac\u00ed doby, nikoli ihned po zavol\u00e1n\u00ed EventSetTimer(). Pokud pot\u0159ebujeme rozli\u0161ovac\u00ed schopnost timeru pod sekundu, existuje spou\u0161t\u011bc\u00ed funkce EventSetMillisecondTimer(), jej\u00edm\u017e parametrem je po\u010det milisekund, po kter\u00fdch se exekuuje OnTimer(). Z\u00e1v\u011brem dlu\u017eno dodat, \u017ee v\u00a0r\u00e1mci jednoho programu lze pou\u017e\u00edt jen jeden timer, ale z\u00e1rove\u0148 m\u016f\u017ee b\u011b\u017eet v\u00edce timer\u016f na v\u00edce r\u016fzn\u00fdch\u00a0strategi\u00edch a tyto se mezi sebou nebudou nikterak pr\u00e1t.<\/p>\n OnChartEvent()<\/h3>\nTato funkce exekuuje k\u00f3d v\u00a0p\u0159\u00edpad\u011b, \u017ee u\u017eivatel provede n\u011bkterou z\u00a0definovan\u00fdch ud\u00e1lost\u00ed. Obvykle se jedn\u00e1 o ud\u00e1losti spojen\u00e9 s\u00a0objekty na grafu, t\u0159eba vytvo\u0159en\u00ed, posunut\u00ed, smaz\u00e1n\u00ed apod., nebo prost\u00e9 kliknut\u00ed, pohyb my\u0161i \u010di stisknut\u00ed kl\u00e1vesy. Funkce m\u00e1 n\u00e1sleduj\u00edc\u00ed parametry.<\/p>\n <\/p>\n
Parametr id ozna\u010duje druh ud\u00e1losti. Ostatn\u00ed parametry potom z\u00e1le\u017e\u00ed pr\u00e1v\u011b na typu ud\u00e1losti. Nap\u0159\u00edklad pokud jde o klik my\u0161\u00ed, lparam bude x-ov\u00e1 sou\u0159adnice grafu, dparam y-ov\u00e1 a sparam se nepou\u017eije. Tabulku s\u00a0v\u00fd\u010dtem r\u016fzn\u00fdch ud\u00e1lost\u00ed a jim p\u0159\u00edslu\u0161n\u00fdch parametr\u016f nalezneme na str\u00e1nce https:\/\/docs.mql4.com\/basis\/function\/events#onchartevent<\/a> samoz\u0159ejm\u011b v angli\u010dtin\u011b. Zanedlouho ov\u0161em i t\u00e9to funkci bude v\u011bnov\u00e1na samostatn\u00e9 kapitola, kde bude tabulka vysv\u011btlena v \u010de\u0161tin\u011b.<\/p>\nOnTester()<\/h3>\nJe funkce, kter\u00e1 je vol\u00e1na pouze p\u0159i testov\u00e1n\u00ed strategie na historick\u00fdch datech, a to p\u0159ed vykon\u00e1n\u00edm funkce OnDeinit(). Je typu double a nem\u00e1 \u017e\u00e1dn\u00fd parametr. Jej\u00edm \u00fa\u010delem je obvykle v\u00fdpo\u010det hodnoty ur\u010dit\u00e9ho testovac\u00edho krit\u00e9ria, kter\u00e9 u\u017eivateli poskytne mo\u017enost se\u0159adit si podle tohoto krit\u00e9ria testy s r\u016fzn\u00fdmi parametry strategie (optimalizace). \u010cl\u00e1nek p\u0159inesl z\u00e1kladn\u00ed p\u0159ehled pokro\u010dil\u00fdch speci\u00e1ln\u00edch funkc\u00ed, kter\u00e9 p\u0159inesla aktualizovan\u00e1 verze jazyka MQL4. Ka\u017ed\u00e1 speci\u00e1ln\u00ed funkce, v\u010detn\u011b t\u011bchto, bude m\u00edt vlastn\u00ed kapitolu.<\/p>\n Glob\u00e1ln\u00ed prom\u011bnn\u00e9 termin\u00e1lu<\/h2>\nProm\u011bnn\u00e9 jsme ji\u017e rozd\u011blili na lok\u00e1ln\u00ed a glob\u00e1ln\u00ed podle toho, ve kter\u00e9 \u010d\u00e1sti programu jsou deklarov\u00e1ny. Prom\u011bnn\u00e1 deklarovan\u00e1 uvnit\u0159 funkce plat\u00ed pouze pro tuto funkci, kde\u017eto prom\u011bnn\u00e1, kter\u00e1 je deklarov\u00e1na v hlavi\u010dce programu mimo t\u011bla v\u0161ech funkc\u00ed, plat\u00ed pro v\u0161echny jeho funkce. P\u0159\u00edkladem m\u016f\u017ee b\u00fdt t\u0159eba hlavi\u010dka programu MACD Sample, kter\u00fd m\u00e1me v\u0161ichni ve sv\u00fdch Metatraderech:<\/p>\n <\/p>\n
Prom\u011bnn\u00e9 po\u010d\u00ednaje TakeProfit a kon\u010de MATrendPeriod jsou glob\u00e1ln\u00edmi prom\u011bnn\u00fdmi. Modifik\u00e1tor input a jejich \u010derven\u00e1 barva potom ud\u00e1vaj\u00ed, \u017ee jsou editovateln\u00e9 u\u017eivatelem strategie. Ve zm\u00edn\u011bn\u00e9 kapitole bylo ale tak\u00e9 nazna\u010deno, \u017ee existuje je\u0161t\u011b jin\u00fd typ glob\u00e1ln\u00ed prom\u011bnn\u00e9, a to glob\u00e1ln\u00ed prom\u011bnn\u00e1 termin\u00e1lu. Takovou prom\u011bnnou mohou pou\u017e\u00edvat nejen v\u0161echny funkce jednoho programu, ale rovn\u011b\u017e v\u0161echny ostatn\u00ed programy konkr\u00e9tn\u00ed platformy Metatrader, a to i po jej\u00edm ukon\u010den\u00ed. Dalo by se tak \u0159\u00edct, \u017ee jde o je\u0161t\u011b glob\u00e1ln\u011bj\u0161\u00ed prom\u011bnnou. Jde o velice u\u017eite\u010dnou v\u011bc, v t\u00e9to kapitole se s n\u00ed proto nau\u010d\u00edme pracovat. S glob\u00e1ln\u00edmi prom\u011bnn\u00fdmi termin\u00e1lu se pracuje odli\u0161n\u011b ne\u017e s klasick\u00fdmi prom\u011bnn\u00fdmi. Je pro n\u011b vyhrazena cel\u00e1 sada funkc\u00ed, kter\u00e1 zaji\u0161\u0165uje v\u0161e od deklarace p\u0159es inicializaci a vyvol\u00e1n\u00ed hodnoty a\u017e po p\u0159\u00edpadn\u00e9 vymaz\u00e1n\u00ed. N\u00e1zev ka\u017ed\u00e9 funkce pro pr\u00e1ci s t\u011bmito prom\u011bnn\u00fdmi za\u010d\u00edn\u00e1 \u0159et\u011bzcem GlobalVariable\u2026(), kde m\u00edsto te\u010dek je \u010dinnost, kterou chceme s prom\u011bnnou prov\u00e9st. Pon\u011bkud odli\u0161n\u011b od klasick\u00fdch prom\u011bnn\u00fdch funguje deklarace a inicializace. Ta zde prob\u00edh\u00e1 v\u017edy nar\u00e1z. Prom\u011bnnou deklarujeme i inicializujeme (vytvo\u0159\u00edme a vlo\u017e\u00edme do n\u00ed hodnotu) funkc\u00ed GlobalVariableSet(), jej\u00edm\u017e prvn\u00edm parametrem je n\u00e1zev prom\u011bnn\u00e9 a druh\u00fdm hodnota, kterou ji chceme p\u0159id\u011blit. Pokud prom\u011bnn\u00e1 s takov\u00fdm n\u00e1zvem neexistuje, vytvo\u0159\u00ed se a dostane danou hodnotu, pokud existuje, pouze se zm\u011bn\u00ed jej\u00ed hodnota. Funkce tedy prom\u011bnn\u00e9 m\u016f\u017ee deklarovat, inicializovat i m\u011bnit jejich hodnotu. Dal\u0161\u00ed d\u016fle\u017eitou funkc\u00ed pro pr\u00e1ci s t\u00edmto druhem prom\u011bnn\u00fdch je GlobalVariableGet(). Jedin\u00fdm parametrem je n\u00e1zev prom\u011bnn\u00e9. Funkce vr\u00e1t\u00ed hodnotu ulo\u017eenou v prom\u011bnn\u00e9. Jedin\u011b touto funkc\u00ed m\u016f\u017eeme s hodnotou prom\u011bnn\u00e9 pracovat. Tyto dv\u011b funkce v\u00e1m teoreticky na pr\u00e1ci s glob\u00e1ln\u00edmi prom\u011bnn\u00fdmi termin\u00e1lu sta\u010d\u00ed, ale jazyk MQL jich nab\u00edz\u00ed je\u0161t\u011b n\u011bkolik. V\u0161echny pop\u00ed\u0161eme v n\u00e1sleduj\u00edc\u00ed tabulce:<\/p>\n \n\n\nN\u00e1zev funkce<\/strong><\/td>\nAkce<\/strong><\/td>\n<\/tr>\n\n | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |