Kurs MetaQuotes Language 4

198
wersja rc1-fCB 224 Kurs MetaQuotes Language 4

Transcript of Kurs MetaQuotes Language 4

wersja rc1-fCB 224Kurs MetaQuotes Language 41.1.WSTPWSTP Wstp MQL 4 Kompilator IDEa. WstpJeli w 2005 roku powiedziano by mi, e napisz kurs MQL 4, spytabym o to, co to jest MQL 4. Jestem peen optymizmu piszc ten kurs, optymizm ten jest tym wikszy, e to jest pierwszy peny i cakowicie po polsku kurs MQL 4. Kiedy skoczyem prac nad prbn wersj tego kursu, nie wiedziaem jak on zostanie przyjty. Ju pod koniec roku 2006 wziem si za pisanie tego kursu, od tego czasu wprowadziem do niego wiele poprawek i nadal go rozwijam, gwnie, dlatego, e firma MetaQuotes nie udostpnia sformalizowanej definicji jzyka, dokumentacja zawiera bdy tak samo jak kompilator, ale bez formalnej definicji jzyka nie mona stwierdzi czy bdy mona zrzuci bezporednio na barki implementacji kompilatora czy moe bd tkwi w samejdefinicjijzyka, sprawkomplikujcige zmianyidentyfikatorw, argumentw formalnychorazlistyfunkcji.Piszcten kursjednoczeniesi uczyem. Staraem si uczyni ten kurs jak najbardziej uytecznym i zrozumiaym, dlatego ma struktur podobn, do helpa MetaEditora, co uatwi w przyszoci ledzenie zmian w funkcjach, ich nazwach i licie parametrw formalnych. Kurs zdobywa coraz wiksz popularno. W Internecie sycha gosy, e ten kurs jest super jak i takie, e tego nie da si nazwa kursem, w tym pierwszym przypadku dzikuje za uznanie, a stwierdzenie, e to nie jest kurs traktuje na rwni ze stwierdzeniem ludzi, ktrzy narzekaj na efektywno MQLa twierdzc, e MQL 4 nie jest jzykiem programowania tylko jakim tamskrypterem. Wskaniki pisanewMQLswolne, alemogbypisanewCi importowaneprzezMQL4. Tumaczsobietonie dedukowaniem ludzi, ktrzy pisz takie rzeczy. Piszc ten kurs napisaem kilkadziesit wskanikw i doszedem do wniosku, e zaimplementowanie nawet istniejcegowskanikamajcnauwadzewasnepreferencjei odpornopsychiczndajelepszerezultatyniwyprbowywaniecaej armii gotowychwskanikw. Mamnadzieje, etenkurspomoeWamwrealizacji marze, boniema, coukrywa, alenawet, jeeli pienidzeniedaj szczcia to na przekr temu twierdzeniu wysuwam tez, e nie wielu jest ludzi, ktrzy swoje szczcie upatruj w nie ustawicznym ich braku.Wewstpiechcpoczyniuwag, ezebranewtym, kursieinformacjoparemnaswoimosobistymdowiadczeniuprogramistycznymi nie wszyscy musz bezkrytycznie podziela moje pogldy. Wrcz mam nadziej, e znajd si ludzie, ktrzy podejm polemik z tym, co zaprezentowaem w tym kursie.Jzyk polski jak inne jzyki etniczne rni si od jzykw formalnych przede wszystkim tym, e jzyk polski jest kontekstowy i wyraenia w nim zawarte czsto s nie jednoznaczne, wic eby unikn duej cz nie jednoznacznoci poczyni zastrzeenie, e jeeli z treci danego fragmentu nie wynikainaczej todany fragment dotyczy semantyki i/lubsyntaktyki MQL4. Dodatkowopoczynizastrzeenie, ekompilator dziaawsposb sekwencyjny i bez kontekstowy, wic jak mu damy do skompilowania tekst fraszki Na zdrowie autorstwa Jana Kochanowskiego to te bdzie prbowa j skompilowa z skutkiem do przewidzenia nawet przez ucznia szkoy podstawowej. Dla tego jak pisz, e jaki warunek musi by speniony to nie, dlatego, e permanentnie w sposb aksjomatyczny innego wyjcia nie ma, tylko dla tego, e inaczej program si nie skompiluj albo w przypadku funkcji importowanych istnieje moliwo bdnego dziaania i jakby tego nie rozpatrywa to efekt kocowy i tak nie wiele si bdzie rni od prby kompilacji tekstu fraszki.b. MQL 4MetaQuotes jest firm, ktra stworzya platform transakcyjn MetaTrader. To, co najbardziej wyrnia t platform z pord innych platform tego typuto, to, ejakojednazniewieluimplementujewbudowanyjzykprogramowania, ktryumoliwianapisanienawet bardzoskomplikowanych programw pozwalajcych naatwiejsze zarzdzanie procesamihandlowymilubnawet naichcakowit automatyzacj przezimplementacj wasnej strategii handlowej. Oprcz tego MQL 4 mona uy do tworzenia skryptw i bibliotek. Programy mog by w atwy sposb doczane do jednego z otwartych wykresw przez przecignicie urzdzeniem wskazujcym z okna nawigatora terminala klienckiego na odpowiedni wykres technik przecignij i upu. Programy dziaaj przynajmniej jak na razie tylko pod kontrol aktywnego terminala klienckiego. Niestety w przeciwiestwie do zasady twrcw jzyka,ktrybypierwowzorem dlatego jzyka, wedug, ktrejnowa wersja powinnaby cakowicie kompatybilna z wczeniejszymiwersjami, firma MetaQuotesniespecjalniedbaokompatybilnowstecznjzykazmieniajci usuwajcniektrestandardowedefinicjefunkcji, couniemoliwiaw ekstremalnychprzypadkachkompilacjestarszychprogramwbezmodyfikacji kodwrdowychlubcigniciaodpowiednichplikw. Dodatkowy problem w opanowaniu tego jzyka mog stanowi bdy merytoryczne w dokumentacji powielane a najczciej wrcz mnoone przez autorw innych kursw tego jzyka.MetaQuotes Language 4 (MQL 4) jest wzgldnie modym jzykiem i jednym z niewielu jzykw, ktry powsta z myl o programowaniu strategiihandlowych. Silna kontrola typw i brak wskanikw powoduje to, e nawet le napisany program nie zdestabilizuje pracy systemu przy zaoeniu, e cao kodu wykonawczego napisana jest w MQL 4, to oznacza, i dopki program nie wykorzystuje funkcji bibliotecznych z bibliotek DLL to najgorsze, comoesistatozawieszeniepracyterminalaklienckiegonaprzykadprzezwejciewnieskoczonptl. MQL4pozwalatworzywskaniki, strategie iskrypty,copozwala naautomatyzacj proceswhandlowych iwyprbowywaniewasnych pomysw.Dodatkowo czstouywanefunkcje monadlawygodyzebrawbibliotekach. Jzyktenzawieraduofunkcji niezbdnychdlaanalizytrenduopartychnahistorycznychi aktualnie napywajcych notowaniach, podstawowe dziaania arytmetyczne i logiczne te s wczone do struktury tego jzyka. Ponadto s rwnie wbudowane podstawowe wskaniki analizy technicznejoraz funkcjekontroli zlece transakcji. MQL 4duo czerpiez jzyka ANSI C znanym rwnie, jako C99,norma ISO/IEC 9899: 1999, wic programici programujcy w jzyku C odnajd si bardzo szybko w tym jzyku. W tym kursie na prostych przykadach pokazana jest semantyka i syntaktyka tego jzyka oraz funkcje wbudowane.Na jednymwykresiemoe pracowa tylkojedenskrypt, jednastrategiaiwiele wskanikw.Liczbawskanikwjestograniczonaprzez zasoby systemowe i zdrowy rozsdek uytkownika. Skrypty i strategie pracuj w swoich wasnych wtkach. Wskaniki pracuj przewanie w wtku interfejsu. Jeli wskanik zosta wywoany przez funkcj iCustom, pracuje w wtku programu, ktry go wywoa. Wywoane importowane funkcje biblioteczne, take pracujwwtkuprogramu. Dlazatrzymaniaprogramu, naleygousunzwykresu. Wskaniki i strategiedziaajdopki niezostanusunitez wykresu jednak istnieje moliwo nakazania strategii by nie podejmowaa adnych dziaa przez wprowadzenie jej w stan nieaktywny, wtedy zamiast emotikona w prawym grnym rogu gwnego okna wykresu, po nazwie strategii, pojawi si symbol. Wskaniki i strategie s uruchamiane podczas ponownego uruchomienia terminala klienckiego dziki zapisywaniu informacji o uruchomionych wskanikach i strategiachpodczas zamykania terminala klienckiegojednakskryptyniesuruchamianepodczasponownegouruchomieniaterminalaklienckiegozpowoduniezapisywaniainformacji o uruchomionych skryptach podczas zamykania terminala klienckiego.Strategie s programami, ktre umoliwiaj automatyzacje procesw handlowych przez tak zwany mechanical trade system (MTS). Jeden wykres moe by obsugiwany, co najwyej przez jeden program tego typu. Uruchomione programy strategii s wywoywane za kadym razem, gdy terminal otrzyma biece dane chyba, e poprzedni cykl operacji jeszcze si nie skoczy. Strategie mog informowa o moliwoci transakcji jak i automatycznie wysyazlecenietransakcji kupnai/lubsprzedaykrtkiej anastpniemogautomatyczniewysyazleceniezamkniciapozycji. MetaTrader jak wikszo systemw tego typu, wspiera test strategii na danych historycznych z pokazywaniem miejsc otwarcia i zamknicia transakcji, niestety brak bazy tickowej moe spowodowa do due rozbienoci pomidzy testami a rzeczywistym dziaaniem strategii, szczeglnie na mao pynnych rynkach albo nawet na pynnych rynkach, w okresach, w ktrych ceny instrumentw zmieniaj si bardzo gwatownie. Na szczcie platforma MetaTrader jako sobie radzi z emulacj ruchw tickowych i przy testach obejmujcych znaczny okres czasu i sytuacji rynkowych takich jak bessa czy hossa wyniki testw w mniejszym lub wikszym stopniu odpowiadaj rzeczywistoci. Strategie s zgromadzone w katalogu .\experts.Wskaniki swskanikami technicznymi pisanymi czstoniezalenieoddodatkowychwskanikwjuzintegrowanychzterminalemklienckim, chocia mog by pisane w oparciu o wskaniki doczone do terminala klienckiego. Wskaniki te s programami, ktre umoliwiaj analiz techniczn, ale tak jak wbudowane wskaniki techniczne nie mog automatyzowa procesw handlowych, lecz mog by i w zdecydowanej wikszoci przypadkw s wykorzystywane do budowy strategii. Wskaniki s zgromadzone w katalogu .\experts\indicators.2Skrypty s programami, ktre umoliwiaj jednorazowo wykonanie jakiej czynnoci. Wykonywanie skryptw nie zaley od napywajcych notowa. W przeciwiestwie do strategii czy wskanikw s wykonywane tylko raz od razu na kadorazowe danie uytkownika i s automatycznie zamykane po wykonaniu operacji, przy czym przy zmianie okresu czasu wykresu, przy zamkniciu wykresu na rzecz, ktrego zosta uruchomiony lub przy zamkniciu terminala klienckiego praca skryptu jest przerywana poczym skrypt jest usuwany z pamici terminala klienckiego. Skrypty s zgromadzone w katalogu .\experts\scripts.Biblioteki szbioremczstouywanychfunkcji, literawstaych, zmiennychi innychzasobwzebranychwjednympliku. Bibliotekaniejest samodzielnym programem wykonawczym, lecz z jednej biblioteki moe korzysta wiksza liczba procesw jednoczenie. Biblioteki EX4 su tylko, jako magazyny kodw maszynowych funkcji, ale to zwaywszy na charakterystyk programw pisanych na platform MetaTrader w zupenoci wystarczy. Biblioteki EX4 s zgromadzone w katalogu .\experts\libraries.Pliki nagwkowe s plikami tekstowymi zawierajcymi najczciej uywane fragmenty kodu rdowego do wykorzystania w programach. Pliki te mogbydoczonedokodurdowego strategii,skryptu,wskanikaa nawetbiblioteki naetapieprzetwarzaniaprzez preprocesor. Uycieplikw nagwkowych jest lepszym pomysem ni uycie bibliotek, bo wywoanie funkcji bibliotecznej nieuchronnie wie si ze zuyciem dodatkowych zasobw wpostaci czasu procesora lub procesorwi pamici operacyjnej a niekiedy te dyskowej. Pliki nagwkowe s zgromadzone wkatalogu .\experts\include.c. KompilatorAby kompilowa napisany kod rdowy programu potrzebny jest kompilator. Do pakietu MetaTrader zosta doczony kompilator, znajduje si w kataloguaplikacji wzbiorze.\MetaLang.exe. Metalang.exejest programemkonsolowym, ktrymadwaparametry. Pierwszyparametrjest toopcja zachowaniakompilatora i jestopcjonalny.Jedyna moliwodostpnawtym kompilatorzetoopcjaq inne znaki signorowane.Opcjekompilatora piszemypoznakumylnika-. Opcjaqsprawia,eniewywietlaneskomunikatydotyczceprzebiegukompilacji.Drugi parametrjestpenalbo relatywn ciek do pliku kodu rdowego.MQL 4 jest jzykiem kompilowanym. Kompilowanie tumaczy kod programu pisanego w jzyku formalnym na jzyk maszynowy. eby centralne jednostki ALU/FPU mogy przetwarza programkonieczna jest jego bezbdna kompilacja, przy czymewentualne ostrzeenia powinny by przeanalizowane.Pliki zawierajcewykonywalnekodymaszynowemuszmierozszerzenieEX4,jeeli majbywidziane,jakoplikiwykonywalne przez terminal kliencki.Przykad:X:\Program Files\MetaTrader>metalang.exeMetaQuotes Language 4 compiler version 4.00 build 216 (16 Apr 2008)Copyright 2001-2008, MetaQuotes Software Corp.usage: metalang [ options... ] filenameoptions:-q : quiet modeX:\Program Files\MetaTrader>metalang.exe X:\Program Files\MetaTrader\experts\przykad.mq4"MetaQuotes Language 4 compiler version 4.00 build 216 (16 Apr 2008)Copyright 2001-2008, MetaQuotes Software Corp.CollectTokens: 3762 MqlToken [1146 Kb], used 3415 MqlToken [size: 312 bytes]Exp file "F:\Program Files\X-Trader 4 XTB\experts\przykad.ex4" produced - 0 error(s), 0 warning(s) X:\Program Files\MetaTrader>metalang.exe -q "X:\Program Files\MetaTrader\experts\przykad.mq4"CollectTokens: 3762 MqlToken [1146 Kb], used 3415 MqlToken [size: 312 bytes]X:\Program Files\MetaTrader>UWAGA: Skompilowanyplikmatsamnazw, cordowyi rozszerzenieEX4, jeli istniejeplikonazwiejednobrzmicej znazwpliku wynikowego to kompilator sprbuje zastpi ten plik bez ostrzeenia.d. IDEMetaTrader 4 jest instalowany z tekstowymedytoremkodu, MetaEditor 4, ktry jest programemtypu IDE (zintegrowane rodowisko programowania),integrujcym edytortekstusucydoedycji kodu rdowegoprogramuzfunkcjpodwietlaniaskadni konstrukcji jzyka.Toma uatwi nam orientacje w kodzie. IDE uatwia kompilacje programu, wystarczy uy klawisza F5 a MetaEditor wywoa proces kompilacji. Komunikaty ze standardowego wyjcia bdw kompilatora bd prze kierowane i wywietlone w zakadce Errors w polu Description. Po pomylnym skompilowaniu plik ma t sam nazw, co plik rdowy i rozszerzenie EX4. Jeli kompilacja si nie powiedzie w zakadce Errors w polu Description pojawi si lista bdw. IDEmatezintegrowanysystempomocydostpnywzakadceHelpi ponaciniciuklawiszaF1. Wsystemiepomocyznajdujsiopisyfunkcjistandardowych podzielonych na kategorie tematyczne, operatory, sowa zastrzeone i wiele innych. System pomocy opisuje te zachowane funkcje, ktre zmieniy nazw.32.2.SKADNIASKADNIA Skadnia Instrukcje Separator y Format Komentarze Sowa zastrzeone Identyfikator y1. SkadniaSkadnia tego jzyka, jak ju zaznaczaem wczeniej, jest zbliona do skadni jzyka C, ale brak w niej niektrych elementw, midzy innymi takich konstrukcji i wyrae jak:- arytmetyka przestrzeni adresowej procesora,- operatora do ... while;- operatora goto ...;- operatora ? : ;- operatora (pre)inkrementacji/dekrementacji,- organizacji struktur danych,- wielokrotnego przypisywania,- wczesnego zakaczania oblicze wyrae logicznych.Skadnia wikszoci jzykw programowania w tym skadnia MQL 4 jest opisywana poprzez wyraenia regularne. Zalet takiego podejcia jest to, ewyraeniaregularne jednoznacznieopisujsyntaktykjzykaniepozwalajcna jakiekolwiek niecisoci czy rozbienoci.Abyuywajakiego jzyka poprawnie trzeba pozna jego gramatyk w przypadku jzykw formalnych gramatyka okrela takie elementy jak: instrukcje, separatory, format, komentarze, sowa zastrzeone i identyfikatory.2. InstrukcjeInstrukcjawysokiegopoziomuoznaczajednczynno, jakmawykonaprogram, ktrkompilator zamieni, naconajmniej jedninstrukcj maszynow. Instrukcja moe te wystpowa jako instrukcja blokowa, czyli, mimo e skada si z szeregu instrukcji wysokiego poziomu, to do dalszego przetwarzania traktowana jest tak samo jak pojedyncza instrukcja wysokiego poziomu.Przykad:x = 2;y = x + 2;c. Separator ySeparatorytocigi znakwuywanychdoograniczeniafragmentwkodurdowegoposiadajcychokreloneznaczenie. Programpiszesi umieszczajc kolejne instrukcje oddzielajc je separatorami. Wewntrz instrukcji te mona umieci separatory. Stosowanie separatorw su na og zwikszeniu czytelnocikodu. Do separatorw zaliczaj si znaki:spacje, tabulatory, koniec wiersza ikoniec strony. Do oddzielenia kadychdwch instrukcji mona stosowa kilka separatorw. Ale dyrektywy preprocesora musz by pisane w jednej linii.Przykad:x = 2;y = x + 2;// kompilator zgosi bd #propertyCopyrigtch "Prawa Autorskie 2007, Konrad Kudzin"x = 2;y = x + 2;// a teraz kompilator nie zgosi#property Copyrigtch "Prawa Autorskie 2007, Konrad Kudzin."d. FormatMetaQuotes Language 4 jest jzykiem o tak zwanym wolnym formacie to znaczy, e ukad linii nie jest nam odgrnie narzucony przez co moemy w instrukcji stosowa dowoln ilo spacji, znakw tabulacji i pustych linii na przykad w jednej linii kodu zapisa dwie instrukcje lub w dwch liniach kodu jedn instrukcj. Dzieje si tak, dlatego, e koniec instrukcji okrelany jest przez rednik a nie przez znaki koca linii. Pamitaj jednak, e nie moesz uywatakichsamychregu doformatowanialinii zawierajcychdyrektywypreprocesora, alenienaleytegotraktowajakowyjtkuodreguy, wyraenia regularnego, bo dyrektywy preprocesora s przetwarzane w pierwszej kolejnoci modyfikujc kod rdowy a dopiero tak zmodyfikowany kod jest przetwarzanyprzezkompilator. Dlaprzykadu, jeli przezdyrektywpreprocesorazdefiniujemystaonazwieSTALAowartoci 5.0, tozanim wkroczy do dziaania kompilator wszystkie wystpienia w kodzie sowa STALA w zakresie jej widzialnoci bd zastpione przez litera dosowny 5.0 a dyrektywa doczenia pliku wstawi zawarto danego pliku dokadnie wmiejsce wystpienia odpowiedniej dyrektywy. Wicej o dyrektywach preprocesora w rozdziale smym.Przykad:double x, y, z;orazdouble x,y,z;s traktowane jako zapisy tosame, z tym, e pierwszy zapis jest bardziej czytelny.e. Komentarze4Komentarze s bardzo uyteczne, s to pisane bezporednio w kodzie rdowym, uywane po to, aeby uatwi nam prace z kodem w przyszoci, opisy, najczciej wjzyku etnicznymrzadziej wmetajzyku czy winnymjzyku formalnym, tego, za co ten konkretny fragment kodu jest odpowiedzialny. Zamy, e piszemy duy program i po procznej przerwie chcemy go zmodyfikowa, ale nie pamitamy, do czego suyy niektre zmienne czy funkcje biblioteczne. Bez komentarzy nawet twrcy kodu mog mie problemy ze zrozumieniem wszystkich zawioci maego kodu, ktry maledwokilkatysicylinii rozrzuconychpokilkunastuplikach. Komentarztofragment kodurdowego, ktregojedynymcelemistnieniajest informowanie o czym osob czytajc rda. Komentarze nie maj adnego wpywu na program i s ignorowane przez kompilator. Generalnie panuje zasada, e komentowane powinno by to, co kod robi, a nie jak to robi. Kady programista ma swj wasny styl pisania komentarzy. Mamy dwa rodzaje komentarzy. Komentarz blokowy, ktry nie moe by zagniedany, zaczyna si od "/*" a koczy "*/", wszystko, co zostanie zapisane pomidzy "/*" a "*/" zostanie zignorowane przez kompilator, komentarz liniowy jak sama nazwa wskazuje dotyczy pojedynczej linii, rozpoczyna si sekwencj "//" i koczy znakiem koca linii, ten typ komentarza moe by zagniedany w komentarzach blokowych a wszystko od "//" do koca linii jest ignorowane.Przykad:double x, y, z; // komentarz jedno linijkowy/* komentarz wielo liniowy // komentarz zagniedony*//* A */ /* to */ /* kilka */ /* komentarzy */ /* wielo */ /* liniowych */ /* w */ /* linii */double a /* zmienna a*/, b /* zmienna b*/, c /* zmienna c*/;double x, y, z; // komentarz jedno linijkowy// kompilator zignoruje symbol /* i w tym miejscu zgosi bd*/double a /* zmienna a*/, b /* zmienna b*///, c /* zmienna c*/; // w tym miejscu zgosi bd, brak ";"f. Sowa zastrzeoneSowazastrzeonemajspecjalneznaczeniedlajzyka, uywanesdlaokrelonychcelwi szarezerwowanedouyciawkonstrukcjach jzykowych. Nie mona uywa ich w roli identyfikatorw albo do jakiego innego celu bo spowoduje to, e nasz program si nie skompiluj.Tab. 1 Sowa zastrzeone.Sowa kluczowe LiterayTypy danych Dyrektywy Operatory Typy pochodne Typy logiczne Przykadowe literay staeboolcolordatetimedoubleintstringvoidexternstaticbreakcasecontinuedefaultelseforifreturnswitchwhileD[RRRR.MM.DD] [GG[:mm[:SS]]]D[DD.MM.RRRR] [GG[:mm[:SS]]]Cr, g, bfalseFalseFALSEtrueTrueTRUENULLMODE_OPENMODE_LOWMODE_HIGHMODE_CLOSEMODE_VOLUMEMODE_TIMEUWAGA: Literay RRRR, MM, DD, GG, mm, SS, r, g, b to odpowiednio mAski dla okrelenia roku, miesica roku, dnia miesica, godziny doby, minuty godziny, sekundy minuty,skadowech z zakresu od0 do255 dziesitnieczerwonej, zieloneji zielonej koloru, w nawiasachpodano skadnikiopcjonalne.Literay stae nie s definiowane przez sam jzyk leczy przez preprocesor i podczas pocztkowego etapu kompilacji czyli przetwarzania tekstu kodu rdowegoprzezpreprocesor szamienianenadosownewartoci tychliteraw. Jednakpredefiniowaneliteraystaemimouwagpoczynionych wczeniej s wedug dokumentacji jzyka traktowane jako cz skadni jzyka i dla tego podaj przykadowe predefiniowane literay stae jako sowa zastrzeone dla tego jzyka.Przykad:int i;bool b = True;color c = C64, 128, 192;datetime d = D11.02.1983;static double sd = 0.0001;g. Identyfikator yIdentyfikatorysnazwami uywanydoidentyfikacji: zmiennych, funkcji i typwdanych. Strzyograniczeniadlawybieranychnazw. Dugo identyfikatora nie moe przekracza 31 znakw. Identyfikatory mog skada si tylko z liter a-z, A-Z, cyfr 0-9 oraz symbolu podkrelenia '_' ale pierwszy symbol nie moe by cyfr. Mae i wielkie litery s rozrniane. Identyfikatorem nie moe by sowo zastrzeone.Przykad:int o_0;// tenint x_0;// i ten identyfikatorint O_0;// to nie to samo co tenint X_0;// i ten identyfikatorint bool; // nie prawidoweint case; // identyfikatoryint if; // tu kompilator wyrzuci bdint IF; // a tu kompilatorint iF; // nie wyrzuci bdu53.3.TYPYTYPY Typy Rzutowanie typw Typ cakowity (int) Typ zmiennoprzecinkowy (double) Typ tekstowy (string) Typ amorficzny (object) Typ pusty (void) Typ booleanowski (bool) Typ daty i czasu (datetime) Typ koloru (color)1. TypyKada nazwa wprowadzona przez nas musi by, co najmniej zadeklarowana. MQL 4 uywa jednoprzebiegowego procesu kompilacji, co implikuje koniecznoprzynajmniej deklaracji nazw, ktrychnieobejmujedefinicjajzykaprzedichpierwszymuyciem. Deklarujcczydefiniujczmiennei funkcje okrelamy przede wszystkim ich typ, przy pomocy odpowiedniego sowa kluczowego (Tab. 1 - Typy danych), tym samym informujemy kompilator jak ma postpowa w przypadku napotkania nie standartowego identyfikatora zmiennej albo funkcji.Przykad:// typy fundamentalneintz1;double z2;string z3;bool z4;void f1(object a1 /* typ amorficzny */)// typ pusty{ // ciao funkcji}int f2(/* lista parametrw formalnych */){ // ciao funkcji}double f3(/* lista parametrw formalnych */){ // ciao funkcji}string f4(/* lista parametrw formalnych */){ // ciao funkcji}bool f5(/* lista parametrw formalnych */){ // ciao funkcji}// typy pochodnecolorz5;datetime z6;b. Rzutowanie typwW MQL 4 uywana jest tylko niejawna konwersja typw. Przed dziaaniami (z wyjtkiem operacji przypisania) jest wykonana, konwersja danych w wyraenia do typu o najwyszym priorytecie w tym wyraeniu. Przed operacj przypisania jest wykonane rzutowanie danych na typ docelowy.Tab. 2 Priorytety konwersji typw.Priorytet Typ321stringdoubleint (color, datetime), boolPrzykad:inti = MathCos(0); // rzutowanie typu double na typ int, wynik 1inti = i * 4;// bez rzutowania, wynik 4intj = i / 2.0;// rzutowanie typu double na typ int, wynik 2bool b = -i =< j;// bez rzutowania, wynik true numerycznie 1double d = 1.0 / j;// bez utowania, wynik 0.5double d = i / 8.0;// rzutowanie na typ double, wynik 0.5double d = 64 / 16;// rzutowanie typu int na typ double, wynik 0.0string s = 1.0 / j;// rzutowanie typu double na typ string, wynik "0.50000000" (10 znakw)string s = NULL; // rzutowanie typu int na typ string, wynik "0" (1 znak)string s = "#" + 1;// rzutowanie typu int na typ string, wynik "#1"c. Typ cakowity (int)Typ cakowito liczbowy oznacza typ danych przeznaczony do reprezentowania 4 bajtowy wartoci cakowitych, liczby tego typu moe poprzedza znak + albo -. MQL 4 wspiera zapis semkowy, dziesitny i szesnastkowy. Zapis semkowy poprzedzamy 0 i w dalszej czci kursu nie bdziemy wykorzystywa tego systemu zapisu ze wzgldu na ma uyteczno tej formy zapisu dla specyfiki programw pisanych w tym jzyku, zapis dziesitny jest domylnym zapisem uywanym przez kompilator i nie ma przedrostka oznaczajcego rodzaj systemu liczbowego, zapis szesnastkowy zaczynamy odsymbolu0xlub0X. Liczbywsystemiedziesitnymskadajsizcyfr od0do9, ktrepoprzedzaopcjonalnyznakliczby. Liczbywsystemie semkowym skadaj si z cyfr od 0 do 7, ktre poprzedza odpowiedni symbol systemu liczbowego. Liczby w systemie szesnastkowym skadaj si z cyfr od 0 do 9 i liter od a do f lub od A do F, ktre poprzedza odpowiedni symbol systemu liczbowego. Zakres wartoci: od -2147483648 do 2147483647 dziesitnie. Typ cakowito liczbowy jest, take wykorzystywany do reprezentacji danych znakowych. Przez znak w tym znaczeniu, naley rozumie jeden z256, indeksowanychod0do255, elementwodpowiadajcychindeksomwrozszerzonej tablicy ASCII (AmericanStandardCodeforInformation 6Interchange). Znaki w tym znaczeniu pisze si w pojedynczych cudzysowach otaczajcych znak. Niektre znaki s znakami specjalnymi i nie mog by uywanebezporedniow pojedynczychcudzysowach,poniewa szarezerwowane i uycie ich zmienisens wyraenia lub spowoduje bd. W takim przypadku konieczne jest uycie sekwencji unikowych. Aby zapisa znaki specjalne uywamy znaku backslash \ z odpowiednim symbolem. W tabeli 4 s wypisane wszystkie sekwencje unikowe. Dla utworzenia zmiennej lub funkcji o wartoci cakowito liczbowej uywamy sowa zastrzeonego int. Jeli staa przekroczy warto reprezentacji tego typu, wynik bdzie niezdefiniowany.Tab. 3 Sekwencje unikowe.Nazwa znaku Oznaczenie znaku Sekwencja unikowa znakuBackslashPojedynczy cytatPodwjny cytat\'"\\\'\"Koniec liniiTabulator poziomyPowrt karetkiNL (FL)HTCR\n\t\rZnak pusty NULL \x00Kod ASCII szesnastkowo 0xhh \xhhPrzykad:int a = 020000000000; // najmniejsza liczba typu intint b =-2147483648;int c = 0x80000000;int d = 017777777777; // najwiksza liczba typu intint e = 2147483647;int f = 0x7FFFFFFF;int g = '#';// to jest warto 35int h = '\x23'; // to rwnie jest warto 35int i = '';// kod 0xA9int j = '';// kod \xAEd. Typ zmiennoprzecinkowy (double)Typ zmiennoprzecinkowy, oznacza typ danych przeznaczony do reprezentowania 8 bajtowych wartoci kwantowego i przeliczalnego zbioru liczb wymiernych w formacie dziesitnym, oznacza to, e dokadno tego typu jest ograniczona. Opcjonaln cz uamkow oddzielamy kropk dziesitn. Zakres wartoci: od (+/-)2.2E-308 do (+/-)1.8E308. Dla utworzenia zmiennej lub funkcji o wartoci zmiennoprzecinkowej uywamy sowa zastrzeonego double. Jeli staa przekroczy warto reprezentacji tego typu, wynik bdzie niezdefiniowany.Przykady:inta = 666;double b = -1.0;intc = 50;double x = a - b; // wynik 667.0double y = b / c; // wynik -0.02double z = c / a; // wynik 0.0double d = a % c; // wynik 16.0e. Typ tekstowy (string)Typ tekstowy, oznacza typ danych przeznaczony do reprezentowania cigu znakw w fizycznie cigej tablicy znakw, ktre moemy zapisywa za pomoc serii znakw rozszerzonej tablicy ASCII ograniczonych znakami podwjnego cudzysowu ", kodw semkowych, dziesitkowych, szesnastkowych. Kolejneznaki szapisywanewpamici podkolejnymi adresami fizycznymi zaczynajcodznakuoindeksie0. Wciguznakw moemy zapisa maksymalnie do 255 znaczcych znakw, po przekroczeniu tego limitu zostanie wygenerowany bd: too long string (255 characters maximum). Bezporednio po ostatnim znakuznaczcym jestumieszczany terminator cigu,takzwanyNULL.ZnakNULL jest znakiem specjalnym reprezentowanym przez znak ASCII o kodzie 0x00 uywanym do oznaczenia koca cigu znakw. Znaki nastpujce po terminatorze cigu s znakami nieznaczcymi, nieinterpretowanymi i ich warto nie ma adnego znaczenia dla cigu. Typ tekstowy, jest zaimplementowany jako rekord ze wskanikiem do tablicy, ktrej element maj po jednym bajcie. Moliwe jest uycie w cigu znakw kadego znaku z rozszerzonej tablicy ASCII, oprcz znakuo kodzie0x00, znaki specjalnemajswoje sekwencjeunikowezaczynajce siodznaku\. Dlautworzeniazmiennej lubfunkcji zwartoci acuchw znakw uywamy sowa zastrzeonego string. Jeli staa przekroczy dugo, nadmiarowe znaki bd obcite i kompilator zgosi odpowiednie ostrzeenie. Struktura:Wartodanej typustringjest reprezentowanaprzezrekord, 8bajtowstruktur. Pierwszyelement strukturyjest 4bajtowliczbcakowit przechowujc wielko bufora. Drugi element struktury jest 4 bajtowym wskanikiem, wskazujcym na adres pierwszego znaku w stringu. Ostatnim znaczcymznakiem jestznak poprzedzajcyznakkocastringu.Naprzykaddanas typu stringowartoci "Konrad"zdefiniowanajako:strings = "Konrad"; jest w pamici zapisana tak:[s+4]+000 [s+4]+001 [s+4]+002 [s+4]+003 [s+4]+004 [s+4]+005 [s+4]+006 ......... [s+4]+255K o n r a D NULL ......... .........Tab. 4 Specjalne stae.Staa Warto OpisNULLEMPTYEMPTY_VALUECLR_NONEWHOLE_ARRAY0-10x7FFFFFFF0xFFFFFFFF0Wskazuje na pusty string.Wskazuje na pusty parametr.Domylna pusta warto wskanika.Wskazuje na brak koloru.Wskazuje, e wszystkie elementy tablicy zostan przetworzone.Tab. 5 Znaki ASCII i ich kody w reprezentacji decymenalnej oraz heksydecymenalnej.Znaki Kody Dec Kody Hex Znaki Kody Dec Kody Hex Znaki Kody Dec Kody Hex Znaki Kody Dec Kod Hex(nil)(soh)(stx)(etx)(eot)(enq)(ack)(bel)(bs)(ht)(lf)0123456789100x000x010x020x030x040x050x060x070x080x090x0a(sp)!"#$%&'()*32333435363738394041420x200x210x220x230x240x250x260x270x280x290x2a@ABCDEFGHIJ64656667686970717273740x400x410x420x430x440x450x460x470x480x490x4a`abcdefghij969798991001011021031041051067Znaki Kody Dec Kody Hex Znaki Kody Dec Kody Hex Znaki Kody Dec Kody Hex Znaki Kody Dec Kod Hex(vt)(ff)(cr)(so)(si)(dle)(dc1)(dc2)(dc3)(dc4)(nak)(syn)(etb)(can)(em)(sub)(esc)(fs)(gs)(rs)(us)1112131415161718192021222324252627282930310x0b0x0c0x0d0x0e0x0f0x100x110x120x130x140x150x160x170x180x190x1a0x1b0x1c0x1d0x1e0x1f+,-./0123456789:;?4344454647484950515253545556575859606162630x2b0x2c0x2d0x2e0x2f0x300x310x320x330x340x350x360x370x380x390x3a0x3b0x3c0x3d0x3e0x3fKLMNOPqRStUVWXYZ[\]^_7576777879808182838485868788899091929394950x4b0x4c0x4d0x4e0x4f0x500x510x520x530x540x550x560x570x580x590x5a0x5b0x5c0x5d0x5e0x5fklmnopqrstuvwxyz{|}~(del)107108109110111112113114115116117118119120121122123124125126127Przykad:""// to jest acuch pusty"\x00"// to jest rwnie acuch pusty"#" // to jest hasz"\x23"// to jest rwnie hasz"\x32"// to jest kod cyfry dwa"\x02"// to jest warto dwa"\x5c"// to jest back slash"Ta \n linia \n jest \n zamana ""\"To jest cudzysw\""f. Typ amorficzny (object)Typ amorficzny, oznacza typ danych przeznaczony do reprezentowania jakiegokolwiek typu. Wprowadzenie takiego typu do systemu typw jzyka, umoliwia pewnego rodzaju uoglnienie - nie trzeba pisa oddzielnych wariantw funkcji dla kadego z typw argumentu.Przykad:void f1(object& o){ // ciao funkcji}g. Typ pusty (void)Typpusty, oznaczatypdanychprzeznaczonydoreprezentowaniatylkojednej wartoci. Wprowadzenietakiegotypudosystemutypwjzyka umoliwiapewnegorodzajuuoglnienia- nietrzebarozrniafunkcji, ktrezwracajwartoi procedur, ktreniezwracajwartoci. Typpusty stosowany jest gwnie do wskazania, e funkcja nie zwraca wyniku. Dla utworzenia funkcji ktra nie zwraca wartoci uywamy sowa zastrzeonego void.Przykad:void f1(/* parametry formalne */){ // ciao funkcji}h. Typ booleanowski (bool)Typlogiczny, oznaczatypdanychprzeznaczony doreprezentowaniawartoci logicznych. Wdokumentacji jzykajest traktowany jakotyp fundamentalny ale wiele wskazuje na to, e jest w rzeczywistoci specjalnie traktowanym typem int. Typ Booleanowski przyjmuje tylko dwie wartoci logiczne. Typ ten swoj nazw zawdzicza synnemu matematykowi George Boole. Warto logiczna TRUE jest definiowana jako warto rna od zera awarto logicznaFALSEjest definiowana jako warto rwna 0. Jawnie nadaniezmiennej logicznej warto TRUEbdzierwnoznacznez przypisaniemjej wartoci liczbowej 1. Literaw: false, FALSEi Falseorazliteraw: true, TRUEi Truemonauywazamiennie. Dlautworzenia zmiennej lub funkcji o wartoci logicznej uywamy sowa zastrzeonego bool.Przykad:bool a = true;bool b = false;bool c = 1;bool d = 0;i. Typ daty i czasu (datetime)Typ daty i czasu jest w rzeczywistoci specjalnie traktowanym typem int. Typ ten, przechowuje dat i czas w formacie konwencji UNIX, czyli liczby sekund, ktre upyny od pnocy 1970.01.01. Jest to typ danych, ktry moe reprezentowa wartoci od 1970.01.01 do 2037.12.31. Istnieje moliwoci dodatkowego sposobu definiowania wartoci reprezentowana przez 6 czci literau, gdzie uywana jest naturalna notacja dla okrelenia dnia miesica, miesicaroku, roku, godzinydoby, minutygodzinyi sekundyminuty, okrelanyprzeznotacjD[RRRR.MM.DD] [GG[:mm[:SS]]] rwnowanz D[DD.MM.RRRR] [GG[:mm[:SS]]], gdzie RRRR to cztero cyfrowe numeryczne okrelenie roku, MM to dwu cyfrowe numeryczne okrelenie miesica roku, DD to dwu cyfrowe okrelenie dnia miesica, GG to dwu cyfrowe okrelenie godziny doby, mm to dwu cyfrowe okrelenie minuty godziny, SS to dwucyfroweokreleniesekundyminuty, wnawiasachpodanoskadniki opcjonalne, gdyniepodamydatytouywanajest datakompilacji, gdynie podamy sekundy przyjmowana jest warto GG:MM:00, podobna sytuacja ma miejsce, gdy nie podamy minuty albo godziny, w takich przypadkach jest 8odpowiednio przyjmowana warto GG:00:00 i 00:00:00. Dla utworzenia zmiennej lub funkcji o wartoci czasu w konwencji UNIX-owej uywamy sowa zastrzeonego datetime.Przykad:datetime przed = D'1970.01.01';// == 0x00000000;datetime po= D'2037.12.31';datetime NowyR = D'1983.01.01';datetime MojUr = D'1983.02.11';datetime DtUrd = D'10.05.2005 08:05:00';datetime kompi = D'10:00:00';// 10:00 dnia kompilacjij. Typ koloru (color)Typ kolorujestw rzeczywistoci specjalnietraktowanymtypemint.Typten,przechowujekolor.Jesttotypdanych, ktry moe reprezentowa wartoci kolorwi przyjmuje16777216rnychwartoci indeksowanychod0do16777215.Istniejemoliwododatkowegosposobudefiniowania wartoci, gdzie uywa si notacji addytywnej mieszania kolorw: czerwonego, zielonego i niebieskiego, okrelan przez notacj Cr, g, b, gdzie r to warto skadowej czerwonej, gto warto skadowej zielonej ab to warto skadowej niebieskiej. Cakowitoliczbowa warto zapisywana w reprezentacji szesnastkowej wyglda tak: 0x00RRGGBB, gdzie RR jest mask skadowej czerwonej, GG jest mask skadowej zielonej a BB jest mask skadowejniebieskiej. Zapis w reprezentacjidziesitnejnie ma tak prostego przeoenia na schemat RGB. MQL 4 oferuje te dodatkowo moliwo okrelania wartoci przez literay stae. W tym celu zostay zdefiniowane 132 literay stae. Dla utworzenia zmiennej lub funkcji o wartoci koloru uywamy sowa zastrzeonego color.Przykad:color c1 = Blue; // nazwacolor c2 = 255;// liczba decymenalnacolor c3 = 0x000000FF; // liczba heksy decymenalna 0x00RRGGBBcolor c4 = C'0, 0, 255'; // skadoweTab. 6 Tabela kolorw.Black DarkGreen DarkSlateGray Olive Greek Teal Navy PurpleMaron Indigo MidnightBlue DarkBlue DarkOliveGreen SaddleBrown ForestGreen OliveDrabSeaGreen DarkGoldenrod DarkSlateBlue Sienna MediumBlue Brown DarkTurquoise DimGrayLightSeaGreen DarkViolet FireBrick MediumVioletRed MediumSeaGreen Chocolate Crimson SteelBlueGoldenrod MediumSpringGreen LawnGreen CadetBlue DarkOrchid YellowGreen LimeGreen OrangeRedDarkOrange Orange Gold Yellow Chartreuse Lime SpringGreen AquaDeepSkyBlue Blue Magenta Red Gray SlateGray Peru BlueVioletLightSlateGray DeepPink MediumTurquoise DodgerBlue Turquoise RoyalBlue SlateBlue DarkKhakiIndianRed MediumOrchid GreenYellow MediumAquamarine DarkSeaGreen Tomato RosyBrown OrchidMediumPurple PaleVioletRed Coral CornflowerBlue DarkGray SandyBrown MediumSlateBlue TanDarkSalmon BurlyWood HotPink Salmon Violet LightCoral SkyBlue LightSalmonPlum Khaki LightGreen Aquamarine Silver LightSkyBlue LightSteelBlue LightBluePaleGreen Thistle PowderBlue PaleGoldenrod PaleTurquoise LightGrey Wheat NavajoWhiteMoccasin LightPink Gainsboro PeachPuff Pink Bisque LightGoldenRod BlanchedAlmondLemonChiffon Beige AntiqueWhite PapayaWhip Cornsilk LightYellow LightCyan LinenLavender MistyRose OldLace WhiteSmoke Seashell Ivory Honeydew AliceBlueLavenderBlush MintCream Snow White94.4.OPERACJE I WYRAENIAOPERACJE I WYRAENIA Operacje i wyraenia Prior ytet operacji Operacje ar ytmetyczne Operacje przypisania Operacje relacji Operacje Booleanowskie Operacje bitowe Operacje inne1. Operacje i wyraeniaPewne znaki i sekwencji znakw maj specjalne znaczenie. S symbolami operacji, uywanych w wyraeniach, oddzielaj argumenty operacji od siebie. Wyraenia buduje si z jednego lub wicej identyfikatorw i operatorw, ktre nadaj wyraeniu znaczenie. Pojedyncze wyraenia cz si w cigi instrukcji, cigi instrukcji cz si w funkcje a te z kojeni buduj kompletny i funkcjonalny program.Wyraenia s opisywane przez wzorce, ktre opisuj acuchy symboli przez co okrelaj zbir pasujcych acuchw. Wyraenie skada si z jednegolubwicej argumentwi znakwoperacji. Wyraeniemoebynapisanewkilkuliniachjaki jednaliniamoezawierawicej nijedno wyraenie. Dzieje si tak ze wzgldu na to, e koniec wyraenia jest okrelany przez operator koca wyraenia, rednik ;.Przykad:int i = 0, j = 2, x, y, z = 1; i++; j--;y = i % 2+j / 2;x = y+2-z*2;b. Prior ytet operacjiPonisza tabela pokazuje, priorytety operatorw. Operatory w tej tabeli s umieszczone wedug priorytetu wykonania. Im wysze miejsce grupy operatorw w tabeli tym wyszy priorytet operatorw, inaczej mwic priorytet malej z gry do dou tabeli. Porzdek wykonania dziaa determinuje grupa, w ktrej znajduje si dany operator. Im wyej jest grupa, w ktrej si znajduje operator, tym wyszy jest jego priorytet. Operatory z relatywnie wyszym priorytetem s wykonywane przed operatorami z relatywnie niszym priorytetem. Operatory w tej samej grupie maj jednakowy priorytet. Gdy operatoryzjednej grupypojawisiwtymsamymwyraeniu, swykonywanezgodniezkierunkiemwykonywaniaoperacji (czno). Wszystkie binarne operatory oprcz operatorw przypisania s wykonywane od lewej do prawej. Operatory przypisania s wykonywane od prawej do lewej strony rwnania.Tab. 7 Priorytet operatorw.Priorytet Operator Argumenty Nazwa operatora czno14()[]N1wywoanie funkcjiindeksowanie tablicyod lewejod lewej13!~++---+111111negacja logicznanegacja bitowainkrementacjadekrementacjazmiana znakuznak liczbyod prawejod prawejod prawejod prawejod prawejod prawej12*/%222mnoeniedzieleniemodulood lewejod lewejod lewej11+-22dodawanieodejmowanieod lewejod lewej10>>=2222mniejszymniejszy, bd rwnywikszywikszy, bd rwnyod lewejod lewejod lewejod lewej8==!=22logiczny operator relacji czy rwnylogiczny operator relacji czy rnyod lewejod lewej7 & 2 bitowy iloczyn od lewej6 ^ 2 bitowa suma modulo od lewej5 | 2 bitowa suma od lewej4 && 2 iloczyn logiczny od lewej3 || 2 suma logiczna od lewej2 =+=-=*=/=%=>>=== B; // przesu w prawo A o B bitw, wynik zapisz w AA b)// jeli a mniejsze b lub a wiksze b? Print("a i b s rne"); // to drukujg. Operacje bitoweBitowe operatory s podobne do operatorw logicznych, z t rnic, e operatory logiczne operuj na sowach maszynowych a operatory bitowe t sam logik stosuj w mniejszej skali, w odniesieniu do (odpowiadajcych sobie) pojedynczych bitw binarnej reprezentacji sowa maszynowego. Bitowy iloczyn logiczny jest dwuargumentowym operatorem liczb cakowitych. Porwnuje odpowiadajce sobie bity obydwu operandw. Warto bitu wynikowego jest ustalana na 1 wtedy i tylko wtedy, gdy odpowiadajce mu bity obydwu operandw maj warto 1.Bitowa suma logiczna jest dwuargumentowym operatorem liczb cakowitych. Porwnuje odpowiadajce sobie bity obydwu operandw. Warto bitu wynikowego jest ustalana na 0 wtedy i tylko wtedy, gdy odpowiadajce mu bity obydwu operandw maj warto 0.Bitowa suma modulo jest dwuargumentowym operatorem liczb cakowitych. Porwnuje odpowiadajce sobie bity obydwu operandw. Warto bitu wynikowego jest ustalana na 1 wtedy i tylko wtedy, gdy odpowiadajce mu bity obydwu operandw maj rne wartoci.Bitowanegacjajest jednoargumentowymoperatoremliczbcakowitych. Wartobituwynikowegojest ustalanana1wtedyi tylkowtedy, gdy odpowiadajce mu bity rdowy operandu ma warto 0.Bitowe przesunicie wprawo jest dwuargumentowym operatorem liczbcakowitych.Przesuwabity pierwszego operandu oliczb bitw zadan drugimoperandem. Bitynajstarszesuzupenianezerami anajmodszezostajzgubione. Operacjaprzesunicialogicznegowykorzystujetylko5 najmodszych bitw drugiego operandu.Bitoweprzesuniciewlewojest dwuargumentowymoperatoremliczbcakowitych. Przesuwabitypierwszegooperanduoliczbbitwzadan drugimoperandem. Bitynajmodszesuzupenianezerami anajstarszezostajzgubione. Operacjaprzesunicialogicznegowykorzystujetylko5 najmodszych bitw drugiego operandu.Tab. 13 Operatory bitowe.Operator Nazwa operatora&|^~>>> B; // C = 0x00000000A = 0x00000000; B = 0x00000001; D = A >> B; // D = 0x00000000A = 0x0000000f; B = 0x00000000; E = A >> B; // E = 0x0000000fA = 0x0000000f; B = 0x00000001; F = A >> B; // F = 0x00000007A = 0x00000000; B = 0x00000000; C = A = 0; i--) { ExtBuffer[i] = (Close[i] - Open[i]) / ((High[i] - Low[i]) + (High[i] == Low[i])); }//---- return(0);}//+------------------------------------------------------------------+d. Funkcja deinit()deinit(...)Funkcjadeinit zwracawartotypuprostegoi moebyzdefiniowanazlistparametrw. Jednake, kiedytafunkcjajest wywoywanaprzez terminal kliencki adne parametry nie s przekazywane do funkcji poza parametrami domylnymi. Funkcja deinit moe zosta wywoana z dowolnego miejsca programu tak jak inne funkcje.Kady program doczony do wykresu koczy prac przez wywoanie predefiniowanej funkcji deinit o ile jej ciao jest zdefiniowane. Funkcja ta jest wywoywana automatycznie przed zamkniciem skryptu, programu skojarzonego z wykresem, samego wykresu, wyczeniem terminala, przed zmian okresuwykresuizmianparametrw lubkonta.Programmoemonitorowa,prbyzamkniciadziki wbudowanej funkcji IsStopped,coumoliwia poprawne skoczenie jego pracy. Funkcja UninitializeReason() zwraca powd wykonania funkcji deinit. Jeli funkcja start bdzie wykonywana w chwili zatrzymywaniaprogramu, tofunkcjadeinit musi skoczydziaaniejak najszybciej bomaksymalnyczaspozostajcydlapracyprogramujest ograniczony do 2,5 sekundy. Po tym czasie, jeli funkcja deinit nie zostanie wykonana to program bdzie zakoczony przez natychmiastowe usunicie go z pamici operacyjnej. Wyjtkiem od tej reguy s skrypty, ktre normalnie kocz swoje zadanie niezalenie od zewntrznych polece, ale jeeli skrypt dziaabardzodugonaprzykadzpowodujakiejptli, moebyzakoczonypoleceniemzewntrznym, zmenukontekstowegowykresu. Rwnie w tym przypadku funkcjadeinitjest ograniczonado 2,5 sekundy. Kiedy terminalkoczy prac towywoywane sfunkcje deinit wszystkich aktywnych programw. Jeli w kodzie programu nie bdzie zdefiniowanej tej funkcji to deinicjalizacja nie bdzie wykonana.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"double price;//+------------------------------------------------------------------+//| Funkcja inicjalizacji wskanika|//+------------------------------------------------------------------+int init(){ //... price = Ask; return(0);}int deinit(){ Print("Zmiana o: ", price - Ask); return(0);}//+------------------------------------------------------------------+//| Funkcja iteracji wskanika |//+------------------------------------------------------------------+int start(){ //...}//+------------------------------------------------------------------+3711.11.ZMIENNE PREDEZMIENNE PREDEFINIOWANEFINIOWANE Zmienne predefiniowane Ask Bars Bid Close[] Digits High[] Low[] Open[] Point Time[] Volume[]1. Zmienne predefiniowaneW MQL 4 jest jedenacie predefiniowanych zmiennych. Te zmienne s zbiorem najwaniejszych, dla tego jzyka, zmiennych, ktre s ustawiane osobno dla kadego uruchomionego programu i s dostpne dla skryptw, wskanikw i strategii. Moduy biblioteczne uywaj zmiennych waciwych dlamoduuktryjewywoa. Dlabezpieczestwai szybkoci dostpudodanychterminal kliencki pracujenalokalnychkopiachpredefiniowanych zmiennych. Te dane s aktualizowane przykadymwywoaniu funkcjigwnejskryptu,wskanika istrategii,automatycznie iprzy wywoaniufunkcjiRefreshRates(). Ich wartoci odzwierciedlaj dane na biecym instrumencie.b. Askdouble AskLitera Ask okrela ostatnio znan cen dla kupujcego, po ktrej aktualny instrument jest oferowany. Kurs Ask jest zawsze wyszy od kursu Bid. Pamita naley o zasadzie, e duga pozycja, czyli zakup instrumentu takiego jak pary walutowe, indeksu czy surowca dokonywane jest po cenie Ask, czyli po cenie wyszej. Wic gdy mylimy o zajciu dugiej pozycji, to posugujemy si kursem Ask. Zatem podczas sprzedarzy, chcc ustawi zlecenie obronne typu stop loss powinnimy w kursie, przy ktrym pozycja ma by zamknita, kierowa si kursem Ask. Podobnie bdzie to odbywao si w przypadku zlecenia take profit, kurs jego aktywacji powinien by ustawiony wedug kurst Ast/k. Zasada taka obowizuje wprzypadku zlece natychmiastowych oraz oczekujcych. Kiedy obliczenia s czasochonne istnieje groba, e dane wejciowe s ju nie aktualne, w takim przypadku naley uy funkcji RefreshRates().Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"double price;//+------------------------------------------------------------------+//| Funkcja inicjalizacji wskanika|//+------------------------------------------------------------------+int init(){ //... price = Ask; return(0);}//+------------------------------------------------------------------+//| Funkcja koczca dziaanie wskanika |//+------------------------------------------------------------------+int deinit(){ Print("Zmiana o: ", price - Ask); return(0);}//+------------------------------------------------------------------+//| Funkcja iteracji wskanika |//+------------------------------------------------------------------+int start(){ //...}//+------------------------------------------------------------------+c. Barsint BarsLitera Bars okrela liczb wiec na aktualnym wykresie, warto Bars jest rwnowana wartoci zwracanej przez funkcje iBars(NULL, 0).Przykad://+------------------------------------------------------------------+38//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"int CCIPeriod = 14;//+------------------------------------------------------------------+//| Funkcja inicjalizacji wskanika|//+------------------------------------------------------------------+int init(){ //...}//+------------------------------------------------------------------+//| Funkcja iteracji wskanika |//+------------------------------------------------------------------+int start(){ //... if(Bars 0) cbars--; if(uchwyt > 0) {for(i = Bars - cbars; i >= 0; i--) FileWrite(uchwyt, Time[0], Open[0], High[0], Low[0], Close[0], Volume[0]);FileClose(uchwyt); }//---- return(0);}//+------------------------------------------------------------------+f. Digitsint DigitsLitera Digits okrela liczb cyfr decymenalnych po kropce dla aktualnego instrumentu.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert(DoubleToStr(Close[0] * 0.75 + Close[1] * 0.25, Digits));//---- return(0);}//+------------------------------------------------------------------+g. High[]double High[]Litera Highjest wskanikiemdotablicynajwyszychwartoci wiecdlaaktualnegoinstrumentu, wartoHigh[0] jest rwnowanawartoci zwracanej przez funkcje iHigh(NULL, 0, 0).Elementy tablicy s indeksowane w odwrotnej kolejnoci. Bieca wieca, ktra jest na kocu tablicy ma indeks 0. Najstarsza wieca, ktra jest pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){int i, cbars = IndicatorCounted(), uchwyt = FileOpen("file.csv", FILE_CSV | FILE_WRITE, ";");//---- if(cbars > 0) cbars--; if(uchwyt > 0) {for(i = Bars - cbars; i >= 0; i--) FileWrite(uchwyt, Time[0], Open[0], High[0], Low[0], Close[0], Volume[0]);FileClose(uchwyt); }//---- return(0);}//+------------------------------------------------------------------+h. Low[]40double Low[]Litera Low jest wskanikiem do tablicy najniszych wartoci wiec dla aktualnego instrumentu, warto Low[0] jest rwnowana wartoci zwracanej przez funkcje iLow(NULL, 0, 0).Elementy tablicy s indeksowane w odwrotnej kolejnoci. Bieca wieca, ktra jest na kocu tablicy ma indeks 0. Najstarsza wieca, ktra jest pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){int i, cbars = IndicatorCounted(), uchwyt = FileOpen("file.csv", FILE_CSV | FILE_WRITE, ";");//---- if(cbars > 0) cbars--; if(uchwyt > 0) {for(i = Bars - cbars; i >= 0; i--) FileWrite(uchwyt, Time[0], Open[0], High[0], Low[0], Close[0], Volume[0]);FileClose(uchwyt); }//---- return(0);}//+------------------------------------------------------------------+i. Open[]double Open[]Litera Open jest wskanikiem do tablicy wartoci otwarcia wiec dla aktualnego instrumentu, warto Open[0] jest rwnowana wartoci zwracanej przez funkcje iOpen(NULL, 0, 0).Elementy tablicy s indeksowane w odwrotnej kolejnoci. Bieca wieca, ktra jest na kocu tablicy ma indeks 0. Najstarsza wieca, ktra jest pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){int i, cbars = IndicatorCounted(), uchwyt = FileOpen("file.csv", FILE_CSV | FILE_WRITE, ";");//---- if(cbars > 0) cbars--; if(uchwyt > 0) {for(i = Bars - cbars; i >= 0; i--) FileWrite(uchwyt, Time[0], Open[0], High[0], Low[0], Close[0], Volume[0]);FileClose(uchwyt); }//---- return(0);}//+------------------------------------------------------------------+j. Pointdouble PointLitera Point okrela warto jednego punktu dla aktualnego instrumentu.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja inicjalizacji wskanika|//+------------------------------------------------------------------+int init(){ //...}41//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){ inti, cbars = IndicatorCounted(); double d;//---- if(cbars > 0) cbars--;//---- //... for(i = Bars - cbars; i >= 0; i--) {d = Close[i] * 0.003 - Point; // na przykad: EUR/USD, Point = 0.0001, EUR/JPY, Point = 0.001//... }}//+------------------------------------------------------------------+k. Time[]datetime Time[]Litera Time jest wskanikiem do tablicy czasw otwarcia wiec dla aktualnego instrumentu, warto Time[0] jest rwnowana wartoci zwracanej przez funkcje iTime(NULL, 0, 0). Typ danych datetime jest przeznaczonych do reprezentowania wartoci od pnocy 1970.01.01 do 2037.12.31. Dane datetime s reprezentowane, jako czas w sekundach, ktry upyn od daty pocztkowej przedziau.Elementy tablicy s indeksowane w odwrotnej kolejnoci. Bieca wieca, ktra jest na kocu tablicy ma indeks 0. Najstarsza wieca, ktra jest pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){int i, cbars = IndicatorCounted(), uchwyt = FileOpen("file.csv", FILE_CSV | FILE_WRITE, ";");//---- if(cbars > 0) cbars--; if(uchwyt > 0) {for(i = Bars - cbars; i >= 0; i--) FileWrite(uchwyt, Time[0], Open[0], High[0], Low[0], Close[0], Volume[0]);FileClose(uchwyt); }//---- return(0);}//+------------------------------------------------------------------+l. Volume[]double Volume[]Litera Volume jest wskanikiem do tablicy wolumenw tikowych wiec dla aktualnego instrumentu, warto Volume[0] jest rwnowana wartoci zwracanej przez funkcje iVolume(NULL, 0, 0).Elementy tablicy s indeksowane w odwrotnej kolejnoci. Bieca wieca, ktra jest na kocu tablicy ma indeks 0. Najstarsza wieca, ktra jest pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){int i, cbars = IndicatorCounted(), uchwyt = FileOpen("file.csv", FILE_CSV | FILE_WRITE, ";");//---- if(cbars > 0) cbars--; if(uchwyt > 0) {for(i = Bars - cbars; i >= 0; i--) FileWrite(uchwyt, Time[0], Open[0], High[0], Low[0], Close[0], Volume[0]);FileClose(uchwyt); }//---- return(0);}//+------------------------------------------------------------------+4212.12. INFORMACJE O KONCIEINFORMACJE O KONCIE Informacje o koncie AccountBalance() AccountCredit() AccountCompany() AccountCurrency() AccountEquity() AccountFreeMargin() AccountFreeMarginCheck() AccountFreeMarginMode() AccountLeverage() AccountMargin() AccountName() AccountNumber() AccountProfit() AccountSer ver() AccountStopoutLevel() AccountStopoutMode()1. Informacje o koncieNie zalenie od typu rachunku, czy to bdzie rachunek demo czy rzeczywisty rachunek inwestycyjny, jedna rzecz dla nas jest bardzo wana, dostp do kompletu funkcji przy pomocy, ktrych uzyska dostp do informacji o biecym stanie rachunku. Funkcje informacji o koncie s bardzo uyteczne, jeli piszemykompletnstrategiewykorzystujczaawansowanetechniki zarzdzaniapienidzmi. Wszystkiefunkcjeopisanewtymrozdzialenie przyjmuj adnych parametrw.2. AccountBalance()double AccountBalance()Funkcja AccountBalance() zwraca warto dostpnych rodkw na biecym rachunku inwestycyjnym stanowic sum dokonanych wpat i wypat oraz osignitego wyniku finansowego na zamknitych pozycjach.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Saldo konta = ", AccountBalance());//---- return(0);}//+------------------------------------------------------------------+c. AccountCredit()double AccountCredit()Funkcja AccountCredit() wedle dokumentacji zwraca aktualn warto biecego rachunku.Przekad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Warto konta = ", AccountCredit());//---- return(0);}43//+------------------------------------------------------------------+UWAGA: W moich testach na rachunku demonstracyjnym funkcja zwracaa zawsze zero nie zalenie od osignitego wyniku finansowego.d. AccountCompany()string AccountCompany()Funkcja AccountCompany() zwraca nazw firmy brokerskiej, gdzie biecy rachunek jest zarejestrowany. Ta sama nazwa znajduje si w menu Pomoc w terminalu klienckim pozycja O programie...Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Nazwa brokera = ", AccountCompany());//---- return(0);}//+------------------------------------------------------------------+e. AccountCurrency()string AccountCurrency()Funkcja AccountCurrency() zwraca nazw waluty, uywan do rozlicze na koncie przez firm brokersk, dla biecego rachunku.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Waluta konta = ", AccountCurrency());//---- return(0);}//+------------------------------------------------------------------+f. AccountEquity()double AccountEquity()Funkcja AccountEquity() zwraca aktualn warto biecego rachunku z wyceny uwzgldnia sum dokonanych wpat i wypat oraz osignitego wyniku finansowego na koncie pomniejszon o strat z otwartych pozycji oraz powikszon o zyski z otwartych pozycji, to suma rodkw dostpnych na biecymrachunkuzwracanychprzezfunkcj AccountBalance()orazwartoci otwartychpozycji zwracanychprzezfunkcj AccounProfit(), pokazuje rzeczywist warto rachunku w danym momencie.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Warto konta = ", AccountEquity());//---- return(0);}//+------------------------------------------------------------------+44g. AccountFreeMargin()double AccountFreeMargin()Funkcja AccountFreeMargin() zwracaaktualn warto wolnychrodkw,ktremog by wykorzystane jako depozyt zabezpieczajcy(Margin) przy otwarciu nowych pozycji na biecym rachunku. wynika z rnicy midzy Equity lub Balance (zawsze nisz z tych wartoci, czyli jeli Balance jestmniejsze od Equity to Equity, jeli Equity jest mniejsze od Balance to Balance) a Margin. Znajc warto Dostpnego Marginu moemy wyliczy, jak maksymaln pozycj moemy jeszcze otworzy.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Warto wolnych rodkw = ", DoubleToStr(AccountFreeMargin(), Digits));//---- return(0);}//+------------------------------------------------------------------+h. AccountFreeMarginCheck()double AccountFreeMarginCheck(string symbol, int cmd, double volume)Funkcja AccountFreeMarginCheck() zwraca warto wolnych rodkwdo wykorzystania na biecymrachunku po wykonaniu zadanego argumentami zlecenia.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_STRING_PARAMETER_EXPECTED (4062)ERR_INTEGER_PARAMETER_EXPECTED (4063)ERR_INVALID_FUNCTION_PARAMVALUE (4051)ERR_UNKNOWN_SYMBOL (4106)ERR_NOT_ENOUGH_MONEY (134)ERR_NO_ERROR (0)Parametry:symbol - Symbol instrumentu.cmd- Zlecenie: OP_BUY - kupna, OP_SELL - sprzeday.volume - Liczba lotw (nomina transakcji w walucie bazowej).Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"#property show_inputs#define MSG "Warto rodkw niezbdnych do zrealizowania transakcji "#define LT" lotw = "#define NEC "Niewystarczajca warto rodkw niezbdnych do zrealizowania transakcji "extern double lots;//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- double AFMC, AFM = AccountFreeMargin();//---- AFMC = AccountFreeMarginCheck(Symbol(), OP_BUY, lots); if(GetLastError() != 134)Alert(MSG, "kupna ", lots, LT, AFM - AFMC); elseAlert(NEC, "kupna!");//---- AFMC = AccountFreeMarginCheck(Symbol(), OP_SELL, lots); if(GetLastError() != 134)Alert(MSG, "sprzeday ", lots, LT, AFM - AFMC); elseAlert(NEC, "sprzeday!");//---- return(0);}//+------------------------------------------------------------------+i. AccountFreeMarginMode()int AccountFreeMarginMode()45Funkcja AccountFreeMarginMode() zwraca tryb obliczania wartoci wolnych rodkw, ktre mona wykorzysta do otwarcia pozycji na wybranym rachunku.Tab. 16 Tryby obliczania warto wolnych rodkw.Waciwo Opis0123Wynik na otwartych pozycjach nie jest uyty do obliczenia wolnych rodkw.Wynik na otwartych pozycjach jest uyty do obliczenia wolnych rodkw.Tylko warto dochodu otwartych pozycji jest uyta do obliczenia wolnych rodkw.Tylko warto straty otwartych pozycji jest uyta do obliczenia wolnych rodkw.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- switch(AccountFreeMarginMode()) {case 0: Alert("Wynik na otwartych pozycjach nie jest uyty do obliczenia wolnych rodkw."); break;case 1: Alert("Wynik na otwartych pozycjach jest uyty do obliczenia wolnych rodkw."); break;case 2: Alert("Tylko warto dochodu otwartych pozycji jest uyta do obliczenia wolnych rodkw."); break;case 3: Alert("Tylko warto straty otwartych pozycji jest uyta do obliczenia wolnych rodkw."); }//---- return(0);}//+------------------------------------------------------------------+j. AccountLeverage()int AccountLeverage()Funkcja AccountLeverage() zwraca warto aktualnie wybranej dwigni dla biecego rachunku.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Aktualna dwignia = ", AccountLeverage());//---- return(0);}//+------------------------------------------------------------------+k. AccountMargin()double AccountMargin()Funkcja AccountMargin() zwraca aktualn warto rodkw pobranych z konta, jako depozyt zabezpieczajcy dla biecego rachunku, stanowicy zabezpieczenie otwartych pozycji. Depozyt jest uwalniany po zamkniciu pozycji.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){46//---- Alert("Warto depozytu zabezpieczajcego = ", AccountMargin());//---- return(0);}//+------------------------------------------------------------------+l. AccountName()string AccountName()Funkcja AccountName() zwraca nazw biecego rachunku.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Nazwa konta ", AccountName());//---- return(0);}//+------------------------------------------------------------------+m. AccountNumber()int AccountNumber()Funkcja AccountNumber() zwraca numer konta biecego rachunku.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Numer konta = ", AccountNumber());//---- return(0);}//+------------------------------------------------------------------+n. AccountProfit()double AccountProfit()Funkcja AccountProfit() zwraca aktualny wynik na otwartych pozycjach na biecym rachunku, zysk lub strata (strata jest ze znakiem minus). Jest to suma pl Profit dla wszystkich pozycji, cakowity wynik na otwartych pozycjach.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Wynik = ", AccountProfit());//---- return(0);}//+------------------------------------------------------------------+47o. AccountSer ver()string AccountServer()(string ServerAddress())Funkcja ServerAddress() zwraca adres serwera, z ktrego korzysta terminal w postaci stringu.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Adres serwera transakcyjnego: ", AccountServer());//---- return(0);}//+------------------------------------------------------------------+p. AccountStopoutLevel()int AccountStopoutLevel()FunkcjaAccountStopoutLevel() zwracawarto MarginLevel czyli stopiepokryciadepozytuzabezpieczajcego, poziomuponiej, ktrego zamykane s najbardziej stratne pozycje. Warto ta wynika ze stosunku Equity do Margin. Jeeli Margin Level bdzie nisze od wartoci ustalonej przez brokera, zazwyczaj30%, co bdzie oznaczao pogbiajc si strat, wtedy system transakcyjny automatycznie zamknie pozycje, ktre bd przynosiy najwiksze straty. Stratne pozycje bd zamykane do chwili, gdy stopie pokrycia depozytu zabezpieczajcego bdzie nie niszy od wartoci ustalonej przez brokera.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- Alert("Poziom StopOut: ", AccountStopoutLevel());//---- return(0);}//+------------------------------------------------------------------+q. AccountStopoutMode()int AccountStopoutMode()Funkcja AccountStopoutMode() zwraca tryb obliczaniawartocipoprzekroczeniu,ktrejzamykanes najbardziej stratne pozycje nawybranym rachunku.Tab. 17 Tryby obliczania warto StopOut.Waciwo Opis01Obliczenie stosunku procentowego midzy wolnymi rodkami i rzeczywist wartoci rachunku.Porwnanie poziomu wolnych rodkw do absolutnej wartoci rachunku.Przykad://+------------------------------------------------------------------+//| przykad.mq4 |//|Copyright 2007, Konrad Kudzin |//|http://www.forex-tower.xt.pl/ |//+------------------------------------------------------------------+#property copyright "Copyright 2007, Konrad Kudzin"#property link"http://www.forex-tower.xt.pl/"//+------------------------------------------------------------------+//| Funkcja skryptu|//+------------------------------------------------------------------+int start(){//---- if(AccountStopoutMode() != 0)Alert("Poziom Stop Out = ", AccountStopoutLevel(), " ", AccountCurrency()); elseAlert("Poziom Stop Out = ", AccountStopoutLevel(),"%");48//---- return(0);}//+------------------------------------------------------------------+4913.13.FUNKCJEFUNKCJE TABLICOWETABLICOWE ArrayBsearch() ArrayCopy() ArrayCopyRates() ArrayCopySeries() ArrayDimension() ArrayGetAsSeries() ArrayInitialize() ArrayIsSeries() ArrayMaximum() ArrayMinimum() ArrayRange() ArrayResize() ArraySetAsSeries() ArraySize() ArraySort()1. ArrayBsearch()int ArrayBsearch(double array[], double value, int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND)Funkcja ArrayBsearch() zwracaindekspierwszegowystpieniawartoci wpierwszymwymiarzetablicyzadanej pierwszymargumentem. Jeli warto nie wystpuje zwracany jest indeks elementu najbliszego, co do wartoci. Funkcja nie moe by uywana z stringami.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:array[] - Tablica do przeszukania.value - Szukana warto.count - Liczba elementw. Domylnie WHOLE_ARRAY (tab. 3).start - Pocztkowy indeks. Domylnie 0.direction - Kierunek szukania. Domylnie MODE_ASCEND (w przd) alternatywnie MODE_DESCEND (w ty).Przykad:datetime dt[];ArrayCopySeries(dt, MODE_TIME, Symbol(), PERIOD_M1);Print(ArrayBsearch(dt, MathRound(dt[0]), WHOLE_ARRAY, 0, MODE_DESCEND));b. ArrayCopy()int ArrayCopy(object& dest[], object source[], int start_dest=0, int start_source=0, int count=WHOLE_ARRAY)Funkcja ArrayCopy() kopiujewartoelementwtablicyzadanej pierwszymargumentemdotablicyzadanej drugimargumentem. Obietablice musz by tego samego typu. Funkcja zwraca liczb skopiowanych elementw.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INCOMPATIBLE_ARRAYS (4056)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:dest[] - Tablica docelowa.source[] - Tablica rdowa.start_dest - Indeks pocztkowy tablicy docelowej. Domylnie 0.start_source - Indeks pocztkowy tablicy rdowej. Domylnie 0.count- Liczba elementw. Domylnie WHOLE_ARRAY (tab. 3).Przykad:double a1[][6], a2[10][6];ArrayCopyRates(a1);// wypenij a1 jakimi danymiArrayCopy(a2, a1,0,Bars-9,10); // teraz a2 ma pierwszych 10 wiec danych historycznychc. ArrayCopyRates()int ArrayCopyRates(double& dest_array[], string symbol=NULL, int timeframe=0)Funkcja ArrayCopyRates() kopiuje kursy wymiany z tablicy zadanej drugimargumentemdo dwuwymiarowej tablicy zadanej pierwszym argumentem, gdzie drugi wymiar ma 6 elementw: 0 - time, 1 - open, 2 - low, 3 - high, 4 - close, 5 - volume. Funkcja zwraca liczb skopiowanych elementw.Tab. 18 Stae interwaw czasowych.Staa Warto OpisPERIOD_M1PERIOD_M5PERIOD_M15PERIOD_M30PERIOD_H1PERIOD_H4PERIOD_D1151530602401440minutowy.5 minutowy.15 minutowy.30 minutowy.godzinny.4 godzinny.dzienny.50Staa Warto OpisPERIOD_W1PERIOD_MN10 (zero)10080432000wygodniowy.miesiczny.aktualnie wykorzystywany przedzia czasowy wykresu.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INCOMPATIBLE_ARRAYS (4056)ERR_STRING_PARAMETER_EXPECTED (4062)Parametry:dest_array[] - Referencja do docelowej dwuwymiarowej tablicy.symbol - Nazwa symbolu.timeframe- Interwa w minutach, domylnie interwa uywany przez wykres (Tab. 18).Przykad:double a1[][6];ArrayCopyRates(a1,"EURPLN", PERIOD_M1);UWAGA: Jeli dane odnosz si do nieotwartego wykresu, moliwa jest sytuacja, e terminal kliencki musi wysa danie uaktualnienia danych do serwera. Wtym przypadku zostanie wygenerowany bd 4066 -ERR_HISTORY_WILL_UPDATED (danie uaktualnienia danych historycznych). T funkcj zazwyczaj uywa si do przekazania danych do funkcji DLL. Pami nie jest alokowana dla tablicy danych. d. ArrayCopySeries()int ArrayCopySeries(double& array[], int series_index, string symbol=NULL, int period=0)Funkcja ArrayCopySeries() kopiuj tablic danych historycznych zadan trzecim argumentem do tablicy zadanej pierwszym argumentem. Funkcja zwraca liczb skopiowanych elementw.Tab. 19 Identyfikatory tablicy danych historycznych.Staa Warto OpisMODE_OPENMODE_LOWMODE_HIGHMODE_CLOSEMODE_VOLUMEMODE_TIME012345Cena otwarcia.Cena najnisza.Cena najwysza.Cena zamknicia.Wolumen, uywany w funkcjach Lowest i Highest.Czas otwarcia, uywany w funkcji ArrayCopySeries.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INCORRECT_SERIESARRAY_USING (4054) ERR_INCOMPATIBLE_ARRAYS (4056)ERR_STRING_PARAMETER_EXPECTED (4062)ERR_HISTORY_WILL_UPDATED (4066)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:array[]- Referencja do docelowej jednowymiarowej tablicy.series_index - Identyfikator danych historycznych (Tab. 19).symbol - Nazwa symbolu, domylnie biecy symbol kursu wymiany walutowej.period - Interwa w minutach, domylnie interwa uywany przez wykres (Tab. 18).Przykad:datetime dt[];ArrayCopySeries(dt, MODE_TIME, Symbol(), PERIOD_M1);UWAGA: Gdy wartoci series_identifier jest MODE_TIME pierwszym parametrem musi by tablica typu datetime.e. ArrayDimension()int ArrayDimension(object array[])Funkcja ArrayDimension() zwraca liczb wymiarw zadanej tablicy.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)Parametry:array[]- Tablica, ktrej wymiar chcemy otrzyma.Przykad:int a[10][5], ws;ws = ArrayDimension(a); // ws = 2f. ArrayGetAsSeries()bool ArrayGetAsSeries(object array[])Funkcja ArrayGetAsSeries() zwracawartoTRUE, jeli tablicazadanaargumentemjest indeksowanajaktablicadanychhistorycznych, czyli elementy tablicy s indeksowane od ostatniego do pierwszego, w przeciwnym razie, jeli tablica jest indeksowana normalnie od lewej do prawej, funkcja zwraca warto FALSE.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)Parametry:array[] - Tablica do sprawdzenia.Przykad:if(ArrayGetAsSeries(a1)) Print("a1 jest indeksowana jak tablica danych historycznych");g. ArrayInitialize()51int ArrayInitialize(double& array[], double value)Funkcja ArrayInitialize()inicjalizujewszystkieelementytablicyzadanej pierwszymargumentemwartocizadandrugimargumentem. Funkcja zwraca liczb zainicjowanych elementw.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:array[] - Tablica do inicjalizacji.value - Warto do ustawienia.Przykad:double a1[7];ArrayInitialize(a1, 1.7);h. ArrayIsSeries()bool ArrayIsSeries(object array[])Funkcja ArrayIsSeries() zwraca TRUE, jeli tablica zadana pierwszym argumentem jest tablic danych historycznych zawierajc elementy time, open, close, high, low lub volume, w przeciwnym razie zwraca false. Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)Parametry:array[] - Tablica do sprawdzenia.Przykad:if(ArrayIsSeries(a1)) Print("Tablica jest tablic danych historycznych.");i. ArrayMaximum()int ArrayMaximum(double array[], int count=WHOLE_ARRAY, int start=0)Funkcja ArrayMaximum() szuka w tablicy zadanej pierwszym argumentem elementu najwikszego, co do wartoci i zwraca jego indeks.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:array[] - Tablica do przeszukania.count - Liczba elementw. Domylnie WHOLE_ARRAY (tab. 3).start - Pocztkowy indeks.Przykad:double a1[] = {1, 2, 3, 5, 11, 8, 7, 4};Print("Element maksymalny = ", a1[ArrayMaximum(a1)]);j. ArrayMinimum()int ArrayMinimum(double array[], int count=WHOLE_ARRAY, int start=0)Funkcja ArrayMinimum() szuka w tablicy zadanej pierwszym argumentem elementu najmniejszego, co do wartoci i zwraca jego indeks.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:array[] - Tablica do przeszukania.count - Liczba elementw. Domylnie WHOLE_ARRAY (tab. 3).start - Pocztkowy indeks.Przykad:double a1[] = {1, 2, 3, 5, 11, 8, 7, 4};Print("Element minimalny = ", a1[ArrayMinimum(a1)]);k. ArrayRange()int ArrayRange(object array[], int range_index)Funkcja ArrayRange() zwraca liczb elementw w tablicy zadanej pierwszym argumentem w wymiarze zadanym drugim argumentem. Poniewa tablice s indeksowane od zera, rozmiar wymiaru jest o 1 wikszy ni najwikszy indeks tego wymiaru. Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INTEGER_PARAMETER_EXPECTED (4063)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:array[] - Tablica do sprawdzenia.range_index - Indeks wymiaru.Przykad:int ws, a1[3, 7, 7];ws = ArrayRange(a1, 1);52l. ArrayResize()int ArrayResize(object& array[], int new_size)Funkcja ArrayResize() ustawia nowy rozmiar pierwszego wymiaru tablicy zadanej pierwszym argumentem. Jeli zmiana rozmiaru si powioda to zwracana jest liczba elementw tablicy po zmianie rozmiaru, w przeciwnym razie zwracana jest warto zero i rozmier tablicy nie ulega zmianie.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:array[]- Tablica ktrej rozmiar ma by zmieniony.new_size - Nowy rozmiar pierwszego wymiaru tablicy.Przykad:double array1[4][4];// a1 ma 16 elementwif(ArrayResize(a1, 8)) Print("Zmiana rozmiaru powioda si"); // a1 ma 32 elementwm. ArraySetAsSeries()bool ArraySetAsSeries(double& array[], bool set)Funkcja ArraySetAsSeries() ustawiakierunekindeksowaniatablicyzadanej pierwszymargumentem. Jeli drugi argument mawartoTRUE, indeksy tablicy bd ustawione w kolejnoci malejcej, ostatni element bdzie mia indeks zero. Jeli drugi argument ma warto FALSE, indeksy tablicy bd ustawione w kolejnoci rosncej, pierwszy element bdzie mia indeks zero. Funkcja zwraca poprzedni stan.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)Parametry:array[] - Tablica, ktrej kolejno ma by ustawiona.set - Flag danych historycznych, ustawiona, jeli przyjmuje warto TRUE.Przykad:double WPRbuf[15], buf[15];int i;ArraySetAsSeries(WPRbuf,true);for(i = 0; i < 15; i++) WPRbuf[i] = iWPR(NULL, 1, 14, i)n. ArraySize()int ArraySize(object array[])Funkcja ArraySize() zwraca liczb elementw zadanej tablicy.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)Parametry:array[] - Tablica jakiegokolwiek typu.Przykad:for(int i = ArraySize(a1); i >= 0; i--){ // ciao ptli}o. ArraySort()int ArraySort(double& array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND)Funkcja ArraySort() sortuje elementy tablicy zadanej pierwszym argumentem po pierwszym wymiarze. Tablica danych historycznych nie moe by sortowana.Kody bdw, ktre mog by ustawione w zmiennej last_error przez t funkcje:ERR_ARRAY_AS_PARAMETER_EXPECTED (4065)ERR_SOME_ARRAY_ERROR (4053)ERR_INCORRECT_SERIESARRAY_USING (4054)ERR_INVALID_FUNCTION_PARAMVALUE (4051)Parametry:array[]- Tablica do posortowania.count- Liczba elementw. Domylnie WHOLE_ARRAY (tab. 3).start- Indeks pocztkowy.sort_dir - Kierunek sortowania. Sortowanie rosnce MODE_ASCEND, malejce MODE_DESCEND.Przykad:double a1[] = {1, 2, 3, 5, 11, 8, 7, 4};ArraySort(a1); // a1[] = {1, 2, 3, 4, 5, 7, 8, 11};ArraySort(a1, WHOLE_ARRAY, MODE_DESCEND);// a1[] = {11, 8, 7, 5, 4, 3, 2, 1};ArraySort(a1, WHOLE_ARRAY, 3, MODE_ASCEND);// a1[] = {1, 2, 3, 5, 4, 7, 8, 11};ArraySort(a1, WHOLE_ARRAY, 3, MODE_DESCEND); // a1[] = {1, 2, 3, 5, 11, 8, 7, 4};5314.14.FUNKCJE SFUNKCJE SPRAWDZAJCEPRAWDZAJCE Funkcje sprawdzajce GetLastError() IsConnected() IsDemo() IsDllsAllowed() IsExpertEnabled() IsLibrariesAllowed() IsOptimization() IsStopped() IsTesting() IsTradeAllowed() IsTradeContextBusy() IsVisualMode() UninitializeReason()1. Funkcje sprawdzajceFunkcje sprawdzajce s zbiorem funkcji, ktre dostarczaj programicie uytecznych informacji o biecym stanie, moliwociach i aktualnych ograniczeniach terminala klienckiego, spowodowanych dziaaniami lub brakiem dziaa uytkownika oraz informacji o bdach ewentualnie informacji o braku takich bdw, rodowiska MetaTrader 4, tak po stronie serwera jak i po stronie terminala klienckiego. Wszystkie funkcje opisane w tym rozdziale nie przyjmuj adnych parametrw.2. GetLastError()int GetLastError()Funkcja GetLastError() zwraca kod ostatniego zarejestrowanego bdu zapisanego z zmiennej last_error i zeruje warto tej zmiennej. Kody bdw zwracaneprzezserweri klientaszdefiniowanewplikustderroe.mqh. Odpowiedniekomunikatywreprezentacji tekstowej, niestetytylkowjzyku angielskim, odpowiadajcyposzczeglnymkodombdw, zwracanychprzeztfunkcj, szwracaneprzezfunkcjErrorDescription, funkcjajest zdefiniowana w pliku stdlib.mqh, ktry trzeba doczy eby korzysta z tej funkcji.W uruchomionym wtku terminala klienckiego, w przypadku wystpienia bdu podczas wykonywania programu MQL 4, kod bdu jest zapisywany wzmiennej last_errordostpnej dlakadegowykonywalnegoprogramuMQL4. Zanimfunkcjainit()zostanieuruchomiona, zmiennalast_errorjest zerowana. Jeeli bd wystpi podczas procesu obliczania lub w wywoaniu funkcji wbudowanej, zmienna last_error przyjmuje odpowiedni kod bdu. Warto przechowywana w zmiennej moe zosta zwrcona przez funkcje GetLastError().Tab. 20 Kody bdw zwracane przez serwer.Staa Warto OpisERR_NO_ERROR 0 Funkcja nie zwrcia bdu.ERR_NO_RESULT 1 Funkcja nie zwrcia bdu, ale poprawno wykonania nie jest znana.ERR_COMMON_ERROR 2 Bd elementarny.ERR_INVALID_TRADE_PARAMETERS 3 Niepoprawne parametry transakcji.ERR_SERVER_BUSY 4 Serwery brokera s przeciony.ERR_OLD_VERSION 5 Stara wersja terminala klienckiego.ERR_NO_CONNECTION 6 Brak poczenia z serwerami brokera.ERR_NOT_ENOUGH_RIGHTS 7 Niewystarczajcy poziom dostpu.ERR_TOO_FREQUENT_REQUESTS 8 Zbyt czste dania.ERR_MALFUNCTIONAL_TRADE 9 Niepoprawne funkcjonowanie operacji transakcyjnej.ERR_ACCOUNT_DISABLED 64 Konto zablokowane.ERR_INVALID_ACCOUNT 65 Konto niepoprawne.ERR_TRADE_TIMEOUT 128 Przekroczono limit czasu transakcji.ERR_INVALID_PRICE 129 Nieprawidowa cena.ERR_INVALID_STOPS 130 Nieprawidowy poziom stop.ERR_INVALID_TRADE_VOLUME 131 Nieprawidowy wolumen transakcji.ERR_MARKET_CLOSED 132 Rynek jest zamknity.ERR_TRADE_DISABLED 133 Moliwo transakcji jest zablokowana.ERR_NOT_ENOUGH_MONEY 134 Za mao rodkw.ERR_PRICE_CHANGED 135 Cena jest nie aktualna.ERR_OFF_QUOTES 136 Kwotowanie jest wyczone.ERR_BROKER_BUSY 137 Broker jest niedostpny.ERR_REQUOTE 138 Przekwotowywanie.ERR_ORDER_LOCKED 139 Zlecenie jest za blokowane.ERR_LONG_POSITIONS_ONLY_ALLOWED 140 Dozwolone tylko pozycje dugie (kupna).ERR_TOO_MANY_REQUESTS 141 Zbyt wiele da.ERR_TRADE_MODIFY_DENIED 145Odmowa modyfikacji, poniewa poziom zlecenia jest zbyt blisko ceny rynkowej.ERR_TRADE_CONTEXT_BUSY 146Inne zlecenie jest wysyane lub broker nie jest jeszcze gotw przyj nastpnego zlecenia z biecego konta, bo zostaa przekroczona maksymalna czstotliwo skadania zlece.ERR_TRADE_EXPIRATION_DENIED 147Dotyczy zlece bdcych w toku. Odmowa przyjcia przez brokera parametru czasu wyganicia transakcji. Operacja moe by powtrzona, jeeli parametr wyganicia bdzie wyzerowany.ERR_TRADE_TOO_MANY_ORDERS 148 Liczna zlece w toku osigna ograniczenie ustawione przez brokera.ERR_TRADE_HEDGE_PROHIBITED 149 Prba otwarcia pozycji przeciwnej do ju istniejcej jest zablokowana.54Staa Warto OpisERR_TRADE_PROHIBITED_BY_FIFO 150 Prba zemknicia pozycji narusza zasady FIFO.Tab. 21 Kody bdw klienta MQL 4.Staa Warto OpisERR_NO_MQLERROR 4000 Funkcja nie zwrcia bdu, kod nigdy niegenerowany.*** ERR_WRONG_FUNCTION_POINTER 4001Podczas wywoywania zewntrznej funkcji, zosta wykryty zy wskanik funkcji.* ****ERR_ARRAY_INDEX_OUT_OF_RANGE 4002 Prba dostpu do elementu tablicy, ktre jest poza tablic.***ERR_NO_MEMORY_FOR_CALL_STACK 4003Podczas wywoywania zewntrznej funkcji, nie byo moliwe relokowanie pamici na stosie dla wywoania funkcji.*ERR_RECURSIVE_STACK_OVERFLOW 4004 Przepenienie stosu podczas rekursywnego wywoania funkcji.*ERR_NOT_ENOUGH_STACK_FOR_PARAM 4005 Parametry nie mieszcz si na stosie.ERR_NO_MEMORY_FOR_PARAM_STRING 4006Podczas wywoywania zewntrznej funkcji, nie byo moliwe alokowanie pamici dla przekazania, stringa jako parametr funkcji.*ERR_NO_MEMORY_FOR_TEMP_STRING 4007Nie byo moliwe alokowanie na stosie tymczasowego bufora dla operacji na stringach.*ERR_NOT_INITIALIZED_STRING 4008Niezainicjalizowany string, string bez wartoci zosta uyty w wyraeniu.***ERR_NOT_INITIALIZED_ARRAYSTRING 4009Niezainicjalizowany string w tablicy stringw, string bez wartoci zosta uyty element tablicy w wyraeniu.***ERR_NO_MEMORY_FOR_ARRAYSTRING 4010Bd przypisania, nie jest moliwe relokowanie pamici dla stringa w tablicy.*ERR_TOO_LONG_STRING 4011Bd przypisania, wynikowy string jest za dugi, by zmieci si w buforze docelowym (nie ma moliwoci relokowania bufora).*ERR_REMAINDER_FROM_ZERO_DIVIDE 4012 Dzielenie przez zero podczas obliczania reszty z dzielenia.*ERR_ZERO_DIVIDE 4013 Dzielenie przez zero.*ERR_UNKNOWN_COMMAND 4014 Nieznana instrukcja.* ****ERR_WRONG_JUMP 4015 Za instrukcja skoku (nigdy niegenerowany bd).ERR_NOT_INITIALIZED_ARRAY 4016 Niezainicjalizowana tablica.****ERR_DLL_CALLS_NOT_ALLOWED 4017 Wywoywanie funkcji importowanej z biblioteki DLL nie jest dozwolone.**ERR_CANNOT_LOAD_LIBRARY 4018Wywoywanie funkcji importowanej z biblioteki EX4 lub DLL nie jest moliwe, wystpi bd podczas adowania biblioteki.**ERR_CANNOT_CALL_FUNCTION 4019Wywoywanie funkcji importowanej z biblioteki EX4 lub DLL nie jest moliwe, nie mona odnale danej funkcji.**ERR_EXTERNAL_CALLS_NOT_ALLOWED 4020 Wywoywanie funkcji importowanej z biblioteki EX4 nie jest dozwolone.**ERR_NO_MEMORY_FOR_RETURNED_STR 4021Nie byo moliwe relokowanie pamici dla zwrcenia tymczasowego stringa z funkcji.ERR_SYSTEM_BUSY 4022 System zajty (nigdy niegenerowany bd).ERR_INVALID_FUNCTION_PARAMSCNT 4050 Nieprawidowa liczna parametrw przekazanych do funkcji.****ERR_INVALID_FUNCTION_PARAMVALUE 4051 Nieprawidowa warto parametru funkcji.ERR_STRING_FUNCTION_INTERNAL 4052 Wewntrzny bd przetwarzania string.****ERR_SOME_ARRAY_ERROR 4053 Bd tablicy.ERR_INCORRECT_SERIESARRAY_USING 4054 Niepoprawne uycie tablicy danych historycznych.ERR_CUSTOM_INDICATOR_ERROR 4055 Bd wskanika technicznego.ERR_INCOMPATIBLE_ARRAYS 4056 Tablica jest niekompatybilna.ERR_GLOBAL_VARIABLES_PROCESSING 4057 Bd przetwarzania zmiennych globalnych.ERR_GLOBAL_VARIABLE_NOT_FOUND 4058 Nie znaleziono zmiennej globalnej.ERR_FUNC_NOT_ALLOWED_IN_TESTING 4059 Wywoanie funkcji nie jest dozwolone w trybie testowym.ERR_FUNCTION_NOT_CONFIRMED 4060 Funkcja nie jest potwierdzona.ERR_SEND_MAIL_ERROR 4061 Wysanie wiadomoci e-mail nie powiodo si.ERR_STRING_PARAMETER_EXPECTED 4062 Spodziewany parametr typu string.ERR_INTEG