Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 183

Kur s MetaQuotes Langua ge 4

wer sja r c1-fCB 224


1. WSTĘP
⇒ Wstęp
⇒ MQL 4
⇒ Kompilator
⇒ IDE
a. Wstęp

Jeśli w 2005 roku powiedziano by mi, że napiszę kurs MQL 4, spytałbym o to, co to jest MQL 4. Jestem pełen optymizmu pisząc ten kurs, optymizm
ten jest tym większy, że to jest pierwszy pełny i całkowicie po polsku kurs MQL 4. Kiedy skończyłem pracę nad próbną wersją tego kursu, nie wiedziałem
jak on zostanie przyjęty. Już pod koniec roku 2006 wziąłem się za pisanie tego kursu, od tego czasu wprowadziłem do niego wiele poprawek i nadal go
rozwijam, głównie, dlatego, że firma MetaQuotes nie udostępniła sformalizowanej definicji języka, dokumentacja zawiera błędy tak samo jak kompilator,
ale bez formalnej definicji języka nie można stwierdzić czy błędy można zrzucić bezpośrednio na barki implementacji kompilatora czy może błąd tkwi w
samej definicji języka, sprawę komplikują ciągłe zmiany identyfikatorów, argumentów formalnych oraz listy funkcji. Pisząc ten kurs jednocześnie się
uczyłem. Starałem się uczynić ten kurs jak najbardziej użytecznym i zrozumiałym, dlatego ma strukturę podobną, do helpa MetaEditora, co ułatwi w
przyszłości śledzenie zmian w funkcjach, ich nazwach i liście parametrów formalnych. Kurs zdobywa coraz większą popularność. W Internecie słychać
głosy, że ten kurs jest „super” jak i takie, że tego nie da się nazwać kursem, w tym pierwszym przypadku dziękuje za uznanie, a stwierdzenie, że to nie
jest kurs traktuje na równi ze stwierdzeniem ludzi, którzy narzekają na efektywność MQLa twierdząc, że MQL 4 nie jest językiem programowania tylko
jakimś tam „skrypterem”. Wskaźniki pisane w MQL są wolne, ale mogą być pisane w C i importowane przez MQL 4. Tłumaczę sobie to nie
dedukowaniem ludzi, którzy piszą takie rzeczy. Pisząc ten kurs napisałem kilkadziesiąt wskaźników i doszedłem do wniosku, że zaimplementowanie
nawet istniejącego wskaźnika mając na uwadze własne preferencje i odporność psychiczną daje lepsze rezultaty niż wypróbowywanie całej armii
gotowych wskaźników. Mam nadzieje, że ten kurs pomoże Wam w realizacji marzeń, bo nie ma, co ukrywać, ale nawet, jeżeli pieniądze nie dają
szczęścia to na przekór temu twierdzeniu wysuwam tezę, że nie wielu jest ludzi, którzy swoje szczęście upatrują w nie ustawicznym ich braku.
We wstępie chcę poczynić uwagę, że zebrane w tym, kursie informację oparłem na swoim osobistym doświadczeniu programistycznym i nie
wszyscy muszą bezkrytycznie podzielać moje poglądy. Wręcz mam nadzieję, że znajdą się ludzie, którzy podejmą polemikę z tym, co zaprezentowałem
w tym kursie.
Język polski jak inne języki etniczne różni się od języków formalnych przede wszystkim tym, że język polski jest kontekstowy i wyrażenia w nim
zawarte często są nie jednoznaczne, więc żeby uniknąć dużej część nie jednoznaczności poczynię zastrzeżenie, że jeżeli z treści danego fragmentu nie
wynika inaczej to dany fragment dotyczy semantyki i/lub syntaktyki MQL 4. Dodatkowo poczynię zastrzeżenie, że kompilator działa w sposób
sekwencyjny i bez kontekstowy, więc jak mu damy do skompilowania tekst fraszki „Na zdrowie” autorstwa Jana Kochanowskiego to też będzie próbował
ją skompilować z skutkiem do przewidzenia nawet przez ucznia szkoły podstawowej. Dla tego jak piszę, że jakiś warunek musi być spełniony to nie,
dlatego, że permanentnie w sposób aksjomatyczny innego wyjścia nie ma, tylko dla tego, że inaczej program się nie skompiluję albo w przypadku funkcji
importowanych istnieje możliwość błędnego działania i jakby tego nie rozpatrywać to efekt końcowy i tak nie wiele się będzie różnił od próby kompilacji
tekstu fraszki.

b. MQL 4

MetaQuotes jest firmą, która stworzyła platformę transakcyjną MetaTrader. To, co najbardziej wyróżnia tą platformę z pośród innych platform tego
typu to, to, że jako jedna z niewielu implementuje wbudowany język programowania, który umożliwia napisanie nawet bardzo skomplikowanych
programów pozwalających na łatwiejsze zarządzanie procesami handlowymi lub nawet na ich całkowitą automatyzację przez implementację własnej
strategii handlowej. Oprócz tego MQL 4 można użyć do tworzenia skryptów i bibliotek. Programy mogą być w łatwy sposób dołączane do jednego z
otwartych wykresów przez przeciągnięcie urządzeniem wskazującym z okna nawigatora terminala klienckiego na odpowiedni wykres techniką przeciągnij
i upuść. Programy działają przynajmniej jak na razie tylko pod kontrolą aktywnego terminala klienckiego. Niestety w przeciwieństwie do zasady twórców
języka, który był pierwowzorem dla tego języka, według, której nowa wersja powinna być całkowicie kompatybilna z wcześniejszymi wersjami, firma
MetaQuotes nie specjalnie dba o kompatybilność wsteczną języka zmieniając i usuwając niektóre standardowe definicje funkcji, co uniemożliwia w
ekstremalnych przypadkach kompilacje starszych programów bez modyfikacji kodów źródłowych lub ściągnięcia odpowiednich plików. Dodatkowy
problem w opanowaniu tego języka mogą stanowić błędy merytoryczne w dokumentacji powielane a najczęściej wręcz mnożone przez autorów innych
kursów tego języka.
MetaQuotes Language 4 (MQL 4) jest względnie młodym językiem i jednym z niewielu języków, który powstał z myślą o programowaniu strategii
handlowych. Silna kontrola typów i brak wskaźników powoduje to, że nawet źle napisany program nie zdestabilizuje pracy systemu przy założeniu, że
całość kodu wykonawczego napisana jest w MQL 4, to oznacza, iż dopóki program nie wykorzystuje funkcji bibliotecznych z bibliotek DLL to najgorsze,
co może się stać to zawieszenie pracy terminala klienckiego na przykład przez wejście w nieskończoną pętlę. MQL 4 pozwala tworzyć wskaźniki,
strategie i skrypty, co pozwala na automatyzację procesów handlowych i wypróbowywanie własnych pomysłów. Dodatkowo często używane funkcje
można dla wygody zebrać w bibliotekach. Język ten zawiera dużo funkcji niezbędnych dla analizy trendu opartych na historycznych i aktualnie
napływających notowaniach, podstawowe działania arytmetyczne i logiczne też są włączone do struktury tego języka. Ponadto są również wbudowane
podstawowe wskaźniki analizy technicznej oraz funkcje kontroli zleceń transakcji. MQL 4 dużo czerpie z języka ANSI C znanym również, jako C99,
norma ISO/IEC 9899: 1999, więc programiści programujący w języku C odnajdą się bardzo szybko w tym języku. W tym kursie na prostych przykładach
pokazana jest semantyka i syntaktyka tego języka oraz funkcje wbudowane.
Na jednym wykresie może pracować tylko jeden skrypt, jedna strategia i wiele wskaźników. Liczba wskaźników jest ograniczona przez zasoby
systemowe i zdrowy rozsądek użytkownika. Skrypty i strategie pracują w swoich własnych wątkach. Wskaźniki pracują przeważnie w wątku interfejsu.
Jeśli wskaźnik został wywołany przez funkcję iCustom, pracuje w wątku programu, który go wywołał. Wywołane importowane funkcje biblioteczne, także
pracują w wątku programu. Dla zatrzymania programu, należy go usunąć z wykresu. Wskaźniki i strategie działają dopóki nie zostaną usunięte z
wykresu jednak istnieje możliwość nakazania strategii by nie podejmowała żadnych działań przez wprowadzenie jej w stan nieaktywny, wtedy zamiast
emotikona w prawym górnym rogu głównego okna wykresu, po nazwie strategii, pojawi się symbol . Wskaźniki i strategie są uruchamiane podczas
ponownego uruchomienia terminala klienckiego dzięki zapisywaniu informacji o uruchomionych wskaźnikach i strategiach podczas zamykania terminala
klienckiego jednak skrypty nie są uruchamiane podczas ponownego uruchomienia terminala klienckiego z powodu nie zapisywania informacji o
uruchomionych skryptach podczas zamykania terminala klienckiego.
Strategie są programami, które umożliwiają automatyzacje procesów handlowych przez tak zwany mechanical trade system (MTS). Jeden wykres
może być obsługiwany, co najwyżej przez jeden program tego typu. Uruchomione programy strategii są wywoływane za każdym razem, gdy terminal
otrzyma bieżące dane chyba, że poprzedni cykl operacji jeszcze się nie skończył. Strategie mogą informować o możliwości transakcji jak i automatycznie
wysyłać zlecenie transakcji kupna i/lub sprzedaży krótkiej a następnie mogą automatycznie wysyłać zlecenie zamknięcia pozycji. MetaTrader jak
większość systemów tego typu, wspiera test strategii na danych historycznych z pokazywaniem miejsc otwarcia i zamknięcia transakcji, niestety brak
bazy tickowej może spowodować dość duże rozbieżności pomiędzy testami a rzeczywistym działaniem strategii, szczególnie na mało płynnych rynkach
albo nawet na płynnych rynkach, w okresach, w których ceny instrumentów zmieniają się bardzo gwałtownie. Na szczęście platforma MetaTrader jakoś
sobie radzi z emulacją ruchów tickowych i przy testach obejmujących znaczny okres czasu i sytuacji rynkowych takich jak bessa czy hossa wyniki testów
w mniejszym lub większym stopniu odpowiadają rzeczywistości. Strategie są zgromadzone w katalogu .\experts.
Wskaźniki są wskaźnikami technicznymi pisanymi często niezależnie od dodatkowych wskaźników już zintegrowanych z terminalem klienckim,
chociaż mogą być pisane w oparciu o wskaźniki dołączone do terminala klienckiego. Wskaźniki te są programami, które umożliwiają analizę techniczną,
ale tak jak wbudowane wskaźniki techniczne nie mogą automatyzować procesów handlowych, lecz mogą być i w zdecydowanej większości przypadków
są wykorzystywane do budowy strategii. Wskaźniki są zgromadzone w katalogu .\experts\indicators.

2
Skrypty są programami, które umożliwiają jednorazowo wykonanie jakiejś czynności. Wykonywanie skryptów nie zależy od napływających notowań.
W przeciwieństwie do strategii czy wskaźników są wykonywane tylko raz od razu na każdorazowe żądanie użytkownika i są automatycznie zamykane po
wykonaniu operacji, przy czym przy zmianie okresu czasu wykresu, przy zamknięciu wykresu na rzecz, którego został uruchomiony lub przy zamknięciu
terminala klienckiego praca skryptu jest przerywana poczym skrypt jest usuwany z pamięci terminala klienckiego. Skrypty są zgromadzone w katalogu
.\experts\scripts.
Biblioteki są zbiorem często używanych funkcji, literałów stałych, zmiennych i innych zasobów zebranych w jednym pliku. Biblioteka nie jest
samodzielnym programem wykonawczym, lecz z jednej biblioteki może korzystać większa liczba procesów jednocześnie. Biblioteki EX4 służą tylko, jako
magazyny kodów maszynowych funkcji, ale to zważywszy na charakterystykę programów pisanych na platformę MetaTrader w zupełności wystarczy.
Biblioteki EX4 są zgromadzone w katalogu .\experts\libraries.
Pliki nagłówkowe są plikami tekstowymi zawierającymi najczęściej używane fragmenty kodu źródłowego do wykorzystania w programach. Pliki te
mogą być dołączone do kodu źródłowego strategii, skryptu, wskaźnika a nawet biblioteki na etapie przetwarzania przez preprocesor. Użycie plików
nagłówkowych jest lepszym pomysłem niż użycie bibliotek, bo wywołanie funkcji bibliotecznej nieuchronnie wiąże się ze zużyciem dodatkowych zasobów
w postaci czasu procesora lub procesorów i pamięci operacyjnej a niekiedy też dyskowej. Pliki nagłówkowe są zgromadzone w katalogu
.\experts\include.

c. Kompilator

Aby kompilować napisany kod źródłowy programu potrzebny jest kompilator. Do pakietu MetaTrader został dołączony kompilator, znajduje się w
katalogu aplikacji w zbiorze .\MetaLang.exe. Metalang.exe jest programem konsolowym, który ma dwa parametry. Pierwszy parametr jest to opcja
zachowania kompilatora i jest opcjonalny. Jedyna możliwość dostępna w tym kompilatorze to opcja q inne znaki są ignorowane. Opcje kompilatora
piszemy po znaku myślnika „-”. Opcja q sprawia, że niewyświetlane są komunikaty dotyczące przebiegu kompilacji. Drugi parametr jest pełną albo
relatywną ścieżką do pliku kodu źródłowego.
MQL 4 jest językiem kompilowanym. Kompilowanie tłumaczy kod programu pisanego w języku formalnym na język maszynowy. Żeby centralne
jednostki ALU/FPU mogły przetwarzać program konieczna jest jego bezbłędna kompilacja, przy czym ewentualne ostrzeżenia powinny być
przeanalizowane. Pliki zawierające wykonywalne kody maszynowe muszą mieć rozszerzenie EX4, jeżeli mają być widziane, jako pliki wykonywalne
przez terminal kliencki.
Przykład:
X:\Program Files\MetaTrader>metalang.exe
MetaQuotes Language 4 compiler version 4.00 build 216 (16 Apr 2008)
Copyright 2001-2008, MetaQuotes Software Corp.

usage: metalang [ options... ] filename


options:
-q : quiet mode

X:\Program Files\MetaTrader>metalang.exe X:\Program Files\MetaTrader\experts\przykład.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\przykład.ex4" produced - 0 error(s), 0 warning(s)

X:\Program Files\MetaTrader>metalang.exe -q "X:\Program Files\MetaTrader\experts\przykład.mq4"


CollectTokens: 3762 MqlToken [1146 Kb], used 3415 MqlToken [size: 312 bytes]

X:\Program Files\MetaTrader>
UWAGA: Skompilowany plik ma tą samą nazwę, co źródłowy i rozszerzenie EX4, jeśli istnieje plik o nazwie jednobrzmiącej z nazwą pliku
wynikowego to kompilator spróbuje zastąpić ten plik bez ostrzeżenia.

d. IDE

MetaTrader 4 jest instalowany z tekstowym edytorem kodu, MetaEditor 4, który jest programem typu IDE (zintegrowane środowisko
programowania), integrującym edytor tekstu służący do edycji kodu źródłowego programu z funkcją podświetlania składni konstrukcji języka. To ma
ułatwić nam orientacje w kodzie. IDE ułatwia kompilacje programu, wystarczy użyć klawisza F5 a MetaEditor wywoła proces kompilacji. Komunikaty ze
standardowego wyjścia błędów kompilatora będą prze kierowane i wyświetlone w zakładce Errors w polu Description. Po pomyślnym skompilowaniu plik
ma tą samą nazwę, co plik źródłowy i rozszerzenie EX4. Jeśli kompilacja się nie powiedzie w zakładce Errors w polu Description pojawi się lista błędów.
IDE ma też zintegrowany system pomocy dostępny w zakładce Help i po naciśnięciu klawisza F1. W systemie pomocy znajdują się opisy funkcji
standardowych podzielonych na kategorie tematyczne, operatory, słowa zastrzeżone i wiele innych. System pomocy opisuje też zachowane funkcje,
które zmieniły nazwę.

3
2. SKŁADNIA
⇒ Składnia
⇒ Instr ukcje
⇒ Separ ator y
⇒ For mat
⇒ Komentarze
⇒ Słowa zastrzeżone
⇒ Identyfikator y
1. Składnia

Składnia tego języka, jak już zaznaczałem wcześniej, jest zbliżona do składni języka C, ale brak w niej niektórych elementów, między innymi takich
konstrukcji i wyrażeń jak:
- arytmetyka przestrzeni adresowej procesora,
- operatora do ... while;
- operatora goto ...;
- operatora <warunek> ? <wyrażenie 1> : <wyrażenie 2>;
- operatora (pre)inkrementacji/dekrementacji,
- organizacji struktur danych,
- wielokrotnego przypisywania,
- wczesnego zakańczania obliczeń wyrażeń logicznych.
Składnia większości języków programowania w tym składnia MQL 4 jest opisywana poprzez wyrażenia regularne. Zaletą takiego podejścia jest to,
że wyrażenia regularne jednoznacznie opisują syntaktykę języka nie pozwalając na jakiekolwiek nieścisłości czy rozbieżności. Aby używać jakiegoś
języka poprawnie trzeba poznać jego gramatykę w przypadku języków formalnych gramatyka określa takie elementy jak: instrukcje, separatory, format,
komentarze, słowa zastrzeżone i identyfikatory.

2. Instr ukcje

Instrukcja wysokiego poziomu oznacza jedną czynność, jaką ma wykonać program, którą kompilator zamieni, na co najmniej jedną instrukcję
maszynową. Instrukcja może też występować jako instrukcja blokowa, czyli, mimo że składa się z szeregu instrukcji wysokiego poziomu, to do dalszego
przetwarzania traktowana jest tak samo jak pojedyncza instrukcja wysokiego poziomu.
Przykład:
x = 2;
y = x + 2;

c. Separ ator y

Separatory to ciągi znaków używanych do ograniczenia fragmentów kodu źródłowego posiadających określone znaczenie. Program pisze się
umieszczając kolejne instrukcje oddzielając je separatorami. Wewnątrz instrukcji też można umieścić separatory. Stosowanie separatorów służ na ogół
zwiększeniu czytelności kodu. Do separatorów zaliczają się znaki: spacje, tabulatory, koniec wiersza i koniec strony. Do oddzielenia każdych dwóch
instrukcji można stosowa kilka separatorów. Ale dyrektywy preprocesora muszą być pisane w jednej linii.
Przykład:
x= 2;
y = x + 2;
// kompilator zgłosi błąd
#property
Copyrigtch "Prawa Autorskie ® 2007, Konrad Kudzin"

x= 2;
y = x + 2;
// a teraz kompilator nie zgłosi
#property Copyrigtch "Prawa Autorskie ® 2007, Konrad Kudzin."

d. For mat

MetaQuotes Language 4 jest językiem o tak zwanym wolnym formacie to znaczy, że układ linii nie jest nam odgórnie narzucony przez co możemy w
instrukcji stosować dowolną ilość spacji, znaków tabulacji i pustych linii na przykład w jednej linii kodu zapisać dwie instrukcje lub w dwóch liniach kodu
jedną instrukcję. Dzieje się tak, dlatego, że koniec instrukcji określany jest przez średnik a nie przez znaki końca linii. Pamiętaj jednak, że nie możesz
używać takich samych reguł do formatowania linii zawierających dyrektywy preprocesora, ale nie należy tego traktować jako wyjątku od reguły,
wyrażenia regularnego, bo dyrektywy preprocesora są przetwarzane w pierwszej kolejności modyfikując kod źródłowy a dopiero tak zmodyfikowany kod
jest przetwarzany przez kompilator. Dla przykładu, jeśli przez dyrektywę preprocesora zdefiniujemy stałą o nazwie STALA o wartości 5.0, to zanim
wkroczy do działania kompilator wszystkie wystąpienia w kodzie słowa STALA w zakresie jej widzialności będą zastąpione przez literał dosłowny 5.0 a
dyrektywa dołączenia pliku wstawi zawartość żądanego pliku dokładnie w miejsce wystąpienia odpowiedniej dyrektywy. Więcej o dyrektywach
preprocesora w rozdziale ósmym.
Przykład:
double x, y, z;
oraz
double
x,

y,
z;
są traktowane jako zapisy tożsame, z tym, że pierwszy zapis jest bardziej czytelny.

e. Komentarze
4
Komentarze są bardzo użyteczne, są to pisane bezpośrednio w kodzie źródłowym, używane po to, ażeby ułatwić nam prace z kodem w przyszłości,
opisy, najczęściej w języku etnicznym rzadziej w metajęzyku czy w innym języku formalnym, tego, za co ten konkretny fragment kodu jest
odpowiedzialny. Załóżmy, że piszemy duży program i po półrocznej przerwie chcemy go zmodyfikować, ale nie pamiętamy, do czego służyły niektóre
zmienne czy funkcje biblioteczne. Bez komentarzy nawet twórcy kodu mogą mieć problemy ze zrozumieniem wszystkich zawiłości małego kodu, który
ma ledwo kilka tysięcy linii rozrzuconych po kilkunastu plikach. Komentarz to fragment kodu źródłowego, którego jedynym celem istnienia jest
informowanie o czymś osobę czytającą źródła. Komentarze nie mają żadnego wpływu na program i są ignorowane przez kompilator. Generalnie panuje
zasada, że komentowane powinno być to, co kod robi, a nie jak to robi. Każdy programista ma swój własny styl pisania komentarzy. Mamy dwa rodzaje
komentarzy. Komentarz blokowy, który nie może być zagnieżdżany, zaczyna się od "/*" a kończy "*/", wszystko, co zostanie zapisane pomiędzy "/*" a "*/"
zostanie zignorowane przez kompilator, komentarz liniowy jak sama nazwa wskazuje dotyczy pojedynczej linii, rozpoczyna się sekwencją "//" i kończy
znakiem końca linii, ten typ komentarza może być zagnieżdżany w komentarzach blokowych a wszystko od "//" do końca linii jest ignorowane.
Przykład:
double x, y, z; // komentarz jedno linijkowy
/*
komentarz
wielo liniowy // komentarz zagnieżdżony
*/
/* 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 zgłosi błąd
*/
double a /* zmienna a*/, b /* zmienna b*///, c /* zmienna c*/;
// w tym miejscu zgłosi błąd, brak ";"

f. Słowa zastrzeżone

Słowa zastrzeżone mają specjalne znaczenie dla języka, używane są dla określonych celów i są zarezerwowane do użycia w konstrukcjach
językowych. Nie można używać ich w roli identyfikatorów albo do jakiegoś innego celu bo spowoduje to, że nasz program się nie skompiluję.
Tab. 1 Słowa zastrzeżone.
Słowa kluczowe Literały
Typy danych Dyrektywy Operatory Typy pochodne Typy logiczne Przykładowe literały stałe
bool extern break D’[RRRR.MM.DD] [GG[:mm[:SS]]]’ false NULL
color static case D’[DD.MM.RRRR] [GG[:mm[:SS]]]’ False MODE_OPEN
datetime continue C’r, g, b’ FALSE MODE_LOW
double default true MODE_HIGH
int else True MODE_CLOSE
string for TRUE MODE_VOLUME
void if MODE_TIME
return
switch
while
UWAGA: Literały RRRR, MM, DD, GG, mm, SS, r, g, b to odpowiednio mAski dla określenia roku, miesiąca roku, dnia miesiąca, godziny doby,
minuty godziny, sekundy minuty, składowech z zakresu od 0 do 255 dziesiętnie czerwonej, zielonej i zielonej koloru, w nawiasach podano składniki
opcjonalne.
Literały stałe nie są definiowane przez sam język leczy przez preprocesor i podczas początkowego etapu kompilacji czyli przetwarzania tekstu kodu
źródłowego przez preprocesor są zamieniane na dosłowne wartości tych literałów. Jednak predefiniowane literały stałe mimo uwag poczynionych
wcześniej są według dokumentacji języka traktowane jako część składni języka i dla tego podaję przykładowe predefiniowane literały stałe jako słowa
zastrzeżone dla tego języka.
Przykład:
int i;
bool b = True;
color c = C’64, 128, 192’;
datetime d = D’11.02.1983’;
static double sd = 0.0001;

g. Identyfikator y

Identyfikatory są nazwami używany do identyfikacji: zmiennych, funkcji i typów danych. Są trzy ograniczenia dla wybieranych nazw. Długość
identyfikatora nie może przekraczać 31 znaków. Identyfikatory mogą składać się tylko z liter a-z, A-Z, cyfr 0-9 oraz symbolu podkreślenia '_' ale pierwszy
symbol nie może być cyfrą. Małe i wielkie litery są rozróżniane. Identyfikatorem nie może być słowo zastrzeżone.
Przykład:
int o_0; // ten
int x_0; // i ten identyfikator
int O_0; // to nie to samo co ten
int X_0; // i ten identyfikator

int bool; // nie prawidłowe


int case; // identyfikatory
int if; // tu kompilator wyrzuci błąd

int IF; // a tu kompilator


int iF; // nie wyrzuci błędu

5
3. TYPY
⇒ Typy
⇒ Rzutowanie typów
⇒ Typ całkowity (int)
⇒ Typ zmiennoprzecinkowy (double)
⇒ Typ tekstowy (string)
⇒ Typ amorficzny (object)
⇒ Typ pusty (void)
⇒ Typ booleanowski (bool)
⇒ Typ daty i czasu (datetime)
⇒ Typ kolor u (color)
1. Typy

Każda nazwa wprowadzona przez nas musi być, co najmniej zadeklarowana. MQL 4 używa jednoprzebiegowego procesu kompilacji, co implikuje
konieczność przynajmniej deklaracji nazw, których nie obejmuje definicja języka przed ich pierwszym użyciem. Deklarując czy definiując zmienne i
funkcje określamy przede wszystkim ich typ, przy pomocy odpowiedniego słowa kluczowego (Tab. 1 - Typy danych), tym samym informujemy kompilator
jak ma postępować w przypadku napotkania nie standartowego identyfikatora zmiennej albo funkcji.
Przykład:
// typy fundamentalne
int z1;
double z2;
string z3;
bool z4;
void f1(object a1 /* typ amorficzny */) // typ pusty
{
// ciało funkcji
}
int f2(/* lista parametrów formalnych */)
{
// ciało funkcji
}
double f3(/* lista parametrów formalnych */)
{
// ciało funkcji
}
string f4(/* lista parametrów formalnych */)
{
// ciało funkcji
}
bool f5(/* lista parametrów formalnych */)
{
// ciało funkcji
}
// typy pochodne
color z5;
datetime z6;

b. Rzutowanie typów

W MQL 4 używana jest tylko niejawna konwersja typów. Przed działaniami (z wyjątkiem operacji przypisania) jest wykonana, konwersja danych w
wyrażenia do typu o najwyższym priorytecie w tym wyrażeniu. Przed operacją przypisania jest wykonane rzutowanie danych na typ docelowy.
Tab. 2 Priorytety konwersji typów.
Priorytet Typ
3 string
2 double
1 int (color, datetime), bool
Przykład:
int i = MathCos(0); // rzutowanie typu double na typ int, wynik 1
int i = i * 4; // bez rzutowania, wynik 4
int j = i / 2.0; // rzutowanie typu double na typ int, wynik 2
bool b = -i =< j; // bez rzutowania, wynik true numerycznie 1
double d = 1.0 / j; // bez żutowania, wynik 0.5
double d = i / 8.0; // rzutowanie na typ double, wynik 0.5
double d = 64 / 16; // rzutowanie typu int na typ double, wynik 0.0
string s = 1.0 / j; // rzutowanie typu double na typ string, wynik "0.50000000" (10 znaków)
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 całkowity (int)

Typ całkowito liczbowy oznacza typ danych przeznaczony do reprezentowania 4 bajtowy wartości całkowitych, liczby tego typu może poprzedzać
znak „+” albo „-”. MQL 4 wspiera zapis ósemkowy, dziesiętny i szesnastkowy. Zapis ósemkowy poprzedzamy 0 i w dalszej części kursu nie będziemy
wykorzystywać tego systemu zapisu ze względu na małą użyteczność tej formy zapisu dla specyfiki programów pisanych w tym języku, zapis dziesiętny
jest domyślnym zapisem używanym przez kompilator i nie ma przedrostka oznaczającego rodzaj systemu liczbowego, zapis szesnastkowy zaczynamy
od symbolu 0x lub 0X. Liczby w systemie dziesiętnym składają się z cyfr od 0 do 9, które poprzedza opcjonalny znak liczby. Liczby w systemie
ósemkowym składają się z cyfr od 0 do 7, które poprzedza odpowiedni symbol systemu liczbowego. Liczby w systemie szesnastkowym składają się z
cyfr od 0 do 9 i liter od a do f lub od A do F, które poprzedza odpowiedni symbol systemu liczbowego. Zakres wartości: od -2147483648 do 2147483647
dziesiętnie. Typ całkowito liczbowy jest, także wykorzystywany do reprezentacji danych znakowych. Przez znak w tym znaczeniu, należy rozumieć jeden
z 256, indeksowanych od 0 do 255, elementów odpowiadających indeksom w rozszerzonej tablicy ASCII (American Standard Code for Information

6
Interchange). Znaki w tym znaczeniu pisze się w pojedynczych cudzysłowach „’” otaczających znak. Niektóre znaki są znakami specjalnymi i nie mogą
być używane bezpośrednio w pojedynczych cudzysłowach, ponieważ są zarezerwowane i użycie ich zmieni sens wyrażenia lub spowoduje błąd. W
takim przypadku konieczne jest użycie sekwencji unikowych. Aby zapisać znaki specjalne używamy znaku backslash „\” z odpowiednim symbolem. W
tabeli 4 są wypisane wszystkie sekwencje unikowe. Dla utworzenia zmiennej lub funkcji o wartości całkowito liczbowej używamy słowa zastrzeżonego int.
Jeśli stała przekroczy wartość reprezentacji tego typu, wynik będzie niezdefiniowany.
Tab. 3 Sekwencje unikowe.
Nazwa znaku Oznaczenie znaku Sekwencja unikowa znaku
Backslash \ \\
Pojedynczy cytat ' \'
Podwójny cytat " \"
Koniec linii NL (FL) \n
Tabulator poziomy HT \t
Powrót karetki CR \r
Znak pusty NULL \x00
Kod ASCII szesnastkowo 0xhh \xhh
Przykład:
int a = 020000000000; // najmniejsza liczba typu int
int b = -2147483648;
int c = 0x80000000;
int d = 017777777777; // największa liczba typu int
int e = 2147483647;
int f = 0x7FFFFFFF;
int g = '#'; // to jest wartość 35
int h = '\x23'; // to również jest wartość 35
int i = '©'; // kod 0xA9
int j = '®'; // kod \xAE

d. Typ zmiennoprzecinkowy (double)

Typ zmiennoprzecinkowy, oznacza typ danych przeznaczony do reprezentowania 8 bajtowych wartości kwantowego i przeliczalnego zbioru liczb
wymiernych w formacie dziesiętnym, oznacza to, że dokładność tego typu jest ograniczona. Opcjonalną część ułamkową oddzielamy kropką dziesiętną.
Zakres wartości: od (+/-)2.2E-308 do (+/-)1.8E308. Dla utworzenia zmiennej lub funkcji o wartości zmiennoprzecinkowej używamy słowa zastrzeżonego
double. Jeśli stała przekroczy wartość reprezentacji tego typu, wynik będzie niezdefiniowany.
Przykłady:
int a = 666;
double b = -1.0;
int c = 50;
double x = a - b; // wynik 667.0
double y = b / c; // wynik -0.02
double z = c / a; // wynik 0.0
double d = a % c; // wynik 16.0

e. Typ tekstowy (string)

Typ tekstowy, oznacza typ danych przeznaczony do reprezentowania ciągu znaków w fizycznie ciągłej tablicy znaków, które możemy zapisywać za
pomocą serii znaków rozszerzonej tablicy ASCII ograniczonych znakami podwójnego cudzysłowu „"”, kodów ósemkowych, dziesiątkowych,
szesnastkowych. Kolejne znaki są zapisywane w pamięci pod kolejnymi adresami fizycznymi zaczynając od znaku o indeksie 0. W ciągu znaków
możemy zapisać maksymalnie do 255 znaczących znaków, po przekroczeniu tego limitu zostanie wygenerowany błąd: „too long string (255 characters
maximum)”. Bezpośrednio po ostatnim znaku znaczącym jest umieszczany terminator ciągu, tak zwany NULL. Znak NULL jest znakiem specjalnym
reprezentowanym przez znak ASCII o kodzie 0x00 używanym do oznaczenia końca ciągu znaków. Znaki następujące po terminatorze ciągu są znakami
nieznaczącymi, nieinterpretowanymi i ich wartość nie ma żadnego znaczenia dla ciągu. Typ tekstowy, jest zaimplementowany jako rekord ze
wskaźnikiem do tablicy, której element mają po jednym bajcie. Możliwe jest użycie w ciągu znaków każdego znaku z rozszerzonej tablicy ASCII, oprócz
znaku o kodzie 0x00, znaki specjalne mają swoje sekwencje unikowe zaczynające się od znaku \. Dla utworzenia zmiennej lub funkcji z wartością
łańcuchów znaków używamy słowa zastrzeżonego string. Jeśli stała przekroczy długość, nadmiarowe znaki będą obcięte i kompilator zgłosi odpowiednie
ostrzeżenie.
Struktura:
Wartość danej typu string jest reprezentowana przez rekord, 8 bajtową strukturę. Pierwszy element struktury jest 4 bajtową liczbą całkowitą
przechowującą wielkość bufora. Drugi element struktury jest 4 bajtowym wskaźnikiem, wskazującym na adres pierwszego znaku w stringu. Ostatnim
znaczącym znakiem jest znak poprzedzający znak końca stringu. Na przykład dana s typu string o wartości "Konrad" zdefiniowana jako: string s =
"Konrad"; jest w pamięci 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]+255
K o n r a D NULL ......... .........
Tab. 4 Specjalne stałe.
Stała Wartość Opis
NULL 0 Wskazuje na pusty string.
EMPTY -1 Wskazuje na pusty parametr.
EMPTY_VALUE 0x7FFFFFFF Domyślna pusta wartość wskaźnika.
CLR_NONE 0xFFFFFFFF Wskazuje na brak koloru.
WHOLE_ARRAY 0 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) 0 0x00 (sp) 32 0x20 @ 64 0x40 ` 96
(soh) 1 0x01 ! 33 0x21 A 65 0x41 a 97
(stx) 2 0x02 " 34 0x22 B 66 0x42 b 98
(etx) 3 0x03 # 35 0x23 C 67 0x43 c 99
(eot) 4 0x04 $ 36 0x24 D 68 0x44 d 100
(enq) 5 0x05 % 37 0x25 E 69 0x45 e 101
(ack) 6 0x06 & 38 0x26 F 70 0x46 f 102
(bel) 7 0x07 ' 39 0x27 G 71 0x47 g 103
(bs) 8 0x08 ( 40 0x28 H 72 0x48 h 104
(ht) 9 0x09 ) 41 0x29 I 73 0x49 i 105
(lf) 10 0x0a * 42 0x2a J 74 0x4a j 106

7
Znaki Kody Dec Kody Hex Znaki Kody Dec Kody Hex Znaki Kody Dec Kody Hex Znaki Kody Dec Kod Hex
(vt) 11 0x0b + 43 0x2b K 75 0x4b k 107
(ff) 12 0x0c , 44 0x2c L 76 0x4c l 108
(cr) 13 0x0d - 45 0x2d M 77 0x4d m 109
(so) 14 0x0e . 46 0x2e N 78 0x4e n 110
(si) 15 0x0f / 47 0x2f O 79 0x4f o 111
(dle) 16 0x10 0 48 0x30 P 80 0x50 p 112
(dc1) 17 0x11 1 49 0x31 q 81 0x51 q 113
(dc2) 18 0x12 2 50 0x32 R 82 0x52 r 114
(dc3) 19 0x13 3 51 0x33 S 83 0x53 s 115
(dc4) 20 0x14 4 52 0x34 t 84 0x54 t 116
(nak) 21 0x15 5 53 0x35 U 85 0x55 u 117
(syn) 22 0x16 6 54 0x36 V 86 0x56 v 118
(etb) 23 0x17 7 55 0x37 W 87 0x57 w 119
(can) 24 0x18 8 56 0x38 X 88 0x58 x 120
(em) 25 0x19 9 57 0x39 Y 89 0x59 y 121
(sub) 26 0x1a : 58 0x3a Z 90 0x5a z 122
(esc) 27 0x1b ; 59 0x3b [ 91 0x5b { 123
(fs) 28 0x1c < 60 0x3c \ 92 0x5c | 124
(gs) 29 0x1d = 61 0x3d ] 93 0x5d } 125
(rs) 30 0x1e > 62 0x3e ^ 94 0x5e ~ 126
(us) 31 0x1f ? 63 0x3f _ 95 0x5f (del) 127
Przykład:
"" // to jest łańcuch pusty
"\x00" // to jest również łańcuch pusty
"#" // to jest hasz
"\x23" // to jest również hasz
"\x32" // to jest kod cyfry dwa
"\x02" // to jest wartość dwa
"\x5c" // to jest back slash

"Ta \n linia \n jest \n złamana "


"\"To jest cudzysłów\""

f. Typ amorficzny (object)

Typ amorficzny, oznacza typ danych przeznaczony do reprezentowania jakiegokolwiek typu. Wprowadzenie takiego typu do systemu typów języka,
umożliwia pewnego rodzaju uogólnienie - nie trzeba pisać oddzielnych wariantów funkcji dla każdego z typów argumentu.
Przykład:
void f1(object& o)
{
// ciało funkcji
}

g. Typ pusty (void)

Typ pusty, oznacza typ danych przeznaczony do reprezentowania tylko jednej wartości. Wprowadzenie takiego typu do systemu typów języka
umożliwia pewnego rodzaju uogólnienia - nie trzeba rozróżniać funkcji, które zwracają wartość i procedur, które nie zwracają wartości. Typ pusty
stosowany jest głównie do wskazania, że funkcja nie zwraca wyniku. Dla utworzenia funkcji która nie zwraca wartości używamy słowa zastrzeżonego
void.
Przykład:
void f1(/* parametry formalne */)
{
// ciało funkcji
}

h. Typ booleanowski (bool)

Typ logiczny, oznacza typ danych przeznaczony do reprezentowania wartości logicznych. W dokumentacji języka jest traktowany jako typ
fundamentalny ale wiele wskazuje na to, że jest w rzeczywistości specjalnie traktowanym typem int. Typ Booleanowski przyjmuje tylko dwie wartości
logiczne. Typ ten swoją nazwę zawdzięcza słynnemu matematykowi George Boole. Wartość logiczna TRUE jest definiowana jako wartość różna od zera
a wartość logiczna FALSE jest definiowana jako wartość równa 0. Jawnie nadanie zmiennej logicznej wartość TRUE będzie równoznaczne z
przypisaniem jej wartości liczbowej 1. Literałów: false, FALSE i False oraz literałów: true, TRUE i True można używać zamiennie. Dla utworzenia
zmiennej lub funkcji o wartości logicznej używamy słowa zastrzeżonego bool.
Przykład:
bool a = true;
bool b = false;
bool c = 1;
bool d = 0;

i. Typ daty i czasu (datetime)

Typ daty i czasu jest w rzeczywistości specjalnie traktowanym typem int. Typ ten, przechowuje datę i czas w formacie konwencji UNIX, czyli liczby
sekund, które upłynęły od północy 1970.01.01. Jest to typ danych, który może reprezentować wartości od 1970.01.01 do 2037.12.31. Istnieje możliwości
dodatkowego sposobu definiowania wartości reprezentowana przez 6 części literału, gdzie używana jest naturalna notacja dla określenia dnia miesiąca,
miesiąca roku, roku, godziny doby, minuty godziny i sekundy minuty, określany przez notację D’[RRRR.MM.DD] [GG[:mm[:SS]]]’ równoważną z
D’[DD.MM.RRRR] [GG[:mm[:SS]]]’, gdzie RRRR to cztero cyfrowe numeryczne określenie roku, MM to dwu cyfrowe numeryczne określenie miesiąca
roku, DD to dwu cyfrowe określenie dnia miesiąca, GG to dwu cyfrowe określenie godziny doby, mm to dwu cyfrowe określenie minuty godziny, SS to
dwu cyfrowe określenie sekundy minuty, w nawiasach podano składniki opcjonalne, gdy nie podamy daty to używana jest data kompilacji, gdy nie
podamy sekundy przyjmowana jest wartość GG:MM:00, podobna sytuacja ma miejsce, gdy nie podamy minuty albo godziny, w takich przypadkach jest

8
odpowiednio przyjmowana wartość GG:00:00 i 00:00:00. Dla utworzenia zmiennej lub funkcji o wartości czasu w konwencji UNIX-owej używamy słowa
zastrzeżonego datetime.
Przykład:
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 kompilacji

j. Typ kolor u (color)

Typ koloru jest w rzeczywistości specjalnie traktowanym typem int. Typ ten, przechowuje kolor. Jest to typ danych, który może reprezentować
wartości kolorów i przyjmuje 16777216 różnych wartości indeksowanych od 0 do 16777215. Istnieje możliwość dodatkowego sposobu definiowania
wartości, gdzie używa się notacji addytywnej mieszania kolorów: czerwonego, zielonego i niebieskiego, określaną przez notację C’r, g, b’, gdzie r to
wartość składowej czerwonej, g to wartość składowej zielonej a b to wartość składowej niebieskiej. Całkowitoliczbowa wartość zapisywana w
reprezentacji szesnastkowej wygląda tak: 0x00RRGGBB, gdzie RR jest maską składowej czerwonej, GG jest maską składowej zielonej a BB jest maską
składowej niebieskiej. Zapis w reprezentacji dziesiętnej nie ma tak prostego przełożenia na schemat RGB. MQL 4 oferuje też dodatkowo możliwość
określania wartości przez literały stałe. W tym celu zostały zdefiniowane 132 literały stałe. Dla utworzenia zmiennej lub funkcji o wartości koloru używamy
słowa zastrzeżonego color.
Przykład:
color c1 = Blue; // nazwa
color c2 = 255; // liczba decymenalna
color c3 = 0x000000FF; // liczba heksy decymenalna 0x00RRGGBB
color c4 = C'0, 0, 255'; // składowe
Tab. 6 Tabela kolorów.
Black DarkGreen DarkSlateGray Olive Greek Teal Navy Purple
Maron Indigo MidnightBlue DarkBlue DarkOliveGreen SaddleBrown ForestGreen OliveDrab
SeaGreen DarkGoldenrod DarkSlateBlue Sienna MediumBlue Brown DarkTurquoise DimGray
LightSeaGreen DarkViolet FireBrick MediumVioletRed MediumSeaGreen Chocolate Crimson SteelBlue
Goldenrod MediumSpringGreen LawnGreen CadetBlue DarkOrchid YellowGreen LimeGreen OrangeRed
DarkOrange Orange Gold Yellow Chartreuse Lime SpringGreen Aqua
DeepSkyBlue Blue Magenta Red Gray SlateGray Peru BlueViolet
LightSlateGray DeepPink MediumTurquoise DodgerBlue Turquoise RoyalBlue SlateBlue DarkKhaki
IndianRed MediumOrchid GreenYellow MediumAquamarine DarkSeaGreen Tomato RosyBrown Orchid
MediumPurple PaleVioletRed Coral CornflowerBlue DarkGray SandyBrown MediumSlateBlue Tan
DarkSalmon BurlyWood HotPink Salmon Violet LightCoral SkyBlue LightSalmon
Plum Khaki LightGreen Aquamarine Silver LightSkyBlue LightSteelBlue LightBlue
PaleGreen Thistle PowderBlue PaleGoldenrod PaleTurquoise LightGrey Wheat NavajoWhite
Moccasin LightPink Gainsboro PeachPuff Pink Bisque LightGoldenRod BlanchedAlmond
LemonChiffon Beige AntiqueWhite PapayaWhip Cornsilk LightYellow LightCyan Linen
Lavender MistyRose OldLace WhiteSmoke Seashell Ivory Honeydew AliceBlue
LavenderBlush MintCream Snow White

9
4. OPERACJE I WYRAŻENIA
⇒ Oper acje i wyr ażenia
⇒ Prior ytet oper acji
⇒ Oper acje ar ytmetyczne
⇒ Oper acje przypisania
⇒ Oper acje r elacji
⇒ Oper acje Booleanowskie
⇒ Oper acje bitowe
⇒ Oper acje inne
1. Oper acje i wyr ażenia

Pewne znaki i sekwencji znaków mają specjalne znaczenie. Są symbolami operacji, używanych w wyrażeniach, oddzielają argumenty operacji od
siebie. Wyrażenia buduje się z jednego lub więcej identyfikatorów i operatorów, które nadają wyrażeniu znaczenie. Pojedyncze wyrażenia łączą się w
ciągi instrukcji, ciągi instrukcji łączą się w funkcje a te z kojeni budują kompletny i funkcjonalny program.
Wyrażenia są opisywane przez wzorce, które opisują łańcuchy symboli przez co określają zbiór pasujących łańcuchów. Wyrażenie składa się z
jednego lub więcej argumentów i znaków operacji. Wyrażenie może być napisane w kilku liniach jak i jedna linia może zawierać więcej niż jedno
wyrażenie. Dzieje się tak ze względu na to, że koniec wyrażenia jest określany przez operator końca wyrażenia, średnik „;”.
Przykład:
int i = 0, j = 2, x, y, z = 1; i++; j--;
y=i%2
+
j / 2;
x=y
+
2
-
z
*
2
;

b. Prior ytet oper acji

Poniższa tabela pokazuje, priorytety operatorów. Operatory w tej tabeli są umieszczone według priorytetu wykonania. Im wyższe miejsce grupy
operatorów w tabeli tym wyższy priorytet operatorów, inaczej mówiąc priorytet maleją z góry do dołu tabeli. Porządek wykonania działań determinuje
grupa, w której znajduje się dany operator. Im wyżej jest grupa, w której się znajduje operator, tym wyższy jest jego priorytet. Operatory z relatywnie
wyższym priorytetem są wykonywane przed operatorami z relatywnie niższym priorytetem. Operatory w tej samej grupie mają jednakowy priorytet. Gdy
operatory z jednej grupy pojawią się w tym samym wyrażeniu, są wykonywane zgodnie z kierunkiem wykonywania operacji (łączność). Wszystkie
binarne operatory oprócz operatorów przypisania są wykonywane od lewej do prawej. Operatory przypisania są wykonywane od prawej do lewej strony
równania.
Tab. 7 Priorytet operatorów.
Priorytet Operator Argumenty Nazwa operatora Łączność
() N wywołanie funkcji od lewej
14
[] 1 indeksowanie tablicy od lewej
! 1 negacja logiczna od prawej
~ 1 negacja bitowa od prawej
++ 1 inkrementacja od prawej
13
-- 1 dekrementacja od prawej
- 1 zmiana znaku od prawej
+ 1 znak liczby od prawej
* 2 mnożenie od lewej
12 / 2 dzielenie od lewej
% 2 modulo od lewej
+ 2 dodawanie od lewej
11
- 2 odejmowanie od lewej
>> 2 bitowe przesunięcie w prawo od lewej
10
<< 2 bitowe przesunięcie w lewo od lewej
< 2 mniejszy od lewej
<= 2 mniejszy, bądź równy od lewej
9
> 2 większy od lewej
>= 2 większy, bądź równy od lewej
== 2 logiczny operator relacji czy równy od lewej
8
!= 2 logiczny operator relacji czy różny od lewej
7 & 2 bitowy iloczyn od lewej
6 ^ 2 bitowa suma modulo od lewej
5 | 2 bitowa suma od lewej
4 && 2 iloczyn logiczny od lewej
3 || 2 suma logiczna od lewej
2 = 2 przypisanie od prawej
+= 2 dodanie z przypisaniem od prawej
-= 2 odejmowanie z przypisaniem od prawej
*= 2 mnożenie z przypisaniem od prawej
/= 2 dzielenie z przypisaniem od prawej
%= 2 modulo z przypisaniem od prawej
>>= 2 bitowe przesunięcie w prawo z przypisaniem od prawej
<<= 2 bitowe przesunięcie w lewo z przypisaniem od prawej
&= 2 bitowy iloczyn z przypisaniem od prawej
|= 2 bitowa suma z przypisaniem od prawej

10
Priorytet Operator Argumenty Nazwa operatora Łączność
^= 2 bitowa suma modulo z przypisaniem od prawej
1 , 2 separator argumentów od lewej

c. Oper acje ar ytmetyczne

W MQL 4 jest 9 operatorów arytmetycznych. Cztery pierwsze operatory to odpowiednio dwuargumentowe operatory dodawania, odejmowania,
mnożenia i dzielenia. Następne dwa to jednoargumentowe operatory inkrementacji i dekrementacji, które nie mogą być stosowane łącznie z innymi
operatorami w jednym wyrażeniu. Operator inkrementacji zwiększa wartość o 1, operator dekrementacji zmniejsza wartość o 1. Dwuargumentowy
operator modulo jest operatorem, który zwraca resztę z dzielenia. Pozostałe dwa operatory są jednoargumentowe, pierwszy z nich jest operatorem
znaku liczby i nic nie robi, drugi jest operatorem zmiany znaku liczby i w przypadku liczb ze znakiem zmienia znak liczby.
Tab. 8 Operatory arytmetyczne.
Operator Nazwa operatora
+ dodawanie
- odejmowanie
* mnożenie
/ dzielenie
++ inkrementacja
-- dekrementacja
% modulo
+ znak liczby
- zmiana znaku liczby
Przykład:
x = x + y; x += y; // dodaje y do x, wynik zapisuje w x
x = x - y; x -= y; // odejmuje y od x, wynik zapisuje w x
x = x * y; x *= y; // mnoży x przez y, wynik zapisuje w x
x = x / y; x /= y; // odzieli x przez y, wynik zapisuje w x
x = x % y; x %= y; // oblicza resztę z dzielenia x przez y, wynik zapisuje w x
x++; // inkrementacja x (zwiększa o 1)
x--; // inkrementacja x (zmniejsza o 1)
x = +x; // nic nie robi
x = -x; // zmień znak liczby x

d. Oper acje przypisania

Jakiekolwiek wyrażenie matematyczne zwraca wynik. Wartość operandów i operatorów zawierającego jeden z poniższych operatorów przypisania
będzie po wykonaniu działań przypisana do operandu znajdującego się po skrajnie lewej stronie wyrażenia po wykonaniu arytmetycznej lub bitowej
operacji opcjonalnie zdefiniowanej przez specyficzny operator przypisania. Można implementować operacje bitowe tylko na liczbach całkowitych.
Operacja przesunięcia logicznego wykorzystuje tylko 5 najmłodszych bitów operandu, dalsze bity są odrzucane. W wyrażeniu może być tylko jedna
operacja przypisania.
Tab. 9 Operatory przypisania.
Operator Nazwa operatora
= Przypisanie
+= dodanie z przypisaniem
-= odejmowanie z przypisaniem
*= mnożenie z przypisaniem
/= dzielenie z przypisaniem
%= modulo z przypisaniem
>>= bitowe przesunięcie w prawo z przypisaniem
<<= bitowe przesunięcie w lewo z przypisaniem
&= bitowy iloczyn logiczny z przypisaniem
|= bitowa suma logiczna z przypisaniem
^= bitowa alternatywa wykluczająca z przypisaniem
Przykład:
A = B; // przypisz wartość B do A
A += B; // dodaj B do A, wynik zapisz w A
A -= B; // odejmij B od A, wynik zapisz w A
A *= B; // przemnóż A przez B, wynik zapisz w A
A /= B; // podziel A przez B, wynik zapisz w A
A %= B; // oblicz resztę z dzielenia A przez B, wynik zapisz w A
A >>= B; // przesuń w prawo A o B bitów, wynik zapisz w A
A <<= B; // przesuń w lewo A o B bitów, wynik zapisz w A
A &= B; // oblicz bitowy iloczyn logiczny A i B, wynik zapisz w A
A |= B; // oblicz bitową sumę logiczną A i B, wynik zapisz w A
A ^= B; // oblicz bitową alternatywę wykluczającą A i B, wynik zapisz w A

e. Oper acje r elacji

Operatory relacji porównuje dwie wartości operandów i zwracają wynik FALSE albo TRUE. Logiczna wartość wyrażenia FALSE jest reprezentowane
wartością liczby całkowitej zero, logiczna wartość wyrażenia TRUE jest reprezentowana jakąkolwiek wartością inną niż zero. Operatory relacji porównują
dwa argumenty, rezultatem może być tylko 0 (FALSE) albo 1 (TRUE).
Tab. 10 Operatory relacji.
Operator Nazwa operatora
== Równy
!= różny
< mniejszy
> większy
<= mniejszy, bądź równy
>= większy, bądź równy
Przykład:
A == A; // TRUE

11
A != A; // FALSE
A < A; // FALSE
A > A; // FALSE
A <= A; // TRUE
A >= A; // TRUE
UWAGA: Nieznormalizowane liczby zmiennoprzecinkowe odpowiadające cenom instrumentów nie powinny być porównywane przez operatory „==” i
„!=”, bo może dojść do przekłamania ze względu na fakt, iż wynik niektórych funkcji matematycznych takich jak dzielenie czy pierwiastkowanie nierzadko
wychodzi poza liczbę miejsc po przecinku określonym literałem Digits. Funkcja normalizująca NormalizeDouble(), dzięki której możemy ten problem
rozwiązać jest opisana w rozdziane 16.

f. Oper acje Booleanowskie

Operatory logiczne generalnie wywodzą się z algebry Boolea i są matematyczną realizacją abstrakcyjnych pojęć prawdy i fałszu. Algebra Boolea
jest najprostszym systemem logicznym ponieważ definiuje tylko dwie wartości, nie dopuszcza wartości nieokreślonej czy wartości pośrednich. Wartości
logiczne zaimplementowane są w następujący sposób, wartość FALSE jest reprezentowana przez liczbę 0 a wartość TRUE jest reprezentowana przez
liczbę różną od 0. MQL 4 implementuje tylko trzy operacje logiczne. Operator iloczynu logicznego zwraca wartość logiczną TRUE tylko wtedy gdy
obydwa argumenty mają wartość logiczną TRUE. Operator sumy logicznej zwraca wartość logiczną TRUE tylko wtedy gdy choć jeden argument ma
wartość logiczną TRUE. Operator negacji logicznej zwraca wartość logiczną TRUE tylko wtedy gdy argument ma wartość logiczną FALSE.
Tab. 11 Operatory Booleanowskie.
Operator Nazwa operatora
&& iloczyn logiczny (LUB)
|| suma logiczna (I)
! negacja logiczna (NIE)
Tab. 12 Tabela prawdy.
A B A && B A || B !A !B
TRUE TRUE TRUE TRUE FALSE FALSE
TRUE FALSE FALSE TRUE FALSE TRUE
FALSE TRUE FALSE TRUE TRUE FALSE
FALSE FALSE FALSE FALSE TRUE TRUE
Przykład:
if(a <= b && a >= b) // jeśli a mniejsze, równe b i a większe, równe b?
Print("a i b są równe"); // to drukuj
if(a < b || a > b) // jeśli a mniejsze b lub a większe b?
Print("a i b są różne"); // to drukuj

g. Oper acje bitowe

Bitowe operatory są podobne do operatorów logicznych, z tą różnicą, że operatory logiczne operują na słowach maszynowych a operatory bitowe tą
samą logikę stosują w mniejszej skali, w odniesieniu do (odpowiadających sobie) pojedynczych bitów binarnej reprezentacji słowa maszynowego.
Bitowy iloczyn logiczny jest dwuargumentowym operatorem liczb całkowitych. Porównuje odpowiadające sobie bity obydwu operandów. Wartość
bitu wynikowego jest ustalana na 1 wtedy i tylko wtedy, gdy odpowiadające mu bity obydwu operandów mają wartość 1.
Bitowa suma logiczna jest dwuargumentowym operatorem liczb całkowitych. Porównuje odpowiadające sobie bity obydwu operandów. Wartość bitu
wynikowego jest ustalana na 0 wtedy i tylko wtedy, gdy odpowiadające mu bity obydwu operandów mają wartość 0.
Bitowa suma modulo jest dwuargumentowym operatorem liczb całkowitych. Porównuje odpowiadające sobie bity obydwu operandów. Wartość bitu
wynikowego jest ustalana na 1 wtedy i tylko wtedy, gdy odpowiadające mu bity obydwu operandów mają różne wartości.
Bitowa negacja jest jednoargumentowym operatorem liczb całkowitych. Wartość bitu wynikowego jest ustalana na 1 wtedy i tylko wtedy, gdy
odpowiadające mu bity źródłowy operandu ma wartość 0.
Bitowe przesunięcie w prawo jest dwuargumentowym operatorem liczb całkowitych. Przesuwa bity pierwszego operandu o liczbę bitów zadaną
drugim operandem. Bity najstarsze są uzupełniane zerami a najmłodsze zostają zgubione. Operacja przesunięcia logicznego wykorzystuje tylko 5
najmłodszych bitów drugiego operandu.
Bitowe przesunięcie w lewo jest dwuargumentowym operatorem liczb całkowitych. Przesuwa bity pierwszego operandu o liczbę bitów zadaną
drugim operandem. Bity najmłodsze są uzupełniane zerami a najstarsze zostają zgubione. Operacja przesunięcia logicznego wykorzystuje tylko 5
najmłodszych bitów drugiego operandu.
Tab. 13 Operatory bitowe.
Operator Nazwa operatora
& bitowy iloczyn logiczny (I)
| bitowa suma logiczna (LUB)
^ bitowa suma modulo (ALBO)
~ bitowa negacja (NIE)
>> bitowe przesunięcie w prawo
<< bitowe przesunięcie w lewo
Przykład:
A = 0x00000000; B = 0x00000000; C = A & B; // C = 0x00000000
A = 0x00000000; B = 0x00000001; D = A & B; // D = 0x00000000
A = 0x0000000f; B = 0x00000000; E = A & B; // E = 0x00000000
A = 0x0000000f; B = 0x00000001; F = A & B; // F = 0x00000001
A = 0x00000000; B = 0x00000000; C = A | B; // C = 0x00000000
A = 0x00000000; B = 0x00000001; D = A | B; // D = 0x00000001
A = 0x0000000f; B = 0x00000000; E = A | B; // E = 0x0000000f
A = 0x0000000f; B = 0x00000001; F = A | B; // F = 0x0000000f
A = 0x00000000; B = 0x00000000; C = A ^ B; // C = 0x00000000
A = 0x00000000; B = 0x00000001; D = A ^ B; // D = 0x00000001
A = 0x0000000f; B = 0x00000000; E = A ^ B; // E = 0x0000000f
A = 0x0000000f; B = 0x00000001; F = A ^ B; // F = 0x0000000e
A = 0x00000000; B = ~A; // B = -1
A = 0x00000001; C = ~A; // C = -2
A = 0x0000000f; D = ~A; // D = -16
A = 0x00000000; B = 0x00000000; C = A >> B; // C = 0x00000000
A = 0x00000000; B = 0x00000001; D = A >> B; // D = 0x00000000
A = 0x0000000f; B = 0x00000000; E = A >> B; // E = 0x0000000f
A = 0x0000000f; B = 0x00000001; F = A >> B; // F = 0x00000007
A = 0x00000000; B = 0x00000000; C = A << B; // C = 0x00000000
A = 0x00000000; B = 0x00000001; D = A << B; // D = 0x00000000
A = 0x0000000f; B = 0x00000000; E = A << B; // E = 0x0000000f

12
A = 0x0000000f; B = 0x00000001; F = A << B; // F = 0x0000001e

h. Oper acje inne

Parę nawiasów okrągłych poprzedzonych identyfikatorem funkcji można uznawać za operator wywołania funkcji. Operator wywołania funkcji
zawiera wszystkie parametry które mogą być reprezentowane przez stałe, zmienne lub wyrażenia, z którymi funkcja ma być wywołana. Operatory
wywołania funkcji mogą być w sobie zagnieżdżone wtedy działania będą wykonywane od najbardziej zagnieżdżonej pary nawiasów.
W programach zwykle są potrzebne pogrupowane szeregi zmiennych tego samego typu. W tym celu stosowane są struktury nazywane tablicami.
Tablica bardzo przypomina tabele z tą różnicą, że tablica może mieć więcej niż dwa wymiary. Tablica to indeksowany ciąg danych tego samego typu.
Operator indeksowania tablicy służy do adresowania jednego elementu w ciągu elementów tego samego typu, które znajdują się w jednym logicznym
obszarze pamięci względem adresu indeksowanej danej, wyrażenie indeksu jest wartością całkowitą. Tablice są typem pochodnym to znaczy, że bazują
na typie fundamentalnym. Jeśli chcemy zdefiniować n elementową tablicę to najpierw określamy jej typ poczym określamy identyfikator zmiennej
tablicowej a następnie określamy jej rozmiar. Rozmiar definiowanej tablicy musi być wyrażeniem, którego wartością jest liczba naturalna znana na etapie
kompilacji. Tablica n elementowa indeksowana jest od 0 do n - 1 to znaczy, że m-ty element tablicy ma indeks m - 1. Inicjalizacja tablicy w momencie
definicji nazywa się inicjalizacją zbiorczą. Możliwa jest tylko inicjalizacja tablicy m pierwszych elementów tablicy n elementowej gdzie m <= n. Jeśli
istnieją elementy od x0 do xn-1 takie, że xm < x0 <= xn-1 to zostanie im nadana wartość 0. Jeśli w definicji tablicy n elementowej podane będzie m
elementów, przy czym m > n to ostatnie m - n elementów zostanie zignorowane. Inicjalizacja zbiorcza elementów tablicy możliwa jest tylko w trakcie
definicji tablicy. Lista elementów inicjalizujących umieszczona jest w nawiasach wąsatych a każde dla elementy są oddzielone od siebie przecinkami.
Jeśli w trakcie inicjalizacji zbiorczej w kwadratowych nawiasach nie zostanie podany rozmiar tablicy to rezerwowana jest pamięć tylko na elementy
podane w definicji. Jeśli w trakcie definicji tablicy nie dokona się inicjalizacji zbiorczej i nie zostanie podany rozmiar tablicy w nawiasach kwadratowych,
zostanie utworzona pusta referencja do tablicy zadanego typu. W większości przypadków wystarczą tablice jednowymiarowe, ale dla bardziej złożonych
struktur potrzebne są bardziej złożone tablice. MQL 4 pozwana na implementację wielowymiarowych tablic, to znaczy tablic, których elementami są inne
tablice. Akceptowane są tablice maksymalnie czterowymiarowe. Elementy wielowymiarowych tablic są kolejno umieszczane tak, że najpierw się zmienia
skrajny prawy indeks. Wielkość każdego wymiaru podajemy w oddzielnej parze nawiasów kwadratowych. Jeśli podczas pracy programu, zdarzy się
sytuacja próby dostępu do indeksu który wskazuje poza tablicę zostanie wygenerowany błąd ERR_ARRAY_INDEX_OUT_OF_RANGE (4002).
Struktura:
Wartość danej tablicowej wskazuje na pierwszy element. Na przykład n elementowa tablica typu int o wartośach 1, 1, 0, 2, 1, 9, 8, 3, ... jest w
pamięci zapisana tak:
[x]+000 [x]+001 [x]+002 [x]+003 [x]+004 [x]+005 [x]+006 [x]+007 ....... [x]+n-1
elem. 1 elem. 2 elem. 3 elem. 4 elem. 5 elem. 6 elem. 7 elem. 8 ....... elem. n
1 1 0 2 1 9 8 3 ....... .......
Ta tablica w pamięci operacyjnej komputera będzie zajmowała 4 * n bajtów bo pojedyncza zmienna typu int zajmuje 4 bajty a w tablicy mamy n
takich zmiennych.
Operator separacji argumentów oddziela każde dwie pary argumentów. Pary wyrażeń rozdzielonych przecinkiem są obliczona od lewej do prawej
strony.
Tab. 14 Inne operatory.
Operator Nazwa operatora
() operator wywołania funkcji
[] operator indeksowania tablicy
, operator separacji argumentów
Przykład:
x = 2 + 2 * 2; // wynik 6
y = (2 + 2) * 2: // wynik 8
z = a * (b / (c - d));
funkcja(a + 1, ((b + 3) == 2) * b, c - d);
Print(S);

int A[2];
double E[2][2], P[4];
string F[];
P[0] = E[0][0];
P[1] = E[1][0];
P[2] = E[0][1];
P[3] = E[1][1];

int x[] = {1, 3, 2, (0 + 6) ,5};


double E[2][2][2] = {0.24, 2.04, 2.24, 4.24, 2.42, 2.44};
string F[] = {"zero", "kropka", "dwa", "cztery"};
funkcja(x, y, z, A, E, F, S, P);

13
5. OPERATORY
⇒ Oper ator y
⇒ Oper ator wyr ażenia
⇒ Oper ator złożony
⇒ Oper ator war unkowy if
⇒ Oper ator br eak
⇒ Oper ator wybor u wielowariantowe go switch
⇒ Oper ator continue
⇒ Oper ator pętli w hile
⇒ Oper ator pętli for
⇒ Oper ator r etur n
1. Oper ator y

Operatory w językach formalnych opisują algorytmiczne operacje, które muszą być wykonane, żeby wykonać zadanie. Normalnie instrukcje, w
programie wykonywane są sekwencyjnie od pierwszej do ostatniej a każda instrukcja jest zakończona średnikiem. Operatory mogą być w sobie
zagnieżdżone. Zbiór instrukcji to kod, który mówi maszynie, by coś zrobiła. Ale takie wykonywanie sekwencji instrukcji od pierwszej do ostatniej,
większych fragmentów kodu jest bardzo mało użyteczne i dlatego w takich sytuacjach wykorzystuje się bloki operacji warunkowych czy
wielowariantowych lub bloki pętli. Maszyna decyduje, co zrobić w odpowiedzi na zmieniający się stan programu. W przypadku tych decyzji sterowanie
może być przekazane z jednej części programu do drugiej. Powód przekazania sterowania jest nazywany wyrażeniem kontrolnym. Pętle stosujemy, aby
wykonać wiele razy pewną sekcję tych samych operacje na różnych danych i/lub wartościach danych, przy czym liczba iteracji zależy od tego czy w
danym kroku iteracji wyrażenie kontrolne jest spełnione. Kiedy wyrażenie kontrolne pętli nie jest spełnione sterowanie jest przekazywane do instrukcji,
która znajduje się bezpośrednio po pętli. Operacje warunkowe czy wielowariantowe mogą wykonać jednorazowo skok do innego miejsca kodu zależnie
od wartości wyrażenia kontrolnego.

b. Oper ator wyr ażenia

...;

Wyrażeniem nazywamy łańcuch znaków, składający się z ciągu symboli, które są definiowane przez MQL 4. Jakiekolwiek wyrażenie, zgodne z
semantyką tego języka, po którym występuje średnik jest operatorem. Operator przypisania może być użyty tylko raz w wyrażeniu. Operator pusty składa
się tylko ze średnika. Używamy tego by oznaczyć zerowe ciało operatora.
Przykład:
i = 0;
x = -0.1;
y = -x;
z = true;
napis = "NaPIS :-D";
Print(AccountBalance());
;

3. Oper ator złożony

{...}

Operator złożony (blok) składa się, z co najmniej jednego operatora jakiegokolwiek typu zamkniętego w nawiasy klamrowe. Po nawiasie klamrowym
nie stawiamy średnika.
Przykład:
if(x + y == 0)
{
x = 1; // blok
y = -1; // instrukcji
}

d. Oper ator war unkowy if

if(wyrażenie) operator;
if(wyrażenie) operator else operator2;

Wyrażenie if sprowadza się do prostej decyzji opartej na sprawdzeniu warunku wykonania określonym przez wyrażenie, obliczając jego wartość
logiczną, wyrażenie musi się zawierać w nawiasach okrągłych, jeśli wartość logiczna wyrażenia w warunku wykonania przyjmuje wartość TRUE to
operator będzie wykonany. Jeśli wartość logiczna wyrażenia w warunku wykonania przyjmuje wartość FALSE to będzie wykonany operator2, jeśli jest
obecny. Konstrukcje warunkowe mogą być w sobie zagnieżdżone.
Przykład:
if(x < 9) x = 9;

if(x < 9)
x = 9;
else
Print(x);

14
Test FALSE Test FALSE
logiczn logiczn
y y

TRUE TRUE

Ciało if Ciało if Ciało else

Wyjście Wyjście

e. Oper ator br eak

break;

Operator break przerywa wykonanie najbliższej konstrukcji switch, pętli while czy for. Sterowanie jest zwracane do instrukcji bezpośrednio
znajdującej się po przerwanej konstrukcji czy pętli.
Przykład:
i = 0;
while(i < 8)
{
if(a1[i] < i) break; // jeśli element i tablicy a jest mniejszy niż 1 to natychmiast przerwij
Print(a[i]);
i++;
}

f. Oper ator wybor u wielowariantowe go switch

switch (wyrażenie) {case stała_1: operator_1; case stała_2: operator_2; ...;}


switch (wyrażenie) {case stała_1: operator_1; case stała_2: operator_2; ...; default: operator_n;}

Operator switch jest używany w większych drzewach decyzyjnych, sprawdza czy którakolwiek wartość stałej odpowiada wyrażeniu w nawiasach
okrągłych, wyrażenie może przyjmować tylko wartości całkowite. Stałe są jednocześnie etykietami operatorów i nie mogą zawierać zmiennych i/lub
wywołań funkcji gdyż ich wartości są obliczane na etapie kompilacji. Jeśli wartość wyrażenia jest zgodna z wartością etykiety to wykonywanie zacznie się
od tej etykiety. Jeśli etykiety nie kończy operator break to wykonane zostaną dalsze etykiety. Operator wykonuje instrukcje z etykiety default, jeśli jest
obecna i jeśli żadna ze stałych operatora nie odpowiada wyrażeniu. Etykieta default umieszczana jest na końcu. Jeśli żadna ze stałych nie odpowiada co
do wartości wyrażeniu i etykieta default nie jest dostępna, nie zostaną wykonane żadne instrukcje operatora. Żaden z dwóch elementów stałych w
operatorze switch nie może mieć takiej samej wartości.
Przykład:
switch(x)
{
case 1:
Print(":-D"); // dla wartości x == 1 wynikiem będzie : :-D
break;
case 2:
Print(":-)"); // dla wartości x == 2 wynikiem będzie : :-)
break;
case 3:
Print(":-|"); // dla wartości x == 3 wynikiem będzie : :-|
break;
case 4:
Print(":-("); // dla wartości x == 4 wynikiem będzie : :-(
} // dla innych wartości nic nie zostanie wydrukowane.

switch(x)
{
case 1:
Print(":-D"); // dla wartości x == 1 wynikiem będzie: :-D
break;
case 2:
Print(":-)"); // dla wartości x == 2 wynikiem będzie: :-)
break;
case 3:
Print(":-|"); // dla wartości x == 3 wynikiem będzie: :-|
break;
case 4:
Print(":-("); // dla wartości x == 4 wynikiem będzie: :-(
break;
default:
Print(":-0"); // dla inny wartości x wynikiem będzie: :-0
}

15
TRUE TRUE
Stała 1 Ciało case 1 Stała 1 Ciało case 1

Wyjście Wyjście
FALSE FALSE

TRUE TRUE
Stała 2 Ciało case 2 Stała 2 Ciało case 2

Wyjście Wyjście
FALSE FALSE

. . . .
. . . .
. . . .

TRUE TRUE
Stała n Ciało case n Stała n Ciało case n

Wyjście Wyjście
FALSE
FALSE

Ciało default
Wyjście

Wyjście

g. Oper ator continue

continue;

Operator continue przerywa wykonanie najbliższej pętli while czy for, jeśli spełniony jest warunek, wywołując następną iterację.
Przykład:
for(i = 0; i < 8; i++)
{
if(a[i] > i) continue; // jeśli element i tablicy a jest mniejszy niż 1 to pomiń dalsze instrukcje
Print(a[i]);
}

h. Oper ator pętli w hile

while(wyrażenie) instrukcja;

Pętla while najpierw sprawdza warunek wykonania pętli, obliczając jego wartość logiczną, jeśli wartość logiczna wyrażenia w warunku wykonania
pętli przyjmuje wartość TRUE instrukcja zostanie wykonana jeden raz poczym operator ponownie sprawdza warunek wykonania pętli, obliczając jego
wartość logiczną. Jeśli wartość wyrażenia logicznego w warunku wykonania pętli przyjmie wartość FALSE to sterowanie jest zwracane do instrukcji
bezpośrednio znajdującej się po pętli. Pętle mogą być w sobie zagnieżdżone. Ciało pętli może składać się tylko z jednego operatora, który może być
operatorem złożonym.
Przykład:
while(i < n) n -= i; // jak i < n to zmniejsz n o i

16
Test FALSE
logiczn Wyjście
y

TRUE

Instrukcje

i. Oper ator pętli for

for(wyrażenie1; wyrażenie2; wyrażenie3) instrukcja;

Pętla for składa się z słowa kluczowego for, zanim w nawiasach okrągłych następują trzy wyrażenia oddzielone od siebie średnikami. Te trzy
wyrażenia to odpowiednio: wyrażenie inicjujące, wyrażenie testowe i wyrażenie modyfikujące, które jest wykonywane przed wejściem do każdej iteracji
poza pierwszą. W ciele pętli znajduje się kod iterowany. Jest to najłatwiejsza pętla do opanowania ponieważ wszystkie jej elementy kontrolne zebrane są
w jednym miejscu. Pętla najpierw wykonuje instrukcje inicjalizujące prace pętli, jest to wyrażenie1, wykonywane tylko raz przed wejściem w pętle,
nadające wartości początkowe zmiennym, przy czym wyrażenie może deklarować nowe zmienne, następnie sprawdza warunek wykonania pętli
określony przez wyrażenie2, obliczając jego wartość logiczną, jeśli wartość logiczna wyrażenia w warunku wykonania pętli przyjmuje wartość TRUE
instrukcja zostanie wykonana jeden raz poczym wykonywane jest wyrażenie3 i ponownie jest sprawdzany warunek wykonania pętli, przez obliczenie
jego wartości logicznej. Jeśli wartość wyrażenia logicznego w warunku wykonania pętli przyjmie wartość FALSE to sterowanie jest zwracane do instrukcji
bezpośrednio znajdującej się po pętli. Pętle mogą być w sobie zagnieżdżone. Obecność któregokolwiek z trzech wyrażeń nie jest wymagana, ale nie
powinniśmy pomijać średników. Pominięcie wyrażenia warunku wykonania pętli jest równoznaczne z przypisaniem do warunku wykonania pętli stałej
TRUE. Można używać więcej, niż jednego wyrażenia inicjującego pętlę for. W tedy oddzielamy je przecinkami. Oddzielając przecinkami, możesz też
używać więcej, niż jednego wyrażenia modyfikującego w pętli for. Ciało pętli może składać się tylko z jednego operatora, który może być operatorem
złożonym.
Przykład:
for(int i = 0; i < 9; i++) Print(i); // i == 0, jeśli i < 9 to inkrementuj i, drukuj i

int i = 0; // i == 0
for(;;)
{
Print(i); i++; // inkrementuj i
if(i == 9) break; // jeśli i = 9
}

for(int i = 0, j = 0; i < 9; i++, j--) Print(i, "\n", j, "\n\n");

Wyrażenie1

Test FALSE
logiczn Wyjście
y

TRUE

Instrukcje

Wyrażenie3

j. Oper ator r etur n

return;
return(wyrażenie);

Operator return przerywa wykonywanie funkcji i zwraca sterowanie do instrukcji bezpośrednio znajdującej się po instrukcji wywołania funkcji. Słowo
kluczowe return może zawierać opcjonalnie wyrażenie którego wartość będzie zwrócona do miejsca wywołania, po przerwaniu funkcji, jako wartość
funkcji. Operator bez wyrażenia wziętego w nawiasy tylko przerywa wykonanie funkcji. Wyrażenie musi być w nawiasach okrągłych i nie powinno

17
zawierać operatora przypisania. Można jawnie zaznaczyć, że funkcja nie zwraca wartości deklarując jej typ jako void. Wartość typu void to w zasadzie
wartość braku wartości. Nie wszystkie funkcje kończą swoje działanie przez jawne wywołanie instrukcji return, w szczególności, gdy funkcja zwraca
wartość void. Brak operatora return nie będzie sygnalizowany. Ale jeśli nie użyjemy operatora return w funkcjach int, double, datetime, color to funkcja
zwróci bezsensowną wartość. Możemy zastosować więcej niż jedną instrukcję powrotu, ponieważ każde wywołanie instrukcji powrotu przerywa działanie
funkcji. W przypadku nie zgodności wyrażenia return() z typem funkcji nastąpi próba nie jawnej konwersji.
Przykład:
void f1(int t[], int prm) // definicja funkcji f1
{
for(prm--; prm >= 0, i--) t[prm]--; // pętla dekrementuje pierwsze prm elementów
}

void f2(int t[], int prm) // definicja funkcji f2


{
if(prm < 0) return; // jeśli prm < 0 return
t[prm]--;
}

int f3(int prm) // definicja funkcji f3


{
if(prm < 0)
return(-prm) // jeśli prm < 0 to zmień znak
else
return(prm); // jeśli prm >= 0 to nie zmieniaj znaku
}

int f4(int prm) // definicja funkcji f4


{
if(prm < 0) return(3.3); // jeśli prm < 0 return 3
}

18
6. FUNKCJE
⇒ Funkcje
⇒ Definicja i deklar acja
⇒ Ar gumenty
⇒ Par ametr y for malne
⇒ Par ametr y aktualne
⇒ Wywołanie funkcji
1. Funkcje

Funkcje są podprogramami, których celem jest wykonanie obliczeń i zwrócenie wyniku do punktu wywołania i za wyjątkiem funkcji typu void nie
powinny mieć żadnego innego wpływu na działanie programu. Funkcja jest zdefiniowana przez cztery składowe. Pierwszym elementem jest typ wartości,
jaką zwraca funkcja, drugim identyfikator funkcji, który jest nazwą, która po kompilacji będzie zamieniona na konkretny adres w pamięci, pod jakim
będzie przechowywany odpowiedni podprogram po pomyślnej kompilacji kodu źródłowego, trzecim lista parametrów formalnych, która jest umieszczana
w nawiasach okrągłych a czwartym operator złożony (blok), który opisuje czynności wykonywane przez funkcję. Funkcją jest każdy podprogram,
niezależnie od tego czy zwraca jakieś wartości i czy ma wpływ na program. Funkcja nie ma specjalnego oznaczenia (słowa kluczowego) podprogramu.
Typ funkcji informuje kompilator, jak ma w przypadku napotkania tej funkcji postępować. Operator return zwraca wartość wyrażenia wziętego w nawiasy.
Funkcja, która nie zwraca jawnie wartości, zwraca wartość typu void. Funkcja może być zadeklarowana czy zdefiniowana w jakiejkolwiek globalnej części
programu ale nie może być zdeklarowana a tym bardziej zdefiniowana w innej funkcji.
Aby lepiej zrozumieć, czym jest segment kodu programu, pomyśl o tym jak o obrazie, wyobraź sobie, że obraz pamięć jest serią różnych maszynek
różnych wielkościach i funkcjach. Maszynka w pamięci zajmuje tyle bajtów ile jest potrzebne na jej ciało. Żeby użyć odpowiedniej maszynki, maszynki
muszą być nazwane, ten proces nazywany jest deklaracją albo definicją funkcji w przypadku, gdy od razu definiujemy jej ciało. W procesie deklaracji i
definicji używamy odpowiedniego słowa, ażeby powiedzieć kompilatorowi, jakiego rodzaju i rozmiaru jest zwracana przez funkcję wartość, słowo te jest
oczywiście słowem zastrzeżonym.
Pomocna jest zasada, według, której nazwa funkcji jest znacząca, to znaczy, że informuje o roli tej funkcji. Te zasady ułatwiają nam życie, więc
warto je stosować.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 /* typ zwracanej wartości */ f1(/* parametry formalne */)


{
// zmienne lokalne
int result;
// ciało funkcji f1
// ...
return(result); // zwrócenie wyniku
}

bool /* typ zwracanej wartości */ f2(/* parametry formalne */)


{
bool result;
// ciało funkcji f2
// ...
return(result); // zwrócenie wyniku
}

color /* typ zwracanej wartości */ f3(/* parametry formalne */)


{
color result;
// ciało funkcji f3
// ...
return(result); // zwrócenie wyniku
}

datetime /* typ zwracanej wartości */ f4(/* parametry formalne */)


{
datetime result;
// ciało funkcji f4
// ...
return(result); // zwrócenie wyniku
}

double /* typ zwracanej wartości */ f5(/* parametry formalne */)


{
double result;
// ciało funkcji f5
// ...
return(result); // zwrócenie wyniku
}

string /* typ zwracanej wartości */ f6(/* parametry formalne */)


{
string result;
// ciało funkcji f6
// ...
return(result); // zwrócenie wyniku
}

void f7(/* parametry formalne */)


{
// ciało funkcji f7
// ...
}

19
//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
int i = f1(/* parametry aktualne */);
bool b = f2(/* parametry aktualne */);
color c = f3(/* parametry aktualne */);
datetime t = f4(/* parametry aktualne */);
double d = f5(/* parametry aktualne */);
string s = f6(/* parametry aktualne */);
//----
f7(/* parametry aktualne */);
//...
//----
return(0);
}
//+------------------------------------------------------------------+

2. Definicja i deklar acja

Każdy język programowania ma zestaw nazw do reprezentacji typów danych. Deklarując funkcję określamy między innymi jej typ, tym samym
informując kompilator, jak ma w przypadku napotkania tej funkcji postępować, a następnie określamy jej nazwę. Każda definicja funkcji jest także jej
deklaracją. Dzieje się tak dla tego, że deklaracja identyfikatora funkcji informuje kompilator o typie, jaki ta funkcja reprezentuje a definicja dodatkowo
rezerwuje obszar pamięci odpowiadającej ciału tej funkcji. Może się zdarzyć, że funkcja już istnieje a my chcemy ją tylko importować z innego modułu. W
tedy tylko deklarujemy funkcją razem z typem i listą parametrów, bo już inny moduł zarezerwował dla niej miejsce w pamięci.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 library

int mul(int val) // definicja funkcji


{
// ciało funkcji
return(val + val);
}

//+------------------------------------------------------------------+
//| My function |
//+------------------------------------------------------------------+
// int MyCalculator(int value,int value2)
// {
// return(value+value2);
// }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| przykład.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

extern int i = 2; // definicja zmiennej


#import "przykład.ex4"
int mul(int val); // deklaracja funkcji
#import

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
Alert("przed ", i);
i = mul(i);
Alert("po ", i);
//----
return(0);
}
//+------------------------------------------------------------------+

c. Ar gumenty

W MQL 4 argumenty są obliczane a następnie przekazywane do funkcji przez wartość chyba, że w definicji funkcji użyjemy modyfikatora & po typie
argumentu. Kolejność obliczania wyrażeń i przekazywania wartości jest gwarantowana. Kompilator sprawdza liczbę i typ argumentów przekazanych do
funkcji. Funkcja może zwracać wartość przez argument operatora return. Funkcja zwraca typ wartości zgodny z typem podanym w definicji. Przekazane
argumenty do funkcji to parametry aktualne. Parametry formalne to parametry, które deklarujemy w definicji.
Argumenty domyślne deklarują wartości domyślne parametrów formalnych w przypadku nie jawnego wystąpienia parametrów aktualnych i muszą
się znajdować na końcu listy argumentów. Nie można ich pomijać stawiając dwa separatory argumentów obok siebie. Tylko n ostatnich argumentów
domyślnych może być pominięte gdzie n jest niewiększe od liczby takich argumentów.
20
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 x, y = 1, z = 1;

int f(int& p1, int & p2) // definicja funkcji f1


{
p1 += p2;
p2 += p1;
return(p1 + p2);
}

int add(int a, int b = 0) // definicja funkcji add


{
return(a + b);
}

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
x = f(y, z); // funkcja zwróci elementy ciągu Fibonacciego
Alert(y, " ", z, " ", x);
y = add(x, z); // funkcja zwróci następny element ciągu
z = add(x, y); // i jeszcze następny
x = add(y, z); // i jeszcze jeden
Alert(y, " ", z, " ", x);
y = add(y); // przypisanie y wartości y, bo b == 0
z = add(z); // przypisanie z wartości z, bo b == 0
x = add(x); // przypisanie x wartości x, bo b == 0
Alert(y, " ", z, " ", x);
//----
return(0);
}
//+------------------------------------------------------------------+

d. Par ametr y for malne

Parametry przekazywane do funkcji są traktowane, jako zainicjalizowane zmienne lokalne, domyślnie są kopiami parametrów aktualnych, zakres ich
ważności ogranicza się do ciała funkcji. Identyfikatory parametrów formalnych tak jak identyfikatory zmiennych lokalnych przykrywają identyfikatory
zmiennych globalnych i dla uniknięcia sytuacji niemożności odczytania wartości zmiennej globalnej, parametry funkcji muszą mieć nazwy różniące się od
nazw zmiennych globalnych. W ciele funkcji parametry formalne są traktowane, jako zmienne lokalne i ich wartości mogą zostać zmieniane.
Parametry formalne mogą zostać zainicjowane przez stałą. W tym przypadku, wartość inicjalizująca jest wartością domyślą. Wszystkie parametry
po parametrze z wartością domyślną, muszą posiadać wartość domyślną. Przy wywoływaniu funkcji parametry domyślne mogą zostać pominięte, wtedy
podczas wywoływania funkcji przekazane zostaną domyślne wartości pominiętych parametrów. Funkcje biblioteczne importowane z innego modułu nie
mogą mieć parametrów domyślnych.
Domyślnie parametry są przekazywane przez wartość, modyfikacja wartości przekazywanych parametrów do funkcji, nie będzie miała wpływu na
odpowiadające im zmienne. Jest możliwe przekazywanie, jako parametr tablicy. Jednakże, dla tablicy przekazywanej, jako parametr jest niemożliwe
zmienienie wartości jej elementów.
Jest także możliwe przekazywanie parametrów przez referencje. W tym przypadku, modyfikacja przekazywanych parametrów do funkcji, będzie
miała wpływ na odpowiadające im zmienne przekazywane przez referencje. Parametry mogą być przekazywane przez referencje w obrębie modułu,
czyli ten sposób przekazywania parametrów nie jest dostępny dla funkcji bibliotecznych. Aby poinformować kompilator o tym, że parametr będzie
przekazywany przez referencje, trzeba umieścić modyfikator & po typie danych.
Tablice mogą być przekazywane przez referencje, w takim przypadku tablice mogą być modyfikowane. W przeciwieństwie do prostych parametrów,
tablice mogą być przekazywane przez referencje do funkcji bibliotecznych.
Parametry przekazywane przez referencje nie mogą posiadać wartości domyślnej. Funkcja nie może mieć więcej niż 64 parametry.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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/"

void f1(double& x[], int i, int y = 0, double z = 0.0 /* parametry formalne */)
{
for(i--; i >= 0; i--)
{
z *= y + i;
x[y] += z;
}
}

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
//...
//----
return(0);
}

21
//+------------------------------------------------------------------+

e. Par ametr y aktualne

Parametry aktualne to rzeczywiste wartości zmiennych, stałych lub wyrażeń, które zastępują parametry formalne, w trakcie wykonywania programu.
Parametry formalne opisują jedynie postać informacji przekazywanej do funkcji. Podczas wywołania funkcji wszystkie parametry aktualne są
przekazywane do funkcji w miejsce odpowiadających im parametrów formalnych. Parametry formalne służą do opisania czynności, które na tych
parametrach ma wykonać funkcja. Prawdziwe obliczenia są wykonywane w odniesieniu do parametrów aktualnych. Powiązanie parametrów aktualnych i
formalnych następuje po kolei, pierwszemu parametrowi formalnemu odpowiada pierwszy w kolejności parametr aktualny, itd. Dlatego parametry
aktualne powinny mieć te same typy, co parametry formalne a liczba parametrów aktualnych i formalnych powinna być równa.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 tab[6] = {1.0, 3.0, 7.0, 13.0, 17.0, 23.0};

void f(double& x[], int i, int y = 0, double z = 1.0)


{
for(i--; i >= 0; i--)
{
z *= 1.5 * (y + (y == 0));
x[i] *= z;
}
}

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
f(tab, 6 /* parametry aktualne */);
for(int i = 0; i < 6; i++) Alert(tab[i]);
//----
return(0);
}
//+------------------------------------------------------------------+

f. Wywołanie funkcji

Nazwa, która nie została, co najmniej zadeklarowana, przed pojawieniem się w wyrażeniu a po której jest lewy nawias okrągły, będzie uważana za
nazwę funkcji.
Argumenty (parametry formalne) są domyślnie przekazywane przez wartość. Każde wyrażenie x1, x2, ..., xn jest najpierw obliczone a wartość jest
przekazana do funkcji. Kolejność obliczania wyrażeń i porządek przekazywania wartości są zawsze takie same i zgodne z priorytetami (tab. 7).
Kompilator sprawdza liczbę i typ argumentów przekazywanych do funkcji. Wywołanie funkcji jest wyrażeniem, które zwraca wartość zgodną z typem
funkcji. Typ funkcji odpowiada typowi zwracanej wartości. Funkcja może zostać zdefiniowana lub zadeklarowana w każdym miejscu kodu w zakresie
globalnym, tzn. na zewnątrz innej funkcji. Funkcja nie może zostać zdefiniowana lub zadeklarowana wewnątrz innej funkcji.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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

extern int a = -1, b = 1;

int f(int a, int b)


{
return(a * b + b);
}

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
Alert("f(a, a) = ", f(a, a));
Alert("f(b, b) = ", f(b, b));
Alert("f(a, b) = ", f(a, b));
Alert("f(b, a) = ", f(b, a));
//----
return(0);
}
//+------------------------------------------------------------------+

22
7. ZMIENNE
⇒ Zmienne
⇒ Definicja i deklar acja
⇒ Zasięg widoczności zmiennych
⇒ Zmienne o zasięgu lokalnym
⇒ Zmienne o zasięgu globalnym
⇒ Dyr ektywa exter n
⇒ Dyr ektywa static
⇒ Inicjalizowanie zmiennych
1. Zmienne

Zmienne w programie są to twory o ustalonej, jednoznacznej nazwie, które odnoszą się do konkretnego obszaru w pamięci, w której dane mogą być
przechowywane. Na przykład, jeśli w pamięci jest zarezerwowany obszar dla 32 bitowej liczby z zakresu od -2147483648 do 2147483647 to w
większości języków programowania taki obszar będzie nazwany jako obszar typu całkowito liczbowego ang. Integer. Każda zmienna składa się z
całkowitej liczby bajtów. Zmiennej mogą być nadawane wszystkie wartości określone przez jej typ. Typy zmiennych fundamentalnych mają rozmiar w
bajtach będący całkowitą potęgą liczby 2. Zmienne typu int ma rozmiar 22 typu double 23 a typu string jest rekordem o rozmiarze, 23 który wskazuje na
fizycznie ciągły obszar pamięci o rozmiarze maksymalnym do 256 bajtów, z czego do 255 bajtów przeznaczone jest na przechowywanie informacji
znaczącej a jeden bajt jest zarezerwowany na tak zwany terminator ciągu. Zmienne niezdefiniowane nie mogą być wykorzystywane podczas działania
programu. Definicje zaczynamy od podania typu potem następuje ciąg maksymalnie 31 znaków. Przed pierwszym użyciem zmiennej w kodzie
źródłowym należy ją, co najmniej zadeklarować.
Identyfikator zmiennej jest to nazwa, która po kompilacji będzie powiązana z konkretnym obszarem w pamięci, na który będzie wskazywać adres tej
zmiennej. Wielkość, jaką w pamięci zajmuje zmienna zależy od jej typu. I tak na przykład zmienne typu int a także typów pochodnych od int takich jak
datetime i color będą wymagały 4 bajtów pamięci, zmienne typu double będą wymagały 8 bajtów pamięci a zmienne typu string będą wymagały
maksymalnie 264 bajtów pamięci. Żeby użyć zmiennej w programie trzeba najpierw ją stworzyć, proces ten nazywa się definicją. W procesie definicji
używa się słowa, informującego kompilator, jakiego typu i rozmiaru jest zmienna. Słowo to jest jednym z słów kluczowych (Tab. 1 - Typy danych).
Identyfikatory zmiennych powinny być tak dobrane, żeby oddawały typ informacji, jaką ta zmienna będzie przechowywać. Dane są umieszczane w
zmiennej przez operację przypisania (Tab. 9).
Stosowanie typów danych datetime i color na sens szczególnie w przypadkach deklaracji parametrów wejściowych programu opatrzonych
dyrektywą extern, dla dogodniejszego przez użytkownika odwzorowania w oknie właściwości.
Aby lepiej zrozumieć, czym jest segment danych programu, pomyśl o tym jak o obrazie, wyobraź sobie, że obraz pamięć jest serią różnych
szufladek o różnych wielkościach. Zmienna jest szufladką, która służy do temporalnego przechowywania wartości obliczeń i nie ma żadnego innego
wpływu na działanie programu ja to ma miejsce w przypadku kodów samo modyfikujących się. Zmienna jest zdefiniowana przez dwie składowe.
Pierwszym elementem jest typ wartości, jaki zmienna może przechowywać, drugim identyfikator zmiennej, który jest nazwą, która po kompilacji będzie
zamieniona na konkretny adres w pamięci, pod jakim będzie przechowywana wartość zmiennej po pomyślnej kompilacji kodu źródłowego. Zmienna nie
ma specjalnego oznaczenia (słowa kluczowego). Typ zmiennej informuje kompilator, jak ma w przypadku napotkania tej zmiennej postępować. Zmienna
może być zadeklarowana czy zdefiniowana w jakiejkolwiek globalnej części programu, wtedy mówimy o zmiennej globalnej, jak i może być zdefiniowana
wewnątrz ciała funkcji, wtedy mówimy o zmiennej lokalnej. Szufladka w pamięci zajmuje tyle bajtów ile jest potrzebne na dany typ zmiennej. Żeby użyć
odpowiedniej szufladki, szufladki muszą być nazwane, ten proces nazywany jest deklaracją albo definicją zmiennej w przypadku, gdy od razu
rezerwujemy dla niej pamięć. W procesie deklaracji i definicji używany odpowiedniego słowa, ażeby powiedzieć kompilatorowi, jakiego rodzaju i rozmiaru
jest szufladka, którą chcemy użyć, słowo te jest oczywiście słowem zastrzeżonym. Pomocna jest zasada, według, której nazwa zmiennej jest znacząca,
to znaczy, że informuje o roli tej zmienne w programie, na przykład przyjęło się, że zmienna, po której będziemy iterować nazywać się będzie „i”. Te
zasady ułatwiają nam życie, więc warto je stosować.
Dane są umieszczane w danej zmiennej poprzez przypisanie wartości w miejsce, na które wskazuje wskaźnik do danej zmiennej. Kiedy ustaliliśmy
wartość tworzonej zmiennej w wyrażeniu deklarującym tą zmienną to taki proces jest zwany inicjalizacją.
Kiedy definiujemy zmienną, mówimy kompilatorowi, że chcemy, zarezerwować pewien konkretny obszar pamięci liczony w bajtach na zmienną. To
ile bajtów kompilator zarezerwuje na zmienną zależy od typu zmiennej. Pod adresem zmiennej w pamięci możemy przechowywać dane programu tylko
zgodne z typem zmiennej, do której ten obszar pamięci jest przypisany.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 gi;
bool gb;
color gc
datetime gt;
double gd
string gs;

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
int i;
bool b;
color c;
datetime t;
double d;
string s;
//----
//...
//----
return(0);
}
//+------------------------------------------------------------------+

23
b. Definicja i deklar acja

Każdy język programowania ma zestaw nazw do reprezentacji typów danych w pamięci operacyjnej. Deklarując zmienną określamy jej typ, tym
samym informując kompilator, jak ma w przypadku napotkania tej zmiennej postępować, a następnie określamy jej nazwę. Każda definicja zmiennej jest
także jej deklaracją. Dzieje się tak dla tego, że deklaracja identyfikatora zmiennej informuje kompilator o typie, jaki ta zmienna reprezentuje a definicja
dodatkowo rezerwuje obszar pamięci odpowiadający tej zmiennej. Może się zdarzyć, że zmienna już istnieje a my chcemy ją tylko importować z innego
modułu. W tedy tylko deklarujemy zmienną razem z typem, bo już inny moduł zarezerwował dla niej miejsce w pamięci.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 library

int ei; // definicja zmiennej

void f(/* parametry formalne */) // definicja funkcji


{
// ciało funkcji
// ...
}

//+------------------------------------------------------------------+
//| My function |
//+------------------------------------------------------------------+
// int MyCalculator(int value,int value2)
// {
// return(value+value2);
// }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| przykład.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/"

extern int i; // definicja zmiennej


#import "przykład.ex4"
int ei; // deklaracja zmiennej
#import

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
Alert("przed ", i);
i++;
Alert("po ", i);
Alert("przed ", ei);
ei++;
Alert("po ", ei);
//----
return(0);
}
//+------------------------------------------------------------------+

c. Zasięg widoczności zmiennych

Istnieją dwa zakresy widzialności zmiennych, lokalny i globalny. Zmienna może być używana wyłącznie w zasięgu swojej widzialności. To oznacza,
że jeden identyfikator zmiennej lokalnej może odnosić się do różnych instancji zmiennych lokalnych różnego typu, nawet jeśli są to zmienne statyczne
pod warunkiem zachowania unikalności nazw w zakresie widzialności.
Zmienne lokalne o tej samej nazwie, co zmienne globalne przesłaniają te zmienne w zakresie ich widzialności, inaczej mówiąc, jeżeli mamy dwa
jednobrzmiące identyfikatory jeden o zakresie lokalnym a drugi o zakresie globalnym to pierwszeństwo ma zmienna lokalna w zakresie jej widzialności.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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

extern double d = 0.5;


extern int i = 1, j = 1;

double f(double d, int i, int j)


{
for(j += i; i < j; i++) d *= (j - i);
return(d);
}

24
//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
for(j += i; i < j; i++)
{
d *= f(d, i, i);
Alert(d);
}
//----
return(0);
}
//+------------------------------------------------------------------+

d. Zmienne o zasięgu lokalnym

Zmienne lokalne są definiowane w bloku funkcji albo pętli, w której będą używane i nie są widoczne poza blokiem funkcji, w której są zdefiniowane.
Zmienne lokalne są przechowywane na stosie i nie są automatycznie inicjalizowane. Niezainicjalizowane zmienne lokalne mają przypadkową wartość.
Każde wywołanie funkcji, odnowa inicjalizuje zmienne zdefiniowane jako zmienne zainicjalizowane.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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

extern int a = 3, i = 5;

int fib(int n)
{
if((n == 1) || (n == 2))
return(1);
else
return(fib(n - 1) + fib(n - 2));
}

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
int b = a + i, c;
//---
for(i = a; i < b; i++)
{
c = fib(i);
Alert(c);
}
//----
return(0);
}
//+------------------------------------------------------------------+

e. Zmienne o zasięgu globalnym

Zmienne globalne są definiowane poza blokiem funkcji, oznacza to, że są zdefiniowane na tym samym poziomie co funkcje. Zmienne te istnieją
przez cały czas trwania programu i są dostępne w całym programie dla wszystkich funkcji. Zmienne globalne są przechowywane w obszarze danych
programu i są inicjalizowane zerami chyba, że jawnie zostaną zdefiniowane z inną wartością początkową. Zmienne takie mogą być inicjalizowane tylko
raz podczas inicjalizacji programu.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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

extern int lg = 0;

string pl = "Wersja ", en = "Version ", it = "Versione ";


double vr = 0.1;
string lt = " alpha";

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
switch(lg)

25
{
case 0:
Alert(pl, vr, lt);
break;
case 1:
Alert(en, vr, lt);
break;
case 2:
Alert(it, vr, lt);
break;
default:
Alert("Wrong value!");
}
//----
return(0);
}
//+------------------------------------------------------------------+
UWAGA: Zmienne zadeklarowane poza funkcją nie mogą być traktowane jak zmienne globalne terminala klienckiego, które są dostępne dla
wszystkich aktywnych programów tylko przez funkcje zmiennych globalnych GlobalVariable...

f. Dyr ektywa static

Klasa pamięci static definiuje zmienne statyczne. Specyfikator static jest deklarowany przed typem danych. Jeśli deklaracje zmiennej lokalnej
poprzedzimy tym specyfikatorem to zmienna ta istnieje i zachowuje swoją ostatnią wartość pomiędzy wywołaniami funkcji, która te zmienne zdefiniowała
przez cały czas działania programu. Gdy kończy się wykonywanie funkcji, zmienne tego typu nie giną, ale kończy się ich zakres ważności, to znaczy, że
są znane tylko lokalnie przez funkcję, która je zdefiniowała. Kiedy ponownie wywołana zostaje ta funkcja, zmienne dostępne są z ostatnio przypisaną
wartością. Każda zmienna w bloku funkcji, poza zmienną, która jest parametrem formalnym, może zostać zdefiniowana jako zmienna statyczna, która
może być zainicjalizowana tylko przez stałą odpowiedniego typu, w przeciwieństwie do zmiennej lokalnej, która może być zainicjalizowana zarówno
przez stałą jak i przez wyrażenie. Zmienne statyczne są traktowane jako zmienne globalne o ograniczonym zasięgu widoczności, z tego powodu nie są
przechowywane na stosie, lecz w obszarze danych. Wynika stąd fakt, iż zmienne takie są inicjalizowane tak jak zmienne globalne, czyli są domyślnie
inicjalizowane wartością zerową, chyba że jawnie będą zainicjalizowane inną wartością. Zmienne tego typu są inicjalizowane tylko raz przy ładowaniu
programu przed wykonaniem funkcji start. Ogólnie dyrektywa static informuje kompilator, o tym, że zmienna w danym bloku programu posiada dokładnie
jedną instancję.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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/"

void f()
{
static int x; // deklaracja lokalnej zmiennej statycznej
x++;
Alert("Licznik odwołań do funkcji f: ", x);
}

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
for(int i = 0; i < 5; i++) f();
//----
return(0);
}
//+------------------------------------------------------------------+

g. Dyr ektywa exter n

Słowo kluczowe extern definiuje specjalny rodzaj zmiennych globalnych, których wartość będzie dostępna w oknie właściwości programu.
Specyfikator extern jest deklarowany przed typem danych. Zmienne extern służą do określenia danych wejściowych programu. Tablice nie mogą być
reprezentowane jako zmienne extern.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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

extern int a = 3, i = 5;

int fib(int n)
{
if((n == 1) || (n == 2))
return(1);
else
return(fib(n - 1) + fib(n - 2));
}

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+

26
int start()
{
int b = a + i;
//---
for(i = a; i < b; i++) Alert(fib(i));
//----
return(0);
}
//+------------------------------------------------------------------+

h. Inicjalizowanie zmiennych

Proces zwany inicjalizacją zmiennej polega na przypisaniu wartości zmiennej. Inicjalizacja odbywa się w tym samym wyrażeniu w którym zmienna
jest tworzona.
Zmienna może przyjmować dowolną wartość zmiennej, stałej lub wyrażenia zgodną z jej typem. Jeśli wartość nie będzie zgodna z jej typem nastąpi
dyskretna konwersja typów. Lista elementów tablicy musi być zamknięta w nawiasach. Jeśli wielkość tablicy nie jest zdefiniowana, to kompilator
wygeneruje najmniejszą tablicę mieszczącą wszystkie predefiniowane elementy. Wielowymiarowe tablice są inicjalizowane tak jak jednowymiarowe bez
dodatkowych nawiasów. Wszystkie tablice lokalne, zawierające deklaracje elementów, mogą zostać zainicjalizowane tylko stałymi.
Zmienne globalne i statyczne inicjalizowane są wartością 0, jeśli nie zainicjalizujemy jej jawnie inną wartością. Zmienne lokalne domyślnie nie są
inicjalizowane, jeśli zainicjalizujemy zmienną lokalną to każde wywołanie funkcji będzie inicjalizowało tą zmienną lokalną, dlatego, że zmienne lokalne są
przechowywane na stosie, więc jeśli po raz kolejny wywołamy daną funkcję to nie ma żadnej gwarancji, że zmienne te będą mieć ostatnio nadaną
wartość. Niezainicjalizowane zmienne lokalne mają przypadkową wartość.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 i, j = 2; // i = 0, j = 2
int a[] = {0, 2} // a[0] = 1, a[1] = 1
double d = 0.2; // d = 0.2
string s1 // s1 = ""
string s2 = {'0', '.', '2', '\0'} // s2 = "0.2"
string s3 = "0.2" // s3 = "0.2"
string s4 = s3; // s4 = "0.2"

int f1()
{
int result;
// ciało funkcji f1
// ...
return(result);
}

bool f2()
{
bool result;
// ciało funkcji f2
// ...
return(result);
}

color f3()
{
color result;
// ciało funkcji f3
// ...
return(result);
}

datetime f4()
{
datetime result;
// ciało funkcji f4
// ...
return(result);
}

double f5()
{
double result;
// ciało funkcji f5
// ...
return(result);
}

string f6()
{
string result;
// ciało funkcji f6
// ...
return(result);
}

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
s1 = s4; // s1 = "0.2"
i = j + 2; // i = 4
27
//----
//...
//----
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i = f1();
bool b = f2();
color c = f3();
datetime t = f4();
double d = f5();
string s = f6();
//----
//...
//----
return(0);
}
//+------------------------------------------------------------------+

28
8. PREPROCESOR
⇒ Pr epr ocesor
⇒ Dyr ektywa define
⇒ Dyr ektywa pr oper ty
⇒ Dyr ektywa include
⇒ Dyr ektywa impor t
1. Pr epr ocesor

#dyrektywa

Preprocesor jest specjalnym podsystemem kompilatora języka, który ma na celu przygotowanie kodu źródłowego programu bezpośrednio przed
kompilacją programu. Preprocesor pozwala poprawić czytelność kodu źródłowego. Kod może być budowany przez dołączanie określonych plików
zawierających kody źródłowe programów. Możliwość przypisania nazw symbolicznych do określonych stałych wpływa na poprawę czytelności kodu.
Preprocesor również pozwala ustalać parametry programów.
Preprocesor przetwarza tekst programu zanim kompilator zacznie pracę. O tym, co ma zrobić dla nas preprocesor, decydujemy za pomocą
dyrektyw preprocesora. Dyrektywy preprocesora zaczynają się znakiem #, który może być poprzedzony jedynie separatorami i kończą się znakiem
końca linii. Po mimo, że MQL 4 jest językiem o wolnym formacie to dyrektywy preprocesora muszą być pisane w jednej linii. Nie jest to spowodowane
jakimiś wyjątkami czy niekonsekwencją, po prostu dyrektywy preprocesora nie wchodzą w skład definicji języka.

b. Dyr ektywa pr oper ty

#property właściwość wartość

Dyrektywa property ma szereg predefiniowanych literałów pozwalających na kontrolę dodatkowych specyficznych parametrów, zwanych
właściwościami, zmieniających domyślne parametry programu. Ta dyrektywa ma na celu pomóc terminalowi klienckiemu w dopasowaniu właściwości
programu bez konieczności ustawiania ręcznego parametrów przez użytkownika. Kompilator zapisuje zadeklarowane wartości parametrów zmienione tą
dyrektywą w ustawieniach pliku wykonywalnego EX4, trzeba też pamiętać o tym, że kompilator MetaEditor przy rekompilacji nie zmienia tych parametrów
nawet jeśli dyrektywa odpowiedzialna za nią zostanie usunięta, do czasu jawnego przedefiniowania wartości dyrektywy. Właściwości typu void są
bezparametrowe. Każdy program pozwala na określenie dodatkowych parametrów określonych w poniższej tabeli. Ta dyrektywa pomaga w ustaleniu
niektórych parametrów programu przez terminal kliencki bez konieczności jawnego ustalania tych parametrów. Większość ustawień dotyczy przede
wszystkim zewnętrznych ustawień wskaźników. Należy pamiętać, że dyrektywa property kończy się znakiem nowej linii (powrotu karetki) a nie
średnikiem jak to ma miejsce wyrażeniach MQL 4.
Tab. 15 Lista stałych dyrektywy property
Właściwość Typ Opis
link string Link do witryny internetowej.
copyrigch string Właściciel praw autorskich.
stacksize Int Wielkość stosu.
Bibliotela, funkcja start nie jest wyznaczona, referencje nieużywanych funkcji
library void
nie są usuwane.
indicator_chart_window void Pokazuje wskaźnik w oknie wykresu.
indicator_separate_window void Pokazuje wskaźnik w oddzielnym oknie.
indicator_buffers Int Liczba buforów dla obliczeń, maksymalnie 8 buforów.
indicator_minimum Int Dolna granica dla wykresu.
indicator_maximum Int Górna granica dla wykresu.
indicator_colorX color Kolor wyświetlania linii X*.
indicator_widthX Int Szerokość wyświetlania linii X*.
indicator_styleX Int Styl wyświetlania linii X*.
indicator_levelX double Predefiniowany poziom X* dla oddzielnego okna wskaźnika.
indicator_levelcolor color Kolor linii poziomu na wykresie wskaźnika.
indicator_levelwidth Int Szerokość linii poziomu na wykresie wskaźnika.
indicator_levelstyle Int Styl linii poziomu na wykresie wskaźnika.
show_confirm void Monitowanie przed uruchomieniem skryptu.
show_inputs void Wyświetla okno z monitem potwierdzenie przed uruchomieniem skryptu.
* liczba całkowita od 1 do 8.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1
#property indicator_buffers 4
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Gold
#property indicator_color4 Peru
#property indicator_level1 0.2
#property indicator_level2 0.3
#property indicator_level3 0.4
#property indicator_level4 0.6
#property indicator_level5 0.7
#property indicator_level6 0.8

//+------------------------------------------------------------------+

29
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//...
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

c. Dyr ektywa define

#define symbol wartość

Dyrektywa define służy do definiowania w programie nazwy symbolicznej lub stałej symbolicznej. Wszystkie wystąpienia zdefiniowanego symbolu,
które wystąpią po jego definicji w wyrażeniach zawierających identyfikator tego symbolu, zgodnych z syntaktyką i semantyką języka będą zastąpione
odpowiadającą dosłowną wartością tego symbolu w procesie parsowania kodu źródłowego o ile parser nie zostanie zatrzymany przez błąd syntaktyczny
bądź semantyczny. Identyfikator nazwy symbolicznej i stałej symbolicznej podlega takim samym zasadom parsowania jak identyfikator zmiennej.
Wartość symbolu może być jakiegokolwiek typu. Kompilator nie zgłosi błędu, gdy jakaś stała przekroczy zakres wartości danego typu. Wartości
identyfikatora nie da się redefiniować, w przeciwieństwie do zmiennej, preprocesor cytuje dosłownie wartość literału nazwy symbolicznej lub stałej
symbolicznej. Należy pamiętać, że dyrektywa define kończy się znakiem nowej linii a nie średnikiem jak to ma miejsce wyrażeniach MQL 4.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
// stałe symboliczne

#define MAXI 2147483647


#define MINI -2147483648
#define PI
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211
70679

// nazwy symboliczne

#define WEB "http://www.forex-tower.xt.pl/"


#define COPY "Copyright © 2007, Konrad Kudzin"
#define NAME "Konrad Kudzin"
#define ID "identyfikator"
#define MAIL "kjk1983@wp.pl"
#define PROG "przykład.mq4"
//+------------------------------------------------------------------+

d. Dyr ektywa include

#include <nazwa_pliku>
#include "nazwa_pliku"

Dyrektywa include wkleja zawartość pliku nagłówkowego zadanego parametrem w miejsce zastosowania dyrektywy. Pliki nagłówkowe MetaQuotes
Header mają rozszerzenie mqh. Są to pliki zawierające dyrektywy preprocesora, deklaracje funkcji i zmiennych, które mogą być włączone przez
preprocesor do programu. Dyrektywa include może być użyta w dowolnej linii programu, ale ze względów praktycznych najczęściej umieszczana jest na
początku kodu źródłowego. Preprocesor zastępuje miejsce wystąpienia dyrektywy zawartością pliku podanego w argumencie dyrektywy. Jeśli kompilator
nie znajdzie pliku o nazwie, którą podaliśmy w dyrektywie to zgłosi błąd kompilacji. Dyrektywa include używa nawiasów trójkątnych dla określenia plików
z katalogu domyślnego, zazwyczaj .\experts\include\, w tym przypadku bieżący katalog nie jest przeszukiwany. Znaku podwójny cudzysłów używa się dla
określenia ograniczenia nazw plików z katalogu bieżącego, w tym przypadku domyślny katalog nie jest przeszukiwany. Jeśli pliki nie zostaną znalezione
w katalogu bieżącym to przeszukiwane są katalogi zdefiniowane w konfiguracji kompilatora. Należy pamiętać, że dyrektywa include kończy się znakiem
nowej linii (powrotu karetki) a nie średnikiem jak to ma miejsce wyrażeniach MQL 4.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#include <sampledll.mqh>
#include "mysample.mqh"

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//...
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{

30
//...
}
//+------------------------------------------------------------------+

e. Dyr ektywa impor t

#import "plik1"
/*
lista funkcji z pliku plik1
*/
#import "plik2"
/*
lista funkcji z pliku plik2
*/
/*
...
*/
#import "plikN"
/*
lista funkcji z pliku plikN
*/
#import

Dyrektywa import pozwala w łatwy sposób wykorzystać inne pliki w konstruowanym programie poprzez deklaracje zmiennych i funkcji z
zewnętrznych źródeł takich jak biblioteki DLL czy skompilowane moduły EX4. Jest podobna do dyrektywy include jednak ma konstrukcję klamrową.
Najważniejszą różnicą jest to, że dyrektywa include dołącza kody źródłowe a przez dyrektywę import importowane są tylko funkcje, które uprzednio
zostały skompilowane i adresy zmiennych. Konstrukcja dyrektywy import określa nazwę pliku, z którego funkcje i zmienne mają być importowane,
zaczyna się wyrażeniem #import "plik" potem następują deklaracje importowanych funkcji i zmiennych. Deklaracja funkcji zewnętrznych, tworzy wskaźnik
typu int, który zawiera adres funkcji odwzorowany na przestrzeń adresową procesu. Każda deklaracja zaczyna się od znaków nowej linii (powrót karetki),
deklaracja może być poprzedzona dowolną liczbą znaków spacji, tabulatorów i znaków nowej linii, następnie może wystąpić dowolna liczba wyrażeń
import z określoną nazwą pliku nawet już wcześniej użytego w dowolnej konstrukcji import, blok opisujący konstrukcję klamrową kończy się wyrażeniem
#import bez żadnych parametrów. W opisie zewnętrznych funkcji i zmiennych musi być użyte słowo kluczowe import z referencją do odpowiedniego
modułu.
Definicja a praktyka się często bardzo różnią, bo klamra zamykająca jest niejednokrotnie pomijana, można to sprawdzić nawet na niektórych
przykładach dostarczonych z środowiskiem MetaEditor. W opisie importowanej funkcji czy zmiennej musi być użyta dyrektywa import powiązana z
odpowiednim plikiem dostępnym podczas działania programu. Dyrektywa ta może być użyta do opisu zmiennych i funkcji zawartych w skompilowanych
modułach EX4 (pliki *.ex4) i bibliotek DLL (pliki *.dll). Typ importowanej funkcji i zmiennej zdefiniowanej w bibliotece lub skompilowanym module powinien
być jawnie zadeklarowany. Nieobecność tej deklaracji będzie skutkować błędem podczas kompilacji programu. Niekompletna deklaracja lub niezgodna z
szczegółową definicją typów i kolejności parametrów podczas wywołania funkcji może spowodować błąd programu.
Do zewnętrznych funkcji DLL zmienne mogą być przekazywane przez wskaźnik. Dane typu string są przekazywane jako wskaźnik do
odpowiadającej danej strukturze bloku pamięci, wewnętrzna reprezentacja struktury danej typu string jest rekordem zawierającym dwie części: długość
bloku pamięci wyrażona przez daną typu int i wskaźnik do bloku pamięci wyrażony przez wskaźnik typu int. Dane typu int i double są przekazywane jako
parametr w jednowymiarowej tablicy odpowiedniego typu przez referencje.
Biblioteki DLL są pisane dla systemu operacyjnego Microsoft Windows w innych językach programowania takich jak C++, Pascal czy Visual basic.
Są to zbiory często używanych zasobów, z których może korzystać wiele aplikacji jednocześnie. Możliwość używania bibliotek DLL daje temu językowi
bardzo wiele możliwości, umożliwiając tworzenie bardzo rozbudowanych aplikacji.
Wskaźnik do zmiennej może być przekazywany do importowanej funkcji bibliotecznej. Stringi są przekazywane przez wskaźnik do odpowiedniego
bloku pamięci. Parametry typu int i double są przekazywane w jednowymiarowej tablicy przekazywanej przez referencje.
Importowane funkcje i zmienne muszą mieć unikalne nazwy. Implikacją powyższego stwierdzenia jest fakt, że funkcje i zmienne mające te same
nazwy nie mogą być importowane równocześnie z różnych plików. Nazwy importowanych funkcji muszą się różnić od nazw funkcji wbudowanych.
Deklaracje, zgodne z definicją, wszystkich funkcji, które mają być użyte w programie są wymagane, ażeby kompilator był w stanie zapisać
prawidłowe wywołanie importowanej funkcji w pliku wykonywalnym. Kompilator nie może sprawdzić czy parametry przekazane do importowanej funkcji w
skompilowanym pliku są zgodne z definicją. Funkcje importowane nie mogą mieć parametrów domyślnych.
Programy pisane w MQL 4 dla wywołania importowanych funkcji podczas wykonywania, używają techniki późnego wiązania. To oznacza, że
podczas wykonywania programu dopóki żadna importowana funkcja czy zmienna z danego modułu lub biblioteki nie zostanie wykożystana, odpowiedni
moduł EX4 lub biblioteka DLL nie będzie załadowana. Niezalecane jest używanie pełnych kwalifikowanych nazw modułów EX4 lub bibliotek DLL. Moduły
MQL 4 są zlokalizowane w katalogu .\experts\libraries. Jeśli moduł nie znajduje się w tym katalogu to jest szukany w katalogu .\experts.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#import "user32.dll"
//---- messages
int SendMessageA(int hWnd, int Msg, int wParam, int lParam);
int SendNotifyMessageA(int hWnd, int Msg, int wParam, int lParam);
int PostMessageA(int hWnd, int Msg, int wParam, int lParam);
void keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);
void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
//---- windows
int FindWindowA(string lpClassName, string lpWindowName);
int SetWindowTextA(int hWnd, string lpString);
int GetWindowTextA(int hWnd, string lpString, int nMaxCount);
int GetWindowTextLengthA(int hWnd);
int GetWindow(int hWnd, int uCmd);

int UpdateWindow(int hWnd);


int EnableWindow(int hWnd, int bEnable);
int DestroyWindow(int hWnd);
int ShowWindow(int hWnd, int nCmdShow);
int SetActiveWindow(int hWnd);
int AnimateWindow(int hWnd, int dwTime, int dwFlags);
int FlashWindow(int hWnd, int dwFlags /*bInvert*/);
int CloseWindow(int hWnd);
int MoveWindow(int hWnd, int X, int Y, int nWidth, int nHeight, int bRepaint);
int SetWindowPos(int hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
int IsWindowVisible(int hWnd);
int IsIconic(int hWnd);

31
int IsZoomed(int hWnd);
int SetFocus(int hWnd);
int GetFocus();
int GetActiveWindow();
int IsWindowEnabled(int hWnd);
//---- miscelaneouse
int MessageBoxA(int hWnd, string lpText, string lpCaption, int uType);
int MessageBoxExA(int hWnd, string lpText, string lpCaption, int uType, int wLanguageId);
int MessageBeep(int uType);
int GetSystemMetrics(int nIndex);
int ExitWindowsEx(int uFlags, int dwReserved);
int SwapMouseButton(int fSwap);
#import "ExpertSample.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double arr[], int, int);
bool SetArrayItemValue(double& arr[],int, int, double);
double GetRatesItemValue(double rates[][6],int, int, int);
int SortStringArray(string& arr[], int);
int ProcessStringArray(string& arr[], int);
#import "stdlib.ex4"
string ErrorDescription(int error_code);
int RGB(int red_value, int green_value, int blue_value);
bool CompareDoubles(double number1, double number2);
string DoubleToStrMorePrecision(double number, int precision);
string IntegerToHexString(int integer_number);
#import

int init()
{
//...
}

int start()
{
//...
}
//+------------------------------------------------------------------+
UWAGA: Przekazywanie argumentów przez referencję do funkcji importowanej skutkuje utworzeniem kopii argumentu i przekazanie wskaźnika do
kopii. Zmiana wartości kopii zmiennej przekazanej przez referencję nie ma żadnego wpływu na oryginalną wartość zmiennej w programie.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 library

void inci(int& i)
{
i++;
}

void addd(double& d)
{
d += d;
}

//+------------------------------------------------------------------+
//| My function |
//+------------------------------------------------------------------+
// int MyCalculator(int value,int value2)
// {
// return(value+value2);
// }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| przykład.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

#import "przykład.ex4"
void inci(int& i);
void addd(double& d);
#import

extern int i = 1;
extern double d = 2.0;

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
Alert(i, " ", d);

32
inci(i);
addd(d);
Alert(i, " ", d);
i++;
d += d;
Alert(i, " ", d);
//----
return(0);
}
//+------------------------------------------------------------------+
UWAGA: Powyższy przykład nie jest równoważny poniższemu przykładowi, chociaż algorytmicznie wykonują te same działania. Przyczyna
odmiennego zachowania tkwi, w tym że przykład powyżej pracuje na wskaźniku do kopii zmiennej a przykład poniżej pracuje na wskaźniku do zmiennej.
Wynikiem działania pierwszego programu będzie wyświetlenie okna z trzema parami liczb:
2 4.00000000
1 2.00000000
1 2.00000000
Przykład:
//+------------------------------------------------------------------+
//| przykład.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/"

extern int i = 1;
extern double d = 2.0;

void inci(int& i)
{
i++;
}

void addd(double& d)
{
d += d;
}

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
Alert(i, " ", d);
inci(i);
addd(d);
Alert(i, " ", d);
i++;
d += d;
Alert(i, " ", d);
//----
return(0);
}
//+------------------------------------------------------------------+
UWAGA: Chociaż rozpatrywane algorytmy wykonują te same działania to z powodu tego, że przykład powyżej pracuje na wskaźniku do zmiennej a
nie na wskaźniku do kopii zmiennej, wynik działania powyższego programu będzie trochę się różnił od wyniku poprzedniego programu. W wyniku
wykonania tego programu zostanie wyświetlone okno z trzema parami liczb:
3 8.00000000
2 4.00000000
1 2.00000000
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 library

void addt(int& t[], int i)


{
t[i] += i;
}

void mult(int& t[], int i)


{
t[i] *= i;
}

//+------------------------------------------------------------------+
//| My function |
//+------------------------------------------------------------------+
// int MyCalculator(int value,int value2)
// {
// return(value+value2);
// }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |

33
//| http://www.forex-tower.xt.pl/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#import "przykład.ex4"
void addt(int& t[], int i);
void mult(int& t[], int i);
#import

int t[4];

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
int i;
for(i = 0; i < 4; i++)
{
addt(t, i);
Alert(i, " ", t[i]);
}
for(i = 0; i < 4; i++)
{
mult(t, i);
Alert(i, " ", t[i]);
}
//----
return(0);
}
//+------------------------------------------------------------------+
UWAGA: Tablica zmiennych jest reprezentowana jako wskaźnik typu int do fizycznej struktury. Kopia wartości wskaźnika będzie wskazywała na to
samo miejsce co oryginalny wskaźnik więc wszystkie zmiany elementów tablicy będą miały wpływ na wartości elementów, tej że tablicy po wyjściu z ciała
funkcji. W wyniku wykonania tego programu zostanie wyświetlone okno z ośmioma parami liczb:
39
24
11
00
33
22
11
00

34
9. WYKRES
⇒ Wykr es
⇒ Słupkowy
⇒ Świecowy
⇒ Liniowy
1. Wykr es

W MetaTrader 4, wykres główny, który jest w oknie o indeksie 0, może składać się z słupków, świec albo z punktów połączonych liniami w
zależności od upodobań użytkownika. W dalszej części kursu będę się posługiwał określeniem świeca, gdyż wykresy w tej konwencji wydają mi się
najbardziej przejrzyste a dodatkowo niosą, co najmniej taką samą ilość informacji, co wykresy słupkowe. Każdy z wymienionych powyżej sposobów
reprezentowania danych, bazuje na wybranym przez użytkownika interwale czasowym. Platforma MetaTrader 4 przy budowaniu wykresu cen, może
używać wartości: najniższych, najwyższych, otwarcia i zamknięcia w zadanym przedziale czasowym w skali arytmetycznej. Brak skali logarytmicznej w
platformie MetaTrader 4 da się w pewnym stopniu skompensować przez możliwość napisania odpowiedniego wskaźnika któryby przedstawiał relacje
logarytmiczne pomiędzy cenami. Indeksowanie świec zaczyna się od 0, gdzie świeca o indeksie 0 oznacza bieżącą świecę, poprzednia świeca ma
indeks 1, a pierwsza świeca ma indeks wyrażony wyrażeniem: całkowita liczba świec wykresu, pomniejszona o 1. Cena zamknięcia jest podawana
nawet przy otwarciu świecy, dla świecy o indeksie 0, jest ostatnio znaną wartością instrumentu. Tak więc przetwarzając bieżącą świecę, należy odwołać
się do odpowiedniej tablicy, używając indeksu 0, a odwołując się do poprzedniej świecy należy zastosować indeks o wartości 1.

b. Słupkowy

MetaTrader 4 do rysowania słupków używa czterech wartości Cena: najniższa, najwyższa, otwarcia i zamknięcia w zadanym przedziale czasowym.
Rozpiętość cen w zadanym przedziale czasowym odzwierciedla wysokość słupka, cena otwarcia jest odwzorowywana poziomą kreską po lewej stronie
słupka a cena zamknięcia jest odwzorowywana poziomą kreską po prawej stronie słupka. W niektórych implementacjach programów tego typu
rozpiętość cen w zadanym przedziale czasowym jest przedstawiana jako wysokość słupka a cena zamknięcia jest prezentowana jako pozioma kreska
przecinająca pionowy słupek, bez uwzględnienia ceny otwarcia, gdyż przez wielu analityków technicznych, cena otwarcia jest uważana za nieistotną.
Przykład:
cena najwyższa │
││ cena zamknięcia
cena otwarcia ─┤
│ cena najniższa

cena najwyższa │
cena otwarcia ─┤
││ cena zamknięcia
│ cena najniższa

c. Świecowy

Do rysowania świec używa się czterech wartości, tak samo jak w przypadku rysowania słupków, używane są ceny: najniższa, najwyższa, otwarcia i
zamknięcia w zadanym przedziale czasowym i tak jak w przypadku słupków rozpiętość cen w zadanym przedziale czasowym odzwierciedla wysokość
całej świecy, ceny otwarcia i zamknięcia są odwzorowywane przez prostokąt. Całkowita rozpiętość świecy jest sumą długości knota górnego i dolnego
oraz korpusu. Knotem jest nazwana ta część świecy, która leży, poza przedziałem ceny otwarcia i zamknięcia. Obszar cen leżący w przedziale ceny
otwarcia i zamknięcia jest nazywany korpusem świecy i może mieć dwa kolory, przeważnie biały (kolor tła) i czarny, które mówią, jaka jest relacja ceny
otwarcia do ceny zamknięcia. W niektórych implementacjach programów tego typu dostępny jest rozszerzony wykres świecowy zwany wykresem
equivolume, gdzie szerokość świecy zależy od wolumenu obrotu.
Przykład:
cena najwyższa │
│││ cena zamknięcia
cena otwarcia │││
│ cena najniższa

cena najwyższa │
cena otwarcia ▐█▌
▐█▌ cena zamknięcia
│ cena najniższa

d. Liniowy

Do rysowania wykresów liniowych używa się tylko jednej wartości, ceny zamknięcia. Pojedyncza cena zamknięcia określa punkt wykresu. Wykres
tworzy się poprzez połączenie kolejnych punktów liniami. Taki wykres pomimo tego, że niesie bardzo mało informacji jest często używany, dlatego, że
niesie najważniejszą cenę, bo jeśli analitycy techniczni się spierają, które ceny są najmniej istotne, czy otwarcia, czy jak się uważa w Japonii ceny
ekstremalne, to ludzi, którzy uważają, że aktualna cena nie jest najważniejszą ceną jest na prawne nie wielu. Niektórzy poszli jeszcze dalej w
ograniczaniu informacji, jakie niesie wykres i tak powstał wykres punktowo-symboliczny, który pomija czas jako czynnik mniej istotny od ceny.
Przykład:
· cena zamknięcia

35
10. FUNKCJE SPECJALNE
⇒ Funkcje specjalne
⇒ Funkcja init()
⇒ Funkcja star t()
⇒ Funkcja deinit()
1. Funkcje specjalne

MQL 4 predefiniuje trzy funkcje specjalne, są to funkcje o identyfikatorach init(), start() oraz deinit(). Chcąc pisać użyteczne i ergonomiczne
wskaźniki oraz automatyczne systemy transakcyjne musimy dobrze opanować przynajmniej posługiwanie się funkcjami init i start.

b. Funkcja init()

init(...)

Funkcja init zwraca wartość typu prostego i może być zdefiniowana z listą parametrów. Jednakże, kiedy ta funkcja jest wywoływana przez terminal
kliencki żadne parametry nie są przekazywane do funkcji poza parametrami domyślnymi. Funkcja init może zostać ponownie wywołana z dowolnego
miejsca programu tak jak inne funkcje.
Natychmiast po uruchomieniu programu przez dodanie go do wykresu, program rozpoczyna pracę od predefiniowanej funkcji init o ile jej ciało jest
zdefiniowane. Podczas wywołania funkcji init program jest inicjalizowany i jeśli w kodzie programu nie będzie tej funkcji to inicjalizacja nie będzie
wykonana. Strategia jak i wskaźniki są inicjalizowane po uruchomieniu, włączeniem terminala, natychmiast po zmianie okresu wykresu, zmianie
parametrów jak też za każdym przelogowaniem użytkownika. Nie jest zalecane wywołanie funkcji start lub wykonywanie operacji handlowych z funkcji
init. Funkcja init musi skończyć działanie jak najszybciej.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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/"

//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
IndicatorDigits(5);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- nazwa
IndicatorShortName("Osc");
SetIndexLabel(0, "Osc");
//---- wskaźnik zainicjalizowany
return(0);
}
//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

c. Funkcja star t()

start(...)

Funkcja start zwraca wartość typu prostego i może być zdefiniowana z listą parametrów. Jednakże, kiedy ta funkcja jest wywoływana przez terminal
kliencki żadne parametry nie są przekazywane do funkcji poza parametrami domyślnymi. Funkcja start może zostać wywołana z dowolnego miejsca
programu tak jak inne funkcje.
Przy napływaniu nowych notowań, są wywoływane funkcje start wszystkich aktywnych strategii i wskaźników. Jeśli funkcja start uruchomiona dla
poprzednich notowań działa, wtedy nowe notowania będą pominięte przez program. Wszystkie nowe notowania są pomijane przez program dopóki
wykonywanie funkcji start się nie zakończy. Następnie ta funkcja będzie wykonana, kiedy napłyną z serwera kolejne nowe notowania. Dla wskaźnika
funkcja start będzie wykonana dla przeliczeń po zmianie przedziału czasowego nie zależnie od napływających notowań. Funkcja ta dla strategii nie
będzie wykonywana, kiedy okno właściwości strategii będzie otwarte, implikacją tego faktu jest to, że podczas działania strategii okno właściwości nie
może być otwarte. Jeśli ta predefiniowana funkcja jest dostępna to jest główną funkcją programu. Jeśli w programie brakuje tej funkcji to taki program nie
może być uruchomiony. Funkcja start w przypadku wskaźników wywoływana jest raz dla każdego okresu danych historycznych i co każdą zmianę ceny
i/lub wolumenu, w przypadku strategii wywoływana jest raz dla każdej zmiany ceny i/lub wolumenu a w przypadku skryptu wywoływana jest tylko raz
natychmiast po wystąpieniu żądania wykonania skryptu.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| http://www.forex-tower.xt.pl/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
36
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| funkcja start programu skryptu |
//+------------------------------------------------------------------+
int start()
{
int cbars = IndicatorCounted();
//----
for(int i = Bars - cbars - 1; i >= 0; i--)
{
ExtBuffer[i] = (Close[i] - Open[i]) / ((High[i] - Low[i]) + (High[i] == Low[i]));
}
//----
return(0);
}
//+------------------------------------------------------------------+

d. Funkcja deinit()

deinit(...)

Funkcja deinit zwraca wartość typu prostego i może być zdefiniowana z listą parametrów. Jednakże, kiedy ta funkcja jest wywoływana przez
terminal kliencki żadne parametry nie są przekazywane do funkcji poza parametrami domyślnymi. Funkcja deinit może zostać wywołana z dowolnego
miejsca programu tak jak inne funkcje.
Każdy program dołączony do wykresu kończy pracę przez wywołanie predefiniowanej funkcji deinit o ile jej ciało jest zdefiniowane. Funkcja ta jest
wywoływana automatycznie przed zamknięciem skryptu, programu skojarzonego z wykresem, samego wykresu, wyłączeniem terminala, przed zmianą
okresu wykresu i zmianą parametrów lub konta. Program może monitorować, próby zamknięcia dzięki wbudowanej funkcji IsStopped, co umożliwia
poprawne skończenie jego pracy. Funkcja UninitializeReason() zwraca powód wykonania funkcji deinit. Jeśli funkcja start będzie wykonywana w chwili
zatrzymywania programu, to funkcja deinit musi skończyć działanie jak najszybciej bo maksymalny czas pozostający dla pracy programu jest
ograniczony do 2,5 sekundy. Po tym czasie, jeśli funkcja deinit nie zostanie wykonana to program będzie zakończony przez natychmiastowe usunięcie
go z pamięci operacyjnej. Wyjątkiem od tej reguły są skrypty, które normalnie kończą swoje zadanie niezależnie od zewnętrznych poleceń, ale jeżeli
skrypt działa bardzo długo na przykład z powodu jakiejś pętli, może być zakończony poleceniem zewnętrznym, z menu kontekstowego wykresu.
Również w tym przypadku funkcja deinit jest ograniczona do 2,5 sekundy. Kiedy terminal kończy pracę to wywoływane są funkcje deinit wszystkich
aktywnych programów. Jeśli w kodzie programu nie będzie zdefiniowanej tej funkcji to deinicjalizacja nie będzie wykonana.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//...
price = Ask;
return(0);
}

int deinit()
{
Print("Zmiana o: ", price - Ask);
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

37
11. ZMIENNE PREDE FINIOWANE
⇒ Zmienne pr edefiniowane
⇒ Ask
⇒ Bar s
⇒ Bid
⇒ Close[]
⇒ Digits
⇒ High[]
⇒ Low[]
⇒ Open[]
⇒ Point
⇒ Time[]
⇒ Volume[]
1. Zmienne pr edefiniowane

W MQL 4 jest jedenaście predefiniowanych zmiennych. Te zmienne są zbiorem najważniejszych, dla tego języka, zmiennych, które są ustawiane
osobno dla każdego uruchomionego programu i są dostępne dla skryptów, wskaźników i strategii. Moduły biblioteczne używają zmiennych właściwych
dla modułu który je wywołał. Dla bezpieczeństwa i szybkości dostępu do danych terminal kliencki pracuje na lokalnych kopiach predefiniowanych
zmiennych. Te dane są aktualizowane przy każdym wywołaniu funkcji głównej skryptu, wskaźnika i strategii, automatycznie i przy wywołaniu funkcji
RefreshRates(). Ich wartości odzwierciedlają dane na bieżącym instrumencie.

b. Ask

double Ask

Literał Ask określa ostatnio znaną cenę dla kupującego, po której aktualny instrument jest oferowany. Kurs Ask jest zawsze wyższy od kursu Bid.
Pamiętać należy o zasadzie, że długa pozycja, czyli zakup instrumentu takiego jak pary walutowe, indeksu czy surowca dokonywane jest po cenie Ask,
czyli po cenie wyższej. Więc gdy myślimy o zajęciu długiej pozycji, to posługujemy się kursem Ask. Zatem podczas sprzedarzy, chcąc ustawić zlecenie
obronne typu stop loss powinniśmy w kursie, przy którym pozycja ma być zamknięta, kierować się kursem Ask. Podobnie będzie to odbywało się w
przypadku zlecenia take profit, kurs jego aktywacji powinien być ustawiony według kurst Ast/k. Zasada taka obowiązuje w przypadku zleceń
natychmiastowych oraz oczekujących. Kiedy obliczenia są czasochłonne istnieje groźba, że dane wejściowe są już nie aktualne, w takim przypadku
należy użyć funkcji RefreshRates().
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//...
price = Ask;
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja kończąca działanie wskaźnika |
//+------------------------------------------------------------------+
int deinit()
{
Print("Zmiana o: ", price - Ask);
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

c. Bar s

int Bars

Literał Bars określa liczbę świec na aktualnym wykresie, wartość Bars jest równoważna wartości zwracanej przez funkcje iBars(NULL, 0).
Przykład:
//+------------------------------------------------------------------+

38
//| przykład.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 wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//...
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
if(Bars <= CCIPeriod)
{
//...
}
//...
}
//+------------------------------------------------------------------+

d. Bid

double Bid

Literał Bid określa ostatnio znaną cenę oferowaną przez kupującego dla sprzedającego na aktualnym instrumencie. Kurs Bid jest zawsze niższy od
kursu Ask. Pamiętać należy o zasadzie, że krótka pozycja, czyli sprzedaż instrumentu takiego jak pary walutowe, indeksu czy surowca dokonywane jest
po cenie Bid, czyli po cenie niższej. Więc gdy myślimy o zajęciu krótkiej pozycji, to posługujemy się kursem Bid. Podobnie będzie to odbywało się w
przypadku zlecenia take profit, kurs jego aktywacji powinien być ustawiony według kurst Bid. Zasada taka obowiązuje w przypadku zleceń
natychmiastowych oraz oczekujących. Kiedy obliczenia są czasochłonne istnieje groźba, że dane wejściowe są już nie aktualne, w takim przypadku
należy użyć funkcji RefreshRates().
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//...
price = Bid;
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja kończąca działanie wskaźnika |
//+------------------------------------------------------------------+
int deinit()
{
Print("Zmiana o: ", price - Bid);
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

e. Close[]

double Close[]

Literał Close jest wskaźnikiem do tablicy wartości zamknięcia świec dla aktualnego instrumentu, wartość Close[0] jest równoważna wartości
zwracanej przez funkcje iClose(NULL, 0, 0).
Elementy tablicy są indeksowane w odwrotnej kolejności. Bieżąca świeca , która jest na końcu tablicy ma indeks 0. Najstarsza świeca, która jest
pierwsza na wykresie, ma indeks zapisywany jako Bars - 1.
Przykład:

39
//+------------------------------------------------------------------+
//| przykład.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);
}
//+------------------------------------------------------------------+

f. Digits

int Digits

Literał Digits określa liczbę cyfr decymenalnych po kropce dla aktualnego instrumentu.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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ł High jest wskaźnikiem do tablicy najwyższych wartości świec dla aktualnego instrumentu, wartość High[0] jest równoważna wartości
zwracanej przez funkcje iHigh(NULL, 0, 0).
Elementy tablicy są indeksowane w odwrotnej kolejności. Bieżąca świeca, która jest na końcu tablicy ma indeks 0. Najstarsza świeca, która jest
pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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[]
40
double Low[]

Literał Low jest wskaźnikiem do tablicy najniższych wartości świec dla aktualnego instrumentu, wartość Low[0] jest równoważna wartości zwracanej
przez funkcje iLow(NULL, 0, 0).
Elementy tablicy są indeksowane w odwrotnej kolejności. Bieżąca świeca, która jest na końcu tablicy ma indeks 0. Najstarsza świeca, która jest
pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 wskaźnikiem do tablicy wartości otwarcia świec dla aktualnego instrumentu, wartość Open[0] jest równoważna wartości zwracanej
przez funkcje iOpen(NULL, 0, 0).
Elementy tablicy są indeksowane w odwrotnej kolejności. Bieżąca świeca, która jest na końcu tablicy ma indeks 0. Najstarsza świeca, która jest
pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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. Point

double Point

Literał Point określa wartość jednego punktu dla aktualnego instrumentu.


Przykład:
//+------------------------------------------------------------------+
//| przykład.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 wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//...
}
41
//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
double d;
//----
if(cbars > 0) cbars--;
//----
//...
for(i = Bars - cbars; i >= 0; i--)
{
d = Close[i] * 0.003 - Point; // na przykład: EUR/USD, Point = 0.0001, EUR/JPY, Point = 0.001
//...
}
}
//+------------------------------------------------------------------+

k. Time[]

datetime Time[]

Literał Time jest wskaźnikiem do tablicy czasów otwarcia świec dla aktualnego instrumentu, wartość Time[0] jest równoważna wartości zwracanej
przez funkcje iTime(NULL, 0, 0). Typ danych datetime jest przeznaczonych do reprezentowania wartości od północy 1970.01.01 do 2037.12.31. Dane
datetime są reprezentowane, jako czas w sekundach, który upłyną od daty początkowej przedziału.
Elementy tablicy są indeksowane w odwrotnej kolejności. Bieżąca świeca, która jest na końcu tablicy ma indeks 0. Najstarsza świeca, która jest
pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 wskaźnikiem do tablicy wolumenów tikowych świec dla aktualnego instrumentu, wartość Volume[0] jest równoważna wartości
zwracanej przez funkcje iVolume(NULL, 0, 0).
Elementy tablicy są indeksowane w odwrotnej kolejności. Bieżąca świeca, która jest na końcu tablicy ma indeks 0. Najstarsza świeca, która jest
pierwsza na wykresie, ma indeks zapisywany, jako Bars - 1.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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);
}
//+------------------------------------------------------------------+
42
12. INFORMACJE O KONCIE
⇒ Infor macje o koncie
⇒ AccountBalance()
⇒ AccountCr edit()
⇒ AccountCompany()
⇒ AccountCur r ency()
⇒ AccountEquity()
⇒ AccountFr eeMar gin()
⇒ AccountFr eeMar ginCheck()
⇒ AccountFr eeMar ginMode()
⇒ AccountLever age()
⇒ AccountMar gin()
⇒ AccountName()
⇒ AccountNumber()
⇒ AccountPr ofit()
⇒ AccountSer ver()
⇒ AccountStopoutLevel()
⇒ AccountStopoutMode()
1. Infor macje o koncie

Nie zależnie od typu rachunku, czy to będzie rachunek demo czy rzeczywisty rachunek inwestycyjny, jedna rzecz dla nas jest bardzo ważna, dostęp
do kompletu funkcji przy pomocy, których uzyska dostęp do informacji o bieżącym stanie rachunku. Funkcje informacji o koncie są bardzo użyteczne,
jeśli piszemy kompletną strategie wykorzystującą zaawansowane techniki zarządzania pieniędzmi. Wszystkie funkcje opisane w tym rozdziale nie
przyjmują żadnych parametrów.

2. AccountBalance()

double AccountBalance()

Funkcja AccountBalance() zwraca wartość dostępnych środków na bieżącym rachunku inwestycyjnym stanowiącą sumę dokonanych wpłat i wypłat
oraz osiągniętego wyniku finansowego na zamkniętych pozycjach.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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. AccountCr edit()

double AccountCredit()

Funkcja AccountCredit() wedle dokumentacji zwraca aktualną wartość bieżącego rachunku.


Przekład:
//+------------------------------------------------------------------+
//| przykład.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 zwracała zawsze zero nie zależnie od osiągniętego wyniku finansowego.

d. AccountCompany()

string AccountCompany()

Funkcja AccountCompany() zwraca nazwę firmy brokerskiej, gdzie bieżący rachunek jest zarejestrowany. Ta sama nazwa znajduje się w menu
Pomoc w terminalu klienckim pozycja O programie...
Przykład:
//+------------------------------------------------------------------+
//| przykład.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. AccountCur r ency()

string AccountCurrency()

Funkcja AccountCurrency() zwraca nazwę waluty, używaną do rozliczeń na koncie przez firmę brokerską, dla bieżącego rachunku.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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ść bieżącego rachunku z wyceny uwzględnia sumę dokonanych wpłat i wypłat oraz osiągniętego
wyniku finansowego na koncie pomniejszoną o stratę z otwartych pozycji oraz powiększoną o zyski z otwartych pozycji, to suma środków dostępnych na
bieżącym rachunku zwracanych przez funkcję AccountBalance() oraz wartości otwartych pozycji zwracanych przez funkcję AccounProfit(), pokazuje
rzeczywistą wartość rachunku w danym momencie.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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);
}
//+------------------------------------------------------------------+

44
g. AccountFr eeMar gin()

double AccountFreeMargin()

Funkcja AccountFreeMargin() zwraca aktualną wartość wolnych środków, które mogą być wykorzystane jako depozyt zabezpieczający (Margin)
przy otwarciu nowych pozycji na bieżącym rachunku. wynika z różnicy między Equity lub Balance (zawsze niższą z tych wartości, czyli jeśli Balance jest
mniejsze od Equity to Equity, jeśli Equity jest mniejsze od Balance to Balance) a Margin. Znając wartość Dostępnego Marginu możemy wyliczyć, jaką
maksymalną pozycję możemy jeszcze otworzyć.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 środków = ", DoubleToStr(AccountFreeMargin(), Digits));
//----
return(0);
}
//+------------------------------------------------------------------+

h. AccountFr eeMar ginCheck()

double AccountFreeMarginCheck(string symbol, int cmd, double volume)

Funkcja AccountFreeMarginCheck() zwraca wartość wolnych środków do wykorzystania na bieżącym rachunku po wykonaniu zadanego
argumentami zlecenia.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_UNKNOWN_SYMBOL (4106)
ERR_INTEGER_PARAMETER_EXPECTED (4063) ERR_NOT_ENOUGH_MONEY (134)
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_NO_ERROR (0)
Parametry:
symbol - Symbol instrumentu.
cmd - Zlecenie: OP_BUY - kupna, OP_SELL - sprzedaży.
volume - Liczba lotów (nominał transakcji w walucie bazowej).
Przykład:
//+------------------------------------------------------------------+
//| przykład.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ść środków niezbędnych do zrealizowania transakcji "


#define LT " lotów = "
#define NEC "Niewystarczająca wartość środków niezbędnych 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);
else
Alert(NEC, "kupna!");
//----
AFMC = AccountFreeMarginCheck(Symbol(), OP_SELL, lots);
if(GetLastError() != 134)
Alert(MSG, "sprzedaży ", lots, LT, AFM - AFMC);
else
Alert(NEC, "sprzedaży!");
//----
return(0);
}
//+------------------------------------------------------------------+

i. AccountFr eeMar ginMode()

int AccountFreeMarginMode()

45
Funkcja AccountFreeMarginMode() zwraca tryb obliczania wartości wolnych środków, które można wykorzystać do otwarcia pozycji na wybranym
rachunku.
Tab. 16 Tryby obliczania wartość wolnych środków.
Właściwość Opis
0 Wynik na otwartych pozycjach nie jest użyty do obliczenia wolnych środków.
1 Wynik na otwartych pozycjach jest użyty do obliczenia wolnych środków.
2 Tylko wartość dochodu otwartych pozycji jest użyta do obliczenia wolnych środków.
3 Tylko wartość straty otwartych pozycji jest użyta do obliczenia wolnych środków.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 użyty do obliczenia wolnych środków.");
break;
case 1:
Alert("Wynik na otwartych pozycjach jest użyty do obliczenia wolnych środków.");
break;
case 2:
Alert("Tylko wartość dochodu otwartych pozycji jest użyta do obliczenia wolnych środków.");
break;
case 3:
Alert("Tylko wartość straty otwartych pozycji jest użyta do obliczenia wolnych środków.");
}
//----
return(0);
}
//+------------------------------------------------------------------+

j. AccountLever age()

int AccountLeverage()

Funkcja AccountLeverage() zwraca wartość aktualnie wybranej dźwigni dla bieżącego rachunku.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 dźwignia = ", AccountLeverage());
//----
return(0);
}
//+------------------------------------------------------------------+

k. AccountMar gin()

double AccountMargin()

Funkcja AccountMargin() zwraca aktualną wartość środków pobranych z konta, jako depozyt zabezpieczający dla bieżącego rachunku, stanowiący
zabezpieczenie otwartych pozycji. Depozyt jest uwalniany po zamknięciu pozycji.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 zabezpieczającego = ", AccountMargin());
//----
return(0);
}
//+------------------------------------------------------------------+

l. AccountName()

string AccountName()

Funkcja AccountName() zwraca nazwę bieżącego rachunku.


Przykład:
//+------------------------------------------------------------------+
//| przykład.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 bieżącego rachunku.


Przykład:
//+------------------------------------------------------------------+
//| przykład.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. AccountPr ofit()

double AccountProfit()

Funkcja AccountProfit() zwraca aktualny wynik na otwartych pozycjach na bieżącym rachunku, zysk lub strata (strata jest ze znakiem „minus”). Jest
to suma pól Profit dla wszystkich pozycji, całkowity wynik na otwartych pozycjach.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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);
}
//+------------------------------------------------------------------+

47
o. AccountSer ver()

string AccountServer()
(string ServerAddress())

Funkcja ServerAddress() zwraca adres serwera, z którego korzysta terminal w postaci stringu.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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()

Funkcja AccountStopoutLevel() zwraca wartość Margin Level czyli stopień pokrycia depozytu zabezpieczającego, poziomu poniżej, którego
zamykane są najbardziej stratne pozycje. Wartość ta wynika ze stosunku Equity do Margin. Jeżeli Margin Level będzie niższe od wartości ustalonej
przez brokera, zazwyczaj 30%, co będzie oznaczało pogłębiającą się stratę, wtedy system transakcyjny automatycznie zamknie pozycje, które będą
przynosiły największe straty. Stratne pozycje będą zamykane do chwili, gdy stopień pokrycia depozytu zabezpieczającego będzie nie niższy od wartości
ustalonej przez brokera.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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 obliczania wartości po przekroczeniu, której zamykane są najbardziej stratne pozycje na wybranym
rachunku.
Tab. 17 Tryby obliczania wartość StopOut.
Właściwość Opis
0 Obliczenie stosunku procentowego między wolnymi środkami i rzeczywistą wartością rachunku.
1 Porównanie poziomu wolnych środków do absolutnej wartości rachunku.
Przykład:
//+------------------------------------------------------------------+
//| przykład.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());
else
Alert("Poziom Stop Out = ", AccountStopoutLevel(),"%");

48
//----
return(0);
}
//+------------------------------------------------------------------+

49
13. FUNKCJE TABLICOWE
⇒ Ar r ayBsear ch()
⇒ Ar r ayCopy()
⇒ Ar r ayCopyRates()
⇒ Ar r ayCopySeries()
⇒ Ar r ayDimension()
⇒ Ar r ayGetAsSeries()
⇒ Ar r ayInitialize()
⇒ Ar r ayIsSeries()
⇒ Ar r ayMaximum()
⇒ Ar r ayMinimum()
⇒ Ar r ayRange()
⇒ Ar r ayResize()
⇒ Ar r aySetAsSeries()
⇒ Ar r aySize()
⇒ Ar r aySor t()
1. Ar r ayBsear ch()

int ArrayBsearch(double array[], double value, int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND)

Funkcja ArrayBsearch() zwraca indeks pierwszego wystąpienia wartości w pierwszym wymiarze tablicy zadanej pierwszym argumentem. Jeśli
wartość nie występuje zwracany jest indeks elementu najbliższego, co do wartości. Funkcja nie może być używana z stringami.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica do przeszukania.
value - Szukana wartość.
count - Liczba elementów. Domyślnie WHOLE_ARRAY (tab. 3).
start - Początkowy indeks. Domyślnie 0.
direction - Kierunek szukania. Domyślnie MODE_ASCEND (w przód) alternatywnie MODE_DESCEND (w tył).
Przykład:
datetime dt[];
ArrayCopySeries(dt, MODE_TIME, Symbol(), PERIOD_M1);
Print(ArrayBsearch(dt, MathRound(dt[0]), WHOLE_ARRAY, 0, MODE_DESCEND));

b. Ar r ayCopy()

int ArrayCopy(object& dest[], object source[], int start_dest=0, int start_source=0, int count=WHOLE_ARRAY)

Funkcja ArrayCopy() kopiuje wartość elementów tablicy zadanej pierwszym argumentem do tablicy zadanej drugim argumentem. Obie tablice
muszą być tego samego typu. Funkcja zwraca liczbę skopiowanych elementów.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INCOMPATIBLE_ARRAYS (4056)
ERR_SOME_ARRAY_ERROR (4053) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
dest[] - Tablica docelowa.
source[] - Tablica źródłowa.
start_dest - Indeks początkowy tablicy docelowej. Domyślnie 0.
start_source - Indeks początkowy tablicy źródłowej. Domyślnie 0.
count - Liczba elementów. Domyślnie WHOLE_ARRAY (tab. 3).
Przykład:
double a1[][6], a2[10][6];
ArrayCopyRates(a1); // wypełnij a1 jakimiś danymi
ArrayCopy(a2, a1,0,Bars-9,10); // teraz a2 ma pierwszych 10 świec danych historycznych

c. Ar r ayCopyRates()

int ArrayCopyRates(double& dest_array[], string symbol=NULL, int timeframe=0)

Funkcja ArrayCopyRates() kopiuje kursy wymiany z tablicy zadanej drugim argumentem do dwuwymiarowej tablicy zadanej pierwszym
argumentem, gdzie drugi wymiar ma 6 elementów: 0 - time, 1 - open, 2 - low, 3 - high, 4 - close, 5 - volume. Funkcja zwraca liczbę skopiowanych
elementów.
Tab. 18 Stałe interwałów czasowych.
Stała Wartość Opis
PERIOD_M1 1 minutowy.
PERIOD_M5 5 5 minutowy.
PERIOD_M15 15 15 minutowy.
PERIOD_M30 30 30 minutowy.
PERIOD_H1 60 godzinny.
PERIOD_H4 240 4 godzinny.
PERIOD_D1 1440 dzienny.

50
Stała Wartość Opis
PERIOD_W1 10080 wygodniowy.
PERIOD_MN1 43200 miesięczny.
0 (zero) 0 aktualnie wykorzystywany przedział czasowy wykresu.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INCOMPATIBLE_ARRAYS (4056)
ERR_SOME_ARRAY_ERROR (4053) ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
dest_array[] - Referencja do docelowej dwuwymiarowej tablicy.
symbol - Nazwa symbolu.
timeframe - Interwał w minutach, domyślnie interwał używany przez wykres (Tab. 18).
Przykład:
double a1[][6];
ArrayCopyRates(a1,"EURPLN", PERIOD_M1);
UWAGA: Jeśli dane odnoszą się do nieotwartego wykresu, możliwa jest sytuacja, że terminal kliencki musi wysłać żądanie uaktualnienia danych do
serwera. W tym przypadku zostanie wygenerowany błąd 4066 - ERR_HISTORY_WILL_UPDATED (żądanie uaktualnienia danych historycznych). Tą
funkcję zazwyczaj używa się do przekazania danych do funkcji DLL. Pamięć nie jest alokowana dla tablicy danych.

d. Ar r ayCopySeries()

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 elementów.
Tab. 19 Identyfikatory tablicy danych historycznych.
Stała Wartość Opis
MODE_OPEN 0 Cena otwarcia.
MODE_LOW 1 Cena najniższa.
MODE_HIGH 2 Cena najwyższa.
MODE_CLOSE 3 Cena zamknięcia.
MODE_VOLUME 4 Wolumen, używany w funkcjach Lowest i Highest.
MODE_TIME 5 Czas otwarcia, używany w funkcji ArrayCopySeries.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_STRING_PARAMETER_EXPECTED (4062)
ERR_SOME_ARRAY_ERROR (4053) ERR_HISTORY_WILL_UPDATED (4066)
ERR_INCORRECT_SERIESARRAY_USING (4054) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
ERR_INCOMPATIBLE_ARRAYS (4056)
Parametry:
array[] - Referencja do docelowej jednowymiarowej tablicy.
series_index - Identyfikator danych historycznych (Tab. 19).
symbol - Nazwa symbolu, domyślnie bieżący symbol kursu wymiany walutowej.
period - Interwał w minutach, domyślnie interwał używany przez wykres (Tab. 18).
Przykład:
datetime dt[];
ArrayCopySeries(dt, MODE_TIME, Symbol(), PERIOD_M1);
UWAGA: Gdy wartością series_identifier jest MODE_TIME pierwszym parametrem musi być tablica typu datetime.

e. Ar r ayDimension()

int ArrayDimension(object array[])

Funkcja ArrayDimension() zwraca liczbę wymiarów zadanej tablicy.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica, której wymiar chcemy otrzymać.
Przykład:
int a[10][5], ws;
ws = ArrayDimension(a); // ws = 2

f. Ar r ayGetAsSeries()

bool ArrayGetAsSeries(object array[])

Funkcja ArrayGetAsSeries() zwraca wartość TRUE, jeśli tablica zadana argumentem jest indeksowana jak tablica danych historycznych, czyli
elementy tablicy są indeksowane od ostatniego do pierwszego, w przeciwnym razie, jeśli tablica jest indeksowana normalnie od lewej do prawej, funkcja
zwraca wartość FALSE.
Kody błędów, które 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.
Przykład:
if(ArrayGetAsSeries(a1)) Print("a1 jest indeksowana jak tablica danych historycznych");

g. Ar r ayInitialize()

51
int ArrayInitialize(double& array[], double value)

Funkcja ArrayInitialize() inicjalizuje wszystkie elementy tablicy zadanej pierwszym argumentem wartością zadaną drugim argumentem. Funkcja
zwraca liczbę zainicjowanych elementów.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica do inicjalizacji.
value - Wartość do ustawienia.
Przykład:
double a1[7];
ArrayInitialize(a1, 1.7);

h. Ar r ayIsSeries()

bool ArrayIsSeries(object array[])

Funkcja ArrayIsSeries() zwraca TRUE, jeśli tablica zadana pierwszym argumentem jest tablicą danych historycznych zawierającą elementy time,
open, close, high, low lub volume, w przeciwnym razie zwraca false.
Kody błędów, które 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.
Przykład:
if(ArrayIsSeries(a1)) Print("Tablica jest tablicą danych historycznych.");

i. Ar r ayMaximum()

int ArrayMaximum(double array[], int count=WHOLE_ARRAY, int start=0)

Funkcja ArrayMaximum() szuka w tablicy zadanej pierwszym argumentem elementu największego, co do wartości i zwraca jego indeks.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica do przeszukania.
count - Liczba elementów. Domyślnie WHOLE_ARRAY (tab. 3).
start - Początkowy indeks.
Przykład:
double a1[] = {1, 2, 3, 5, 11, 8, 7, 4};
Print("Element maksymalny = ", a1[ArrayMaximum(a1)]);

j. Ar r ayMinimum()

int ArrayMinimum(double array[], int count=WHOLE_ARRAY, int start=0)

Funkcja ArrayMinimum() szuka w tablicy zadanej pierwszym argumentem elementu najmniejszego, co do wartości i zwraca jego indeks.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica do przeszukania.
count - Liczba elementów. Domyślnie WHOLE_ARRAY (tab. 3).
start - Początkowy indeks.
Przykład:
double a1[] = {1, 2, 3, 5, 11, 8, 7, 4};
Print("Element minimalny = ", a1[ArrayMinimum(a1)]);

k. Ar r ayRange()

int ArrayRange(object array[], int range_index)

Funkcja ArrayRange() zwraca liczbę elementów w tablicy zadanej pierwszym argumentem w wymiarze zadanym drugim argumentem. Ponieważ
tablice są indeksowane od zera, rozmiar wymiaru jest o 1 większy niż największy indeks tego wymiaru.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INTEGER_PARAMETER_EXPECTED (4063)
ERR_SOME_ARRAY_ERROR (4053) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
array[] - Tablica do sprawdzenia.
range_index - Indeks wymiaru.
Przykład:
int ws, a1[3, 7, 7];
ws = ArrayRange(a1, 1);

52
l. Ar r ayResize()

int ArrayResize(object& array[], int new_size)

Funkcja ArrayResize() ustawia nowy rozmiar pierwszego wymiaru tablicy zadanej pierwszym argumentem. Jeśli zmiana rozmiaru się powiodła to
zwracana jest liczba elementów tablicy po zmianie rozmiaru, w przeciwnym razie zwracana jest wartość zero i rozmier tablicy nie ulega zmianie.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica której rozmiar ma być zmieniony.
new_size - Nowy rozmiar pierwszego wymiaru tablicy.
Przykład:
double array1[4][4]; // a1 ma 16 elementów
if(ArrayResize(a1, 8)) Print("Zmiana rozmiaru powiodła się"); // a1 ma 32 elementów

m. Ar r aySetAsSeries()

bool ArraySetAsSeries(double& array[], bool set)

Funkcja ArraySetAsSeries() ustawia kierunek indeksowania tablicy zadanej pierwszym argumentem. Jeśli drugi argument ma wartość TRUE,
indeksy tablicy będą ustawione w kolejności malejącej, ostatni element będzie miał indeks zero. Jeśli drugi argument ma wartość FALSE, indeksy tablicy
będą ustawione w kolejności rosnącej, pierwszy element będzie miał indeks zero. Funkcja zwraca poprzedni stan.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica, której kolejność ma być ustawiona.
set - Flag danych historycznych, ustawiona, jeśli przyjmuje wartość TRUE.
Przykład:
double WPRbuf[15], buf[15];
int i;
ArraySetAsSeries(WPRbuf,true);
for(i = 0; i < 15; i++) WPRbuf[i] = iWPR(NULL, 1, 14, i)

n. Ar r aySize()

int ArraySize(object array[])

Funkcja ArraySize() zwraca liczbę elementów zadanej tablicy.


Kody błędów, które 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.
Przykład:
for(int i = ArraySize(a1); i >= 0; i--)
{
// ciało pętli
}

o. Ar r aySor t()

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 może być
sortowana.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_INCORRECT_SERIESARRAY_USING (4054)
ERR_SOME_ARRAY_ERROR (4053) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
array[] - Tablica do posortowania.
count - Liczba elementów. Domyślnie WHOLE_ARRAY (tab. 3).
start - Indeks początkowy.
sort_dir - Kierunek sortowania. Sortowanie rosnące MODE_ASCEND, malejące MODE_DESCEND.
Przykład:
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};

53
14. FUNKCJE S PRAWDZAJĄCE
⇒ Funkcje spr awdzające
⇒ GetLastEr r or()
⇒ IsConnected()
⇒ IsDemo()
⇒ IsDllsAllowed()
⇒ IsExper tEnabled()
⇒ IsLibr ariesAllowed()
⇒ IsOptimization()
⇒ IsStopped()
⇒ IsTesting()
⇒ IsTr adeAllowed()
⇒ IsTr adeContextBusy()
⇒ IsVisualMode()
⇒ UninitializeReason()
1. Funkcje spr awdzające

Funkcje sprawdzające są zbiorem funkcji, które dostarczają programiście użytecznych informacji o bieżącym stanie, możliwościach i aktualnych
ograniczeniach terminala klienckiego, spowodowanych działaniami lub brakiem działań użytkownika oraz informacji o błędach ewentualnie informacji o
braku takich błędów, środowiska MetaTrader 4, tak po stronie serwera jak i po stronie terminala klienckiego. Wszystkie funkcje opisane w tym rozdziale
nie przyjmują żadnych parametrów.

2. GetLastEr r or()

int GetLastError()

Funkcja GetLastError() zwraca kod ostatniego zarejestrowanego błędu zapisanego z zmiennej last_error i zeruje wartość tej zmiennej. Kody błędów
zwracane przez serwer i klienta są zdefiniowane w pliku stderroe.mqh. Odpowiednie komunikaty w reprezentacji tekstowej, niestety tylko w języku
angielskim, odpowiadający poszczególnym kodom błędów, zwracanych przez tą funkcję, są zwracane przez funkcję ErrorDescription, funkcja jest
zdefiniowana w pliku stdlib.mqh, który trzeba dołączyć żeby korzystać z tej funkcji.
W uruchomionym wątku terminala klienckiego, w przypadku wystąpienia błędu podczas wykonywania programu MQL 4, kod błędu jest zapisywany
w zmiennej last_error dostępnej dla każdego wykonywalnego programu MQL 4. Zanim funkcja init() zostanie uruchomiona, zmienna last_error jest
zerowana. Jeżeli błąd wystąpi podczas procesu obliczania lub w wywołaniu funkcji wbudowanej, zmienna last_error przyjmuje odpowiedni kod błędu.
Wartość przechowywana w zmiennej może zostać zwrócona przez funkcje GetLastError().
Tab. 20 Kody błędów zwracane przez serwer.
Stała Wartość Opis
ERR_NO_ERROR 0 Funkcja nie zwróciła błędu.
ERR_NO_RESULT 1 Funkcja nie zwróciła błędu, ale poprawność wykonania nie jest znana.
ERR_COMMON_ERROR 2 Błąd elementarny.
ERR_INVALID_TRADE_PARAMETERS 3 Niepoprawne parametry transakcji.
ERR_SERVER_BUSY 4 Serwery brokera są przeciążony.
ERR_OLD_VERSION 5 Stara wersja terminala klienckiego.
ERR_NO_CONNECTION 6 Brak połączenia z serwerami brokera.
ERR_NOT_ENOUGH_RIGHTS 7 Niewystarczający poziom dostępu.
ERR_TOO_FREQUENT_REQUESTS 8 Zbyt częste żą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 Nieprawidłowa cena.
ERR_INVALID_STOPS 130 Nieprawidłowy poziom stop.
ERR_INVALID_TRADE_VOLUME 131 Nieprawidłowy wolumen transakcji.
ERR_MARKET_CLOSED 132 Rynek jest zamknięty.
ERR_TRADE_DISABLED 133 Możliwość transakcji jest zablokowana.
ERR_NOT_ENOUGH_MONEY 134 Za mało środków.
ERR_PRICE_CHANGED 135 Cena jest nie aktualna.
ERR_OFF_QUOTES 136 Kwotowanie jest wyłączone.
ERR_BROKER_BUSY 137 Broker jest niedostępny.
ERR_REQUOTE 138 Przekwotowywanie.
ERR_ORDER_LOCKED 139 Zlecenie jest za blokowane.
ERR_LONG_POSITIONS_ONLY_ALLOWED 140 Dozwolone tylko pozycje długie (kupna).
ERR_TOO_MANY_REQUESTS 141 Zbyt wiele żądań.
Odmowa modyfikacji, ponieważ poziom zlecenia jest zbyt blisko ceny
ERR_TRADE_MODIFY_DENIED 145
rynkowej.
Inne zlecenie jest wysyłane lub broker nie jest jeszcze gotów przyjąć
ERR_TRADE_CONTEXT_BUSY 146 następnego zlecenia z bieżącego konta, bo została przekroczona
maksymalna częstotliwość składania zleceń.
Dotyczy zleceń będących w toku. Odmowa przyjęcia przez brokera parametru
ERR_TRADE_EXPIRATION_DENIED 147 czasu wygaśnięcia transakcji. Operacja może być powtórzona, jeżeli
parametr wygaśnięcia będzie wyzerowany.
ERR_TRADE_TOO_MANY_ORDERS 148 Liczna zleceń w toku osiągnęła ograniczenie ustawione przez brokera.
ERR_TRADE_HEDGE_PROHIBITED 149 Próba otwarcia pozycji przeciwnej do już istniejącej jest zablokowana.

54
Stała Wartość Opis
ERR_TRADE_PROHIBITED_BY_FIFO 150 Próba zemknięcia pozycji narusza zasady FIFO.
Tab. 21 Kody błędów klienta MQL 4.
Stała Wartość Opis
ERR_NO_MQLERROR 4000 Funkcja nie zwróciła błędu, kod nigdy niegenerowany.***
Podczas wywoływania zewnętrznej funkcji, został wykryty zły wskaźnik
ERR_WRONG_FUNCTION_POINTER 4001
funkcji.* ****
ERR_ARRAY_INDEX_OUT_OF_RANGE 4002 Próba dostępu do elementu tablicy, które jest poza tablicą.***
Podczas wywoływania zewnętrznej funkcji, nie było możliwe relokowanie
ERR_NO_MEMORY_FOR_CALL_STACK 4003
pamięci na stosie dla wywołania funkcji.*
ERR_RECURSIVE_STACK_OVERFLOW 4004 Przepełnienie stosu podczas rekursywnego wywołania funkcji.*
ERR_NOT_ENOUGH_STACK_FOR_PARAM 4005 Parametry nie mieszczą się na stosie.
Podczas wywoływania zewnętrznej funkcji, nie było możliwe alokowanie
ERR_NO_MEMORY_FOR_PARAM_STRING 4006
pamięci dla przekazania, stringa jako parametr funkcji.*
Nie było możliwe alokowanie na stosie tymczasowego bufora dla operacji
ERR_NO_MEMORY_FOR_TEMP_STRING 4007
na stringach.*
Niezainicjalizowany string, string bez wartości został użyty w
ERR_NOT_INITIALIZED_STRING 4008
wyrażeniu.***
Niezainicjalizowany string w tablicy stringów, string bez wartości
ERR_NOT_INITIALIZED_ARRAYSTRING 4009
został użyty element tablicy w wyrażeniu.***
Błąd przypisania, nie jest możliwe relokowanie pamięci dla stringa w
ERR_NO_MEMORY_FOR_ARRAYSTRING 4010
tablicy.*
Błąd przypisania, wynikowy string jest za długi, by zmieścił się w
ERR_TOO_LONG_STRING 4011
buforze docelowym (nie ma możliwości 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 Zła instrukcja skoku (nigdy niegenerowany błąd).
ERR_NOT_INITIALIZED_ARRAY 4016 Niezainicjalizowana tablica.****
ERR_DLL_CALLS_NOT_ALLOWED 4017 Wywoływanie funkcji importowanej z biblioteki DLL nie jest dozwolone.**
Wywoływanie funkcji importowanej z biblioteki EX4 lub DLL nie jest
ERR_CANNOT_LOAD_LIBRARY 4018
możliwe, wystąpił błąd podczas ładowania biblioteki.**
Wywoływanie funkcji importowanej z biblioteki EX4 lub DLL nie jest
ERR_CANNOT_CALL_FUNCTION 4019
możliwe, nie można odnaleźć żądanej funkcji.**
ERR_EXTERNAL_CALLS_NOT_ALLOWED 4020 Wywoływanie funkcji importowanej z biblioteki EX4 nie jest dozwolone.**
Nie było możliwe relokowanie pamięci dla zwrócenia tymczasowego stringa
ERR_NO_MEMORY_FOR_RETURNED_STR 4021
z funkcji.
ERR_SYSTEM_BUSY 4022 System zajęty (nigdy niegenerowany błąd).
ERR_INVALID_FUNCTION_PARAMSCNT 4050 Nieprawidłowa liczna parametrów przekazanych do funkcji.****
ERR_INVALID_FUNCTION_PARAMVALUE 4051 Nieprawidłowa wartość parametru funkcji.
ERR_STRING_FUNCTION_INTERNAL 4052 Wewnętrzny błąd przetwarzania string.****
ERR_SOME_ARRAY_ERROR 4053 Błąd tablicy.
ERR_INCORRECT_SERIESARRAY_USING 4054 Niepoprawne użycie tablicy danych historycznych.
ERR_CUSTOM_INDICATOR_ERROR 4055 Błąd wskaźnika technicznego.
ERR_INCOMPATIBLE_ARRAYS 4056 Tablica jest niekompatybilna.
ERR_GLOBAL_VARIABLES_PROCESSING 4057 Błąd przetwarzania zmiennych globalnych.
ERR_GLOBAL_VARIABLE_NOT_FOUND 4058 Nie znaleziono zmiennej globalnej.
ERR_FUNC_NOT_ALLOWED_IN_TESTING 4059 Wywołanie funkcji nie jest dozwolone w trybie testowym.
ERR_FUNCTION_NOT_CONFIRMED 4060 Funkcja nie jest potwierdzona.
ERR_SEND_MAIL_ERROR 4061 Wysłanie wiadomości e-mail nie powiodło się.
ERR_STRING_PARAMETER_EXPECTED 4062 Spodziewany parametr typu string.
ERR_INTEGER_PARAMETER_EXPECTED 4063 Spodziewany parametr typu całkowitoliczbowego.
ERR_DOUBLE_PARAMETER_EXPECTED 4064 Spodziewany parametr typu zmiennoprzecinkowego.
ERR_ARRAY_AS_PARAMETER_EXPECTED 4065 Spodziewany parametr typu tablicowego.
ERR_HISTORY_WILL_UPDATED 4066 Żądane dane historyczne są uaktualniane.
ERR_TRADE_ERROR 4067 Wewnętrzny błąd przetwarzania transakcji.****
ERR_END_OF_FILE 4099 Koniec pliku.
ERR_SOME_FILE_ERROR 4100 Błąd plikowy.
ERR_WRONG_FILE_NAME 4101 Błędna nazwa pliku.
ERR_TOO_MANY_OPENED_FILES 4102 Za wiele otwartych plików.
ERR_CANNOT_OPEN_FILE 4103 Nie można otworzyć pliku.
ERR_INCOMPATIBLE_FILEACCESS 4104 Niekompatybilny dostęp do pliku.
ERR_NO_ORDER_SELECTED 4105 Nie wybrano pozycji.
ERR_UNKNOWN_SYMBOL 4106 Niepoprawny symbol.
ERR_INVALID_PRICE_PARAM 4107 Nieprawidłowa cena.
ERR_INVALID_TICKET 4108 Nieprawidłowy identyfikator.
Transakcje są niedozwolone. Uaktywnij checkbox "Umożliw Handel" w
ERR_TRADE_NOT_ALLOWED 4109
właściwościach strategii.
ERR_LONGS_NOT_ALLOWED 4110 Pozycje długie nie są dozwolone. Sprawdź właściwości strategii.
ERR_SHORTS_NOT_ALLOWED 4111 Pozycje krótkie nie są dozwolone. Sprawdź właściwości strategii.
ERR_OBJECT_ALREADY_EXISTS 4200 Obiekt już istnieje.
ERR_UNKNOWN_OBJECT_PROPERTY 4201 Błędna właściwość obiektu.
ERR_OBJECT_DOES_NOT_EXIST 4202 Obiekt nie istnieje.
ERR_UNKNOWN_OBJECT_TYPE 4203 Błędny typ obiektu.
ERR_NO_OBJECT_NAME 4204 Nazwa obiektu jest pusta.
ERR_OBJECT_COORDINATES_ERROR 4205 Błąd położenia obiektu.
ERR_NO_SPECIFIED_SUBWINDOW 4206 Nie określono pod okna.
ERR_SOME_OBJECT_ERROR 4207 Wewnętrzny błąd przetwarzania obiektu.****
* błędy krytyczne, które powodują natychmiastowe przerwanie programu.

55
** błędy krytyczne, które dotyczą wywołań funkcji importowanych, z powodu natychmiastowego zatrzymania strategii lub wskaźnika, funkcja start()
nie będzie wywoływana do czasu re-inicjalizacji strategii lub wskaźnika.
*** błędy nieprzerywające wykonywania programu.
**** błędy, które są możliwe tylko, w wyniku błędu oprogramowania lub awarii sprzętu. Jeżeli błąd wystąpi wielokrotnie, należy skontaktować się z
producentem.
UWAGA: Jeżeli program przestał działać z porodu błędu krytycznego, kod tego błędu będzie można odczytać po następnym uruchomieniu z funkcji
start() lub deinit() używając funkcji GetLastError(). Zmienna last_error nie jest zerowana przed wywołaniem funkcji start() czy deinit.
Funkcje, które zawsze zmieniają wartość zmiennej last_error:
AccountFreeMarginCheck() OrderCloseBy() GetLastError()
OrderSend() OrderDelete()
OrderClose() OrderModify()
Funkcje, które zmieniają wartość zmiennej last_error tylko w przypadku wystąpienia błędu:
ArrayBsearch() iBullsPower() ObjectGet()
ArrayCopy() iCCI() ObjectGetFiboDescription()
ArrayCopyRates() iCCIOnArray() ObjectGetShiftByValue()
ArrayCopySeries() iCustom() ObjectGetValueByShift()
ArrayDimension() iDeMarker() ObjectMove()
ArrayGetAsSeries() iEnvelopes() ObjectName()
ArrayInitialize() iEnvOnArray() ObjectSet()
ArrayIsSeries() iForce() ObjectSetText()
ArrayMaximum() iFractals() ObjectSetFiboDescription()
ArrayMinimum() iGator() ObjectType()
ArrayRange() iIchimoku() OrderClosePrice()
ArrayResize() iBWMFI() OrderCloseTime()
ArraySetAsSeries() iMomentum() OrderComment()
ArraySize() iMomOnArray() OrderCommission()
ArraySort() iMFI() OrderExpiration()
FileClose() iMA() OrderLots()
FileDelete() iMAOnArray() OrderMagicNumber()
FileFlush() iOsMA() OrderOpenPrice()
FileIsEnding() iMACD() OrderOpenTime()
FileIsLineEnding() iOBV() OrderPrint()
FileOpen() iSAR() OrderProfit()
FileOpenHistory() iRSI() OrderStopLoss()
FileReadArray() iRSIOnArray() OrderSwap()
FileReadDouble() iRVI() OrderSymbol()
FileReadInteger() iStdDev() OrderTakeProfit()
FileReadNumber() iStdDevOnArray() OrderTicket()
FileReadString() iStochastic() OrderType()
FileSeek() iWPR() PlaySound()
FileSize() iBars() SendFTP()
FileTell() iBarShift SendMail()
FileWrite() iClose() SetIndexArrow()
FileWriteDouble() iHigh() SetIndexBuffer()
FileWriteInteger() iHighest() SetIndexDrawBegin()
FileWriteString() iLow() SetIndexEmptyValue()
FileWriteArray() iLowest() SetIndexLabel()
GlobalVariableCheck() iOpen() SetIndexShift()
GlobalVariableDel() iTime() SetIndexStyle()
GlobalVariableGet() iVolume() SetLevelValue()
GlobalVariablesDeleteAll() IndicatorBuffers() Sleep()
GlobalVariableSet() IndicatorDigits() StringFind()
GlobalVariableSetOnCondition() IndicatorShortName() StringGetChar()
iCustom() MarketInfo() StringLen()
iAC() MathArccos() StringSetChar()
iAD() MathArcsin() StringSubstr()
iAlligator() MathMod() StringTrimLeft()
iADX() MathSqrt() StringTrimRight()
iATR() MessageBox() WindowIsVisible()
iAO() ObjectCreate() WindowFind()
iBearsPower() ObjectDelete() WindowHandle()
iBands() ObjectDescription() WindowScreenShot()
iBandsOnArray() ObjectFind()
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ERROR (0)
Przykład:
AccountFreeMarginCheck(Symbol(), OP_BUY, lots);
for(double lost = 0.1; GetLastError() != 134; AccountFreeMarginCheck(Symbol(), OP_BUY, lots)) lots += 0.1;

c. IsConnected()

bool IsConnected()

Funkcja IsConnected() zwraca status połączenia między terminalem klienckim i serwerem brokera. Wartość TRUE jest zwracana, jeśli terminal
kliencki uzyskał połączenie z serwerem, w przeciwnym razie, zwracana jest wartość FALSE. Funkcja ta jest wykorzystywana najczęściej w
automatycznych systemach transakcyjnych, ale zdarzają się sytuacje, że wskaźnik potrzebuje pobrać z serwera brokera pewne specyficzne dane na
przykład dźwignie finansową.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"

56
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua

//---- parametry
extern int Try = 255;
//---- bufory
double ExtBuffer0[];
//---- zmienne globalne
bool ConnectionIsStable;
double Min, Leverage, StopoutLevel;

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
TryCount = Try;
//---- przypisywani buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0));
//---- wskźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i = Bars, cbars = IndicatorCounted();
if(IsConnected())
{
if((AccountLeverage() != 0) || (TryCount == 0))
{
if(!ConnectionIsStable)
{
ConnectionIsStable = true;
i = Bars - TCBars;
//...
}
for(; i >= 0; i--)
{
TCBars = i;
//...
}
}
else
{
TryCount--;
Sleep(15);
}
}
else
TryCount = Try;
//+------------------------------------------------------------------+

d. IsDemo()

bool IsDemo()

Funkcja IsDemo() zwraca wartość TRUE, jeśli program jest uruchomiony na koncie demo, w przeciwnym razie funkcja zwraca wartość FALSE.
Funkcja może być wykorzystywana do ochrony trialowych programów tak, żeby działały tylko na kontach demonstracyjnych.
Przykład:
if(IsDemo())
Print("To jest demo");
else
Print("To nie jest demo");

e. IsDllsAllowed()

bool IsDllsAllowed()

Funkcja IsDllsAllowed() zwraca wartość TRUE, jeśli program może wywoływać funkcje z biblioteki DLL, w przeciwnym razie funkcja zwraca wartość
FALSE. Aby program mógł wywoływać funkcje z biblioteki DLL i by nie było potrzeby każdorazowo zaznaczania pola „Umożliw import DLL” w opcjach
strategii, można z menu Narzędzia -> Opcje -> Strategie zaznaczyć pole „Umożliw import DLL”.
Przykład:
if(!IsDllsAllowed())
{
Print("Program nie może wywoływać funkcje bibliotek dymnamicznych");
return(-1)
}

f. IsExper tEnabled()

bool IsExpertEnabled()

57
Funkcja IsExpertEnabled() zwraca wartość TRUE, jeśli strategia może zostać uruchomiona, w przeciwnym razie funkcja zwraca wartość FALSE.
Przykład:
if(!IsExpertEnabled())
{
Print("Strategia nie może zostać uruchomiona");
return(-1)
}

g. IsLibr ariesAllowed()

bool IsLibrariesAllowed()

Funkcja IsLibrariesAllowed() zwraca wartość TRUE, jeśli strategia może wywoływać funkcje biblioteczne zawarte z skompilowanych plikach, w
przeciwnym razie funkcja zwraca wartość FALSE.
Przykład:
if(!IsLibrariesAllowed())
{
Print("Program nie może wywoływać funkcje bibliotek");
return(-1)
}

h. IsOptimization()

bool IsOptimization()

Funkcja IsOptimization() zwraca wartość TRUE, jeśli strategia jest testowana w trybie optymalizacji, w przeciwnym razie funkcja zwraca wartość
FALSE.
Przykład:
if(IsOptimization()) Print("Program nie może wywoływać funkcje bibliotek");

i. IsStopped()

bool IsStopped()

Funkcja IsOptimization() zwraca wartość TRUE, jeśli program (strategia lub skrypt) został wstrzymany, w przeciwnym razie funkcja zwraca wartość
FALSE. Program może kontynuować działanie, przez co najmniej 2,5 sekundy zanim terminal kliencki wymusi jego zatrzymanie.
Przykład:
if(!IsStopped()) Print("Program jest jeszcze aktywny");

j. IsTesting()

bool IsTesting()

Funkcja IsTesting() zwraca wartość TRUE, jeśli program jest uruchomiony w trybie testowym, w przeciwnym razie funkcja zwraca wartość FALSE.
Przykład:
if(IsTesting())
Print("To jest test");
else
Print("To nie jest test");

k. IsTr adeAllowed()

bool IsTradeAllowed()

Funkcja IsTradeAllowed() zwraca wartość TRUE, jeśli strategia może automatycznie realizować transakcje i wykres nie jest zajęty przez inną
strategię, w przeciwnym razie funkcja zwraca wartość FALSE.
Przykład:
if(IsTradeAllowed())
Print("Program może realizować transakcje automatycznie");
else
Print("Program nie może realizować transakcji automatycznie");

l. IsTr adeContextBusy()

bool IsTradeContextBusy()

Funkcja IsTradeContextBusy() zwraca wartość TRUE, jeśli wykres wykorzystuje już inną strategię, w przeciwnym razie funkcja zwraca wartość
FALSE.
Przykład:
if(IsTradeContextBusy()) Print("Wykres nie jest dostępny dla tej strategii");

m. IsVisualMode()

58
bool IsVisualMode()

Funkcja IsVisualMode() zwraca wartość TRUE, jeśli strategia jest testowana z zaznaczoną opcją "Visual Mode", w przeciwnym razie funkcja zwraca
wartość FALSE.
Przykład:
if(IsVisualMode()) Print("Opcja "Visual Mode" jest włączona");

n. UninitializeReason()

int UninitializeReason()

Funkcja UninitializeReason() zwraca kod nieudanej inicjalizacji wskaźnika, strategii i skryptu. Ta funkcja może być użyta do reakcji na wcześniejszą
nieudaną inicjalizację.
Tab. 22 Przyczyny nieudanej inicjalizacji.
Stała Wartość Opis
0 Program zakończył się bez błędów.
REASON_REMOVE 1 Strategia usunięta z wykresu.
REASON_RECOMPILE 2 Strategia została rekompilowana.
REASON_CHARTCHANGE 3 Symbol lub przedział czasowy wykresu zostały zmienione.
REASON_CHARTCLOSE 4 Wykres został zamknięty.
REASON_PARAMETERS 5 Parametry wejściowe zostały zmienione przez użytkownika.
REASON_ACCOUNT 6 Inne konto zostało aktywowane.
Przykład:
if(UninitializeReason() != 0) Print("Odmowa wykonania programu!");

59
15. TERMINAL KLIENCKI
⇒ Ter minalCompany()
⇒ Ter minalName()
⇒ Ter minalPath()
1. Ter minalCompany()

string TerminalCompany()
(string CompanyName())

Funkcja TerminalCompany() zwraca nazwę właściciela kopii licencji na terminal kliencki.


Przykład:
Print("Nazwa firmy: ", TerminalCompany());

b. Ter minalName()

string TerminalName()
(string ClientTerminalName())

Funkcja TerminalName() zwraca nazwę terminala klienckiego.


Przykład:
Print("Nazwa terminala: ", TerminalName());

c. Ter minalPath()

string TerminalPath()

Funkcja TerminalPath() zwraca katalog, z którego terminal kliencki został uruchomiony.


Przykład:
Print("katalog, z którego terminal kliencki został uruchomiony: ", TerminalPath());

60
16. FUNKCJE RÓŻNE
⇒ Aler t()
⇒ Comment()
⇒ GetTickCount()
⇒ Mar ketInfo()
⇒ MessageBox()
⇒ PlaySound()
⇒ Print()
⇒ SendFTP()
⇒ SendMail()
⇒ Sleep()
⇒ SpeechText()
1. Aler t()

void Alert(...)

Funkcja Alert() wyświetla okno dialogowe zawierające dane zdefiniowane przez użytkownika. Parametry mogą być każdego typu poza typem
tablicowym. Dane typu bool, datetime i color będą wyświetlane jako wartości numeryczne. Funkcja TimeToStr() konwertuje wartość datetime na string.
Parametry:
... - Jakiekolwiek wartości, oddzielone przecinkami.
Przykład:
Alert("Konrad wita", "\x21\x21");

b. Comment()

void Comment(...)

Funkcja Comment() wyświetla komunikat w lewym górnym rogu wykresu. Parametry mogą być każdego typu poza typem tablicowym. Dane typu
bool, datetime i color będą wyświetlane jako wartości numeryczne. Funkcja TimeToStr() konwertuje wartość datetime na string.
Parametry:
... - Jakiekolwiek wartości, oddzielone przecinkami.
Przykład:
Comment("Czas:", TimeToStr(TimeCurrent));

c. GetTickCount()

int GetTickCount()

Funkcja GetTickCount() zwraca liczbę milisekund, które upłynęły od startu systemu. Rozdzielczość czasowa jest ograniczona przez zegar
systemowy.
Przykład:
Print("Od startu systemu mineło", GetTickCount(), " milisekund.");

d. Mar ketInfo()

double MarketInfo(string symbol, int type)

Funkcja MarketInfo() zwraca wartość zadaną drugim argumentem dla instrumentu zadanego pierwszym argumentem.
Tab. 23 Identyfikatory informacji rynku.
Stała Wartość Opis
MODE_LOW 1 Najniższa cena.
MODE_HIGH 2 Najwyższa cena.
MODE_TIME 5 Czas ostatniej wyceny.
MODE_BID 9 Ostatnia znana cena Bid (cena dla sprzedającego).
MODE_ASK 10 Ostatnia znana cena Ask (cena dla kupującego).
MODE_POINT 11 Wartość punktu w walucie kwotowanej.
MODE_DIGITS 12 Cyfr po kropce decymenalnej.
Wartość spread, różnica pomiędzy ceną dla kupującego (Ask) i ceną dla
MODE_SPREAD 13
sprzedającego (Bid) w punktach.
MODE_STOPLEVEL 14 Minimalna odległość poziomu stop w punktach od aktualnej ceny.
MODE_LOTSIZE 15 Wielkość lota w walucie bazowej.
MODE_TICKVALUE 16 Warotść pipsa w walucie rachunku.
Wielkość najmniejszej zmiany kwotowania w punktach, to jest jednostki, o którą
MODE_TICKSIZE 17
minimalnie może się zmienić wycena danego instrumentu.
MODE_SWAPLONG 18 Punkty swapowe dla pozycjach długich.
MODE_SWAPSHORT 19 Punkty swapowe dla pozycjach krótkich.
MODE_STARTING 20 Data realizacji, używane dla warunkowych zleceń oczekujących.
MODE_EXPIRATION 21 Data wygaśnięcia, używane dla warunkowych zleceń oczekujących.
MODE_TRADEALLOWED 22 Transakcje dla symbolu są dozwolone.
61
Stała Wartość
Opis
MODE_MINLOT 23 Minimalna dozwolona wielkość w lotach.
MODE_LOTSTEP 24 Krok w lotach
MODE_MAXLOT 25 Maksymalna dozwolona wielkość w lotach.
Metoda obliczania swapa:
0 - w punkach,
MODE_SWAPTYPE 26 1 - w walucie bazowej,
2 - w procentach,
3 - w walucie kąta.
Tryb obliczania zysku:
0 - Forex,
MODE_PROFITCALCMODE 27
1 - CFD,
2 - Futures.
Tryb obliczania depozytu zabezpieczającego:
0 - Forex,
MODE_MARGINCALCMODE 28 1 - CFD,
2 - Futures,
3 - CFD dla indeksu.
MODE_MARGININIT 29 Początkowy depozyt wymagany dla 1 lota.
MODE_MARGINMAINTENANCE 30 Depozyt dla utrzymania otwartych pozycji obliczany dla 1 lota.
MODE_MARGINHEDGED 31 Depozyt zabezpieczający obliczany dla 1 lota.
MODE_MARGINREQUIRED 32 Depozyt wymagany do otwarcia pozycji przez kupno 1 lota.
Zlecenie zamrożenia poziomu w punktach. Jeżeli cena wykonania leży w zasięgu
MODE_FREEZELEVEL 33 zdefiniowanym przez poziom zamrożenia, zlecenie nie może zostać zmodyfikowane,
anulowane lub zamknięte.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_UNKNOWN_SYMBOL (4106)
ERR_FUNC_NOT_ALLOWED_IN_TESTING (4059) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
symbol - Symbol instrumentu.
type - Typ zwracanej wartości (Tab. 23).
Przykład:
double SampleMaxMoney(string symbol, double money, int cmd = OP_BUY)
{
double ret = 0.0, lot_step = MarketInfo(Symbol(), MODE_LOTSTEP), lots = MarketInfo(Symbol(), MODE_MINLOT);
//----
for(double req = AccountFreeMargin() - AccountFreeMarginCheck(Symbol(), OP_BUY, lots); GetLastError() != 134;)
{
ret = lots;
lots += lot_step;
req = AccountFreeMargin() - AccountFreeMarginCheck(Symbol(), OP_BUY, lots);
}
//----
return(ret);
}

e. MessageBox()

int MessageBox(string text=NULL, string caption=NULL, int flags=EMPTY)

Funkcja MessageBox() tworzy, wyświetla i obsługuje okno wiadomości. Okno komunikatu zawiera komunikat zadany pierwszym argumentem, tytuł
zadany drugim argumentem i kombinacje predefiniowanych ikon i przycisków zadanych trzecim argumentem. Jeśli wykonanie funkcji MessageBox() się
powiedzie to zwracany jest kod wybranego przycisku. Identyfikatory przycisków dla okien dialogowych i flagi funkcji MessageBox() są zdefiniowane w
piku nagłówkowym WinUsen32.mqh. Flagi określają zawartość i zachowanie okna MessageBox.
Tab. 24 Stałe powrotu z funkcji MessageBox().
Stała Wartość Opis
IDOK 1 Został wybrany przycisk OK.
IDCANCEL 2 Został wybrany przycisk Cancel.
IDABORT 3 Został wybrany przycisk Abort.
IDRETRY 4 Został wybrany przycisk Retry.
IDIGNORE 5 Został wybrany przycisk Ignore.
IDYES 6 Został wybrany przycisk Yes.
IDNO 7 Został wybrany przycisk No.
IDTRYAGAIN 10 Został wybrany przycisk Try again.
IDCONTINUE 11 Został wybrany przycisk Continue.
Tab. 25 Flagi zawartości okna.
Stała Wartość Opis
MB_OK 0x00000000 Okno komunikatu zawiera przyciski: OK.
MB_OKCANCEL 0x00000001 Okno komunikatu zawiera przyciski: OK i Cancel.
MB_ABORTRETRYIGNORE 0x00000002 Okno komunikatu zawiera przyciski: Abort, Retry, Ignore.
MB_YESNOCANCEL 0x00000003 Okno komunikatu zawiera przyciski: Yes, No, Cancel.
MB_YESNO 0x00000004 Okno komunikatu zawiera przyciski: Yes, No.
MB_RETRYCANCEL 0x00000005 Okno komunikatu zawiera przyciski: Retry, Cancel.
MB_CANCELTRYCONTINUE 0x00000006 Okno komunikatu zawiera przyciski: Cancel, Try again, Continue.
Tab. 26 Flagi ikony okna.
Stała Wartość Opis
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND 0x00000010 Ikona błędu.
MB_ICONQUESTION 0x00000020 Ikona znaku zapytania.
MB_ICONEXCLAMATION, MB_ICONWARNING 0x00000030 Ikona wstrzeżenia.
MB_ICONINFORMATION, MB_ICONASTERISK 0x00000040 Ikona informacji.
Tab. 27 Flagi przycisków okna.

62
Stała Wartość Opis
MB_DEFBUTTON1 0x00000000 Pierwszy przycisk jest przyciskiem domyślnym.
MB_DEFBUTTON2 0x00000100 Drugi przycisk jest przyciskiem domyślnym.
MB_DEFBUTTON3 0x00000200 Trzeci przycisk jest przyciskiem domyślnym.
MB_DEFBUTTON4 0x00000300 Czwarty przycisk jest przyciskiem domyślnym.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_FUNC_NOT_ALLOWED_IN_TESTING (4059) ERR_STRING_PARAMETER_EXPECTED (4062)
ERR_CUSTOM_INDICATOR_ERROR (4055)
Parametry:
text - Tekst wiadomości, który ma być wyświetlony.
captionn - Tytuł okna dialogowego. Jeśli parametrem jest NULL, tytułem będzie nazwa skryptu.
flags - Specyfikacja zawartości i zachowania okna dialogowego (tab. 3, 25, 26, 27, 28).
Przykład:
#include <WinUser32.mqh>
//...
int ret = MessageBox("Yes or No", "Wybór nalerzy do Ciebie", MB_YESNO | MB_ICONQUESTION);
if(ret == IDYES)
Print("Jesteś pozytywnie zakręcony");
else
Print("Czy zawsze jesteś na nie?");

f. PlaySound()

void PlaySound(string filename)

Funkcja PlaySound() odtwarza plik dźwiękowy zadany pierwszym argumentem. Plik musi być zlokalizowany w katalogu .\souds lub w jego
podkatalogach.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_WRONG_FILE_NAME (4101)
Parametry:
filename - plik dźwiękowy.
Przykład:
PlaySound("alert.wav");

g. Print()

void Print(...)

Funkcja Print() wyświetla zadaną wiadomość w dzienniku. Argumenty mogą być dowolnego typu poza typem tablicowym. Jednak pojedyncze
elementy tablicy mogą stanowić argument wywołania funkcji. Dane typu bool, datetime i color będą wyświetlane jako wartości numeryczne. Funkcja
TimeToStr() konwertuje wartość datetime na string.
Parametry:
... - Jakiekolwiek wartości, oddzielone przecinkami.
Przykład:
double a1[] = {1, 2, 3, 5, 11, 8, 7, 4};
for(int i = 0; i < 8; i++) Print(a1[i]);

h. SendFTP()

bool SendFTP(string filename, string ftp_path=NULL)

Funkcja SendFTP() jeśli jest włączona wysyła plik na serwer FTP na konto ustawione w zakładce Tools -> Options -> Publisher. Funkcja nie działa
w trybie testowym i nie może być wywołana przez wskaźniki. Plik musi być zlokalizowany w katalogu .\experts\files lub w jego podkatalogach. Plik nie
będzie wysłany jeśli nie będzie podanego w ustawieniach adresu FTP i/lub hasła dostępu.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_FUNC_NOT_ALLOWED_IN_TESTING (4059) ERR_STRING_PARAMETER_EXPECTED (4062)
ERR_CUSTOM_INDICATOR_ERROR (4055)
Parametry:
filename - Plik do wysłania.
ftp_path - Ścieżka FTP. Jeśli ścieżka nie będzie podana to użyta będzie ścieżka ustawiona w terminalu.
Przykład:
if(!SendFTP("plik.txt")) Print("Wysłanie pliku nie powiodło się.");

i. SendMail()

void SendMail(string subject, string some_text)

Funkcja SendMail() jeśli jest włączona wysyła wiadomość e-mail do adresata ustawionego w zakładce Tools -> Options -> EMail.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_FUNC_NOT_ALLOWED_IN_TESTING (4059) ERR_FUNCTION_NOT_CONFIRMED (4060)
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_SEND_MAIL_ERROR (4061)
Parametry:
Subject - Temat wiadomości.
some_text - Wiadomość.
Przykład:

63
if(Close[0] > 3.3541) SendMail("ForEx", "Cena: " + DoubleToStr(Close[0]));

j. Sleep()

void Sleep(int milliseconds)

Funkcja Sleep() wstrzymuje wykonanie kodu programu na czas zadany argumentem. Interwał zadany pierwszym argumentem jest mierzony w
milisekundach.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_CUSTOM_INDICATOR_ERROR (4055)
Parametry:
Millisecondsn - Interwał w millisekundach.
Przykład:
Sleep(7);

k. SpeechText()

void SpeechText(string text, int lang_mode=SPEECH_ENGLISH)

Funkcja SpeechText() syntezuje tekst zadany pierwszym argumentem. Drugi argument określa język syntezy tekstu. Od wersji 188 funkcja
SpeechText() jest dostępna tylko jako funkcja biblioteczna i standardowo nie jest dołączana do terminala klienckiego.
Parametry:
text - Tekst do syntezy.
lang_mode - Język syntezy. Domyślnie SPEECH_ENGLISH alternatywnie SPEECH_NATIVE.
Przykład:
SpeechText("Cena " + DoubleToStr(Ask));

64
17. FUNKCJE KONWERSJI
⇒ Funkcje konwer sji
⇒ CharToStr()
⇒ DoubleToStr()
⇒ Nor malizeDouble()
⇒ StrToDouble()
⇒ StrToInte ger()
⇒ StrToTime()
⇒ TimeToStr()
1. Funkcje konwer sji

W niektórych sytuacjach potrzebujemy jakiejś zmiennej w danym formacie użyć w innym formacie. Typy podstawowe takie jak int i double są
konwertowane automatycznie, ale z automatycznym konwertowaniem należy bardzo uważać jak to obrazuje przykład. Typy pochodne takie jak datetime
są traktowane jak odpowiadające im typy podstawowe, żeby wyświetlić wartość typu datetime w odpowiednim formacie konieczne jest skorzystanie z
funkcji TimeToStr, która przekonwertuje wartość typu datetime na wartość typu string.
Przykład:
for(int i = 1, int j = -1; i < 3; i++, j--) Print(i + j);
// wyniki:
// dla 1: 1-1 zamiast 0
// dla 2: 2-2 zamiast 0

2. CharToStr()

string CharToStr(int char_code)

Funkcja CharToStr() zwraca string ze znakiem ASCII którego kod jest zadany argumentem.
Parametry:
char_code - Kod znaku ASCII.
Przykład:
string s = CharToStr(75) + CharToStr(111) + CharToStr(110) + CharToStr(114) + CharToStr(97) + CharToStr(100);
// s = "Konrad";
for(int i = 97, s = ""; i < 100; i++) StringConcatenate(s, CharToStr(i));
// s = "abc";

c. DoubleToStr()

string DoubleToStr(double value, int digits)

Funkcja DoubleToStr() zwraca string z tekstowym zapisem wartości liczby zadanej pierwszym argumentem. Drugi argument określa liczbę cyfr po
kropce od 0 do 8.
Parametry:
value - Wartości numeryczna.
digits - Liczba cyfr po kropce (0 - 8).
Przykład:
string s = DoubleToStr(3.1415926535897932384626433832795, 2); // s = "3.14";

d. Nor malizeDouble()

double NormalizeDouble(double value, int digits)

Funkcja NormalizeDouble() zwraca zaokrągloną liczbę zmiennoprzecinkową zadaną pierwszym parametrem. Drugi parametr określa liczbę cyfr po
kropce.
Parametry:
value - Liczba zmiennoprzecinkowa.
digits - Liczba cyfr po kropce (0 - 8).
Przykład:
double d= 3.14159265;
d = NormalizeDouble(d1, 2); // d = 3.14;

e. StrToDouble()

double StrToDouble(string value)

Funkcja StrToDouble() konwertuje string zadany argumentem na liczbę typu double.


Parametry:
value - String zawierający reprezentację wartości liczbowej.
Przykład:

65
double d = StrToDouble("3.14159265"); // d = 3.14159265

f. StrToInte ger()

int StrToInteger(string value)

Funkcja StrToInteger() konwertuje string zadany argumentem reprezentujący liczbę całkowitą na typ int.
Parametry:
value - String zawierający reprezentację wartości liczbowej.
Przykład:
int i = StrToInteger("314159265"); // i = 314159265

g. StrToTime()

datetime StrToTime(string value)

Funkcja StrToTime() konwertuje string zadany argumentem w formacie "RRRR.MM.DD [GG:MM]" lub "[RRRR.MM.DD] GG:MM" na typ datetime.
Parametry:
value - String zawierający wartość daty/czasu w formacie "RRRR.MM.DD [GG:MM]" lub "[RRRR.MM.DD] GG:MM".
Przykład:
datetime d1 = StrToTime("2007.1.10 13:33");
datetime d2 = StrToTime("13:33"); // bierząca data godzina 13:33
datetime d3 = StrToTime("2007.1.10"); // północ 10 styczna 2007

h. TimeToStr()

string TimeToStr(datetime value, int mode=TIME_DATE|TIME_MINUTES)

Funkcja TimeToStr() konwertuje typ datetime na string. Format zwracanego łańcucha zależy od parametru mode. Domyślnie jest zwracany string w
formacie "RRRR.MM.DD GG:MM".
Tab. 28 Stałe konwersji typu datetime.
Stała Format
TIME_DATE RRRR.MM.DD
TIME_MINUTES GG:MM
TIME_SECONDS GG:MM:SS
Parametry:
value - Liczba sekund od północy 1 stycznia 1970 roku.
mode - Formatowanie, jedna lub kombinacja powyższych stałych (Tab. 28).
Przykład:
string s = TimeToStr(TimeCurrent(), TIME_DATE | TIME_SECONDS);

66
18. W SKAŹNIKI
⇒ Wskaźniki
⇒ IndicatorBuf fer s()
⇒ IndicatorCounted()
⇒ IndicatorDigits()
⇒ IndicatorShor tName()
⇒ SetIndexAr r ow()
⇒ SetIndexBuf fer()
⇒ SetIndexDr awBe gin()
⇒ SetIndexEmptyValue()
⇒ SetIndexLabel()
⇒ SetIndexShift()
⇒ SetIndexStyle()
⇒ SetLevelStyle()
⇒ SetLevelValu()
1. Wskaźniki

Poniższe funkcje są zbiorem funkcji używanych do ustawiania właściwości kodowanych wskaźników i nie są używane przy pisaniu automatycznych
systemów transakcyjnych czy skryptów.

2. IndicatorBuf fer s()

void IndicatorBuffers(int count)

Funkcja IndicatorBuffers() alokuje wymaganą pamięć dla buforów używanych do pracy na wskaźnikach. Ilość buforów zadanych argumentem nie
może być większa od 8 i mniejsza od właściwości indicator_buffers. Jeśli wskaźnik wymaga dodatkowych buforów do obliczeń, ta funkcja musi być użyta
do określenia całkowitej liczby buforów. Różnica pomiędzy liczbą buforów zaalokowanych przez właściwość indicator_buffers i funkcję IndicatorBuffers()
będzie wykorzystywana na dodatkowe bufory wykorzystywane do obliczeń, z zastrzeżeniem, iż tylko pierwszych indicator_buffers buforów będzie
rysowane.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
count - Liczba buforów do alokacji. Liczba buforów powinna mieścić się między wartością indicator_buffers a 8.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- deklaracja buforów
IndicatorBuffers(2);
//---- przypisywanie buforów wskaźników
SetIndexBuffer(0, ExtBuffer0);
SetIndexBuffer(1, ExtBuffer1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

c. IndicatorCounted()

int IndicatorCounted()

Funkcja IndicatorCounted() zwraca liczbę świec, które nie zmieniły wartości a inaczej ujmując, których aktualna wartość już została przeliczona w
poprzednich wywołaniach funkcji start wskaźnika. W przypadku pierwszego wywołania funkcji start funkcja ta zwróci wartość 0 ponieważ wskaźnik nie
przeliczył jeszcze żadnej świecy. Większość obliczanych świec nie wymaga przeliczenia. Funkcja używana dla optymalizowania obliczeń.
67
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Aqua
#property indicator_color3 Aqua
//---- bufory
double BBuf[], RBuf[], LBuf[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
SetIndexBuffer(0, BBuf);
SetIndexBuffer(1, RBuf);
SetIndexBuffer(2, LBuf);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int j = IndicatorCounted();
if(j < 0) return(-1); // w przypadku błędu zwróci -1
if(j) j--; // ostatnia policzona świeca będzie przeliczona
for(int i = 0; i < (Bars - j); i++) // pętla główna
{
BBuf[i] = iMA(NULL, 0, JawsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
RBuf[i] = iMA(NULL, 0 ,TeethPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
LBuf[i] = iMA(NULL, 0, LipsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
}
return(0);
}
//+------------------------------------------------------------------+
UWAGA: Ostatnia świeca nie jest brana pod uwagę w obliczeniach i w większości przypadków jest konieczne przeliczenie tylko tej świecy. Jednak
występują przypadki graniczne, gdzie wskaźnik jest wywoływany z poziomu strategii przy tworzeniu nowej świecy. Możliwe jest, że ostatnia wartość
poprzedniej świecy nie została przeliczona, wskaźnik nie został wywołany i jego wartość nie była obliczona. Aby uniknąć błędnego obliczenia wartości
wskaźnika w takich sytuacjach, należ dodatkowo wartość funkcji IndicatorCounted() zmniejszyć o jeden, jeśli wartość ta jest większe od zera.

d. IndicatorDigits()

void IndicatorDigits(int digits)

Funkcja IndicatorDigits() zmienia domyślną liczbę cyfr po kropce dziesiętnej na zadaną argumentem precyzję formatowania dla wyświetlania
wskaźnika. Domyślną wartością jest precyzja formatowania używana na głównym wykresie instrumentu.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
digits - Precyzja formatowania, liczba cyfr po kropce.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
IndicatorDigits(5);
//---- przypisywanie buforów wskaźników
SetIndexBuffer(0, ExtBuffer);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()

68
{
//...
}
//+------------------------------------------------------------------+

e. IndicatorShor tName()

void IndicatorShortName(string name)

Funkcja IndicatorShortName() ustawia zadaną argumentem krótką nazwę wskaźnika, która jest widoczna na wykresie w lewym górnym rogu
oddzielnego okna.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
name - Krótka nazwa.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];
//---- parametry
extern double Period = 14;

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
SetIndexBuffer(0, ExtBuffer);
//---- nazwa
IndicatorShortName("Os (" + Period + ")");
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

f. SetIndexAr r ow()

void SetIndexArrow(int index, int code)

Funkcja SetIndexArrow() ustawia symbol kursora dla wskaźników na zadany symbol czcionki Wingdings.
Tab. 29 Symbole czcionki Wingdings.
Symbol Kod Symbol Kod Symbol Kod Symbol Kod Symbol Kod Symbol Kod Symbol Kod
32  64  96  128 160  192  224
 33  65  97  129  161  193  225
 34  66  98  130  162  194  226
 35  67  99  131  163  195  227
 36  68  100  132  164  196  228
 37  69  101  133  165  197  229
 38  70  102  134  166  198  230
 39  71  103  135  167  199  231
 40  72  104  136  168  200  232
 41  73  105  137  169  201  233
 42  74  106  138  170  202  234
 43  75  107  139  171  203  235
 44  76  108  140  172  204  236
 45  77  109  141  173  205  237
 46  78  110  142  174  206  238

69
Symbol Kod Symbol Kod Symbol Kod Symbol Kod Symbol Kod Symbol Kod Symbol Kod
 47  79  111  143  175  207  239
 48  80  112  144  176  208  240
 49  81  113  145  177  209  241
 50  82  114  146  178  210  242
 51  83  115  147  179  211  243
 52  84  116  148  180  212  244
 53  85  117  149  181  213  245
 54  86  118  150  182  214  246
 55  87  119  151  183  215  247
 56  88  120  152  184  216  248
 57  89  121  153  185  217  249
 58  90  122  154  186  218  250
 59  91  123  155  187  219  251
 60  92  124  156  188  220  252
 61  93  125  157  189  221  253
 62  94  126  158  190  222  254
 63  95  127  159  191  223  255
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
index - Indeks bufora od 0 do 7.
code - Kod symbolu z czcionki Wingdings lub stała.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetIndexArrow(0, 176);
//---- przypisywanie buforów wskaźników
SetIndexBuffer(0, ExtBuffer);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

g. SetIndexBuf fer()

bool SetIndexBuffer(int index, double array[])

Funkcja SetIndexBuffer() ustawia bufor wskaźnika. Do tablicy zadanej drugim argumentem zostanie podpięty bufor wskaźnika zadany pierwszym
argumentem. Jeśli funkcja zakończy się błędem, zostanie zwrócona wartość FALSE w przeciwnym razie zostanie zwrócona wartość TRUE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_INCOMPATIBLE_ARRAYS (4056)
ERR_INCORRECT_SERIESARRAY_USING (4054)
Parametry:
index - Indeks bufora od 0 do 7.
array[] - Tablica danych.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

70
//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

h. SetIndexDr awBe gin()

void SetIndexDrawBegin(int index, int begin)

Funkcja SetIndexDrawBegin() ustawia indeks świecy zadany pierwszym argumentem, od którego linia wskaźnika się zaczyna. Wartości przed tym
indeksem nie są pokazywane w oknie danych.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
index - Indeks bufora od 0 do 7.
begin - Indeks pierwszej rysowanej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_buffers 1
#property indicator_color1 Aqua
//---- parametry
extern double Period = 14;
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetIndexDrawBegin(0, Period);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

i. SetIndexEmptyValue()

void SetIndexEmptyValue(int index, double value)

Funkcja SetIndexEmptyValue() ustawia wartość pustej linii wykresu. Wartość ta nie jest rysowane i pokazywane w oknie danych. Pusta linia ma
wartość EMPTY_VALUE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
index - Indeks bufora od 0 do 7.
value - Nowa pusta wartość.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
71
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetIndexEmptyValue(0, 0);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

j. SetIndexLabel()

void SetIndexLabel(int index, string text)

Funkcja SetIndexLabel() wyświetla opis linii w oknie danych zadany drugim argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
index - Indeks bufora od 0 do 7.
text - Tekst etykiety. NULL oznacza, że linia o tym indeksie nie ma etykiety.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- nazwa
SetIndexLabel(0, "Os");
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

k. SetIndexShift()

void SetIndexShift(int index, int shift)

Funkcja SetIndexShift() ustawia przesunięcie linii o wartość zadaną drugim argumentem względem oryginalnej pozycji. Linia będzie przeliczona, a
potem przesunięta.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
index - Indeks bufora od 0 do 7.
shift - Przesunięcie wartości w świecach.
Przykład:
72
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetIndexShift(0, 14);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

l. SetIndexStyle()

void SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE)

Funkcja SetIndexStyle() ustawia nowy typ zadany drugim argumentem, styl zadany trzecim argumentem, szerokość zadaną czwartym argumentem
i kolor zadany piątym argumentem dla linii wskaźnika zadanego pierwszym argumentem.
Tab. 30 Styl kształtu.
Stała Wartość
DRAW_LINE 0
DRAW_SECTION 1
DRAW_HISTOGRAM 2
DRAW_ARROW 3
DRAW_ZIGZAG 4
DRAW_NONE 12
Tab. 31 Styl linii.
Stała Wartość Styl
STYLE_SOLID 0 ──────
STYLE_DASH 1 ------
STYLE_DOT 2 ······
STYLE_DASHDOT 3 -·-·-·
STYLE_DASHDOTDOT 4 -··-··
Styl linii jest brany pod uwagę, kiedy width = 1.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
index - Indeks bufora od 0 do 7.
type - Styl kształtu (Tab. 30).
style - Styl linii (Tab. 31), styl linii dla wartości: 2, 3, 4, 5 przyjmuje wartość STYLE_SOLID.
width - Grubość linii, wartości: 1, 2, 3, 4, 5.
clr - Kolor linii (tab. 6).
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetIndexStyle(0, DRAW_HISTOGRAM, EMPTY, 4, Blue);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);

73
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

m. SetLevelStyle()

void SetLevelStyle(int draw_style, int line_width, color clr=CLR_NONE)

Funkcja SetLevelStyle() ustawia nowy styl, szerokość i kolor linii poziomu dla wskaźnika w oddzielnym oknie.
Parametry:
style - Styl linii, EMPTY - bez zmian (Tab. 31), styl dla wartości: 2, 3, 4, 5 przyjmuje wartość STYLE_SOLID.
width - Grubość linii, wartości: 1, 2, 3, 4, 5, EMPTY - bez zmian.
clr - Kolor linii (tab. 6).
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_level1 0.2
#property indicator_level2 0.3
#property indicator_level3 0.4
#property indicator_level4 0.6
#property indicator_level5 0.7
#property indicator_level6 0.8
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetLevelStyle(STYLE_SOLID, EMPTY, Red);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

n. SetLevelValue()

void SetLevelValue(int level, double value)

Funkcja SetLevelValue() ustawia wartość linii poziomu dla wskaźnika w oddzielnym oknie.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
level - Indeks linii poziomu (0-31).
value - Wartość do ustawienia.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |

74
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetLevelValue(0, 0.2);
SetLevelValue(1, 0.3);
SetLevelValue(2, 0.4);
SetLevelValue(3, 0.6);
SetLevelValue(4, 0.7);
SetLevelValue(5, 0.8);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
//...
}
//+------------------------------------------------------------------+

75
19. F UNKCJE DATY I CZASU
⇒ Funkcje daty i czasu
⇒ TimeCur r ent()
⇒ Day()
⇒ DayOfWeek()
⇒ DayOfYear()
⇒ Hour()
⇒ TimeLocal()
⇒ Minute()
⇒ Month()
⇒ Seconds()
⇒ TimeDay()
⇒ TimeDayOfWeek()
⇒ TimeDayOfYear()
⇒ TimeHour()
⇒ TimeMinute()
⇒ TimeMonth()
⇒ TimeSeconds()
⇒ TimeYear()
⇒ Year()
1. Funkcje daty i czasu

Funkcje daty i czasu są funkcjami, które przetwarzają czas w konwencji UNIX. Przed przeczytaniem tego rozdziału zalecam przeczytanie rozdziału
trzeciego, punkt „Typ daty i czasu (datetime)” dla zrozumienia podstaw, które leżą u podstaw operacji na dacie i czasie.

b. Day()

int Day()

Funkcja Day() zwraca aktualny dzień miesiąca obliczony na podstawie ostatnio wysłanej przez serwer wartości czasu. Serwer wysyła do terminala
czterobajtowy znacznik czasu w postaci liczby sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W trybie testowym wartość
ta jest emulowana przez tester.
Przykład:
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += (TimeDay(OrderOpenTime()) == Day());
}

c. DayOfWeek()

int DayOfWeek()

Funkcja DayOfWeek() zwraca indeks aktualnego dna tygodnia zgodnie w specyfikacją kalendarza (0 - nd, 1 - pn, 2 - wt, 3 - śr, 4 - cz, 5 - pt, 6 - so)
obliczony na podstawie ostatnio wysłanej przez serwer wartości czasu. Serwer wysyła do terminala czterobajtowy znacznik czasu w postaci liczby
sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W trybie testowym wartość ta jest emulowana przez tester.
Przykład:
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += ((TimeDay(OrderOpenTime()) == Day()) && (TimeDayOfWeek(OrderOpenTime()) == DayOfWeek()));
}

d. DayOfYear()

int DayOfYear()

Funkcja DayOfYear() zwraca aktualny dzień roku (1, 2, ..., 365 (366)) obliczony na podstawie ostatnio wysłanej przez serwer wartości czasu. Serwer
wysyła do terminala czterobajtowy znacznik czasu w postaci liczby sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W
trybie testowym wartość ta jest emulowana przez tester.
Przykład:
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += (TimeDayOfYear(OrderOpenTime()) == DayOfYear());
}

e. Hour()

76
int Hour()

Funkcja Hour() zwraca bieżącą godzinę (0, 1, ..., 23) obliczony na podstawie ostatnio wysłanej przez serwer wartości czasu. Serwer wysyła do
terminala czterobajtowy znacznik czasu w postaci liczby sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W trybie testowym
wartość ta jest emulowana przez tester.
Przykład:
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += ((TimeDayOfYear(OrderOpenTime()) == DayOfYear()) && (Hour(OrderOpenTime()) == Hour()));
}
UWAGA: Godzina zwrócona przez tą funkcję jest godziną z momentu startu programu i nie zmienia się podczas wykonania programu.

f. Minute()

int Minute()

Funkcja Minute() zwraca bieżącą minutę (0, 1, ..., 59) obliczony na podstawie ostatnio wysłanej przez serwer wartości czasu. Serwer wysyła do
terminala czterobajtowy znacznik czasu w postaci liczby sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W trybie testowym
wartość ta jest emulowana przez tester.
Przykład:
kw = 1 + Minute() / 15;
Print("kwadrans: " + kw);
UWAGA: Jak wartość zwracana przez funkcję Hour, minuta zwracana przez tą funkcję jest minutą z momentu startu programu i nie zmienia się
podczas wykonania programu.

g. Month()

int Month()

Funkcja Month() zwraca bieżący miesiąc (1, 2, ..., 12) obliczony na podstawie ostatnio wysłanej przez serwer wartości czasu. Serwer wysyła do
terminala czterobajtowy znacznik czasu w postaci liczby sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W trybie testowym
wartość ta jest emulowana przez tester.
Przykład:
int kw = 1 + Month() / 4;
return("kwartał " + kw);

h. Seconds()

int Seconds()

Funkcja Seconds() zwraca bieżącą sekundę (0, 1, ..., 59) obliczony na podstawie ostatnio wysłanej przez serwer wartości czasu. Serwer wysyła do
terminala czterobajtowy znacznik czasu w postaci liczby sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W trybie testowym
wartość ta jest emulowana przez tester.
Przykład:
int begin = Seconds() + Minute() * 60 + Hour() * 3600;
//...
int end = Seconds() + Minute() * 60 + Hour() * 3600;
if(MathAbs(end - begin) > 2)
Print("Przekroczono czas operacji!");
else
{
//...
}
UWAGA: Jak wartość zwracana przez funkcje Hour() i Minute(), sekunda zwracana przez tą funkcję jest sekundą z momentu startu programu i nie
zmienia się podczas wykonania programu.

9. TimeCur r ent()

datetime TimeCurrent()
(datetime CurTime())

Funkcja TimeCurrent() zwraca ostatnią wysłaną przez serwer wartość czasu. Serwer wysyła do terminala czterobajtowy znacznik czasu w postaci
liczby sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W trybie testowym wartość ta jest emulowana przez tester.
Przykład:
int TimrZone()
{
return((TimeCurrent() - TimeLocal()) / 3600);
}

j. TimeDay()

int TimeDay(datetime date)

Funkcja TimeDay() zwraca dzień miesiąca zadany argumentem. (1, 2, ...).

77
Parametry:
date - Typ datetime, jest interpretowany, jako liczba sekund od 1970.01.01 00:00:00.
Przykład:
datetime bd = D'1983.02.11';
int UrDzi = TimeDay(bd); // UrDzi = 11;

k. TimeDayOfWeek()

int TimeDayOfWeek(datetime date)

Funkcja TimeDayOfWeek() zwraca dzień tygodnia zadany argumentem (0 - nd, 1 - pn, 2 - wt, 3 - śr, 4 - cz, 5 - pt, 6 - so).
Parametry:
date - Typ datetime, jest interpretowany, jako liczba sekund od 1970.01.01 00:00:00.
Przykład:
datetime bd = D'1983.02.11';
int TyDzień = TimeDayOfWeek(bd); // TyDzień = 5; to oznacza, że udręki tego świata dopadły mnie w piątek

l. TimeDayOfYear()

int TimeDayOfYear(datetime date)

Funkcja TimeDayOfYear() zwraca dzień roku zadany argumentem (01.01 - 1, 01.02 - 32, ...).
Parametry:
date - Typ datetime, jest interpretowany, jako liczba sekund od 1970.01.01 00:00:00.
Przykład:
datetime bd = D'1983.02.11';
int rok = TimeDayOfYear(bd); // rok = 1983;

m. TimeHour()

int TimeHour(datetime time)

Funkcja TimeHour() zwraca godzinę zadaną argumentem (0, 1, ..., 23).


Parametry:
date - Typ datetime, jest interpretowany, jako liczba sekund od 1970.01.01 00:00:00.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property show_inputs

extern int h;

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
int time = 0;
//----
for(int i = OrdersHistoryTotal(); i > 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
time += (TimeHour(OrderOpenTime()) == h);
}
Alert(time);
//----
return(0);
}
//+------------------------------------------------------------------+

n. TimeLocal()

datetime TimeLocal()
(datetime LocalTime())

Funkcja TimeLocal() zwraca bieżącą wartość czasu podaną przez zegar systemowy. Wartość, jaką zwraca funkcja TimeLocal() jest typu datetime i
jest zwracana, jako liczba sekund od północy 1 stycznia 1970. W trybie testowym wartość ta jest emulowana przez tester tak jak czas zwracany przez
serwer.
Przykład:
int TimrZone()
{
return((TimeCurrent() - TimeLocal()) / 3600);

78
}

o. TimeMinute()

int TimeMinute(datetime time)

Funkcja TimeMinute() zwraca minutę zadaną argumentem (0, 1, ..., 59).


Parametry:
date - Typ datetime, jest interpretowany, jako liczba sekund od 1970.01.01 00:00:00.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern int m;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += (TimeMinute(OrderOpenTime()) == m);
}
}
//+------------------------------------------------------------------+

p. TimeMonth()

int TimeMonth(datetime time)

Funkcja TimeMonth() zwraca miesiąc zadany argumentem (1 - sty, 2 - lut, 3 - mar, 4 - kwi, 5 - maj, 6 - cze, 7 - lip, 8 - sie, 9 - wrz, 10 - paź, 11 - lis,
12 - gru).
Parametry:
date - Typ datetime, jest interpretowany, jako liczba sekund od 1970.01.01 00:00:00.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern int mm;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += (TimeMonth(OrderOpenTime()) == mm);
}
}
//+------------------------------------------------------------------+

q. TimeSeconds()

int TimeSeconds(datetime time)

Funkcja TimeSeconds() zwraca sekundę zadaną argumentem (0, 1, ..., 59).


Parametry:
date - Typ datetime, jest interpretowany, jako liczba sekund od 1970.01.01 00:00:00.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+

79
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern int s;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += (TimeSeconds(OrderOpenTime()) == s);
}
}
//+------------------------------------------------------------------+

r. TimeYear()

int TimeYear(datetime time)

Funkcja TimeYear() zwraca rok zadany argumentem. Funkcja zwraca na wartość jest z zakresu 1970 - 2037.
Parametry:
date - Typ datetime, jest interpretowany, jako liczba sekund od 1970.01.01 00:00:00.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern int y;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += (TimeYear(OrderOpenTime()) == y);
}
}
//+------------------------------------------------------------------+

s. Year()

int Year()

Funkcja Year() zwraca bieżący rok obliczony na podstawie ostatnio wysłanej przez serwer wartości czasu. Serwer wysyła do terminala
czterobajtowy znacznik czasu w postaci liczby sekund od północy 1 stycznia 1970 za każdym razem, gdy wysyła notowania. W trybie testowym wartość
ta jest emulowana przez tester.
Przykład:
for(int i = OrdersHistoryTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
int time += (TimeYear(OrderOpenTime()) == Year());
}

80
20. F UNKCJE PLIKOWE
⇒ Funkcje plikowe
⇒ FileClose()
⇒ FileDelete()
⇒ FileFlush()
⇒ FileIsEnding()
⇒ FileIsLineEnding()
⇒ FileOpen()
⇒ FileOpenHistor y()
⇒ FileReadAr r ay()
⇒ FileReadDouble()
⇒ FileReadInte ger()
⇒ FileReadNumber()
⇒ FileReadString()
⇒ FileSeek()
⇒ FileSize()
⇒ FileTell()
⇒ FileWrite()
⇒ FileWriteAr r ay()
⇒ FileWriteDouble()
⇒ FileWriteInte ger()
⇒ FileWriteString()
1. Funkcje plikowe

Jedną z irytujących cech, jest ograniczenie dostępu do plików. Dostęp do plików został ograniczony do niektórych katalogów. Niemożna pracować z
plikami, które się znajdują poza jednym z trzech katalogów. Funkcja FileOpenHistory() może pracować tylko z plikami z katalogu .\history\<katalog
bieżącego brokera>\. Katalog ogólnodostępny dla wykonywujących się programów to .\experts\files\ a ogólnodostępny katalog dla wykonywujących się
programów w trybie testowym to .\tester\files\. Takie ograniczenia dostępu tylko to niektórych podkatalogów katalogu instalacji MetaTrader 4 są
podyktowane względami bezpieczeństwa, chociaż są sposoby, żeby te obostrzenia obejść.

2. FileClose()

void FileClose(int handle)

Funkcja FileClose() zamyka uprzednio otworzony przez funkcję FileOpen() plik zadany argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
Przykład:
int a[8], uchwyt = FileOpen("plik", FILE_CSV | FILE_READ);
if(u > 0)
{
if(FileReadArray(uchwyt, a, 0, 8) != 8) FileClose(uchwyt);
}

c. FileDelete()

void FileDelete(string filename)

Funkcja FileDelete() usuwa zadany argumentem plik.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_WRONG_FILE_NAME (4101) ERR_SOME_FILE_ERROR (4100)
Parametry:
filename - Ścieżka do pliku.
Przykład:
FileDelete("tabela.csv"); // plik tabela.csv zostanie skasowany z katalogu .\experts\files\
UWAGA: Pliki mogą być usunięte tylko z katalogu .\experts\files\ i jego podkatalogów. Katalogiem główny dla operacji plikowych jest katalog
.\experts\files\.

d. FileFlush()

void FileFlush(int handle)

Funkcja FileFlush() zrzuca wszystkie dane przechowywane w buforze pliku, którego uchwyt jest zadany argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)

81
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
Przykład:
int uchwyt = FileOpen("tabela.csv", FILE_CSV | FILE_WRITE);
if(uchwyt > 0)
{
FileWrite(uchwyt, "#","OPEN","CLOSE","HIGH","LOW");
for(int i = 0; i < Bars; i++) FileWrite(uchwyt, i + 1, Open[i], Close[i], High[i], Low[i]);
FileFlush(uchwyt);
//...
FileClose(uchwyt);
}

e. FileIsEnding()

bool FileIsEnding(int handle)

Funkcja FileIsEnding() zwraca wartość TRUE, jeśli wskaźnik pliku, którego uchwyt jest zadany argumentem jest na końcu pliku, w przeciwnym razie
zwraca wartość FALSE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
Przykład:
if(FileIsEnding(uchwyt)) FileClose(uchwyt);

f. FileIsLineEnding()

bool FileIsLineEnding(int handle)

Funkcja FileIsLineEnding() dla plików CSV zwraca wartość TRUE, jeśli wskaźnik zadanego argumentem pliku jest na końcu wiersza, w przeciwnym
razie zwraca wartość FALSE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
Przykład:
if(FileIsEnding(uchwyt)) FileClose(uchwyt);

g. FileOpen()

int FileOpen(string filename, int mode, int delimiter=';')

Funkcja FileOpen() podejmuje próbę otwarcia pliku z katalogów .\experts\files\, .\tester\files\ lub ich podkatalogów, zadanego pierwszym
argumentem do odczytu i/lub zapisu. Funkcja zwraca unikalny uchwyt otwartego pliku, który wykorzystuje większość funkcji plikowych, aby pracować z
otworzonym plikiem lub jeśli funkcja się nie powiedzie, zwraca wartość -1.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_TOO_MANY_OPENED_FILES (4102) ERR_SOME_FILE_ERROR (4100)
ERR_WRONG_FILE_NAME (4101) ERR_CANNOT_OPEN_FILE (4103)
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
filename - Ścieżka do pliku.
mode - Tryb otwarcia, jedna lub kombinacja wartości: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE.
delimiter - Znak ogranicznika dla plików csv. Domyślnie jest to symbol ';'.
Przykład:
int uchwyt = FileOpen("tabela.csv", FILE_CSV | FILE_READ);
UWAGA: Pliki mogą być otwierane tylko z katalogu .\experts\files\ i jego podkatalogów. Katalogiem główny dla operacji plikowych jest katalog
.\experts\files\.

h. FileOpenHistor y()

int FileOpenHistory(string filename, int mode, int delimiter=';')

Funkcja FileOpenHistory() podejmuje próbę otwarcia pliku zadanego pierwszym argumentem z katalogu .\experts\history\ z podkatalogu
wskazanego przez brokera i jego dalszych podkatalogów do odczytu i/lub zapisu. Funkcja zwraca unikalny uchwyt otwartego pliku, który wykorzystuje
większość funkcji plikowych, aby pracować z otworzonym plikiem lub jeśli funkcja się nie powiedzie, zwraca wartość -1. Funkcja może być przydatna do
tworzenia historii dla nie standardowych okresów. Plik utworzony w katalogu \history może zostać otworzony offline.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_TOO_MANY_OPENED_FILES (4102) ERR_SOME_FILE_ERROR (4100)
ERR_WRONG_FILE_NAME (4101) ERR_CANNOT_OPEN_FILE (4103)
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
filename - Ścieżka do pliku.
mode - Tryb otwarcia, jedna lub kombinacja wartości: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE.
delimiter - Znak ogranicznika dla plików csv. Domyślnie jest to symbol ';'.
Przykład:
82
int uchwyt = FileOpenHistory("tabela.hst", FILE_BIN | FILE_WRITE);
UWAGA: Terminal kliencki może łączyć się z serwerami różnych brokerów. Dane historyczne w plikach HST dla każdego brokera są zapisywane w
odpowiednim podkatalogu katalogu .\history\.

i. FileReadAr r ay()

int FileReadArray(int handle, object& array[], int start, int count)

Funkcja FileReadArray() wczytuję liczbę elementów zadaną czwartym argumentem z pliku binarnego, którego uchwyt jest zadany pierwszym
argumentem do tablicy zadanej drugim argumentem. Funkcja zwraca liczbę wczytanych elementów.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_SOME_FILE_ERROR (4100)
ERR_INCOMPATIBLE_FILEACCESS (4104) ERR_END_OF_FILE (4099)
ERR_SOME_ARRAY_ERROR (4053)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
array[] - Tablica, w której dane będą przechowywane.
start - Indeks początkowy.
count - Liczba elementów do wczytania.
Przykład:
int tab[8], uchwyt = FileOpen("plik.dat", FILE_BIN | FILE_READ);
if(uchwyt > 0)
{
FileReadArray(uchwyt, tab, 0, 8);
FileClose(uchwyt);
}
UWAGA: Tablica musi mieć odpowiedni rozmiar, zanim dane do niej zostaną wczytane.

j. FileReadDouble()

double FileReadDouble(int handle, int size=DOUBLE_VALUE)

Funkcja FileReadDouble() czyta liczbę zmiennoprzecinkową z bieżącej pozycji w pliku binarnym, którego uchwyt jest zadany pierwszym
argumentem. Rozmiar formatu zadany drugim argumentem może być jedną z wartości: DOUBLE_VALUE dla elementów 8 bajtowych i FLOAT_VALUE
dla elementów 4 bajtowych. Domyślnie jest używany rozmiar DOUBLE_VALUE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_END_OF_FILE (4099)
ERR_INCOMPATIBLE_FILEACCESS (4104)
Parametry:
handle - Uchwyt pliku, zwrócony przez funkcję FileOpen.
size - Rozmiar formatu, domyślnie 8 bajtów - DOUBLE_VALUE alternatywnie 4 bajty FLOAT_VALUE.
Przykład:
int uchwyt = FileOpen("plik.dat", FILE_BIN | FILE_READ);
double x;
if(uchwyt > 0)
{
x = FileReadDouble(uchwyt);
FileClose(uchwyt);
}

k. FileReadInte ger()

int FileReadInteger(int handle, int size=LONG_VALUE)

Funkcja FileReadInteger() czyta liczbę całkowitą z bieżącej pozycji w pliku binarnym, którego uchwyt jest zadany pierwszym argumentem. Rozmiar
format zadany drugim argumentem może być jedną z wartości: CHAR_VALUE dla elementów 1 bajtowych, SHORT_VALUE dla elementów 2 bajtowych i
LONG_VALUE dla elementów 4 bajtowych. Domyślnie jest używany rozmiar LONG_VALUE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_END_OF_FILE (4099)
ERR_INCOMPATIBLE_FILEACCESS (4104)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
size - Rozmiar formatu, domyślnie 4 bajtów - LONG_VALUE, alternatywnie 2 bajty SHORT_VALUE, 1 bajt CHAR_VALUE.
Przykład:
int x, uchwyt = FileOpen("plik.dat", FILE_BIN | FILE_READ);
if(uchwyt > 0)
{
x = FileReadInteger(uchwyt);
FileClose(uchwyt);
}

l. FileReadNumber()

double FileReadNumber(int handle)

Funkcja FileReadNumber() czyta liczbę z bieżącej pozycji w pliku, którego uchwyt jest zadany argumentem do znaku ogranicznika dla plików CSV.
Domyślnie jest to symbol ';'.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:

83
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_SOME_FILE_ERROR (4100)
ERR_INCOMPATIBLE_FILEACCESS (4104) ERR_END_OF_FILE (4099)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
Przykład:
int x, uchwyt = FileOpen("tabela.csv", FILE_CSV | FILE_READ, ",");
if(uchwyt > 0)
{
x = FileReadNumber(uchwyt);
FileClose(uchwyt);
}

m. FileReadString()

string FileReadString(int handle, int length=0)

Funkcja FileReadString() odczytuje string z bieżącej pozycji w pliku, którego uchwyt jest zadany pierwszym argumentem. Stosowana do plików CSV
i binarnych. Pliki tekstowe będą czytane do ogranicznika a z plików binarnych będzie czytana zadana drogim argumentem liczba znaków.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_TOO_LONG_STRING (4011)
ERR_INCOMPATIBLE_FILEACCESS (4104) ERR_END_OF_FILE (4099)
ERR_SOME_FILE_ERROR (4100)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
length - Liczba znaków do przeczytania.
Przykład:
int uchwyt = FileOpen("tabela.csv", FILE_CSV | FILE_READ);
string str = FileReadString(handle);

n. FileSeek()

void FileSeek(int handle, int offset, int origin)

Funkcja FileSeek() przesuwa wskaźnik pliku w pliku, którego uchwyt jest zadany pierwszym argumentem o liczbę bajtów zadaną drugim
argumentem.
Tab. 32 Pozycjonowanie w pliku.
Stała Pozycja
SEEK_CUR Względem aktualnej pozycji.
SEEK_SET Względem początku.
SEEK_END Względem końca.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
handle - Uchwyt pliku, zwrócony przez funkcję FileOpen.
offset - Offset w bajtach.
origin - Pozycja wyjściowa, jedna z stałych (Tab. 32).
Przykład:
int uchwyt = FileOpen("tabela.csv", FILE_CSV | FILE_READ, ";");
FileSeek(uchwyt, 4, SEEK_END);
int x = FileReadIneger(uchwyt);
FileClose(uchwyt);

o. FileSize()

int FileSize(int handle)

Funkcja FileSize() zwraca rozmiar pliku, którego uchwyt jest zadany argumentem. Wartość zwracana przez funkcję wyrażona jest w bajtach.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
Przykład:
int uchwyt = FileOpen("tabela.csv", FILE_CSV | FILE_READ);
int rozmiar = FileSize(uchwyt);
FileClose(uchwyt);

p. FileTell()

int FileTell(int handle)

Funkcja FileTell() zwraca aktualną pozycję wskaźnika pliku, którego uchwyt jest zadany argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
Przykład:
84
int uchwyt = FileOpen("tabela.csv", FILE_CSV | FILE_READ);
string str = FileReadString(handle);
FileSeek(uchwyt, FileTell(uchwyt) & 0xfffffff0, SEEK_SET); // wyrównanie pozycji wskaźnika do 16

q. FileWrite()

int FileWrite(int handle, ...)

Funkcja FileWrite() zapisuje w bieżącej pozycji pliku CSV, którego uchwyt jest zadany pierwszym argumentem, wartość zadaną drugim
argumentem. Funkcja zwraca liczbę zapisanych znaków lub w przypadku błędu wartość ujemną.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_SOME_FILE_ERROR (4100)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
... - Dane do zapisu, oddzielone przecinkiem.
Przykład:
int uchwyt = FileOpen("tabela.csv", FILE_CSV | FILE_WRITE, "\t");
FileWrite(uchwyt, Close[0], Open[0], High[0], Low[0], TimeToStr(OrderOpenTime()));
FileClose(uchwyt);
UWAGA: Typy int, double automatycznie są konwertowane na string, ale typy color, datetime i bool nie są automatycznie konwertowane i są
zapisywane do pliku jako liczby.

r. FileWriteAr r ay()

int FileWriteArray(int handle, object array[], int start, int count)

Funkcja FileWriteArray() zapisuje w bieżącej pozycji tablicę do pliku binarnego, którego uchwyt jest zadany pierwszym argumentem. Tablice typu int,
bool, datetime i color są zapisane jako 4 bajtowy wartości całkowite. Tablice typu double są zapisywane jako 8 bajtowa liczba zmiennoprzecinkowa.
Tablice stringów są zapisane jako jeden string rozdzielony znakami powrót karetki i koniec linii (0x0d 0x0a). Funkcja zwraca liczbę zapisanych
elementów lub w przypadku błędu wartość ujemną.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_SOME_FILE_ERROR (4100)
ERR_INCOMPATIBLE_FILEACCESS (4104)
Parametry:
Handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
array[] - Tablica w której dane są przechowywane.
start - Indeks początkowy.
count - Liczba elementów do zapisania.
Przykład:
int uchwyt = FileOpen("plik.dat", FILE_BIN | FILE_WRITE);
FileWriteArray(handle, Open[0], 0, Bars);
FileClose(uchwyt);

s. FileWriteDouble()

int FileWriteDouble(int handle, double value, int size=DOUBLE_VALUE)

Funkcja FileWriteDouble() zapisuje w bieżącej pozycji pliku binarnego, którego uchwyt jest zadany pierwszym argumentem, liczbę
zmiennoprzecinkową. Jeśli trzeci parametr ma wartość FLOAT_VALUE to liczba zmiennoprzecinkowa jest zapisywana na 4 bajtach, w przeciwnym razie
liczba zmiennoprzecinkowa jest zapisywana na 8 bajtach. Funkcja zwraca liczbę zapisanych bajtów.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_SOME_FILE_ERROR (4100)
ERR_INCOMPATIBLE_FILEACCESS (4104)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
value - Wartość do zapisania.
size - Opcjonalna flaga formatu, domyślnie 8 bajtów - DOUBLE_VALUE alternatywnie 4 bajty FLOAT_VALUE.
Przykład:
int uchwyt = FileOpen("plik.dat", FILE_BIN | FILE_WRITE);
FileWriteDouble(uchwyt, 3,14159265);
FileClose(uchwyt);

t. FileWriteInte ger()

int FileWriteInteger(int handle, int value, int size=LONG_VALUE)

Funkcja FileWriteInteger() zapisuje w bieżącej pozycji pliku binarnego, którego uchwyt jest zadany pierwszym argumentem, liczbę całkowitą. Jeśli
trzeci parametr ma wartość SHORT_VALUE to liczba całkowita jest zapisywana na 2 bajtach, jeśli trzeci parametr ma wartość CHAR_VALUE to liczba
całkowita jest zapisywana na 1 bajcie, jeśli trzeci parametr ma wartość LONG_VALUE to liczba całkowita jest zapisywana na 4 bajtach. Funkcja zwraca
liczbę zapisanych bajtów.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_SOME_FILE_ERROR (4100)
ERR_INCOMPATIBLE_FILEACCESS (4104)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
value - Wartość do zapisania.
size - Opcjonalna flaga formatu, domyślnie 4 bajty - LONG_VALUE lub 2 bajty SHORT_VALUE, 1 bajt SHORT_VALUE.

85
Przykład:
int uchwyt = FileOpen("plik.dat", FILE_BIN | FILE_WRITE);
FileWriteInteger(uchwyt, 16777216);
FileClose(uchwyt);

u. FileWriteString()

int FileWriteString(int handle, string value, int length)

Funkcja FileWriteString() zapisuje w bieżącej pozycji pliku binarnego, którego uchwyt jest zadany pierwszym argumentem, string. Funkcja zwraca
liczbę zapisanych bajtów.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_SOME_FILE_ERROR (4100)
ERR_INCOMPATIBLE_FILEACCESS (4104) ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
handle - Uchwyt pliku, zwracany przez funkcję FileOpen.
value - Wartość do zapisania.
length - Liczba znaków do zapisania.
Przykład:
int uchwyt = FileOpen("plik.dat", FILE_BIN | FILE_WRITE);
FileWriteString(uchwyt, "Prawa Autorskie ® 2007, Konrad Kudzin.", 38);
FileClose(uchwyt);
UWAGA: Symbole CR/LF w pliku nie są dopisywane.

86
21. Z MIENNE GLOBALNE
⇒ Zmienne globalne
⇒ GlobalVariableCheck()
⇒ GlobalVariableDel()
⇒ GlobalVariableGet()
⇒ GlobalVariableName()
⇒ GlobalVariableSet()
⇒ GlobalVariableSetOnCondition()
⇒ GlobalVariablesDeleteAll()
⇒ GlobalVariablesTotal()
1. Zmienne globalne

Zmienne globalne są strukturami, które przechowują wartość i identyfikator umożliwiający dostęp do tej wartości. Dane przechowywane w
zmiennych globalnych mogą być wymieniane przez programy pisane w MQL4 za pomocą platformy MetaTrader.
Zmienne te mają inny charakter niż w innych językach programowania, gdzie przez zmienną globalną rozumne się zmienną dostępną z każdego
miejsca w obrębie aktywnego programu, czyli o zasięgu globalnym. Tu zmienne globalne są rekordami dostępnymi dla wszystkich programów
uruchomionych przez terminal kliencki. Zmienne globalne w przeciwieństwie do innych typów zmiennych są dostępne nawet po zakończeniu działania
przez program, który je powołał. Zmienne globalne wraz z ich wartościami i znacznikiem czasu są permanentnie zapisywane przez terminal, więc nawet
po ponownym uruchomieniu terminala będą one dostępne do czasu ich skasowania, ale nie dłużej niż przez cztery tygodnie po ostatniej modyfikacji.
Głównym przeznaczeniem zmiennych globalnych jest umożliwienie komunikacji pomiędzy procesami automatycznych systemów transakcyjnych,
gdyż nie istnieje żaden inny standardowy mechanizm komunikacji pomiędzy tymi procesami a dobrze byłoby nie dopuszczać do sytuacji, gdy dwa
procesy angażują zbyt dużą ilość środków z ten sam instrument albo, gdy jeden proces wystawia zlecenie sprzedaży krótkiej a drugi kupna na ten sam
instrument. Oczywiście to nie jedyne zastosowanie zmiennych tego typu i trudno by wymienić wszystkie.

2. GlobalVariableCheck()

bool GlobalVariableCheck(string name)

Funkcja GlobalVariableCheck() zwraca wartość TRUE, gdy zmienna globalna zadana argumentem istnieje, w przeciwnym razie zwraca wartość
FALSE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
name - Nazwa zmiennej globalnej.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern string zg1;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
if(GlobalVariableCheck("zg1")) double d = GlobalVariableGet("zg1");
}
//+------------------------------------------------------------------+

c. GlobalVariableDel()

bool GlobalVariableDel(string name)

Funkcja GlobalVariableDel() kasuje zmienną globalną zadaną argumentem. Jeśli funkcja się powiedzie, zwraca wartość TRUE w przeciwnym razie
zwraca wartość FALSE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_GLOBAL_VARIABLES_PROCESSING (4057)
Parametry:
name - Nazwa zmiennej globalnej.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry

87
extern string zg1;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
if(GlobalVariableCheck("zg1"))
{
GlobalVariableDel("zg1");
Print("Usunięto zmienną globalną zg1");
}
}
//+------------------------------------------------------------------+

d. GlobalVariablesDeleteAll()

void GlobalVariablesDeleteAll()

Funkcja GlobalVariablesDeleteAll() kasuje wszystkie zmienne globalne.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_GLOBAL_VARIABLES_PROCESSING (4057)
Przykład:
GlobalVariablesDeleteAll();

e. GlobalVariableGet()

double GlobalVariableGet(string name)

Funkcja GlobalVariableGet() zwraca wartość zmiennej globalnej typu double zadanej argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_GLOBAL_VARIABLE_NOT_FOUND (4058)
Parametry:
name - Nazwa zmiennej globalnej.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern string zg1;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
double d = GlobalVariableGet("zg1");
if(GetLastError() == ERR_GLOBAL_VARIABLE_NOT_FOUND) Print("Nie znaleziono zmiennej globalnej zg1");
}
//+------------------------------------------------------------------+
UWAGA: Jeśli zmienna globalna zadana parametrem nie zostanie znaleźna zostanie zwrócona wartość 0.0 do miejsca wywołania funkcji,
jednocześnie kod błędu zwracany przez funkcję GetLastError() będzie ustawiony na ERR_GLOBAL_VARIABLE_NOT_FOUND (4058). Tak, więc
należałoby używać funkcji GlobalVariableCheck() przed wywołaniem funkcji GlobalVariableGet.

f. GlobalVariableName()

string GlobalVariableName(int index)

Funkcja GlobalVariableName() zwraca nazwę zmiennej globalnej zadanej indeksem.


Parametry:
index - Indeks z listy zmiennych globalnych. Indeks jest większy równy 0 i mniejszy od GlobalVariablesTotal.
Przykład:
for(int i = GlobalVariablesTotal() - 1; i >= 0; i--) Print(i, " ", GlobalVariableName(i), "\n");

g. GlobalVariableSet()

bool GlobalVariableSet(string name, double value)

Funkcja GlobalVariableSet() przypisuje wartość zadaną drugim argumentem, zmiennej globalnej zadanej pierwszym argumentem. Jeśli zmienna o
identyfikatorze zadanym pierwszym argumentem jeszcze nie istnieje podjęta będzie próba jej utworzenia. Jeśli zmienna o identyfikatorze zadanym

88
pierwszym argumentem już istnieje podjęta będzie próba zmiany jej dotychczasowej wartości. Funkcja modyfikuje znacznik czasu dostępu do zmiennej
nadpisując go bieżącą wartością. Jeśli funkcja się powiedzie, zwraca wartość TRUE w przeciwnym razie zwraca wartość FALSE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_GLOBAL_VARIABLE_NOT_FOUND (4058)
ERR_GLOBAL_VARIABLES_PROCESSING (4057)
Parametry:
name - Nazwa zmiennej globalnej.
value - Wartość do zapisania.
Przykład:
return(GlobalVariableSet("BarsTotal", Bars))
UWAGA: Zmienne globalne są typu double i próba wprowadzenia wartości innego typu będzie skutkowało podjęciem próby niejawnej konwersji
typów.

h. GlobalVariableSetOnCondition()

bool GlobalVariableSetOnCondition(string name, double value, double check_value)

Funkcja GlobalVariableSetOnCondition() ustawia nową wartość istniejącej zmiennej globalnej, jeśli aktualna wartość tej zmiennej jest równa
wartości zadanej trzecim argumentem check_value. Jeśli funkcja się powiedzie, zwraca wartość TRUE w przeciwnym razie zwraca wartość FALSE.
Jeśli aktualna wartość zmiennej globalnej będzie różnić się od check_value, funkcja zwróci wartość FALSE. Funkcja zapewnia atomowy dostęp do
zmiennej globalnej, dlatego może zostać użyta do stworzenia semafora w interakcji kilku strategii pracujących równocześnie w jednym terminalu
klienckim.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_GLOBAL_VARIABLE_NOT_FOUND (4058)
Parametry:
name - Nazwa zmiennej globalnej.
value - Wartość do zapisania.
check_value - Wartość do porównania z aktualną wartością zmiennej globalnej.
Przykład:
return(GlobalVariableSetOnCondition("ZmiennaGlobalnaX", 7, 0));

i. GlobalVariablesTotal()

int GlobalVariablesTotal()

Funkcja GlobalVariablesTotal() zwraca liczbę zmiennych globalnych.


Przykład:
int i, j = GlobalVariablesTotal();
double d;
if(j < 0)
{
for(i = j - 1; i >= 0; i--) d += GlobalVariableGet(GlobalVariableName(i));
Print("Suma: ", NormalizeDouble(d, 2), "Średnia: ", NormalizeDouble(d / j, 2));
}

89
22. FUNKCJE MATEMATYCZNE
⇒ MathAbs()
⇒ MathAr ccos()
⇒ MathAr csin()
⇒ MathAr ctan()
⇒ MathCeil()
⇒ MathCos()
⇒ MathExp()
⇒ MathFloor()
⇒ MathLog()
⇒ MathMax()
⇒ MathMin()
⇒ MathMod()
⇒ MathPow()
⇒ MathRand()
⇒ MathRound()
⇒ MathSin()
⇒ MathSqr t()
⇒ MathSr and()
⇒ MathTan()
1. MathAbs()

double MathAbs(double value)

Funkcja MathAbs() zwraca wartość bezwzględną zadanego argumentu.


Parametry:
value - Wartość.
Przykład:
Print(MathAbs(-6.2831853));

b. MathAr ccos()

double MathArccos(double x)

Funkcja MathArccos() jest funkcją odwrotną do funkcji MathCos() rozpatrywanej na przedziale [0, π]. W przedziale tym MathCos() jest funkcją ściśle
malejącą, wobec czego ma funkcję odwrotną. Funkcja zwraca wartość arcus cosinus dla zadanego argumentu. Dziedzina x ϵ [-1, 1], przeciwdziedzina
[0, π]. Jeśli argument przekroczy wartość, w której dziedzina jest zdefiniowana to funkcja zwróci wartość niezdefiniowaną (coś jak NaN).
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
x - Wartość od -1 do 1.
Przykład:
Print(MathArccos(0.9998476951)); // MathArccos(0.9998476951) ≈ 1

c. MathAr csin()

double MathArcsin(double x)

Funkcja MathArcsin() jest funkcją odwrotną do funkcji MathSin() rozpatrywanej na przedziale [-π/2, π/2]. W przedziale tym MathSin() jest funkcją
ściśle malejącą, wobec czego ma funkcję odwrotną. Funkcja zwraca wartość arcus sinus dla zadanego argumentu. Dziedzina x ϵ [-1, 1],
przeciwdziedzina [-π/2, π/2]. Jeśli argument przekroczy wartość, w której dziedzina jest zdefiniowana to funkcja zwróci wartość niezdefiniowaną (coś jak
NaN).
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
x - Wartość od -1 do 1.
Przykład:
Print(MathArcsin(0.017452406)); // MathArcsin(0.017452406) ≈ 1

d. MathAr ctan()

double MathArctan(double x)

Funkcja MathArctan() jest funkcją odwrotną do funkcji MathTan() rozpatrywanej na przedziale [-π/2, π/2]. W przedziale tym MathTan() jest funkcją
ściśle rosnącą, wobec czego ma funkcję odwrotną, która jest określona na przedziale double. Funkcja zwraca wartość arcus tangens dla zadanego
argumentu. Dziedzina x ϵ double, przeciwdziedzina [- π/2, π/2].

90
Parametry:
x - Wartość.
Przykład:
Print(MathArctan(0)); // MathArctan(0) = 0

e. MathCeil()

double MathCeil(double x)

Funkcja MathCeil() zwraca najmniejszą liczbę całkowitą większą bądź równą zadanemu argumentowi.
Parametry:
x - Wartość.
Przykład:
Print(MathCeil(-6.2831853), ", ", MathCeil(6.2831853)); // MathCeil(-6.2831853) = -7, MathCeil(6.2831853) = 6

f. MathCos()

double MathCos(double value)

Funkcja MathCos() zwraca wartość cosinus dla zadanego argumentu. Dziedzina X ϵ double, przeciwdziedzina [-1, 1].
Parametry:
x - Wartość.
Przykład:
Print(MathCos(0)); // MathCos(0) = 1

g. MathExp()

double MathExp(double d)

Funkcja MathExp() zwraca wartość stałej e podniesionej do potęgi zadanej argumentem.


Parametry:
d - Wartość potęgi.
Przykład:
Print(MathExp(1)); // MathExp(1) ≈ 2.718282

h. MathFloor()

double MathFloor(double x)

Funkcja MathFloor() zwraca największą liczbę całkowitą mniejszą bądź równą zadanemu argumentowi.
Parametry:
x - Wartość.
Przykład:
Print(MathFloor(-6.28318), ", ", MathFloor(6.28318)); // MathFloor(-6.28318) = -7, MathFloor(6.28318) = 6

i. MathLog()

double MathLog(double x)

Funkcja MathLog(), jeśli się powiedzie zwraca wartość logarytmu naturalnego dla zadanego argumentu. Jeśli zadany argument jest ujemny to
funkcja zwróci wartość niezdefiniowaną (coś jak NaN). Jeśli zadany argument jest równy zero, to funkcja zwraca wartość INF (nieskończoność).
Parametry:
x - Wartość.
Przykład:
Print(MathLog(2.718282)); // MathLog(2.718282) ≈ 1

j. MathMax()

double MathMax(double value1, double value2)

Funkcja MathMax() zwraca największą z dwóch wartości argumentów.


Parametry:
value1 - Pierwsza wartość.
value2 - Druga wartość.
Przykład:
Print(MathMax(3, 4)); // MathMax(3, 4) = 4

k. MathMin
91
Funkcja MathMin() zwraca najmniejszą z dwóch wartości argumentów.
Parametry:
value1 - Pierwsza wartość.
value2 - Druga wartość.
Przykład:
Print(MathMin(3, 4)); // MathMin(3, 4) = 3

l. MathMod()

double MathMod(double value, double value2)

Funkcja MathMod() zwraca resztę z dzielenia pierwszego argumentu przez drugi.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ZERO_DIVIDE (4013)
Parametry:
value1 - Wartość dzielnej.
value2 - Wartość dzielnika.
Przykład:
Print(MathMod(3, 4)); // MathMod(3, 4) = 3

m. MathPow()

double MathPow(double base, double exponent)

Funkcja MathPow() zwraca wartość pierwszego argumentu podniesioną do potęgi zadanej przez drugi argument.
Parametry:
base - Podstawa potęgi.
exponent - Wykładnik potęgi.
Przykład:
Print(MathPow(2, 24)); // MathPow(2, 24) = 16777216

n. MathRand()

int MathRand()

Funkcja MathRan() zwraca wartość całkowitą pseudolosową z przedziału od 0 do 0x7fff (32767).


Przykład:
Print(MathRand());

o. MathRound()

double MathRound(double value)

Funkcja MathRound() zwraca wartość całkowitą najbliższą, zadanemu argumentowi.


Parametry:
x - Wartość.
Przykład:
Print(MathRound(-6.8), ", ", MathRound(3.4)); // MathRound(-6.8) = -7, MathRound(3.4) = 3

p. MathSin()

double MathSin(double value)

Funkcja MathSin() zwraca wartość sinus dla zadanego argumentu. Dziedzina x ϵ double, przeciwdziedzina [-1, 1].
Parametry:
x - Wartość.
Przykład:
Print(MathSin(0)); // MathSin(0) = 0

q. MathSqr t()

double MathSqrt(double x)

Funkcja MathSqrt() zwraca pierwiastek kwadratowy z zadanego argumentu. Jeśli zadany argument jest ujemny to funkcja zwróci wartość
niezdefiniowaną (coś jak NaN).
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
x - Wartość.
Przykład:

92
Print(MathSqrt(0.01)); // MathSqrt(0.01) = 0.1

r. MathSr and()

void MathSrand(int seed)

Funkcja MathSrand() ustawia zarodź generatora liczb pseudolosowych na wartość zadaną argumentem.
Parametry:
seed - Wartość zarodzi.
Przykład:
MathSrand(TimeLocal());

s. MathTan()

double MathTan(double x)

Funkcja MathTan() zwraca wartość tangens dla zadanego argumentu. Dziedzina x:[-263, 263] Λ {kπ + (π/2)}, x ϵ double, k ϵ int, przeciwdziedzina
double. Jeśli argument przyjmie wartość, w której dziedzina nie jest zdefiniowana to funkcja zwróci wartość niezdefiniowaną (coś jak NaN).
Parametry:
x - Wartość.
Przykład:
Print(MathTan(0)); // MathTan(0) = 0

93
23. O BIEKTY
⇒ Obiekty
⇒ ObjectCr eate()
⇒ ObjectDelete()
⇒ ObjectDescription()
⇒ ObjectFind()
⇒ ObjectGet()
⇒ ObjectGetFiboDescription()
⇒ ObjectGetShiftByValue()
⇒ ObjectGetValueByShift()
⇒ ObjectMove()
⇒ ObjectName()
⇒ ObjectsDeleteAll()
⇒ ObjectSet()
⇒ ObjectSetFiboDescription()
⇒ ObjectSetText()
⇒ ObjectsTotal()
⇒ ObjectType()
1. Obiekty

Obiekty takie jak linie, kanały, strzałki, etykiety tekstowe i inne pomagają w wizualnej analizie wykresu. Rysowanie obiektów w platformie
transakcyjnej MetaTrader 4 ręcznie jest łatwym zadaniem, wystarczy wybrać obiekt, który ma być rysowany z menu albo z pAska narzędzi. Każdy obiekt
można modyfikować i usuwać, wystarczy wskazać żądany obiekt na wykresie przez kliknięcie prawym przyciskiem urządzenia wskazującego (mysz,
touchpad, trackball, touch screen) i wybrać żądaną operację z menu kontekstowego. Wszystkie dostępne obiekty w platformie MetaTrader można
tworzyć, modyfikować i usuwać programowo za pomocą odpowiednich funkcji.

2. ObjectCr eate()

bool ObjectCreate(string name, int type, int window, datetime time1, double price1, datetime time2=0, double
price2=0, datetime time3=0, double price3=0)

Funkcja ObjectCreate() tworzy obiekt o zadanej nazwie, typie i współrzędnych (czas, cena) w zadanym oknie. Liczba współrzędnych zależy od typu
obiektu (1 - 3). Jeśli funkcja zakończy się błędem, zostanie zwrócona wartość FALSE w przeciwnym razie zostanie zwrócona wartość TRUE.
Tab. 33 Typy obiektów.
Stała Wartość Opis
OBJ_VLINE 0 Linia pionowa - używa części czasu pierwszej współrzędnej.
OBJ_HLINE 1 Linia pozioma - używa części ceny pierwszej współrzędnej.
OBJ_TREND 2 Trendline - używa dwóch współrzędnych.
Trendline by angle - używa pierwszej współrzędnej. Do ustawienia kąta używa się
OBJ_TRENDBYANGLE 3
ObjectSet.
OBJ_REGRESSION 4 Linear regression - używa części czasu dwóch współrzędnych.
OBJ_CHANNEL 5 Channel - używa trzech współrzędnych.
OBJ_STDDEVCHANNEL 6 Standard deviation - używa części czasu dwóch pierwszych współrzędnych.
OBJ_GANNLINE 7 Gann Line - używa dwóch współrzędnych, ale cena drugiej współrzędnej jest ignorowana.
OBJ_GANNFAN 8 Gann fan - używa dwóch współrzędnych, ale cena drugiej współrzędnej jest ignorowana.
OBJ_GANNGRID 9 Gann grid - używa dwóch współrzędnych, ale cena drugiej współrzędnej jest ignorowana.
OBJ_FIBO 10 Fibonacci retracement - używa dwóch współrzędnych.
OBJ_FIBOTIMES 11 Fibonacci time zones - używa dwóch współrzędnych.
OBJ_FIBOFAN 12 Fibonacci fan - używa dwóch współrzędnych.
OBJ_FIBOARC 13 Fibonacci arcs - używa dwóch współrzędnych.
OBJ_EXPANSION 14 Fibonacci expansions - używa trzech współrzędnych.
OBJ_FIBOCHANNEL 15 Fibonacci channel - używa trzech współrzędnych.
OBJ_RECTANGLE 16 Prostokąt - używa dwóch współrzędnych.
OBJ_TRIANGLE 17 Trójkąt - używa trzech współrzędnych.
OBJ_ELLIPSE 18 Elipsa - używa dwóch współrzędnych.
OBJ_PITCHFORK 19 Andrews pitchfork - używa trzech współrzędnych.
OBJ_CYCLES 20 Cycles Lines - używa dwóch współrzędnych.
OBJ_TEXT 21 Text - używa pierwszej współrzędnej.
OBJ_ARROW 22 Strzałki - używa pierwszej współrzędnej.
OBJ_LABEL 23 Text label - używa pierwszej współrzędnej.
Tab. 34 Predefiniowane kody strzałek.
Stała Wartość Opis
SYMBOL_LEFTPRICE 5 Lewostronna etykieta ceny.
SYMBOL_RIGHTPRICE 6 Prawostronna etykieta ceny.
SYMBOL_THUMBSUP 67 Kciuk w górę, symbol ().
SYMBOL_THUMBSDOWN 68 Kciuk w dół, symbol ().
SYMBOL_ARROWUP 241 Strzała w górę, symbol ().
SYMBOL_ARROWDOWN 242 Strzała w dół, symbol ().
SYMBOL_STOPSIGN 251 Znak stop, symbol ().
SYMBOL_CHECKSIGN 252 Znak sprawdzenia, symbol ().
94
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
ERR_NO_OBJECT_NAME (4204) ERR_OBJECT_ALREADY_EXISTS (4200)
ERR_UNKNOWN_OBJECT_TYPE (4203) ERR_NO_SPECIFIED_SUBWINDOW (4206)
Parametry:
name - Unikalna nazwa obiektu.
type - Typ obiektu.
window - Indeks okna gdzie obiekt będzie dodany. Indeksy okien: [0, WindowsTotal() - 1].
time1 - Część czasu współrzędnej pierwszej.
price1 - Część ceny współrzędnej pierwszej.
time2 - Część czasu współrzędnej drugiej.
price2 - Część ceny współrzędnej drugiej.
time3 - Część czasu współrzędnej trzeciej.
price3 - Część ceny współrzędnej trzeciej.
Przykład:
ObjectCreate("t1", OBJ_TEXT, 0, D'2007.01.29 13:10', 0.95);

c. ObjectDelete()

bool ObjectDelete(string name)

Funkcja ObjectDelete() kasuje obiekt zadany argumentem. Jeśli funkcja zakończy się błędem, zostanie zwrócona wartość FALSE w przeciwnym
razie zostanie zwrócona wartość TRUE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204)
Parametry:
name - Unikalna nazwa obiektu.
Przykład:
for(int i = ObjectsTotal() - 1; i >= 0; i--) ObjectDelete(ObjectName(i));

d. ObjectDescription

string ObjectDescription(string name)

Funkcja ObjectDescription() zwraca opis obiektu. Dla obiektów OBJ_TEXT i OBJ_LABEL, które nie mają opisu funkcja zwraca wartość pola
tekstowego rysowanego przez te obiekty.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204)
Parametry:
name - Unikalna nazwa obiektu.
Przykład:
for(int i = ObjectsTotal() - 1; i >= 0; i--) Print(ObjectDescription(ObjectName(i)), "\n");

e. ObjectFind()

int ObjectFind(string name)

Funkcja ObjectFind() zwraca indeks okna, które jest właścicielem obiektu zadanego argumentem. Jeśli funkcja zakończy się błędem, zostanie
zwrócona wartość -1. Wykres główny ma indeks 0 a pierwszy wykres pod oknem głównego wykresu na indeks o wartości 1 i tak dalej.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_NO_OBJECT_NAME (4204)
Parametry:
name - Unikalna nazwa obiektu.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern string t1;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
if(ObjectFind(t1) >= 0) Print(ObjectDescription(t1));
}
//+------------------------------------------------------------------+

f. ObjectGet()
95
double ObjectGet(string name, int index)

Funkcja ObjectGet() zwraca wartość właściwości zadanej drugim argumentem, obiektu zadanego pierwszym argumentem.
Tab. 35 Indeksy właściwości obiektów.
Stała Wartość Opis
OBJPROP_TIME1 0 datetime, współrzędna pierwsza, część czasu.
OBJPROP_PRICE1 1 double, współrzędna pierwsza, część ceny.
OBJPROP_TIME2 2 datetime, współrzędna druga, część czasu.
OBJPROP_PRICE2 3 double, współrzędna druga, część ceny.
OBJPROP_TIME3 4 datetime, współrzędna trzecia, część czasu.
OBJPROP_PRICE3 5 double, współrzędna trzecia, część ceny.
OBJPROP_COLOR 6 color, kolor obiektu.
OBJPROP_STYLE 7 int, styl linii (Tab. 31).
OBJPROP_WIDTH 8 int, szerokość linii: 1, 2, 3, 4, 5.
OBJPROP_BACK 9 boolean, rysowanie tła obiektu.
OBJPROP_RAY 10 int, właściwość promienia obiektu.
OBJPROP_ELLIPSE 11 double, właściwość elipsy dla fibonacci arcs.
OBJPROP_SCALE 12 double, właściwość skali obiektu.
OBJPROP_ANGLE 13 double, właściwość kąta obiektu.
OBJPROP_ARROWCODE 14 int, właściwość obiektu strzałka.
OBJPROP_TIMEFRAMES 14 int, interwał czasu, jedna lub kombinacja stałych.
OBJPROP_FONTSIZE 100 int, rozmiar czcionki dla tekstu obiektu.
OBJPROP_CORNER 101 double, właściwość zakotwiczenia dla obiektu label.
OBJPROP_XDISTANCE 102 double, właściwość zakotwiczenia obiektu oś X.
OBJPROP_YDISTANCE 103 double, właściwość zakotwiczenia obiektu oś Y.
OBJPROP_FIBOLEVELS+n 200 int, indeks poziomu obiektu Fibonacci’ego, gdzie n jest poziomem indeksu.
Tab. 36 Interwały czasu.
Stała Wartość Opis
NULL 0x0000 Obiekt pokazywany na wszystkich interwałach czasowych.
OBJ_PERIOD_M1 0x0001 Obiekt pokazywany tylko na wykresie 1 minutowym.
OBJ_PERIOD_M5 0x0002 Obiekt pokazywany tylko na wykresie 5 minutowym.
OBJ_PERIOD_M15 0x0004 Obiekt pokazywany tylko na wykresie 15 minutowym.
OBJ_PERIOD_M30 0x0008 Obiekt pokazywany tylko na wykresie 30 minutowym.
OBJ_PERIOD_H1 0x0010 Obiekt pokazywany tylko na wykresie 1 godzinnym.
OBJ_PERIOD_H4 0x0020 Obiekt pokazywany tylko na wykresie 4 godzinnym.
OBJ_PERIOD_D1 0x0040 Obiekt pokazywany tylko na wykresie dziennym.
OBJ_PERIOD_W1 0x0080 Obiekt pokazywany tylko na wykresie tygodniowym.
OBJ_PERIOD_MN1 0x0100 Obiekt pokazywany tylko na wykresie miesięcznym.
OBJ_ALL_PERIODS 0x01FF Obiekt pokazywany na wszystkich interwałach czasowych.
EMPTY -1 Obiekt niepokazywany na żadnym interwale czasowym.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204) ERR_UNKNOWN_OBJECT_PROPERTY (4201)
Parametry:
name - Unikalna nazwa obiektu.
index - Indeks właściwości obiektu.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern string t1;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
if(ObjectFind(t1) >= 0) double cena = ObjectGet(t1, OBJPROP_PRICE1);;
}
//+------------------------------------------------------------------+

g. ObjectGetFiboDescription()

string ObjectGetFiboDescription(string name, int index)

Funkcja ObjectGetFiboDescription() zwraca opis obiektu Fibonacci’ego, poziomu zadanego drugim argumentem. Liczba poziomów zależy od typu
obiektu Fibonacci’ego, zaczyna się od 0. Obiekt może używać do 32 poziomów.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204) ERR_UNKNOWN_OBJECT_TYPE (4203)
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_UNKNOWN_OBJECT_PROPERTY (4201)
Parametry:
name - Unikalna nazwa obiektu.
index - Indeks poziomu opisu obiektu Fibonacci’ego.
Przykład:
string txt = ObjectGetFiboDescription(FibObj, 0);

96
h. ObjectGetShiftByValue()

int ObjectGetShiftByValue(string name, double value)

Funkcja ObjectGetShiftByValue() oblicza i zwraca indeks świecy dla ceny zadanej drugim argumentem. Indeks świecy obliczany jest za pomocą
pierwszej i drugiej współrzędnej.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204) ERR_OBJECT_COORDINATES_ERROR (4205)
Parametry:
name - Unikalna nazwa obiektu.
value - Cena.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern string MLT;
extern double val;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
int i = ObjectGetShiftByValue(MLT, val);
}
//+------------------------------------------------------------------+

i. ObjectGetValueByShift()

double ObjectGetValueByShift(string name, int shift)

Funkcja ObjectGetValueByShift() oblicza i zwraca wartość ceny dla świecy zadanej drugim argumentem. Wartość ceny obliczana jest za pomocą
pierwszej i drugiej współrzędnej.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204) ERR_OBJECT_COORDINATES_ERROR (4205)
Parametry:
name - Unikalna nazwa obiektu.
shift - Indeks świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern string MLT;
extern int sh;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
double cena = ObjectGetValueByShift(MLT, sh);
}
//+------------------------------------------------------------------+

j. ObjectMove()

bool ObjectMove(string name, int point, datetime time1, double price1)

Funkcja ObjectMove() zmienia zadaną współrzędną na wykresie, obiektu zadanego pierwszym argumentem, na współrzędną zadaną parametrem
drugim i trzecim. Obiekt może mieć od jednej do trzech współrzędnych, indeksowanych od zera do dwóch, zależności od jego typu. Jeśli funkcja
zakończy się błędem, zostanie zwrócona wartość FALSE w przeciwnym razie zostanie zwrócona wartość TRUE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
ERR_NO_OBJECT_NAME (4204) ERR_OBJECT_DOES_NOT_EXIST (4202)
Parametry:
name - Unikalna nazwa obiektu.

97
point - Indeks współrzędnych.
time1 - Część czas współrzędnej.
price1 - Część ceny współrzędnej.
Przykład:
ObjectMove("MLT", 0, D'2007.02.01 19:10', 1.3425);

k. ObjectName()

string ObjectName(int index)

Funkcja ObjectName() zwraca nazwę obiektu zadanego indeksem.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_OBJECT_DOES_NOT_EXIST (4202)
Parametry:
index - Indeks obiektu na wykresie. Indeks musi być większy lub równy 0 i mniejszy od ObjectsTotal.
Przykład:
for(int i = ObjectsTotal() - 1; i >= 0; i--)
{
string nazwa = ObjectName(i);
//...
}

l. ObjectsDeleteAll()

int ObjectsDeleteAll(int window, int type=EMPTY)

Funkcja ObjectsDeleteAll() usuwa wszystkie obiekty zadanego drugim argumentem typu w podoknie wykresu zadanym pierwszym argumentem.
Funkcja zwraca liczbę usuniętych obiektów.
Parametry:
window - Indeks okna, z którego obiekty będą usuwane. Indeks musi być niemniejszy do 0 i mniejszy WindowsTotal.
type - Opcjonalny typ do usunięcia. To może być jakikolwiek typ obiektu. Stała EMPTY usuwa wszystkie obiekty.
Przykład:
ObjectsDeleteAll(0);

m. ObjectSet()

bool ObjectSet(string name, int index, double value)

Funkcja ObjectSet() ustawia wartość zadaną trzecim argumentem właściwości zadanej drugim argumentem obiektu znanego pierwszym
argumentem. Jeśli funkcja zakończy się błędem, zostanie zwrócona wartość FALSE w przeciwnym razie zostanie zwrócona wartość TRUE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204) ERR_UNKNOWN_OBJECT_PROPERTY (4201)
Parametry:
name - Nazwa obiektu.
index - Indeks właściwości obiektu. To może być jakakolwiek ze stałych indeksów właściwości obiektów.
value - Nowa wartość właściwości.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern string MLT;
extern double val;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
ObjectSet(MLT, OBJPROP_PRICE1, val);
}
//+------------------------------------------------------------------+

n. ObjectSetFiboDescription()

bool ObjectSetFiboDescription(string name, int index, string text)

Funkcja ObjectSetFiboDescription() przypisuje nowy opis do obiektu Fibonacci’ego poziomu zadanego drugim argumentem. Liczba poziomów
zależy od typu obiektu Fibonacci’ego.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_NO_OBJECT_NAME (4204)
98
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_UNKNOWN_OBJECT_TYPE (4203)
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_UNKNOWN_OBJECT_PROPERTY (4201)
ERR_OBJECT_DOES_NOT_EXIST (4202)
Parametry:
name - Unikalna nazwa obiektu.
index - Indeks poziomu opisu obiektu Fibonacci’ego.
text - Nowy opis poziomu.
Przykład:
ObjectSetFiboDescription("FibObj", 0, "Poziom 0");

o. ObjectSetText()

bool ObjectSetText(string name, string text, int font_size, string font=NULL, color text_color=CLR_NONE)

Funkcja ObjectSetText() ustawia wartość zadaną drugim parametrem, jako opis. Jeśli funkcja zakończy się błędem, zostanie zwrócona wartość
FALSE w przeciwnym razie zostanie zwrócona wartość TRUE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204)
Parametry:
name - Nazwa obiektu.
text - Opis.
font_size - Rozmiar czcionki w punktach.
Font - Czcionka.
text_color - Kolor tekstu.
Przykład:
for(int i = ObjectsTotal() - 1; i >= 0; i--) ObjectSetText(ObjectName(i), "Obj " + i, "Tahoma", 8, Green);

p. ObjectsTotal()

int ObjectsTotal()

Funkcja ObjectsTotal() zwraca liczbę obiektów na wykresie.


Przykład:
Print("Obiektów: ", ObjectsTotal());

q. ObjectType()

int ObjectType(string name)

Funkcja ObjectType() zwraca typ obiektu (Tab. 33).


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_OBJECT_DOES_NOT_EXIST (4202)
ERR_NO_OBJECT_NAME (4204)
Parametry:
name - Nazwa obiektu.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern string MLT;
extern double val;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
ObjectSet(MLT, OBJPROP_PRICE1, val);
}
//+------------------------------------------------------------------+

99
24. OPERACJE NA STRINGACH
⇒ StringConcatenate()
⇒ StringFind()
⇒ StringGetChar()
⇒ StringLen()
⇒ StringSetChar()
⇒ StringSubstr()
⇒ StringTrimLeft()
⇒ StringTrimRight()
1. StringConcatenate()

string StringConcatenate(...)

Funkcja StringConcatenate() zwraca string, który jest konkatenacją zadanych argumentów wywołania. Liczba argumentów nie może przekroczyć
64. Funkcja StringConcatenate() działa szybciej i zużywa mniej pamięci niż konkatenacja przy użyciu operatora sumy (+).
Parametry:
... - Stringi oddzielone przecinkami, maksymalnie 64.
Przykład:
string txt = StringConcatenate("Nazwa rachunku: ", AccountName);

2. StringFind()

int StringFind(string text, string matched_text, int start=0)

Funkcja StringFind() zwraca pozycje pierwszego wystąpienia ciągu zadanego drugim argumentem w ciągu zadanym pierwszym argumentem
zaznając szukanie od indeksu nadanego trzecim argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
text - Przeszukiwany string.
matched_text - Szukany string.
start - Indeks startowy w stringu przeszukiwanym.
Przykład:
Print("pozycja sława \"Konrad\" w stringu: ", StringFind("Prawa Autorskie ® 2007, Konrad Kudzin.", "Konrad", 0));

c. StringGetChar()

int StringGetChar(string text, int pos)

Funkcja StringGetChar() zwraca kod znaku na pozycji zadanej drugim argumentem w ciągu zadanym pierwszym argumentem. Indeksy w stringu
zaczynają się od zera.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_ARRAY_INDEX_OUT_OF_RANGE (4002)
ERR_NOT_INITIALIZED_STRING (4008)
Parametry:
text - String źródłowy.
pos - Indeks znaku w stringu.
Przykład:
int kod = StringGetChar("Prawa Autorskie ® 2007, Konrad Kudzin.", 7); // kod = 117 czyli znak "u"

d. StringLen()

int StringLen(string text)

Funkcja StringLen() zwraca liczbę znaków w stringu zadanym argumentem.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
text - String źródłowy.
Przykład:
int i = StringLen("Prawa Autorskie ® 2007, Konrad Kudzin."); // i = 38

e. StringSetChar()

string StringSetChar(string text, int pos, int value)

Funkcja StringSetChar() zwraca string, który jest kopią ciągu zadanego pierwszym argumentem ze zmienionym znakiem na pozycji zadanej drugim
argumentem na znak zadanym trzecim argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
100
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_TOO_LONG_STRING (4011)
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_ARRAY_INDEX_OUT_OF_RANGE (4002)
ERR_NOT_INITIALIZED_STRING (4008)
Parametry:
text - String źródłowy.
pos - Indeks znaku w stringu.
value - Kod ASCII.
Przykład:
string str = "Prawa Autorskie ® 2007, Konrad Kudzin.";
str = StringSetChar(str, 37, 0); // str = "Prawa Autorskie ® 2007, Konrad Kudzin"

f. StringSubstr()

string StringSubstr(string text, int start, int count=EMPTY)

Funkcja StringSubstr() zwraca string, który jest kopią ciągu zadanego pierwszym argumentem zaczynającą się od indeksu znaku zadanego drugim
argumentem i długości zadanej trzecim argumentem. Pozycja w stringu jest indeksowana od zera. Funkcja zwraca pusty string, jeśli nie jest możliwe
utworzenie ciągu wynikowego na podstawie podanych argumentów.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_TOO_LONG_STRING (4011)
Parametry:
text - String źródłowy.
start - Indeks znaku w stringu od którego ma się zaczynać string docelowy.
Mount - Licznik znaków w stringu docelowym (tab. 3).
Przykład:
string str = StringSubstr("Prawa Autorskie ® 2007, Konrad Kudzin.", 24, 14); // str = "Konrad Kudzin."

g. StringTrimLeft()

string StringTrimLeft(string text)

Funkcja StringTrimLeft() zwraca string, który jest kopią ciągu zadanego argumentem bez początkowych białych znaków (nowa linia, spacja, tab).
Funkcja zwraca pusty string jeśli nie jest możliwe utworzenie ciągu wynikowego na podstawie podanego argumentu.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
text - String źródłowy.
Przykład:
string str = StringTrimLeft(" Konrad Kudzin "); // str = "Konrad Kudzin "

h. StringTrimRight()

string StringTrimRight(string text)

Funkcja StringTrimRight() zwraca string, który jest kopią ciągu zadanego argumentem bez końcowych białych znaków (nowa linia, spacja, tab).
Funkcja zwraca pusty string jeśli nie jest możliwe utworzenie ciągu wynikowego na podstawie podanego argumentu.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
text - String źródłowy.
Przykład:
string str = StringTrimRight(" Konrad Kudzin "); // str = " Konrad Kudzin"

101
25. WSKAŹNIKI TECHNICZNE
⇒ Acceler ator Oscillator - iAC()
⇒ Accumulation/Distribution - iAD()
⇒ Alligator - iAlligator()
⇒ Aver a ge Dir ectional Movement Index - iADX()
⇒ Aver a ge Tr ue Range - iATR()
⇒ Awesome Oscillator - iAO()
⇒ Bear s Power - iBear sPower()
⇒ Bollinger Bands - iBands()
⇒ Bollinger Bands on buf fer - iBandsOnAr r ay()
⇒ Bulls Power - iBullsPower()
⇒ Commodity Channel Index - iCCI()
⇒ Commodity Channel Index on ar r ay - iCCIOnAr r ay()
⇒ Custom Indicator - iCustom()
⇒ DeMar ker - iDeMar ker()
⇒ Envelopes - iEnvelopes()
⇒ Envelopes on buf fer - iEnvOnAr r ay()
⇒ For ce Index - iFor ce()
⇒ Fr actals - iFr actals()
⇒ Gator Oscillator - iGator()
⇒ Ichimoku Kinko Hyo - iIchimoku()
⇒ Mar ket Facilitation Index (Bill W illiams) - iBWMFI()
⇒ Momentum - iMomentum()
⇒ Momentum on buf fer - iMomOnAr r ay()
⇒ Money Flow Index - iMFI()
⇒ Moving Aver a ge - iMA()
⇒ Moving Aver a ge on buf fer - iMAOnAr r ay()
⇒ Moving Aver a ge of Oscillator - iOsMA()
⇒ Moving Aver a ges Conver gence/Diver gence - iMACD()
⇒ On Balance Volume - iOBV()
⇒ Par abolic SAR - iSAR()
⇒ Relative Str ength Index - iRSI()
⇒ Relative Str ength Index on ar r ay - iRSIOnAr r ay()
⇒ Relative V igor Index - iRVI()
⇒ Standar d Deviation - iStdDev()
⇒ Standar d Deviation on buf fer - iStdDevOnAr r ay()
⇒ Stochastic Oscillator - iStochastic()
⇒ W illiam’s Per cent Range - iWPR()
1. Acceler ator Oscillator - iAC()

double iAC(string symbol, int timeframe, int shift)

Funkcja iAC() zwraca wartość oscylatora Accelerator/Decelerator dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
102
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iAC(NULL, 0, i);
//----
return(0);
}
//+------------------------------------------------------------------+

b. Accumulation/Distribution - iAD()

double iAD(string symbol, int timeframe, int shift)

Funkcja iAD() zwraca wartość wskaźnika Accumulation/Distribution dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iAD(NULL, 0, i);
//----
return(0);
}
//+------------------------------------------------------------------+

c. Alligator - iAlligator()

double iAlligator(string symbol, int timeframe, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int
lips_period, int lips_shift, int ma_method, int applied_price, int mode, int shift)

Funkcja iAlligator() zwraca wartość wskaźnika Alligator dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego drugim
argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Tab. 37 Metody liczenia MA.
Stała Wartość Opis
MODE_SMA 0 Prosta średnia ruchoma.
MODE_EMA 1 Wykładnicza średnia ruchoma.
MODE_SMMA 2 Wygładzona średnia ruchoma.
MODE_LWMA 3 Liniowa ważona średnia ruchoma.
Tab. 38 Ceny odniesienia.

103
Stała Wartość Opis
PRICE_CLOSE 0 Cena zamknięcia.
PRICE_OPEN 1 Cena otwarcia.
PRICE_HIGH 2 Cena najwyższa.
PRICE_LOW 3 Cena najniższa.
PRICE_MEDIAN 4 Cena średnia, (high + low) / 2.
PRICE_TYPICAL 5 Cena typowa, (high + low + close) / 3.
PRICE_WEIGHTED 6 Ważona cena zamknięcia, (high + low + close + close) / 4.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
jaw_period - Liczba okresów do przeliczenia dla linii "paszczy aligatora", zwykle 13 okresów.
jaw_shift - Relatywne przesunięcie w przód linii paszczy względem bieżącej świecy, zwykle 8 okresów.
teeth_period - Liczba okresów do przeliczenia dla linii "zębów aligatora", zwykle 8 okresów.
teeth_shift - Relatywne przesunięcie w przód linii zębów względem bieżącej świecy, zwykle 5 okresów.
lips_period - Liczba okresów do przeliczenia dla linii "warg aligatora", zwykle 5 okresów.
lips_shift - Relatywne przesuniecie w przód linii warg względem bieżącej świecy, zwykle 5 okresów.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
applied_price - Cena odniesienia (Tab. 38).
mode - Źródło: MODE_GATORJAW - linia Jaw, MODE_GATORTEETH - linia Teeth, MODE_GATORLIPS - linia Lips.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Gold
//---- bufory
double ExtBuffer0[], ExtBuffer1[], ExtBuffer2[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1) &&
!SetIndexBuffer(2, ExtBuffer2)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--)
{
ExtBuffer0[i] = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, i);
ExtBuffer1[i] = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, i);
ExtBuffer2[i] = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

d. Aver a ge Dir ectional Movement Index - iADX()

double iADX(string symbol, int timeframe, int period, int applied_price, int mode, int shift)

Funkcja iADX() zwraca wartość wskaźnika Average Directional Movement Index dla instrumentu zadanego pierwszym argumentem i przedziału
czasowego zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Tab. 39 Identyfikatory linii wskaźnika.
Stała Wartość Opis
MODE_MAIN 0 Linia bazowa wskaźnika ADX.
MODE_PLUSDI 1 Linia wskaźnika + di.
MODE_MINUSDI 2 Linia wskaźnika - di.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
applied_price - Cena odniesienia (Tab. 38).
104
mode - Identyfikatory linii wskaźnika (Tab. 39).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iADX(NULL, 0, 14, PRICE_CLOSE, MODE_MAIN, i);
//----
return(0);
}
//+------------------------------------------------------------------+

e. Aver a ge Tr ue Range - iATR()

double iATR(string symbol, int timeframe, int period, int shift)

Funkcja iATR() zwraca wartość wskaźnika Average True Range dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iATR(NULL, 0, 12, i);
//----
return(0);

105
}
//+------------------------------------------------------------------+

f. Awesome Oscillator - iAO()

double iAO(string symbol, int timeframe, int shift)

Funkcja iAO() zwraca wartość oscylatora Awesome Oscillator dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iAO(NULL, 0, i);
//----
return(0);
}
//+------------------------------------------------------------------+

g. Bear s Power - iBear sPower()

double iBearsPower(string symbol, int timeframe, int period, int applied_price, int shift)

Funkcja iBearsPower() zwraca wartość wskaźnika Bears Power dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
106
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iBearsPower(NULL, 0, 13, PRICE_OPEN, i);
//----
return(0);
}
//+------------------------------------------------------------------+

h. Bollinger Bands - iBands()

double iBands(string symbol, int timeframe, int period, int deviation, int bands_shift, int applied_price, int mode, int
shift)

Funkcja iBands() zwraca wartość wskaźnika Bollinger Bands dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Tab. 40 Identyfikatory linii wskaźnika.
Stała Wartość Opis
MODE_UPPER 1 linia wyższa
MODE_LOWER 2 linia niższa
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
deviation - Odchylenie.
bands_shift - Przesunięcie (w przód lub w tył) obliczonych wartości.
applied_price - Cena odniesienia (Tab. 38).
mode - Identyfikatory linii wskaźnika (Tab. 40).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iBands(NULL, 0, 20, 2, 0, PRICE_ MEDIAN, MODE_LOWER, i);
//----
return(0);
}
//+------------------------------------------------------------------+

i. Bollinger Bands on buf fer - iBandsOnAr r ay()

double iBandsOnArray(double array[], int total, int deviation, int bands_shift, int mode, int shift)

Funkcja iBandsOnArray() zwraca wartość wskaźnika Bollinger Bands dla danych zadanych pierwszym argumentem i przedziału zadanego drugim
argumentem.
107
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica danych.
total - Liczba wszystkich elementów tablicy.
deviation - Odchylenie.
bands_shift - Przesunięcia zakres.
mode - Identyfikatory linii wskaźnika (Tab. 40).
shift - Przesunięcie w stosunku do ostatniej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Aqua
#property indicator_color3 Blue
//---- bufory
double ExtBuffer0[], ExtBuffer1[], ExtBuffer2[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1) &&
!SetIndexBuffer(2, ExtBuffer2)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars - 1; i >= 0; i--)
{
ExtBuffer2[i] = iMA(NULL, 0, 13, 8, MODE_SMMA, PRICE_MEDIAN, i);
ExtBuffer1[i] = iBandsOnArray(ExtBuffer2, Bars, 2, 0, MODE_UPPER, i);
ExtBuffer0[i] = iBandsOnArray(ExtBuffer2, Bars, 2, 0, MODE_LOWER, i);

}
//----
return(0);
}
//+------------------------------------------------------------------+

j. Bulls Power - iBullsPower()

double iBullsPower(string symbol, int timeframe, int period, int applied_price, int shift)

Funkcja iBullsPower() zwraca wartość wskaźnika Bulls Power dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+

108
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iBullsPower(NULL, 0, 13, PRICE_CLOSE, i);
//----
return(0);
}
//+------------------------------------------------------------------+

k. Commodity Channel Index - iCCI()

double iCCI(string symbol, int timeframe, int period, int applied_price, int shift)

Funkcja iCCI() zwraca wartość wskaźnika Commodity Channel Index dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iCCI(NULL, 0, 12, i)
//----
return(0);
}
//+------------------------------------------------------------------+

l. Commodity Channel Index on ar r ay - iCCIOnAr r ay()

double iCCIOnArray(double array[], int total, int period, int shift)

Funkcja iCCIOnArray() zwraca wartość wskaźnika Commodity Channel Index dla danych zadanych pierwszym argumentem i przedziału zadanego
drugim argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica danych.
total - Liczba wszystkich elementów tablicy.
period - Liczba okresów użytych do obliczeń.

109
shift - Przesunięcie w stosunku do ostatniej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- deklaracja buforów
IndicatorBuffers(2);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars - 1; i >= 0; i--)
{
ExtBuffer1[i] = iMA(NULL, 0, 13, 8, MODE_SMMA, PRICE_MEDIAN, i);
ExtBuffer0[i] = iCCIOnArray(ExtBuffer1, Bars, 12, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

m. Custom Indicator - iCustom()

double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)

Funkcja iCustom() zwraca wartość wskaźnika zadanego trzecim argumentem dla instrumentu zadanego pierwszym argumentem i przedziału
czasowego zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
name - Ciąg znaków stanowiący nazwę programu wskaźnika.
... - Parametry liczbowe wskaźnika (jeśli wymagane).
mode - Indeks bufora linii od 0 do 7.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+

110
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iCustom(NULL, 0, "IndVol", 0, i);
//----
return(0);
}
//+------------------------------------------------------------------+

n. DeMar ker - iDeMar ker()

double iDeMarker(string symbol, int timeframe, int period, int shift)

Funkcja iDeMarker() zwraca wartość wskaźnika DeMarker dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iDeMarker(NULL, 0, 13, i);
//----
return(0);
}
//+------------------------------------------------------------------+

o. Envelopes - iEnvelopes()

double iEnvelopes(string symbol, int timeframe, int ma_period, int ma_method, int ma_shift, int applied_price, double
deviation, int mode, int shift)

Funkcja iEnvelopes() zwraca wartość wskaźnika Envelopes dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
ma_period - Liczba okresów do przeliczenia dla średniej kroczącej.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
ma_shift - Zakres przesunięcia.
applied_price - Cena odniesienia (Tab. 38).
deviation - Odchylenie.
mode - Identyfikatory linii wskaźnika (Tab. 40).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |

111
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--)
{
ExtBuffer[i] = iEnvelopes(NULL, 0, 13, MODE_SMA, 10, PRICE_CLOSE, 0.2, MODE_UPPER, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

p. Envelopes on buf fer - iEnvOnAr r ay()

double iEnvOnArray(double array[], int total, int period, int ma_method, double deviation, int mode, int shift)

Funkcja iEnvOnArray() zwraca wartość wskaźnika Envelopes dla danych zadanych pierwszym argumentem i przedziału zadanego drugim
argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica danych.
total - Liczba wszystkich elementów tablicy.
period - Liczba okresów użytych do obliczeń.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
deviation - Odchylenie.
mode - Identyfikatory linii wskaźnika (Tab. 40).
shift - Przesunięcie w stosunku do ostatniej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Aqua
#property indicator_color3 Blue
//---- bufory
double ExtBuffer0[], ExtBuffer1[], ExtBuffer2[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1) &&
!SetIndexBuffer(2, ExtBuffer2)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars - 1; i >= 0; i--)
112
{
ExtBuffer2[i] = iMA(NULL, 0, 13, 8, MODE_SMMA, PRICE_MEDIAN, i);
ExtBuffer1[i] = iEnvOnArray(ExtBuffer2, Bars, 13, MODE_SMA, 0.2, MODE_UPPER, i);
ExtBuffer0[i] = iEnvOnArray(ExtBuffer2, Bars, 13, MODE_SMA, 0.2, MODE_LOWER, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

q. For ce Index - iFor ce()

double iForce(string symbol, int timeframe, int period, int ma_method, int applied_price, int shift)

Funkcja iForce() zwraca wartość wskaźnika Force Index dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iForce(NULL, 0, 13, MODE_SMA, PRICE_OPEN, i);
//----
return(0);
}
//+------------------------------------------------------------------+

r. Fr actals - iFr actals()

double iFractals(string symbol, int timeframe, int mode, int shift)

Funkcja iFractals() zwraca wartość wskaźnika Fractals dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego drugim
argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
array[] - Tablica danych.
timeframe - Przedział czasowy.
mode - Identyfikatory linii wskaźnika (Tab. 40).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
113
#property indicator_buffers 2
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 115);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 115);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--)
{
ExtBuffer0[i] = iFractals(NULL, 0, MODE_UPPER, i);
ExtBuffer1[i] = iFractals(NULL, 0, MODE_LOWER, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

s. Gator Oscillator - iGator()

double iGator(string symbol, int timeframe, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int
lips_period, int lips_shift, int ma_method, int applied_price, int mode, int shift)

Funkcja iGator() zwraca wartość oscylatora Gator dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego drugim
argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
jaw_period - Liczba okresów do przeliczenia dla Jaw.
jaw_shift - Relatywne przesunięcie względem bieżącej świecy dla Jaw.
teeth_period - Liczba okresów do przeliczenia dla Teeth.
teeth_shift - Relatywne przesunięcie względem bieżącej świecy dla Teeth.
lips_period - Liczba okresów do przeliczenia dla Lips.
lips_shift - Relatywne przesunięcie względem bieżącej świecy dla Lips.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
applied_price - Cena odniesienia (Tab. 38).
mode - Identyfikatory linii wskaźnika (Tab. 40).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Blue
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+

114
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--)
{
ExtBuffer0[i] = iGator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMA, PRICE_MEDIAN, MODE_UPPER, i);
ExtBuffer1[i] = iGator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMA, PRICE_MEDIAN, MODE_LOWER, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

t. Ichimoku Kinko Hyo - iIchimoku()

double iIchimoku(string symbol, int timeframe, int tenkan_sen, int kijun_sen, int senkou_span_b, int mode, int shift)

Funkcja iIchimoku() zwraca wartość wskaźnik Ichimoku Kinko Hyo dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Tab. 41 Identyfikatory danych źródłowych.
Stała Wartość Opis
MODE_TENKANSEN 1 Tenkan-sen
MODE_KIJUNSEN 2 Kijun-sen
MODE_SENKOUSPANA 3 Senkou Span A
MODE_SENKOUSPANB 4 Senkou Span B
MODE_CHINKOUSPAN 5 Chinkou Span
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
tenkan_sen - Okres Tenkan Sen, zwykle 9.
kijun_sen - Okres Kijun Sen, zwykle 26.
senkou_span_b - Okres Senkou Span B, zwykle 52.
mode - Identyfikatory linii wskaźnika (Tab. 41).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Gold
#property indicator_color4 Peru
#property indicator_color5 Teal
//---- bufory
double ExtBuffer0[], ExtBuffer1[], ExtBuffer2[], ExtBuffer3[], ExtBuffer4[],;

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0 &&
!SetIndexBuffer(1, ExtBuffer1 &&
!SetIndexBuffer(2, ExtBuffer2 &&
!SetIndexBuffer(3, ExtBuffer3 &&
!SetIndexBuffer(4, ExtBuffer4) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--)
{
ExtBuffer0[i] = iIchimoku(NULL, 0, 9, 26, 52, MODE_TENKANSEN, i);
ExtBuffer1[i] = iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, i);
ExtBuffer2[i] = iIchimoku(NULL, 0, 9, 26, 52, MODE_SENKOUSPANA, i);
ExtBuffer3[i] = iIchimoku(NULL, 0, 9, 26, 52, MODE_SENKOUSPANB, i);
ExtBuffer4[i] = iIchimoku(NULL, 0, 9, 26, 52, MODE_CHINKOUSPAN, i);
}
//----
return(0);
}

115
//+------------------------------------------------------------------+

u. Mar ket Facilitation Index (Bill W illiams) - iBWMFI()

double iBWMFI(string symbol, int timeframe, int shift)

Funkcja iBWMFI() zwraca wartość wskaźnik Bill Williams Market Facilitation index dla instrumentu zadanego pierwszym argumentem i przedziału
czasowego zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iBWMFI(NULL, 0, i)
//----
return(0);
}
//+------------------------------------------------------------------+

v. Momentum - iMomentum()

double iMomentum(string symbol, int timeframe, int period, int applied_price, int shift)

Funkcja iMomentum() zwraca wartość wskaźnika Momentum dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{

116
//---- deklaracja buforów
IndicatorBuffers(2)
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--)
{
ExtBuffer[i] = iMomentum(NULL, 0, 12, PRICE_OPEN, 0) - iMomentum(NULL, 0, 20, PRICE_OPEN, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

w. Momentum on ar r ay - iMomentumOnAr r ay()

double iMomentumOnArray(double array[], int total, int period, int shift)

Funkcja iMomOnArray() zwraca wartość wskaźnika Momentum dla danych zadanych pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica danych.
total - Liczba wszystkich elementów tablicy.
period - Liczba okresów użytych do obliczeń.
shift - Przesunięcie w stosunku do ostatniej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars - 1; i >= 0; i--)
{
ExtBuffer1[i] = iMA(NULL, 0, 13, 8, MODE_SMMA, PRICE_MEDIAN, i);
ExtBuffer0[i] = iMomentumOnArray(ExtBuffer1, Bars, 12, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

x. Money Flow Index - iMFI()

double iMFI(string symbol, int timeframe, int period, int shift)

Funkcja iMFI() zwraca wartość wskaźnika Money Flow Index dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.

117
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iMFI(NULL, 0, 14, i);
//----
return(0);
}
//+------------------------------------------------------------------+

y. Moving Aver a ge - iMA()

double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

Funkcja iMA() zwraca wartość wskaźnika Moving Average dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
ma_shift - Zakres przesunięcia.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |

118
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iMA(NULL, 0, 13, 8, MODE_SMMA, PRICE_MEDIAN, i);
//----
return(0);
}
//+------------------------------------------------------------------+

z. Moving Aver a ge on ar r ay - iMAOnAr r ay()

double iMAOnArray(double array[], int total, int period, int ma_shift, int ma_method, int shift)

Funkcja iMAOnArray() zwraca wartość wskaźnika Moving Average dla danych zadanych pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica danych.
total - Liczba wszystkich elementów tablicy.
period - Liczba okresów użytych do obliczeń.
ma_shift - Zakres przesunięcia.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
shift - Przesunięcie w stosunku do ostatniej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- deklaracja buforów
IndicatorBuffers(2);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}
//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars - 1; i >= 0; i--)
{
ExtBuffer1[i] = iCCI(NULL, lim, 14, PRICE_TYPICAL, i);

ExtBuffer0[i] = iMAOnArray(ExtBuffer1[i], Bars, 5, 0, MODE_SMA, i);


}
//----
return(0);
}
//+------------------------------------------------------------------+

aa. Moving Aver age of Oscillator - iOsMA()

double iOsMA(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int
applied_price, int shift)

119
Funkcja iOsMA() zwraca wartość oscylatora Moving Average Convergence/Divergence dla instrumentu zadanego pierwszym argumentem i
przedziału czasowego zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
fast_ema_period - Liczba okresów do przeliczenia dla fast moving average.
slow_ema_period - Liczba okresów do przeliczenia dla slow moving average.
signal_period - Liczba okresów do przeliczenia dla signal moving average.
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iOsMA(NULL,0,12,26,9,PRICE_OPEN, i);
//----
return(0);
}
//+------------------------------------------------------------------+

bb. Moving Aver ages Conver gence/Diver gence - iMACD()

double iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int
applied_price, int mode, int shift)

Funkcja iMACD() zwraca wartość wskaźnika Moving Average Convergence/Divergence dla instrumentu zadanego pierwszym argumentem i
przedziału czasowego zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Tab. 42 Identyfikatory linii wskaźnika.
Stała Wartość Opis
MODE_MAIN 0 Linia bazowa wskaźnika.
MODE_SIGNAL 1 Linia sygnałowa wskaźnika.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
fast_ema_period - Liczba okresów dla których obliczana jest krótsza średnia krocząca, najczęściej 12 okresów.
slow_ema_period - Liczba okresów dla których obliczana jest dłuższa średnia krocząca, najczęściej 26 okresów.
signal_period - Liczba okresów do obliczenia linii sygnału, najczęściej średnia krocząca 9 okresowa.
applied_price - Cena odniesienia (Tab. 38).
mode - Identyfikatory linii wskaźnika (Tab. 42).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Blue
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

120
//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--)
{
ExtBuffer0[i] = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, i);
ExtBuffer1[i] = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

cc. On Balance Volume - iOBV()

double iOBV(string symbol, int timeframe, int applied_price, int shift)

Funkcja iOBV() zwraca wartość wskaźnika On Balance Volume dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iOBV(NULL, 0, PRICE_CLOSE, i);
//----
return(0);
}
//+------------------------------------------------------------------+

dd. Par abolic SAR - iSAR()

double iSAR(string symbol, int timeframe, int step, int maximum, int shift)

Funkcja iSAR() zwraca wartość wskaźnika Parabolic Sell and Reverse dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.

121
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
step - Inkrementacja/dekrementacja, zazwyczaj używa się 0.02.
maximum - Maksymalna wartość, zazwyczaj używa się 0.2.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienia rysowania
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 115);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iSAR(NULL, 0, 0.02, 0.2, i);
//----
return(0);
}
//+------------------------------------------------------------------+

ee. Relative Str ength Index - iRSI()

double iRSI(string symbol, void timeframe, int period, int applied_price, int shift)

Funkcja iRSI() zwraca wartość wskaźnika Relative Strength Index dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

122
//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iRSI(NULL, 0, 14, PRICE_POEN, i);
//----
return(0);
}
//+------------------------------------------------------------------+

f f. Relative Str ength Index on ar r ay - iRSIOnAr r ay()

double iRSIOnArray(double array[], int total, int period, int shift)

Funkcja iRSIOnArray() zwraca wartość wskaźnika Relative Strength Index dla danych zadanych pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica danych.
total - Liczba wszystkich elementów tablicy.
period - Liczba okresów użytych do obliczeń.
shift - Przesunięcie w stosunku do ostatniej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- deklaracja buforów
IndicatorBuffers(2);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}
//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars - 1; i >= 0; i--)
{
ExtBuffer1[i] = iMA(NULL, 0, 13, 8, MODE_SMMA, PRICE_MEDIAN, i);
ExtBuffer0[i] = iRSIOnBuffer(ExtBuffer1, Bars, 14, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

gg. Relative Vigor Index - iRVI()

double iRVI(string symbol, int timeframe, int period, int mode, int shift)

123
Funkcja iRVI() zwraca wartość wskaźnik Relative Vigor Index dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
mode - Identyfikatory linii wskaźnika (Tab. 42).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iRVI(NULL, 0, 10, MODE_MAIN, i);
//----
return(0);
}
//+------------------------------------------------------------------+

hh. Standar d Deviation - iStdDev()

double iStdDev(string symbol, int timeframe, int ma_period, int ma_method, int ma_shift, int applied_price, int shift)

Funkcja iStdDev() zwraca wartość wskaźnika Standard Deviation dla instrumentu zadanego pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
ma_period - Liczba okresów do przeliczenia dla średniej kroczącej.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
ma_shift - Zakres przesunięcia.
applied_price - Cena odniesienia (Tab. 38).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

124
//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iStdDev(NULL, 0, 10, MODE_SMA, PRICE_CLOSE, i);
//----
return(0);
}
//+------------------------------------------------------------------+

ii. Standar d Deviation on ar r ay - iStdDevOnAr r ay()

double iStdDevOnArray(double array[], int total, int ma_period, int ma_method, int ma_shift, int shift)

Funkcja iStdDevOnArray() zwraca wartość wskaźnika Standard Deviation dla danych zadanych pierwszym argumentem i przedziału czasowego
zadanego drugim argumentem.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_ARRAY_AS_PARAMETER_EXPECTED (4065) ERR_SOME_ARRAY_ERROR (4053)
Parametry:
array[] - Tablica danych.
total - Liczba wszystkich elementów tablicy.
ma_period - Liczba okresów do przeliczenia dla średniej kroczącej.
ma_method - Metoda liczenia średniej kroczącej (Tab. 37).
ma_shift - Zakres przesunięcia.
shift - Przesunięcie w stosunku do ostatniej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- deklaracja buforów
IndicatorBuffers(2);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars - 1; i >= 0; i--)
{
ExtBuffer1[i] = iMA(NULL, 0, 13, 8, MODE_SMMA, PRICE_MEDIAN, i);
ExtBuffer0[i] = iStdDevOnArray(ExtBuffer1, Bars, 10, MODE_SMA, 0, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

jj. Stochastic Oscillator - iStochastic()

double iStochastic(string symbol, int timeframe, int %Kperiod, int %Dperiod, int slowing, int method, int price_field, int
mode, int shift)

Funkcja iStochastic() zwraca wartość oscylator Stochastic dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego
drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.

125
timeframe - Przedział czasowy.
%Kperiod - Okres dla linii %K.
%Dperiod - Okres dla linii %D.
slowing - Opóźnienie.
method - Metoda liczenia średniej kroczącej (Tab. 37).
price_field - Pole ceny. Przyjmuje jedną z wartości: 0 - Low/High albo 1 - Close/Close.
mode - Identyfikatory linii wskaźnika (Tab. 42).
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Blue
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--)
{
ExtBuffer0[i] = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, MODE_MAIN, i);
ExtBuffer1[i] = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, MODE_SIGNAL, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+

kk. W illiam’s Per cent Range - iWPR()

double iWPR(string symbol, int timeframe, int period, int shift)

Funkcja iWPR() zwraca wartość wskaźnika Larry William's Percent Range dla instrumentu zadanego pierwszym argumentem i przedziału
czasowego zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy.
period - Liczba okresów użytych do obliczeń.
shift - Przesunięcie w stosunku do bieżącej świecy.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufory
double ExtBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer)) return(-1);
//---- wskaźnik zainicjalizowany
return(0);
}

126
//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars; i >= 0; i--) ExtBuffer[i] = iWPR(NULL, 0, 14, i);
//----
return(0);
}
//+------------------------------------------------------------------+

127
26. WSKAŹNIKI TECHNICZNE (OPIS)
⇒ Acceler ation/Deceler ation
⇒ Accumulation/Distribution
⇒ Alligator
⇒ Aver a ge Dir ectional Movement Index
⇒ Aver a ge Tr ue Range
⇒ Awesome Oscillator
⇒ Bear s Power
⇒ Bollinger Bands
⇒ Bollinger Bands on buf fer
⇒ Bulls Power
⇒ Commodity Channel Index
⇒ DeMar ker
⇒ Envelopes
⇒ For ce Index
⇒ Fr actals
⇒ Gator Oscillator
⇒ Ichimoku Kinko Hyo
⇒ Mar ket Facilitation Index
⇒ Momentum
⇒ Money Flow Index
⇒ Moving Aver a ge
⇒ Moving Aver a ge of Oscillator
⇒ Moving Aver a ges Conver gence/Diver gence
⇒ On Balance Volume
⇒ Par abolic SAR
⇒ Relative Str ength Index
⇒ Relative V igor Index
⇒ Standar d Deviation
⇒ Stochastic Oscillator
⇒ W illiam’s Per cent Range
1. Acceler ation/Deceler ation

Wskaźnik techniczny Acceleration/Deceleration (AC) mierzy siłę trendu i jest używany przy inwestycjach krótkoterminowych. Wskaźnik ten zmienia
kierunek przed jakimikolwiek zmianami w sile trendu, które, mają wpływ na kierunek trendu.
Interpretacja wskaźnika polega na obserwacji ekstremalnych poziomów wskaźnika. Poziom 0.00 jest zasadniczo linią gdzie siły trendów
spadkowego i wzrostowego się równoważą. Jeśli wskaźnik Acceleration/Deceleration przebije się powyżej poziomu 0.00, wtedy zazwyczaj następuje
ruch w górę i na odwrót, jeśli wskaźnik Acceleration/Deceleration spadnie poniżej poziomu 0.00, wtedy zazwyczaj następuje ruch w duł. Osiąganie
minimum przez wskaźnik często poprzedza osiągnięcie lokalnego minimum przez wykres kursu, zaś osiąganie maksimum przez wskaźnik często
poprzedza osiągnięcie lokalnego maksimum przez wykres kursu. Sygnał kupna jest generowani, gdy wskaźnik jest poniżej zera i zmienił kolor z
czerwonego na zielony. Sygnał sprzedaży jest generowani, gdy wskaźnik jest powyżej zera i zmienił kolor z zielonego na czerwony.
Jeśli gra się z trendem, dla bezpieczeństwa należy kupować przy drugim zielonym słupku wskaźnika a sprzedawać przy drugim czerwonym słupku
wskaźnika.
Obliczenia:
AO = SMA(MEDIAN PRICE, 5) - SMA(MEDIAN PRICE, 34)
AC = AO - SMA(AO, 5)
Oznaczenia:
MEDIAN PRICE - Średnia cena.
SMA - Prosta średnia ruchoma.
AO - Oscylator Awesome.

b. Accumulation/Distribution

Wskaźnik techniczny Accumulation/Distribution (A/D) jest określony przez zmiany w cenie i wolumenie, informuje o zachodzących ruchach
akumulacyjnych lub dystrybucyjnych. A/D opiera się na założeniu, iż ruch cen jest tym pewniejszy im większy jest towarzyszący mu wzrost wolumenu.
Inaczej mówiąc wolumen jest współczynnikiem zmiany cen. Czym większy wolumen tym większy współczynnik zmiany cen, gdy wraz ze wzrostem ceny
wzrasta wolumen, wzrasta akumulacja danego instrumentu, istnieje znaczące prawdopodobieństwo kontynuacji trendu zwyżkującego. Analogicznie,
spadek cen połączony z wzrostem obrotów powoduje spadek wartości wskaźnika i świadczy o zwiększonej dystrybucji - prawdopodobna kontynuacja
spadku notowań danego instrumentu.
Wskaźnik służy do przewidywania zmian trendów na podstawie obserwacji dywergencji pomiędzy wykresem kursu a przebiegiem wskaźnika. Kiedy
wskaźnik Accumulation/Distribution rośnie, to oznacza, iż nabycie (akumulacja) instrumentu przewyższa zbycie (dystrybucję) tego instrumentu. Kiedy
wskaźnik Accumulation/Distribution spada, to oznacza, iż zbycie (dystrybucja) instrumentu przewyższa nabycie (akumulację) tego instrumentu.
Rozbieżności między wykresami ceny i wskaźnika wskazują na nadchodzącą zmianę cen. Z reguły, w przypadku takich rozbieżności, wskaźnik
wskazuje kierunek trendu. W ten sposób, jeśli wskaźnik rośnie, a cena spada, to powinien nastąpić zwrot trendu. Jeśli na wskaźniku pojawia się trend
zwyżkujący przy kontynuacji spadku przez wykres kursu, zapowiadana jest zmiana trendu wykresu instrumentu. Analogicznie, zapowiadana jest zmiana
trendu zwyżkującego w sytuacji, gdy kurs nadal rośnie, a na wskaźniku wytworzy się trend zniżkujący - na wykresie skutkiem tego jest korekta cen
instrumentu.
Obliczenia:

128
A/D = SUM(((CLOSE - LOW) - (HIGH - CLOSE)) * VOLUME / (HIGH - LOW), N)
Oznaczenia:
N - Liczba okresów użytych do obliczeń.
HIGH - Najwyższa cena świecy.
LOW - Najniższa cena świecy.
CLOSE - Cena zamknięcia świecy.

c. Alligator

Wskaźnik techniczny Alligator ma linie Lips, Teeth i Jaw pokazujące zależności trendu w różnych okresach czasu. Ponieważ czyste trendy
występują rzadko (15 do 30 procent), ważnym jest wchodzenie na rynek z dużą dozą pewności, co do kierunku trendu. Kiedy linie Lips, Teeth i Jaw się
przecinają, to oznacza, że trend się zmienia.
Obliczenia:
MEDIAN PRICE = (HIGH + LOW) / 2
ALLIGATORS JAW = SMMA(MEDEAN PRICE, 13, 8)
ALLIGATORS TEETH = SMMA(MEDEAN PRICE, 8, 5)
ALLIGATORS LIPS = SMMA(MEDEAN PRICE, 5, 3)
Oznaczenia:
MEDIAN PRICE - Średnia cena.
HIGH - Najwyższa cena świecy.
LOW - Najniższa cena świecy.
SMMA(A, B, C) - Wygładzona średnia ruchoma. A - dana do wygładzenia, B - okres, C - przesunięcie.
ALLIGATORS JAW - Alligator’s jaws (linia niebieska);
ALLIGATORS TEETH - Alligator’s teeth (linia czerwona);
ALLIGATORS LIPS - Alligator’s lips (linia zielona).

d. Aver a ge Dir ectional Movement Index

Wskaźnik techniczny Average Directional Movement Index (ADX) pomaga w określeniu trendu. Najprostsza metoda oparta na systemie kierunku
ruchu, porównuje pozycje dwóch wskaźników: 14-okresów +DI i 14-okresów -DI. W. Wilder poleca kupowanie, kiedy +DI jest nad -DI i sprzedając, kiedy
+DI pod -DI.
Do tych prostych reguły Wells Wilder dodał "regułę punktów ekstremum". Ta reguła jest używana, by wyeliminować fałszywe sygnały i zmniejszyć
liczbę zleceń. Zgodnie z zasadą punktów ekstremum, "punkt ekstremum" to punkt gdzie +DI i -DI przecinają się. Punkt, w którym +DI przecina od dołu
-DI sygnalizuje, iż ceny będą rosły. Punkt, w którym +DI przecina od góry -DI sygnalizuje, iż ceny będą spadały.
Punkt ekstremum używamy wtedy, jako poziom wejścia. Po sygnale, kupna (+DI powyżej -DI) trzeba zaczekać, aż cena nie przekroczy punktu
ekstremum.
Obliczenia:
ADX = SUM[(+DI - (-DI))/(+DI + (-DI)), N]/N
Oznaczenia:
N - Liczba okresów użytych do obliczeń.

e. Aver a ge Tr ue Range

Wskaźnik techniczny Average True Range (ATR) jest wskaźnikiem pokazującym płynność rynku dla danego instrumentu. Wskaźnik ten jest
używany, jako część składowa wielu innych wskaźników i strategii.
Average True Range może często osiągnąć wysoką wartość mimo niskiego kursu wywołanego niepokojami na rynku. Niskie wartości wskaźnika są
typowe dla długiego okresu z trendem bocznym, który zdarza się na szczycie rynku i podczas konsolidacji. Zasada przewidywania opartego na tym
wskaźniku może zostać sformułowana następująco: wyższa wartość tego wskaźnika to wyższe prawdopodobieństwo zmiany trendu, niższa wartość tego
wskaźnika to mniejsza zmienność trendu.
Wskaźnik ATR oblicza się, jako średnią z rzeczywistego zakresu zmian (TR - True Range), który jest największą wartością z odległości pomiędzy
poprzednią ceną zamknięcia a aktualnym minimum, odległości pomiędzy aktualnym maksimum a poprzednią ceną zamknięcia i odległością pomiędzy
aktualnym maksimum i minimum.
Wskaźnik jest używany do przewidywania lokalnych szczytów i dołków - jego wartość jest często wysoka i osiąga szczyt przed lokalnym minimum
lub maksimum kursu. Także wysoka wartość wskaźnika podczas gwałtownego spadku lub wzrostu może zapowiadać dłuższą zmianę trendu. Niskie
wartości wskaźnika potwierdzają trend horyzontalny.
Obliczenia:
ATR = MAX(HIGH[0] - LOW[0], MAX(CLOSE[1] - HIGH[0], CLOSE[1] - LOW[0])
Oznaczenia:
HIGH - Najwyższa cena świecy.
LOW - Najniższa cena świecy.

f. Awesome Oscillator

Wskaźnik techniczny Awesome Oscillator (AO) jest różnicą prostych średnich kroczących z 5 i 34 okresów dla średnich wartości świec (H + L) / 2.
To pokazuje całkiem wyraźnie siłę trendu w obecnym momencie.
Sygnał kupna, jest generowany przez dodatnie wartości oscylatora, kiedy trend zmienia kierunek w górę, jeśli druga kolumna ma mniejszą wartość
niż pierwsza i jest czerwona, trzecia kolumna jest wyższa niż druga i jest zielona.
Sygnał kupna, jest generowany przy przejściu od wartości ujemnych do dodatnich. Ten sygnał jest generowany, tylko przez dwie kolumny. Pierwsza
kolumna ma mieć wartość ujemną a druga ma mieć wartości dodatnią. Wystąpienie równocześnie sygnałów, kupna i sprzedaży jest niemożliwe.
Sygnał kupna, jest generowany przez ujemne wartości oscylatora, kiedy po przejściu przez poziom 0.00 przedostatnia kolumna ma największą, co
do modułu, wartość a ostatnia kolumna ma mniejszą, co do modułu, wartość.
Sygnał sprzedaży, jest analogiczny do sygnału kupna opisanego w drugim akapicie i jest generowany przez ujemne wartości oscylatora. Sygnał
sprzedaży, jest analogiczny do sygnału kupna opisanego w trzecim akapicie i jest generowany przy przejściu od wartości dodatnich do ujemnych. Sygnał
sprzedaży, jest analogiczny do sygnału kupna opisanego w czwartym akapicie i jest generowany przez dodatnie wartości oscylatora, kiedy po przejściu
przez poziom 0.00 ostatnia kolumna ma największą, wartość a ostatnia kolumna ma mniejszą wartość.
Obliczenia:
AO = SMA((HIGH + LOW) / 2, 5) - SMA((HIGH + LOW) / 2, 34)
Oznaczenia:
129
HIGH - Najwyższa cena świecy.
LOW - Najniższa cena świecy.
SMA - Prosta średnia ruchoma.

g. Bear s Power

Wskaźnik techniczny Bears Power jest wskaźnikiem pokazującym stosunek siły sprzedawców ("Niedźwiedzie" - spadek ceny) do siły nabywców
("Byki" - wzrost ceny) dla pewnego okresu czasu, najniższa cena pokazuje maksymalny udział sprzedawców. W zależności od przeważającej siły cena
rośnie lub spada.
Jest bardzo ważne by być w stanie oszacować stosunek siły nabywców do siły sprzedawców. To zadanie może zostać rozwiązane przy użyciu
oscylatora Bears Power.
Oscylator Bears Power jest różnicą pomiędzy najniższą ceną i wykładniczą średnią kroczącą z 13-okresów (LOW - EMA). Wskaźnika lepiej jest
używać razem z wskaźnikiem trendu (najczęściej średnia krocząca). Jeśli wskaźnik trendu jest skierowany ku górze i indeks Bears Power, jest poniżej
zera, ale rośnie, to generowany jest sygnał kupna.
Obliczenia:
BEARS = LOW - EMA
Oznaczenia:
LOW - Najniższa cena świecy.
EMA - Wykładnicza średnia ruchoma.

h. Bollinger Bands

Wskaźnik techniczny Bollinger Bands (BB) jest podobny do Envelopes. Jedyną różnicą jest to, że odległość band wskaźnika Envelopes od średniej
kroczącej jest stała a rozpiętość bandy wskaźnika Bollinger’a jest obliczana w oparciu o odchylenie standardowe. Odchylenie standardowe jest miarą
zmienności, dlatego Bollinger Bands przystosowują się do warunków rynku.
Bollinger Bands zwykle jest nakładany na wykres ceny, ale może być, także dodany w oknie wskaźnika (Custom Indicators). Tak jak w przypadku
Envelopes, interpretacja Bollinger Bands jest oparta na fakcie, że ceny nie często osiągają ekstremum. Wyróżniająca cecha wskaźnika Bollinger Bands
jest jego zmienna szerokość band z powodu okresowych zmian płynności rynku. W okresie znacznych zmian cen bandy poszerzają się. Podczas
okresów zastoju lub okresów niskiej płynności rynku bandy kurczą się.
Ogólnie należy sprzedawać, gdy wykres cen jest nad linią TL a kupować w odwrotnej sytuacji to znaczy, gdy wykres cen jest pod linią BL.
Obliczenia:
ML = SUM(CLOSE, N) / N
StdDev = SQRT(SUM(CLOSE - SMA(CLOSE, N), N) ^ 2) / N
TL = ML + (D * StdDev)
BL = ML — (D * StdDev)
Oznaczenia:
N - Liczba okresów.
SMA - Prosta średnia ruchoma.
StdDev - Odchylenie standardowe.

i. Bulls Power

Wskaźnik techniczny Bulls Power jest wskaźnikiem pokazującym stosunek siły nabywców ("Byki" - wzrost ceny) do siły sprzedawców
("Niedźwiedzie" - spadek ceny) dla pewnego okresu czasu, najniższa cena pokazuje maksymalny udział sprzedawców. W zależności od przeważającej
siły cena rośnie lub spada.
Jest bardzo ważne by być w stanie oszacować stosunek siły nabywców do siły sprzedawców. To zadanie może zostać rozwiązane używając
oscylatora Bulls Power.
Oscylator Bulls Power jest różnicą pomiędzy najwyższą ceną i wykładniczy średnią kroczącą z 13-okresów (HIGH - EMA). Ten wskaźnik lepiej jest
używać razem z wskaźnikiem trendu (najczęściej średnia krocząca). Jeśli wskaźnik trendu jest skierowany w dół i indeks Bulls Power, jest powyżej zera,
ale maleje, to generowany jest sygnał sprzedaży.
Obliczenia:
BULLS = HIGH - EMA
Oznaczenia:
HIGH - Najwyższa cena świecy.
EMA - Wykładnicza średnia ruchoma.

j. Commodity Channel Index

Wskaźnik techniczny Commodity Channel Index (CCI) jest wskaźnikiem bazującym na tzw. kursie typowym (Typical Price: (H + L + C) / 3 gdzie, H
to kurs maksimum, L to kurs minimum, C to cena zamknięcia) i odchylenie ceny od ceny średniej w stosunku do części uśrednionego odchylenia w N
okresach. Przy obliczaniu wskaźnika najczęściej stosuje się czternaście okresów. Wysokie wartości tego wskaźnika oznaczają względnie wysokie ceny a
niskie wartości pokazują, że cena jest względnie niska. Pomimo nazwy, Commodity Channel Index może być stosowany dla jakiegokolwiek instrumentu
finansowego.
Są dwie podstawowe techniki używania Commodity Channel Index. Pierwsza z nich polega na znajdywaniu dywergencji pomiędzy wykresem kursu
a wykresem wskaźnika. Kiedy wskaźnik wskazuje trend zniżkujący a trend wykresu kursu jest zwyżkujący, to taka sytuacja zwykle pociąga za sobą
korektę ceny a więc i zmianę trendu. Druga technika używa Commodity Channel Index jako wskaźnika wykupienia / wysprzedaży. Wartość wskaźnika
powyżej poziomu +100, generuje sygnał wykupienia, gdy CCI przebija od góry poziom +100. Wartość wskaźnika poniżej poziomu -100, generuje sygnał
wysprzedaży, gdy CCI przebija od góry poziom +100. Cechą charakterystyczną CCI jest to, że najczęściej generuje on sygnał kupna wcześniej niż inne
wskaźniki.
Obliczenia:
CCI = (SUM(D, N) / N * 0,015) / ((HIGH + LOW + CLOSE) / 3 - SUM((HIGH + LOW + CLOSE) / 3, N) / N)
Oznaczenia:
N - Liczba okresów.
SMA - Prosta średnia ruchoma.

k. DeMar ker
130
Wskaźnik techniczny DeMarker porównuje wartości dwóch bezpośrednio sąsiadujących świec. Jeśli aktualna świeca ma wartości maksymalną
wyższą od poprzedniej świecy różnica między nimi będzie zarejestrowana. Jeśli aktualna świeca ma wartości maksymalną niższą lub równą wartości
maksymalnej poprzedniej świecy, będzie zarejestrowana wartość zero. Różnice otrzymane dla N okresów są sumowane. Otrzymana wartość jest
używana, jako licznik DeMarker i jest dzielony przez tę samą wartość plus suma różnicy, gdy poprzednia minimalna wartość jest większa. Jeśli aktualne
minimum ceny jest większe niż minimum poprzedniej świecy, wartość zerowa będzie zarejestrowana.
Kiedy wskaźnik osiąga wartości poniżej 0.3, powinno się oczekiwać odwrócenia trendu spadkowego. Kiedy wskaźnik osiąga wartości powyżej 0.7,
powinno się oczekiwać odwrócenia trendu wzrostowego.
Jeśli używasz dłuższych okresów, obliczając wskaźnik, będziesz w stanie określić długoterminowe trendy. Wskaźnik bazowany na krótkich okresach
pozwala wchodzić na rynek w punkcie najmniejszego ryzyka i planować czas transakcji, w odniesieniu do głównego trendu.
Obliczenia:
DeMax[i] = (high[i] - high[i - 1]) * [high[i] > high[i - 1]]
DeMin[i] = (low[i - 1] - low[i]) * [low[i] < low[i - 1]]
Dmark = SMA(DeMax, N) / (SMA(DeMax, N) + SMA(DeMin, N))
Oznaczenia:
N - Liczba okresów.
SMA - Prosta średnia ruchoma.

l. Envelopes

Wskaźnik techniczny Envelopes jest utworzony przy pomocy dwóch średnich kroczących, z których jedna jest przesunięta w górę a druga jest
przesunięta w dół. Wybór optymalnego marginesu przesunięcia zależy od płynności rynku. Niższa płynność rynku wymaga większego marginesu.
Envelopes definiuje górny i dolny margines cen. Sygnał sprzedaży, jest generowany, kiedy cena osiąga górny margines bandy. Sygnał kupna, jest
generowany, kiedy cena osiąga dolny margines bandy.
Obliczenia:
UB = SMA(CLOSE, N) * (1 + K / 1000)
LB = SMA(CLOSE, N) * (1 - K / 1000)
Oznaczenia:
N - Liczba okresów.
SMA - Prosta średnia ruchoma.
K / 1000 - Wartość przesunięcia średniej (mierzona w punktach podstawy)

m. For ce Index

Wskaźnik techniczny Force Index prezentowany jest w formie graficznej jako wykres na skali oscylujący wokół zera i mierzy siłę byków w każdym
wzroście i siłę niedźwiedzi w każdym spadku. Łączy informacje o ruchu cen i wolumen transakcji. Aproksymacja za pomocą średniej kroczącej pomaga
znajdować najlepszy moment do otwarcia lub zamknięcia pozycji i pomaga określić zmiany trendu cen. Wykres samego wskaźnika jednakże jest raczej
zmienny i nierówny, dlatego dla uzyskania lepszych efektów łączy się go z dwu okresową średnią kroczącą wykładniczą dla prognoz krótkoterminowych
lub z trzynasto okresową średnią kroczącą wykładniczą dla prognoz długoterminowych.
Sygnał kupna, jest generowany, kiedy wskaźnik z wartości dodatnich przechodzi na wartości ujemne w okresie trendu wzrostowego. Sygnał
sprzedaży, jest generowany, kiedy wskaźnik z wartości ujemnych przechodzi na wartości dodatnie w okresie trendu spadkowego. Jeśli zmiany ceny nie
korelują z odpowiednimi zmianami w wolumenie, wskaźnik niewiele się zmienia. Zazwyczaj jest to sygnał zmiany trendu. Sygnały powinny być
potwierdzone przez odpowiednie sygnały na średniej wykładniczej.
Obliczenia:
FI = VOLUME * ((MA(ApPRICE, N, i) - MA(ApPRICE, N, i - 1))
Oznaczenia:
VOLUME - Wolumen.
MA - Średnia krocząca.
ApPRICE - Metoda: Simple, Exponential, Weighted lub Smoothed.
N - Liczba okresów.

n. Fr actals

Wskaźnik techniczny Fractals, wyraża się wzorami, które są serią, co najmniej pięciu kolejnych świec, zwanych figurami. Są dwa typy fraktali, fraktal
z najwyższym punktem zwrotnym w środku i dwoma niższymi z obu stron i fraktal z najniższym punktem zwrotnym w środku i dwoma wyższymi z obu
stron.
Wskaźnik Fractals razem ze wskaźnikiem Alligator służy do przewidywania zmian trendu. Innymi słowy nie powinno się zamykać transakcji kupna,
jeśli fractal jest niżej niż Alligator’s Teeth i nie powinno się zamykać transakcji sprzedaży, jeśli fractal jest wyżej niż Alligator’s Teeth. Na rynek należy
wchodzić, gdy sygnał wskaźnika Aligator zostanie poprzedzony przez odpowiedni sygnał wskaźnika Fractals.

o. Gator Oscillator

Wskaźnik techniczny Gator Oscillator jest oparty na wskaźniku Alligator i pokazuje stopień zbieżności / rozbieżności Balance Lines (Wygładzona
Średnia krocząca). Wykres świecowy jest absolutną różnicą między wartościami czerwonej linii i zielonej linii, ale z ujemnym znakiem, ponieważ wykres
świecowy jest odwrócony.

p. Ichimoku Kinko Hyo

Wskaźnik techniczny Ichimoku Kinko Hyo scharakteryzuje trend rynku, poziomy wsparcia i oporu i generuje sygnały kupna i sprzedaży. Wskaźnik
ten pracuje najlepiej w tygodniowych i dziennych wykresach.
Definiując parametry, używamy trzech różnych interwałów czasowych. Wartości poszczególnych linii składowych tego wskaźnika są oparte na tych
interwałach.
Tenkan-sen pokazuje średnią cenę stosując pierwszy interwał zdefiniowany jako suma maksimum i minimum dzielone przez dwa. Kijun-sen
pokazuje średnią cenę stosując drugi interwał. Senkou Span A wyznacza środek między dwoma poprzednimi liniami, wartość drugiego interwału
czasowego określa przesunięcie linii wstecz. Senkou Span B pokazuje średnią cenę stosując trzeci interwał przesunięty wstecz o wartość drugiego
interwału czasowego.

131
Chinkou Span pokazuje cenę zamknięcia aktualnej świecy przesuniętą wstecz o wartość drugiego interwału czasowego. Odległość między liniami
Senkou jest zaznaczona innym kolorem i nazwaną "cloud". Jeśli cena jest między tymi liniami, możliwa jest zmiana trendu a wtedy marginesy cloud
tworzą poziomy wsparcia i oporu.
Jeśli cena jest powyżej cloud, górna linia tworzy pierwszy poziom wsparcia a druga linia tworzy drugi poziom wsparcia. Jeśli cena jest poniżej cloud,
dolna linia tworzy pierwszy poziom oporu a górna tworzy drugi poziom oporu. Jeśli linia Chinkou Span przecina wykres ceny od dołu, to jest to sygnał
kupna. Jeśli Chinkou przecina wykres ceny od góry, to jest to sygnał sprzedaży.
Kijun-sen jest używany jako wskaźnik ruchu rynku. Jeśli cena będzie powyżej tego wskaźnika, cena prawdopodobnie będzie kontynuować wzrost.
Kiedy cena przechodzi tę linię zmiana trendu jest prawdopodobna. Sygnał kupna jest generowany, kiedy linia Tenkan-sen przechodzi przez Kijun-sen od
dołu. Sygnał sprzedaży jest generowany, kiedy linia Tenkan-sen przechodzi przez Kijun-sen od góry. Tenkan-sen jest użyty jako wskaźnik trendu rynku.
Kiedy linia jest poziomo, to znaczy, że rynek wszedł w trend boczny.

q. Mar ket Facilitation Index

Wskaźnik techniczny Market Facilitation Index (BW MFI) jest wskaźnikiem, który pokazuje zmianę ceny dla jednego tiku. Absolutne wartości
wskaźnika nic nie znaczą.
Kiedy zarówno BW MFI, jak i wolumen rośnie równocześnie, oznacza to, że trend na rynku jest stabilny i, że więcej ludzi uczestniczy w rynku. To
sygnał, by wejść na rynek.
Kiedy zarówno BW MFI, jak i wolumen spada równocześnie, oznacza to, że zainteresowanie inwestorów zaczyna słabnąć. Taka sytuacja często
występuje pod koniec trendu.
Kiedy BW MFI osiąga względnie wysokie wartości a wolumen spada, oznacza to, że trend rynku jest w miarę stabilny, ale nie ma żadnych nowych
uczestników, by wygenerować wyższy wolumen. Ruchy cen są skutkiem spekulacji.
Kiedy BW MFI osiąga względnie wysokie wartości a wolumen równocześnie rośnie, oznacza to, że siły kupujących i sprzedających prawie się
równoważą. Taka sytuacja często występuje przed znacznym ruchem w przeciwnym kierunku.
Obliczenia:
BWMFI = RANGE * (HIGH - LOW) / VOLUME
Oznaczenia:
VOLUME - Wolumen.
RANGE - Czynnik mnożenia, który odpowiada różnicy w punktach.
HIGH - Najwyższa cena świecy.
LOW - Najniższa cena świecy.

r. Momentum

Wskaźnik techniczny Momentum jest podstawowym wskaźnikiem siły trendu i prezentuje wielkość zmiany ceny danego instrumentu w określonym
przedziale czasowym. W przypadku tego wskaźnika możliwe jest poszukiwanie dywergencji pomiędzy wskazaniami wykresu wskaźnika a wykresem
kursu, jak i wyznaczanie linii trendów (jednak dotyczy to przeważnie inwestycji w krótszym horyzoncie czasowym).
Możemy używać wskaźnika Momentum, jako oscylatora trendu podobny do Moving Average Convergence/Divergence (MACD). Wtedy kupujemy,
kiedy wskaźnik po długim spadku zacznie zwrot ku górze a sprzedajemy, kiedy wskaźnik po długim wzroście zacznie zwrot do dołu. Możemy
wykorzystać krótko terminową średnią kroczącą, by określić, moment kupna i sprzedaży.
Jeśli wskaźnika Momentum osiąga niezmiernie wysokie lub niskie wartości (w stosunku do jego historycznych wartości), należy założyć kontynuację
aktualnego trendu. Na przykład, jeśli wskaźnika Momentum osiąga niezmiernie wysokie wartości i zmienia kierunek, należy założyć, że ceny
prawdopodobnie pójdą jeszcze wyżej.
Można również używać wskaźnika Momentum, jako wiodącego wskaźnika. Ta metoda zakłada, że szczyty rynku są typowo identyfikowane przez
szybki wzrost ceny (kiedy każdy oczekuje, że cena wzrośnie) i, że trend spadkowy typowo kończą się szybkimi spadkami ceny (kiedy każdy chce wyjść).
To jest częsty przypadek, ale to jest generalizacja.
Obliczenia:
MOMENTUM = CLOSE[i] / CLOSE[i - N] * 100
Oznaczenia:
CLOSE - Cena zamknięcia świecy.
i - Indeks świecy.
N - Przesunięcie.

s. Money Flow Index

Wskaźnik techniczny Money Flow Index (MFI), wskazuje tempo przepływów pieniężnych (wielkość napływu i odpływu kapitału). Wskaźnik
przedstawiany jest, jako wykres oscylujący w granicach wartości od 0 do 100. Interpretacja wskaźnika jest podobna do interpretacji wskaźnika Relative
Strength Index, jednakże w przeciwieństwie do niego wskaźnik MFI bierze pod uwagę także wolumen.
Analizując Money Flow Index trzeba wziąć pod uwagę dwie rzeczy. Po pierwsze rozbieżności między wskaźnikiem i ruchem cen. Jeśli ceny rosną,
kiedy MFI spada (lub vice versa), jest sygnałem zwrotu trendu. Po drugie wartość, Money Flow Index, której poziom jest ponad 80 lub pod 20, jest
sygnałem odpowiednio wykupienia lub wyprzedaży.
Obliczenia:
MF[i] = (HIGH[i] + LOW[i] + CLOSE[i]) / 3 * VOLUME[i]
MR = SUM(MF[i] * [MF[i - 1] - MF[i] > 0], N) / SUM(MF[i] * [MF[i - 1] - MF[i] < 0], N)
MFI = 100 - (100 / (1 + MR))
Oznaczenia:
VOLUME - Wolumen.
CLOSE - Cena zamknięcia świecy.
HIGH - Najwyższa cena świecy.
LOW - Najniższa cena świecy.
i - Indeks świecy.
N - Liczba okresów użytych do obliczeń.

t. Moving Aver a ge

Wskaźnik techniczny Moving Average jest średnią kroczącą pokazującą uśrednioną wartość instrumentu dla pewnego okresu. Są cztery typy
średnich kroczących. Prosta również zwany arytmetyczną (SMA), wykładnicza (EMA), wygładzona (SMMA) i liniowo ważona (LWMA). Średnie kroczące
mogą zostać obliczony dla ciągłego zbioru danych, zawierając ceny otwarcia i zamknięcia, ceny najwyższe i najniższe, wolumen lub inne wskaźniki.
W przypadku prostych średnich kroczących, wszystkie ceny z danego okresu, o których mowa, są równo wartościowe. Wykładnicza i liniowo
ważona średnia krocząca przywiązuje większą wagę do późniejszych cen.
132
Kiedy wykres ceny przecina średnią kroczącą od dołu, jest to sygnał kupna, jeśli wykres ceny przecina średnią kroczącą od góry, to jest to sygnał
sprzedaży.
System, który jest oparty na średniej kroczącej, nie wchodzi na rynek w punkcie ekstremum, ale pozwala na transakcję wkrótce po tym, jak cena
osiągnie lokalne ekstremum. Średnia krocząca może również zostać odniesiona do wskaźników. Interpretacja takiego wskaźnika jest podobna do
interpretacji średniej kroczącej cen.
Obliczenia:
SMA = SUM(CLOSE, N) / N
Oznaczenia:
CLOSE - Cena zamknięcia świecy.

u. Exponential Moving Aver age

Wskaźnik techniczny Exponential Moving Average (EMA) jest odpowiedzią analityków technicznych często korzystających z wykładniczych średnich
kroczących, aby pozbyć się opóźnień w prostych średnich ruchomych (średnich arytmetycznych). Podstawową cechą tej średniej jest fakt, iż przywiązuje
ona większą wagę do ostatnich wartości niż do wartości starszych i jest tym samym bardziej czuła, a więc lepiej oddaje bieżącą kondycję rynku. Ponadto
EMA szybciej od SMA reaguje na zmiany. Stare wartości EMA, zamiast być odrzucane, tracą stopniowo na znaczeniu aż przestają w ogóle być istotne.
Najczęściej wskaźnik EMA oblicza się na podstawie cen zamknięcia.
Interpretacja wskaźnika EMA jest w zasadzie identyczna z interpretacją wskaźnika SMA. Jeśli wykres kursu przecina od góry nierosnącą linię
wykładniczej średniej kroczącej, jest to sygnał do sprzedaży. Sygnał jest tym mocniejszy, im dłużej linia średniej była ustabilizowana w pozycji zbliżonej
do horyzontalnej przed wygenerowaniem sygnału. Gdy zaś wykres kursu przecina od dołu niemalejącą wykładniczą średnią kroczącą, jest to sygnał do
kupna. Sygnał jest tym mocniejszy, im dłużej linia średniej była ustabilizowana w pozycji horyzontalnej przed wygenerowaniem sygnału.
Obliczenia:
EMA = (CLOSE[i] * P) + (EMA(i - 1) * (100 - P))
SMMA(i) = (SMMA(i - 1) * N - SMMA(i - 1) + CLOSE[i]) / N
SMMA(i) = (SMMA(i - 1) * (N - 1) + CLOSE[i]) / N
LWMA = SUM(CLOSE[i] * i, N) / SUM(i, N)
Oznaczenia:
CLOSE - Cena zamknięcia świecy.
P - Procent istotności wartość cen historycznych.
N - Liczba okresów.
i - Indeks świecy.

v. Moving Aver a ge Conver gence/Diver gence

Wskaźnik techniczny Moving Average Convergence / Divergence (MACD) wskazuje korelację między dwoma średnimi kroczącymi cen. Wskaźnik
Moving Average Convergence / Divergence jest różnicą między 26-okresową i 12-okresową wykładniczą średnią kroczącą (EMA). Aby jasno określić
możliwość kupna / sprzedaży, stosuje się 9-okresową średnią kroczącą na wykresie MACD.
Popularność wskaźnika MACD wynika z dużej użyteczności generowanych przez niego sygnałów, z łatwości interpretacji oraz z możliwości
wykorzystania wskaźnika zarówno w okresie stabilizacji jak i wyraźnych wzrostów czy spadków cen. Przy stosunkowo dużej wiarygodności
generowanych przez MACD sygnałów wadą są wyraźne ich opóźnienia. Dlatego MACD bardziej przydaje się przy inwestycjach o dłuższym horyzoncie
czasowym.
MACD okazuje się najbardziej efektywny na rynkach gdzie różnica kursu jest duża. Sygnał kupna zostaje wygenerowany, gdy MACD przebija od
dołu niemalejącą linię Signal, zaś sygnał sprzedaży zostaje wygenerowany, gdy MACD przebija od góry nierosnącą linię Signal. Sygnał kupna powinien
zostać wygenerowany poniżej poziomu zerowego, a sygnał sprzedaży powyżej tego poziomu. Zdarza się, gdy nieco ponad poziomem zerowym
dochodzi do ustabilizowania wskaźnika, a następnie przebicia w górę linię Signal - zostaje często wygenerowany mocny sygnał kupna zapowiadający
długą zwyżkę. Analogiczna sytuacja ma miejsce w przepadku sygnału sprzedaży.
Obliczenia:
MACD = EMA(CLOSE, 12) - EMA(CLOSE, 26)
SIGNAL = SMA(MACD, 9)
Oznaczenia:
CLOSE - Cena zamknięcia świecy.
SMA - Prosta średnia krocząca.
EMA - Wykładnicza średnia krocząca.

w. Moving Aver a ge of Oscillator

Wskaźnik techniczny Moving Average of Oscillator (OsMA) przedstawia różnicę pomiędzy linią MACD a linią Signal. Zatem sygnały generowane
przez ten wskaźnik przy przecięciu poziomu 0.00 odpowiadają sygnałom generowanym przy przecinaniu linii Signal przez MACD. Przy zastosowaniu
tego wskaźnika będzie często łatwiej odszukać punkty przecięcia niż przy wykorzystaniu MACD i linii Signal, jednak następuje to kosztem utraty
informacji dostępnej w przypadku analizy przebiegu linii Signal (nie widać wzrostów ani spadków).
W przypadku wskaźnika OsMA, sygnał kupna zostaje wygenerowany, gdy OsMA przebija od dołu poziom 0.00, zaś sygnał sprzedaży zostaje
wygenerowany, gdy OsMA przebija od góry poziom 0.00.
Obliczenia:
OsMA = EMA(CLOSE, 12) - EMA(CLOSE, 26) - SMA(EMA(CLOSE, 12) - EMA(CLOSE, 26), 9)
Oznaczenia:
CLOSE - Cena zamknięcia świecy.
SMA - Prosta średnia krocząca.
EMA - Wykładnicza średnia krocząca.

x. On Balance Volume

Wskaźnik techniczny On Balance Volume (OBV) jest wskaźnikiem, który odpowiada wolumenowi obrotów w czasie, ze znakiem plus lub minus,
zależnie od zmiany kursu zamknięcia danej świecy i pomaga oszacować wielkość zmiany ceny.
Zasada działania wskaźnika jest dość prosta, gdy cena zamknięcia aktualnej świecy jest większa od ceny zamknięcia poprzedniej świecy to
poprzednia wartość wskaźnika jest inkrementowana o wartość wolumenu. Gdy cena zamknięcia aktualnej świecy jest mniejsza od ceny zamknięcia
poprzedniej świecy to poprzednia wartość wskaźnika jest dekrementowana o wartość wolumenu. Gdy cena zamknięcia aktualnej świecy jest równa cenie
zamknięcia poprzedniej świecy to poprzednia wartość wskaźnika jest przepisywana.

133
Podstawowe założenie, dotyczące tego wskaźnika jest takie, że wskaźnik OBV powinien wyprzedzać zmiany cen instrumentu, dlatego też sposób
interpretacji wykresu wskaźnika polega na wyznaczaniu linii trendu oraz poszukiwaniu dywergencji pomiędzy wskaźnikiem a ruchami cen. Wskaźnik
OBV używany jest często w roli wskaźnika pomocniczego, uzupełniającego sygnały innych wskaźników. Jego zmodyfikowaną i ulepszoną wersją jest
wskaźnik A/D (Accumulation/Distribution).
Obliczenia:
OBV(i) = OBV(i - 1) + VOLUME[i] * SIGN(VOLUME[i] - VOLUME[i - 1])
Oznaczenia:
VOLUME - Wolumen.

y. Par abolic SAR

Wskaźnik techniczny Parabolic SAR został stworzony dla analizowania trendów rynków. Wskaźnik jest umieszczany na wykresie ceny i używany
jest do określenia punktów zamykania pozycji, zarówno krótkich jak i długich. Ten wskaźnik jest podobny do średnich kroczących z małymi różnicami.
Wskaźnik jest poniżej wykresu cen, jeśli trend jest wzrostowy, kiedy trend jest spadkowy, to wskaźnik jest powyżej wykresu cen.
Mimo swojej bardzo skomplikowanej formuły matematycznej, interpretacja wskaźnika jest prosta. Sygnałem kupna jest wejście notowań powyżej
przebiegu wskaźnika, zaś sygnałem sprzedaży jest zejście notowań poniżej przebiegu wskaźnika. Zaleca się branie pod uwagę jedynie sygnałów
zgodnych z obecnym trendem, czyli sygnałów występujących po wcześniejszym uformowaniu się trendu i zgodnych z jego kierunkiem.
Kiedy wskaźnik przechodzi na drugą stronę wykresu cen, cena maksymalna lub minimalna dla poprzedniego okres służy jako punkt początkowy.
Kiedy wskaźnik przechodzi na drugą stronę wykresu cen, daje sygnał końca trendu lub jego odwrócenia. Dlatego Parabolic SAR jest bardzo dobrym
wskaźnikiem dla dostarczania punktów wyjścia.
Obliczenia:
SAR(i) = SAR(i - 1) + ACCELERATION * (EPRICE(i - 1) - SAR(i - 1))
Oznaczenia:
ACCELERATION - Czynnik przyspieszenia.
EPRICE - Cena dla poprzedniej świecy (EPRICE = HIGH dla długich pozycji, EPRICE = LOW dla krótkich pozycji).

z. Relative Str ength Index

Wskaźnik techniczny Relative Strength Index (RSI) jest bardzo popularnym oscylatorem porównującym ruchy cen zamknięcia w danym okresie
czasu a wartości wskaźnika przedstawione są jako skalowany wykres w granicach od 0 do 100, często używa się go razem ze wskaźnikiem MACD jako
podstawowe narzędzie analizy technicznej. Standartowo do generacji wskaźnika używa się 14-okresów jako optimum, ale spotyka się 7 i 9-okresowy
wskaźnik RSI, który również zyskał popularność dla analiz krótkoterminowych oraz 20 i 25-okresowy dla analiz długoterminowych.
Wskaźnik RSI cechuje się gładszym wykresem i mniejszymi zniekształceniami (w stosunku do wielu innych krótko i średnioterminowych
wskaźników) wywołanymi przez skrajnie wysokie i skrajnie niskie poziomy kursu.
Sposobów interpretacji wskaźnika Relative Strength Index dla analizy wykresu jest kilka. Najprostszy sposób opiera się na wyszukiwaniu punktów
przekroczenia przez wykres wskaźnika poziomów wykupienia i wyprzedaży. Zazwyczaj poziom wykupienia wyznacza się na wysokości ponad 70-80% a
poziom wyprzedania na wysokości poniżej 30-20%, twórca wskaźnika sugeruje tutaj poziomy 30% dla poziomu wyprzedaży i 70% dla poziomu
wykupienia. Sygnał kupna zostaje wygenerowany, gdy wskaźnik przebija od dołu poziom wyprzedaży, zaś sygnał sprzedaży zostaje wygenerowany, gdy
wskaźnik przebija od góry poziom wykupienia. Kolejny ze sposobów interpretacji polega na wyszukiwaniu dywergencji pomiędzy wykresem wskaźnika a
wykresem cen. Dywergencje występują, kiedy cena osiąga nowe ekstremum, co nie jest potwierdzone przez ruchy wskaźnika. Cena zazwyczaj ulega
korekcie wskazywanej przez wskaźnik RSI. W celu wyszukania bardziej wiarygodnych sygnałów najczęściej stosuje się obie metody interpretacji
wskaźnika RSI jednocześnie. Na podstawie wykresu wskaźnika RSI można czasami wyraźniej niż na podstawie wykresu cen określić poziomy wsparcia i
oporu.
Obliczenia:
RSI = 100 - (100 / (1 + U / D))
Oznaczenia:
U - Liczba wzrostów cen.
D - Liczba spadków cen.

aa. Relative Vigor Index

Wskaźnik techniczny Relative Vigor Index (RVI) jest oscylatorem pokazującym stosunek siły nabywców ("Byki" - wzrost ceny) do siły sprzedawców
("Niedźwiedzie" - spadek ceny). Wskaźnik RVI często używa z innymi wskaźnikami do potwierdzenia sygnałów kupna czy sprzedaży. W swojej
konstrukcji jest bardzo podobny do wskaźnika RSI z tą różnicą, iż nie opiera się na cenach zamknięcia, ale na dziesięciookresowej średniej kroczącej.
Jeśli większość cen zamknięcia świec jest wyższa niż ceny ich otwarcia dla zadanego przedziału czasu to oznacza, iż siła nabywców jest większa. Jeśli
większość cen zamknięcia świec jest niższa niż ceny ich otwarcia dla zadanego przedziału czasu to oznacza, iż siła sprzedawców jest większa. Aby
znormalizować wskazania dzieli się różnice ceny otwarcia i zamknięcia świecy przez wysokość świecy. Aby bardziej wygładzić wskazania, używa się
prostej średniej kroczącej, zazwyczaj 10-okresowej. Aby uniknąć dwuznaczności wskaźnik ma linię sygnałową, która jest 4-okresową symetryczną
ważoną średnią kroczącą z wartości Relative Vigor Index. Przecięcie linii jest sygnałem kupna lub sprzedaży.
Obliczenia:
RVI = (CLOSE - OPEN) / (HIGH - LOW)
Oznaczenia:
OPEN - Cena otwarcia świecy.
CLOSE - Cena zamknięcia świecy.
HIGH - Najwyższa cena świecy.
LOW - Najniższa cena świecy.

bb. Standar d Deviation

Wskaźnik techniczny Standard Deviation mierzy płynność rynku i jest statystyczną miarą zmienności kursu i pokazuje, jak bardzo ceny zamknięcia
odbiegają od średniej wartości tychże cen z ostatnich n okresów (najczęściej dwudziestu). Wartość wskaźnika rośnie wraz z większą rozbieżnością
wspomnianych wartości, zaś, gdy wartości te są identyczne lub bardzo podobne, wtedy wartość wskaźnika sięga zera. Ten wskaźnik opisuje zasięg
wahań cen w stosunku do prostej średniej kroczącej. Jeśli wartość tego wskaźnika jest wysoka, rynek jest stosunkowo płynny. Jeśli wartość wskaźnika
jest niska, rynek można opisać jako mało płynny. Idea tego wskaźnika opiera się na założeniu, że duża zmienność wahań instrumentu towarzyszy
kształtowaniu się lokalnych maksimów i analogicznie, mała zmienność wahań idzie w parze z tworzeniem się lokalnych minimów. Obie sytuacje wpływają
na wskaźnik, który odpowiednio rośnie lub maleje.

134
Zwykle ten wskaźnik jest użyty, jako składnik innych wskaźników i jako wskaźnika wspomagającego, tj. potwierdzającego sygnały innych
wskaźników, na przykład wstęg Bollingera.
Interpretacja wskaźnika polega na wyszukiwaniu bardzo niskich poziomów wskaźnika, które mogą zwiastować nagłą zmianę trendu.
Obliczenia:
StdDev = SQRT(SUM(CLOSE - SMA CLOSE, N), N) ^ 2) / N
Oznaczenia:
SMA - Prosta średnia krocząca.
N - Liczba okresów użytych do obliczeń.

cc. Stochastic Oscillator

Wskaźnik techniczny Stochastic Oscillator porównuje zmianę ceny zamknięcia z minimum w stosunku do rozpiętości między ceną minimalną a
maksymalną. Wspomniane zmiany następnie uśrednia się przy pomocy średniej ruchomej. Stochastic Oscillator jest pokazany, jako dwie linie. Główna
linia oscylatora (niebieska linia na wykresie) jest to linia %K. Druga linia to linia %D, służy, jako linia Signal, która jest 2-okresową średnią kroczącą
obliczaną na podstawie linii %K. Linia %K zwykle jest pokazana, jako ciągła linia a linia %D zwykle jest pokazana, jako linia przerywana.
Jest kilka sposobów interpretowania wskaźnika Stochastic Oscillator. Ale najpopularniejsze są trzy metody. Jedna interpretacja oparta jest o
poziomy kupna (10% - 20%) i sprzedaży (80% - 90%). Kiedy Oscylator, linia %K lub %D, znajduje się poniżej określonego poziomu, na przykład 20% i
przebija ten poziom od dołu wskaźnik generuje sygnał kupna. Kiedy Oscylator, linia %K lub %D, znajduje się powyżej określonego poziomu, na przykład
80% i przebija ten poziom od góry wtedy wskaźnik generuje sygnał sprzedaży. Następna interpretacja oparta jest na sygnałach płynących z przecięcia
się linii %K %D. Kiedy linia %K przecina od dołu niemalejącą linie %D, jest generowany sygnał kupna. Kiedy linia %K przecina od góry nierosnącą linie
%D, jest generowany sygnał sprzedaży. Sygnały te są bardziej wiarygodne, gdy występują w pobliżu poziomów wyprzedania i wykupienia. Kolejna
interpretacja oparta jest o poszukiwanie dywergencji pomiędzy trendami wskaźnika i kursu instrumentu. Trend zwyżkujący wskaźnika przy jednoczesnym
trendzie zniżkującym kursu może zwiastować zakończenie, i ewentualne odwrócenie, trendu spadkowego. W sytuacji odwrotnej, zniżkujący trend
wskaźnika przy jednoczesnym zwyżkującym trendzie kursu może zapowiadać zakończenie i ewentualne odwrócenie, trendu wzrostowego.
Obliczenia:
%K = (CLOSE - LOW(%K)) / (HIGH(%K) - LOW(%K)) * 100
%D = SMA(%K, N)
Oznaczenia:
CLOSE - Cena zamknięcia świecy.
HIGH(%K) - Najwyższa cena z %K okresów.
LOW(%K) - Najniższa cena z %K okresów.
SMA - Prosta średnia krocząca.
N - Liczba okresów użytych do obliczeń.

dd. W illiam’s Per cent Range

Wskaźnik techniczny Williams’ Percent Range (%R) jest wskaźnikiem technicznym, który ma dwa poziomy, na których generuje sygnały kupna lub
sprzedaży. Wskaźnik Williams’ %R jest bardzo podobny do Oscylatora Stochastycznego. Jedyna różnica jest taka, że wskaźnik ten ma odwróconą skalę
i oscylator stochastyczny ma dodatkową linie, która jest 2-okresową średnią kroczącą obliczaną na podstawie wartości wskaźnika. Wskaźnik %R daje
dość dobre sygnały w czasie, gdy kurs znajduje się w trendzie horyzontalnym przy dużych wahaniach cen.
Aby zwiększyć czytelność wskaźnika w jego graficznej reprezentacji na skali są pokazywane ujemne wartości (na przykład -30). W analizie należy
ignorować symbol minus. Do analizy tego wskaźnika konieczne jest wyznaczenie poziomów wykupienia i wyprzedaży.
Jeśli wskaźnik przyjmuje wartości między 80 i 100 to wtedy zostaje wygenerowany sygnał kupna. Jeśli wskaźnik przyjmuje wartości między 0 i 20 to
wtedy zostaje wygenerowany sygnał sprzedaży. Poziom wykupienia najczęściej wyznacza się na poziomie 80 - 90 a poziom wyprzedaży na wysokości
10 - 20.
W przypadku sygnału kupna lub sprzedaży najlepiej poczekać z zleceniem transakcji, aż trend ulegnie odwróceniu. Używając tego wskaźnika
należy pamiętać, iż sygnały kupna i sprzedaży nie zawsze oznaczają rychłą zmianie trendu. Sygnały kupna i sprzedaży, mogą utrzymywać się dłuższy
czas, dlatego zaleca się stosowanie dodatkowych wskaźników lub innych metod analizy przy wyraźnych trendach wzrostowych lub spadkowych.
Interesująca właściwość wskaźnika Williams Percent Range jest taka, prawie zawsze osiąga ekstremum i zmienia trend, co najmniej jedną świece przed
lokalnym ekstremum cen.
Obliczenia:
%R = (HIGH(n) - CLOSE) / (HIGH(n) - LOW(n)) * 100
Oznaczenia:
CLOSE - Cena zamknięcia świecy.
HIGH(n) - Najwyższa cena z n okresów.
LOW(n) - Najniższa cena z n okresów.

135
27. DANE HISTORYCZNE
⇒ Dane histor yczne
⇒ iBar s()
⇒ iBarShift()
⇒ iClose()
⇒ iHigh()
⇒ iHighest()
⇒ iLow()
⇒ iLowest()
⇒ iOpen()
⇒ iTime()
⇒ iVolume()
1. Dane histor yczne

W MQL 4 jest dziesięć funkcji odpowiadających ośmiu predefiniowanym zmiennym. Te funkcje umożliwiają dostęp do zbioru najważniejszych, dla
tego języka, zmiennych, które są ustawiane osobno dla każdego otwartego wykresu. Ich wartości odzwierciedlają dane na instrumencie zadanym
pierwszym argumentem.
Niekiedy pojawiają się pytania o transakcje na innym instrumencie niż instrument, na którego rzecz jest uruchomiona strategia. Żeby
przeprowadzać z dobrym skutkiem transakcje na innym instrumencie niż instrument, na którego rzecz jest uruchomiona strategia należałoby mieć dostęp
do danych z wykresu na rzecz, którego mają być zawierane transakcje. Funkcje opisane w dalszej części tego rozdziału umożliwiają dostęp do
podstawowych danych wszystkich dostępnych instrumentów bez względu, na jakim instrumencie strategia została uruchomiona.
UWAGA: Jeśli dane do których program żąda dostępu odnoszą się do nieotwartego wykresu, możliwa jest sytuacja, że terminal kliencki musi wysłać
żądanie uaktualnienia danych do serwera. W tym przypadku zostanie wygenerowany błąd 4066 - ERR_HISTORY_WILL_UPDATED (żądanie
uaktualnienia danych historycznych).

2. iBar s()

int iBars(string symbol, int timeframe)

Funkcja iBars() zwraca liczbę świec dla instrumentu zadanego pierwszym argumentem i przedziału czasowego zadanego drugim argumentem. Dla
aktualnego wykresu, informacje o liczbie świec jest przechowywana w predefiniowanej zmiennej Bars.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
Przykład:
Print("Liczba świec dla 'EURPLN' dla PERIOD_H4: ", iBars("EURPLN", PERIOD_H4));

c. iBarShift()

int iBarShift(string symbol, int timeframe, datetime time, bool exact=false)

Funkcja iBarShift() zwraca indeks świecy, której czas otwarcia jest zadany trzecim argumentem dla instrumentu zadanego pierwszym argumentem i
przedziału czasowego zadanego drugim argumentem. Jeśli nie ma świecy z szukanym czasem otwarcia, funkcja zwraca -1 lub wartość najbliższą,
przesunięcia świecy, gdy argument czwarty ma wartość true.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
time - Czas otwarcia świecy.
exact - Flaga wartości gdy nie znaleziono żądanej świecy. FALSE - najbliższa świeca, TRUE - zwraca -1.
Przykład:
int swieca = iBarShift("EURPLN", PERIOD_M1, D'2007.04.12 13:00');

d. iClose()

double iClose(string symbol, int timeframe, int shift)

Funkcja iClose() zwraca wartość zamknięcia świecy dla instrumentu zadanego pierwszym argumentem, przedziału czasowego zadanego drugim
argumentem i przesunięcia zadanego trzecim argumentem. Jeśli lokalne dane historyczne są niezaładowane, funkcja zwraca wartość 0. Dla aktualnego
wykresu, informacje o cenach zamknięcia są przechowywane w predefiniowanej tablicy Close[].
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
shift - Indeks świecy w buforze wskaźnika (przesunięcie w tył względem aktualnej świecy).
Przykład:
double c = iClose("EURPLN", PERIOD_M1, 8);
e. iHigh()

double iHigh(string symbol, int timeframe, int shift)

Funkcja iHigh() zwraca najwyższą wartość świecy dla instrumentu zadanego pierwszym argumentem, przedziału czasowego zadanego drugim
argumentem i przesunięcia zadanego trzecim argumentem. Jeśli lokalne dane historyczne są niezaładowane, funkcja zwraca wartość 0. Dla aktualnego
wykresu, informacje o najwyższych cenach są przechowywane w predefiniowanej tablicy High[].
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
shift - Indeks świecy w buforze wskaźnika (przesunięcie w tył względem aktualnej świecy).
Przykład:
double h = iHigh("EURPLN", PERIOD_M1, 8);

f. iHighest()

int iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)
(int Highest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0))

Funkcja iHighest() zwraca indeks elementu zawierającego największą wartość typu zadanego trzecim argumentem dla instrumentu zadanego
pierwszym argumentem i przedziału czasowego zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący
symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
type - Identyfikator tablicy historycznej lub wartość numeryczna identyfikatora (Tab. 19).
count - Liczba okresów użytych do obliczeń.
start - Początkowy indeks. Domyślnie 0.
Przykład:
double d = High[Highest(NULL, 0, MODE_HIGH, 5, 4)]; // zwróci najwyższą wartość elementu od piątego do dziesiątego.

g. iLow()

double iLow(string symbol, int timeframe, int shift)

Funkcja iLow() zwraca najmniejszą wartość świecy dla instrumentu zadanego pierwszym argumentem, przedziału czasowego zadanego drugim
argumentem i przesunięcia zadanego trzecim argumentem. Jeśli lokalne dane historyczne są niezaładowane, funkcja zwraca wartość 0. Dla aktualnego
wykresu, informacje o najniższych cenach są przechowywane w predefiniowanej tablicy Low[].
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
shift - Indeks świecy w buforze wskaźnika (przesunięcie w tył względem aktualnej świecy).
Przykład:
double l = iLow("EURPLN", PERIOD_M1, 8);

h. iLowest()

int iLowest(string symbol, int timeframe, int type, int count=WHILE_ARRAY, int start=0)
(int Lowest(string symbol, int timeframe, int type, int count=WHILE_ARRAY, int start=0))

Funkcja iLowest() zwraca indeks elementu zawierającego najmniejszą wartość typu zadanego trzecim argumentem dla instrumentu zadanego
pierwszym argumentem i przedziału czasowego zadanego drugim argumentem. Gdy pierwszym argumentem jest NULL wtedy instrumentem jest bieżący
symbol.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
type - Identyfikator tablicy historycznej lud wartość numeryczna identyfikatora (Tab. 19).
count - Liczba okresów użytych do obliczeń.
start - Początkowy indeks. Domyślnie 0.
Przykład:
double d = Low[Lowest(NULL, 0, MODE_LOW, 5, 4)]; // zwróci najniższą wartość elementu od piątego do dziesiątego.

i. iOpen()

double iOpen(string symbol, int timeframe, int shift)


Funkcja iOpen() zwraca wartość otwarcia świecy dla instrumentu zadanego pierwszym argumentem, przedziału czasowego zadanego drugim
argumentem i przesunięcia zadanego trzecim argumentem. Jeśli lokalne dane historyczne są niezaładowane, funkcja zwraca wartość 0. Dla aktualnego
wykresu, informacje o cenach otwarcia są przechowywane w predefiniowanej tablicy Open[].
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
shift - Indeks świecy w buforze wskaźnika (przesunięcie w tył względem aktualnej świecy).
Przykład:
double o = iOpen("EURPLN", PERIOD_M1, 8);

j. iTime()

datetime iTime(string symbol, int timeframe, int shift)

Funkcja iTime() zwraca wartość czasu otwarcia świecy dla instrumentu zadanego pierwszym argumentem, przedziału czasowego zadanego drugim
argumentem i przesunięcia zadanego trzecim argumentem. Jeśli lokalne dane historyczne są niezaładowane, funkcja zwraca wartość 0. Dla aktualnego
wykresu, informacje o czasie otwarcia są przechowywane w predefiniowanej tablicy Time[].
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
shift - Indeks świecy w buforze wskaźnika (przesunięcie w tył względem aktualnej świecy).
Przykład:
double t = iTime("EURPLN", PERIOD_M1, 8);

k. iVolume()

double iVolume(string symbol, int timeframe, int shift)

Funkcja iVolume() zwraca wartość wolumenu obrotów świecy dla instrumentu zadanego pierwszym argumentem, przedziału czasowego zadanego
drugim argumentem i przesunięcia zadanego trzecim argumentem. Jeśli lokalne dane historyczne są niezaładowane, funkcja zwraca wartość 0. Dla
aktualnego wykresu, informacje o wolumenie obrotów są przechowywane w predefiniowanej tablicy Volume[].
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_HISTORY_WILL_UPDATED (4066)
Parametry:
symbol - Symbol instrumentu, NULL - bieżący symbol.
timeframe - Przedział czasowy (Tab. 18).
shift - Indeks świecy w buforze wskaźnika (przesunięcie w tył względem aktualnej świecy).
Przykład:
double v = iVolume("EURPLN", PERIOD_M1, 8);
28. FUNKCJE T RANSAKCJI
⇒ Or der sHistor yTotal()
⇒ Or derClose()
⇒ Or derCloseBy()
⇒ Or derClosePrice()
⇒ Or derCloseTime()
⇒ Or derComment()
⇒ Or derCommission()
⇒ Or derDelete()
⇒ Or derExpir ation()
⇒ Or derLots()
⇒ Or derMa gicNumber()
⇒ Or derModify()
⇒ Or derOpenPrice()
⇒ Or derOpenTime()
⇒ Or derPrint()
⇒ Or derPr ofit()
⇒ Or derSelect()
⇒ Or derSend()
⇒ Or derStopLoss()
⇒ Or derSwap()
⇒ Or derSymbol()
⇒ Or derTakePr ofit()
⇒ Or derTicket()
⇒ Or derType()
1. Or der sHistor yTotal()

int OrdersHistoryTotal()
(int HistoryTotal())

Funkcja OrdersHistoryTotal() zwraca liczbę zamkniętych zleceń w historii konta.


Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- zmienne globalne


int win, loss;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if(OrderProfit() > 0)
win++;
else if(OrderProfit() < 0)
loss++;
}
//...
}
//+------------------------------------------------------------------+

b. Or derClose()

bool OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE)

Funkcja OrderClose() zamyka otwartą pozycje po cenie rynkowej i ustawia ją, jako domyślną. Po tej operacji, dane o zleceniu dostępne są w historii
rachunku. Aby zamknąć część pozycji należy wybrać wolumen, jaki ma zostać zamknięty. Po tej operacji pozycja zostanie zredukowana o żądaną
wartość. Jeśli funkcja się powiedzie, zwraca wartość TRUE w przeciwnym razie zwraca wartość FALSE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_CUSTOM_INDICATOR_ERROR (4055) ERR_INVALID_TICKET (4108)
ERR_INTEGER_PARAMETER_EXPECTED (4063) ERR_UNKNOWN_SYMBOL (4106)
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_TRADE_NOT_ALLOWED (4109)
ERR_INVALID_PRICE_PARAM (4107) ERR_NO_ERROR (0)
Parametry:
ticket - Unikalny numer zlecenia.
lots - Liczba lotów (nominał transakcji w walucie bazowej).
price - Preferowana cena zamknięcia.
slippage - Wartość maksymalna różnicy pomiędzy szacowanymi kosztami transakcji i rzeczywistą sumą w punktach.
Color - Kolor zamykającej strzałki na wykresie, domyślnie CLR_NONE (nierysowana na wykresie).
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern double loss = -100.0;
//...

Cls()
{
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 3);
else if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3);
}

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if((OrderProfit() < loss) Cls();
}
//...
}
//+------------------------------------------------------------------+

c. Or derCloseBy()

bool OrderCloseBy(int ticket, int opposite, color Color=CLR_NONE)

Funkcja OrderCloseBy() zamyka otwartą pozycje przez drugą pozycję, która jest zleceniem przeciwstawnym. Po zamknięci obie pozycje są
dostępne w historii rachunku. Zamknięcie pozycji przez pozycję przeciwstawnią powoduje naliczenia spreadu tylko za jedną pozycję. Jeśli funkcja się
powiedzie, zwraca wartość TRUE w przeciwnym razie zwraca wartość FALSE.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_CUSTOM_INDICATOR_ERROR (4055) ERR_UNKNOWN_SYMBOL (4106)
ERR_INTEGER_PARAMETER_EXPECTED (4063) ERR_TRADE_NOT_ALLOWED (4109)
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_NO_ERROR (0)
ERR_INVALID_TICKET (4108)
Parametry:
ticket - Unikalny numer zlecenia.
opposite - Unikalny numer zlecenia przeciwnego.
Color - Kolor zamykającej strzałki na wykresie, domyślnie CLR_NONE (nierysowana na wykresie).
Przykład:
OrderCloseBy(nr_zlecenia1, nr_zlecenia2);

d. Or derClosePrice()

double OrderClosePrice()

Funkcja OrderClosePrice() zwraca cenę zamknięcia dla aktualnie wybranej pozycji.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
double profit;
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_BUY)
profit += OrderClosePrice() - OrderOpenPrice();
else if(OrderType() == OP_SELL)
profit += OrderOpenPrice() - OrderClosePrice();
}
//...
}
//+------------------------------------------------------------------+

e. Or derCloseTime()

datetime OrderCloseTime()

Funkcja OrderCloseTime()zwraca dokładną datę i godzinę zamknięcia transakcji dla aktualnie wybranej pozycji. Jeśli funkcja się powiedzie, zwraca
wartość różną od zera. Jeśli funkcja się nie powiedzie, zwraca wartość równą zero.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern datetime time;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
int ticket;
datetime t, tt;
//...
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
tt = MathAbs(time - OrderCloseTime());
if(tt < t)
{
t = tt;
ticket = OrderTicket();
}
}
//...
}
//+------------------------------------------------------------------+

f. Or derComment()

string OrderComment()

Funkcja OrderComment() zwraca komentarz dla aktualnie wybranej pozycji.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
Print(OrderComment());
}
//...
}
//+------------------------------------------------------------------+

g. Or derCommission()

double OrderCommission()
Funkcja OrderCommission() zwraca wielkość prowizji dla aktualnie wybranej pozycji.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
double commission;
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
commission += OrderCommission();
}
//...
}
//+------------------------------------------------------------------+

h. Or derDelete()

bool OrderDelete(int ticket)

Funkcja OrderDelete() usuwa niezrealizowane zlecenie. Jeśli funkcja się powiedzie, zwraca wartość TRUE w przeciwnym razie zwraca wartość
FALSE. Usunięte zlecenia są zapisywane w historii rachunku.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_CUSTOM_INDICATOR_ERROR (4055) ERR_UNKNOWN_SYMBOL (4106)
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_TRADE_NOT_ALLOWED (4109)
ERR_INVALID_TICKET (4108) ERR_NO_ERROR (0)
Parametry:
ticket - Unikalny numer zlecenia.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() > 1) OrderDelete(OrderTicket());
}
//...
}
//+------------------------------------------------------------------+

i. Or derExpir ation()

datetime OrderExpiration()

Funkcja OrderExpiration() zwraca czas wygaśnięcia dla aktualnie wybranej jeszcze niezamkniętej pozycji.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
int c;
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderExpiration() > 0) c++;
}
//...
}
//+------------------------------------------------------------------+

j. Or derLots()

double OrderLots()

Funkcja OrderLots() zwraca liczbę lutów czyli nominał transakcji w walucie bazowej dla aktualnie wybranej pozycji.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
double lots;
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
lots = OrderLots();
}
//...
}
//+------------------------------------------------------------------+

k. Or derMa gicNumber()

int OrderMagicNumber()

Funkcja OrderMagicNumber() zwraca unikalny identyfikator całkowitoliczbowy dla aktualnie wybranej pozycji, nadany przy składaniu zlecenia przez
funkcję OrderSend. Odpowiednie używanie tak zwanych Magicznych Liczb może być bardzo przydatne na przykład dla różnicowania zleceń złożonych
przez człowieka i automatyczny system transakcyjny, pozwalają też różnicować zlecenia pod względem tego, jaki automatyczny system transakcyjny
dokonał zlecenia transakcji.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern int magic = 0x80000000;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
int c;
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if((OrderMagicNumber() & 0xFF000000) == magic) c++;
}
//...
}
//+------------------------------------------------------------------+

l. Or derModify()

int OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color
arrow_color=CLR_NONE)
Funkcja OrderModify() modyfikuje opcje dla ostatnio otwartej lub aktualnie wybranej pozycji. Można w każdym momencie dokonać modyfikacji
zlecenia. W przypadku zleceń typu „market” zmianie mogą ulec poziomy stop lost oraz take profit. Przy zleceniach oczekujących można ponadto
dokonać zmiany ceny realizacji, terminu wygaśnięcia.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_CUSTOM_INDICATOR_ERROR (4055) ERR_INVALID_TICKET (4108)
ERR_INTEGER_PARAMETER_EXPECTED (4063) ERR_UNKNOWN_SYMBOL (4106)
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_TRADE_NOT_ALLOWED (4109)
ERR_INVALID_PRICE_PARAM (4107) ERR_NO_ERROR (0)
Parametry:
ticket - Unikalny numer zlecenia.
price - Cena otwarcia dla zleceń oczekujących.
stoploss - Nowy poziom stop loss.
takeprofit - Nowy poziom take profit.
expiration - Czas wygaśnięcia.
arrow_color - Kolor zamykającej strzałki na wykresie, domyślnie CLR_NONE (nierysowana na wykresie).
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
OrderModify(OrderTicket(), Ask + 2 * Point, OrderStopLoss(),Ask + 8 * Point, 0);
}
//...
}
//+------------------------------------------------------------------+

m. Or derOpenPrice()

double OrderOpenPrice()

Funkcja OrderOpenPrice() zwraca cenę otwarcia dla aktualnie wybranej pozycji.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
double profit;
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_BUY)
profit += OrderClosePrice() - OrderOpenPrice();
else if(OrderType() == OP_SELL)
profit += OrderOpenPrice() - OrderClosePrice();
}
//...
}
//+------------------------------------------------------------------+

n. Or derOpenTime()

datetime OrderOpenTime()

Funkcja OrderOpenTime() zwraca dokładną datę i godzinę otwarcia transakcji dla aktualnie wybranej pozycji.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern datetime time;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
int ticket;
datetime t, tt;
//...
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
tt = MathAbs(time - OrderOpenTime());
if(tt < t)
{
t = tt;
ticket = OrderTicket();
}
}
//...
}
//+------------------------------------------------------------------+

o. Or derPrint()

void OrderPrint()

Funkcja OrderPrint() wyświetla informację dla aktualnie wybranej pozycji w poniższym formacie: nr zlecenia; czas otwarcia; operacja; loty; cena
otwarcia; poziom strat; poziom zysku; czas zamknięcia; cena zamknięcia; prowizja; swap; zysk; komentarz; identyfikator; czas wygaśnięcia.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
//...
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
OrderPrint();
}
//...
}
//+------------------------------------------------------------------+

p. Or derPr ofit()

double OrderProfit()

Funkcja OrderProfit() zwraca wartość zysku dla aktualnie wybranej pozycji.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
double profit;
//...
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
profit += OrderProfit();
}
//...
}
//+------------------------------------------------------------------+

q. Or derSelect()

bool OrderSelect(int index, int select, int pool=MODE_TRADES)

Funkcja OrderSelect() wybiera pozycje przez indeks lub numer zlecenia do dalszego przetwarzania. Każde wywołanie funkcji OrderSend(),
OrderClose() i OrderModify() zmienia aktualną pozycje. Jeśli funkcja OrderDelete() usuwa zlecenie, które jest wybrane, jako aktualne funkcja resetuje
numer wybranego zlecenie. Jeśli funkcja się powiedzie, zwraca wartość TRUE w przeciwnym razie zwraca wartość FALSE.
Parametry:
index - Indeks lub numer zlecenia.
select - Flaga wyboru. Przyjmuje jedną z wartości: SELECT_BY_POS - nr pozycji, SELECT_BY_TICKET - nr zlecenia.
pool - Kolejność, SELECT_BY_POS porządek według: domyślnie MODE_TRADES - otwarcia, MODE_HISTORY -
zamknięcia.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
//...
}
//...
}
//+------------------------------------------------------------------+

r. Or derSend()

int OrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit,
string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

Funkcja OrderSend() otwiera pozycję lub ustawia zlecenie oczekujące, ma 11 parametrów i ma szczególne znaczenie, gdyż jest najważniejszą
częścią automatycznego systemu transakcyjnego. Zwraca unikatowy numer zlecenia, który może być następnie użyty, jako referencja do otwartego albo
oczekującego zlecenia lub -1, jeśli funkcja się nie powiedzie.
Dwa pierwsze typy zleceń to zlecenia egzekucji natychmiastowej, które są wykonywane bezwarunkowo. W zleceniach oczekujących występują
dwie standardowe pozycje: długa BUY i krótka SELL oraz dwa rozszerzenia: STOP i LIMIT. Zlecenia z rozszerzeniem Stop są strategią na przebicie w
górę lub w dół poziomów cenowych, zaś zlecenia Limit na odbicie się od poziomów na przykład wsparć i oporów. Realizacja zleceń oczekujących
następuje w momencie osiągnięcia przez rynek zdefiniowanych cen. Zlecenia oczekujące służą tylko do otwierania pozycji i z ich wykorzystaniem nie
można zamknąć wcześniejszego zlecenia kupna czy sprzedaży krótkiej.
Najczęściej spotykanym błędem jest zły Stop Loss lub Take Profit. Sytuacja taka wynika z nieodpowiedniego ustawienia poziomu aktywacji.
Oczywiście należy pamiętać o zasadzie zgodnie z którą należy ustawiać kurs w zależności od planowanej pozycji: dla krótkiej należy ustawiać poziom
zlecenia zgodnie z ceną Bid, dla długiej pozycji należy ustawiać poziom zlecenia zgodnie z ceną Ask. Przy składaniu zleceń powinniśmy również
zwracać uwagę na minimalny poziom oddalenia kursu aktywacji od obecnego kursu. Poziom aktywacji zlecenia oczekującego dla Stop Loss i Take Profit
powinien wynosić niemniej niż 5 pipsów od ceny rynkowej Ask w przypadku długiej pozycji lub Bid w przypadku krótkiej pozycji.
Broker zlecenia warunkowe obejmuje gwarancją przez określony czas, na przykład tydzień. Oznacza to, iż broker gwarantuje wykonanie po
uprzednio ustalonej cenie tylko przez ten czas mimo tego, że można nie podawać terminu wygaśnięcia zlecenia albo ustalić termin wygaśnięcia zlecenia
na dowolną (w granicach rozsądku) przyszłą datę.
Tab. 43 Typy operacji handlowych.
Stała Wartość Opis
Zlecenie egzekucji natychmiastowej oznacza zlecenie market, czyli po cenie rynkowej, kupna
OP_BUY 0
kontraktów po bieżącym kursie Ask na rynku OTC.
Zlecenie egzekucji natychmiastowej oznacza zlecenie market, czyli po cenie rynkowej,
OP_SELL 1
sprzedaży krótkiej kontraktów po bieżącym kursie Bid na rynku OTC.
Zlecenie oczekujące polegające na zajęciu długiej pozycji po spadku kursu danego
instrumentu finansowego, polega na kupnie po kursie niższym od aktualnej ceny rynkowej.
ZASTOSOWANIE:
Z tego zlecenia skorzystamy, gdy spodziewamy się wzrostu ceny danego instrumentu, jednak
OP_BUYLIMIT 2 zanim to nastąpi przewidujemy spadek jego ceny. Ten spadek pozwoli nam kupić go taniej, niż
po bieżącej cenie w chwili składania zlecenia i tym samym pozwoli to mam osiągnąć większy
zysk, jeżeli nasze oczekiwania się potwierdzą. Zlecenie stosujemy, gdy oczekujemy spadku
ceny. Zlecenie aktywuje się automatycznie w momencie, gdy cena rynkowa Ask osiągnie lub
przebije wyznaczony w zleceniu poziom.
OP_SELLLIMIT 3 Zlecenie oczekujące polegające na zajęciu krótkiej pozycji po wzroście kursu danego
instrumentu finansowego, polega na sprzedaży po kursie wyższym od aktualnej ceny rynkowej.
ZASTOSOWANIE:
Jest to lustrzane odbicie zlecenia Buy Limit, ale dotyczy sprzedaży. Wykorzystujemy tego
typu zlecenia, gdy spodziewamy się spadku ceny danego instrumentu, jednak zanim to nastąpi
przewidujemy wzrost jego ceny. Ten wzrost pozwoli nam sprzedać po cenie wyższej niż obecna,
w chwili składania zlecenia i tym samym pozwoli to mam osiągnąć większy zysk, jeżeli nasze
Stała Wartość Opis
oczekiwania się potwierdzą. Zlecenie stosujemy, gdy oczekujemy wzrostu ceny. Zlecenie
aktywuje się automatycznie w momencie, gdy cena rynkowa Bid osiągnie lub przebije
wyznaczony w zleceniu poziom.
Zlecenie oczekujące polegające na zajęciu długiej pozycji po wzroście kursu danego
instrumentu finansowego, polega na kupnie po kursie wyższym od aktualnej ceny rynkowej.
ZASTOSOWANIE:
Z tego zlecenia skorzystamy, gdy spodziewamy się wzrostu ceny instrumentu. Dopiero
OP_BUYSTOP 4
przebicie pewnego wyższego poziomu potwierdzi nasze przewidywania, co do dalszego wzrostu
ceny instrumentu. Realizacja tych zleceń następuje w momencie osiągnięcia przez rynek
zdefiniowanych cen. Zlecenie aktywuje się automatycznie w momencie, gdy cena rynkowa Ask
osiągnie lub przebije wyznaczony w zleceniu poziom.
Zlecenie oczekujące polegające na zajęciu krótkiej pozycji po spadku kursu danego
instrumentu finansowego, polega na sprzedaży po kursie niższym od aktualnej ceny rynkowej.
ZASTOSOWANIE:
Jest to lustrzane odbicie zlecenia Buy Stop, ale dotyczy sprzedaży. Wykorzystujemy tego
OP_SELLSTOP 5 typu zlecenia, gdy spodziewamy się spadku ceny instrumentu. Dopiero przebicie pewnego
niższego poziomu potwierdzi nasze przewidywania, co do dalszego spadku ceny instrumentu.
Realizacja tych zleceń następuje w momencie osiągnięcia przez rynek zdefiniowanych cen.
Zlecenie aktywuje się automatycznie w momencie, gdy cena rynkowa Bid osiągnie lub przebije
wyznaczony w zleceniu poziom.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_CUSTOM_INDICATOR_ERROR (4055) ERR_UNKNOWN_SYMBOL (4106)
ERR_STRING_PARAMETER_EXPECTED (4062) ERR_TRADE_NOT_ALLOWED (4109)
ERR_INTEGER_PARAMETER_EXPECTED (4063) ERR_LONGS_NOT_ALLOWED (4110)
ERR_INVALID_FUNCTION_PARAMVALUE (4051) ERR_SHORTS_NOT_ALLOWED (4111)
ERR_INVALID_PRICE_PARAM (4107) ERR_NO_ERROR (0)
Parametry:
symbol - Nazwa symbolu.
cmd - Zlecenie (Tab. 43).
volume - Liczba lotów (nominał transakcji w walucie bazowej).
price - Cena otwarcia zlecenia. Na przykład Bid dla kupna i Ask dla sprzedaży realizowanej natychmiast.
slippage - Maksymalna różnica między szacowanymi kosztami transakcji i rzeczywistą sumą wyrażoną w punktach.
stoploss - Poziom stop loss, cena, po której zlecenie zostanie zamknięte dla zminimalizowania strat.
takeprofit - Poziom take profit, cena, po której zlecenie zostanie zamknięte, aby chronić wypracowane zyski.
comment - Komentarz do zlecenia.
magic - Identyfikator zlecenia, który może różnicować pozycje otwarte przez różne strategie.
expiration - Czas wygaśnięcia, zgodnie z czasem serwera (TimeCurrent), domyślnie 0 (nigdy nie wygasa).
arrow-color - Kolor zamykającej strzałki na wykresie, domyślnie CLR_NONE (nierysowana na wykresie).
Przykład:
int ord(bool buy)
{
if(buy)
nr = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask - 8 * Point, Ask + 8 * Point, "", 8, 0, Red);
else
nr = OrderSend(Symbol(), OP_SELL, 1, Ask, 3, Bid - 8 * Point, Bid + 8 * Point, "", 8, 0, Red);
if(nr < 0)
{
Print("Błąd OrderSend ", GetLastError());
return(-1);
}
Else
{
Print("OrderSend zrealizowane");
return(nr);
}
}

s. Or derStopLoss()

double OrderStopLoss()

Funkcja OrderStopLoss() zwraca poziom stop loss, czyli poziom, na którym pozycja jest automatycznie zamykana, aby ograniczyć straty, dla
aktualnie wybranej pozycji. Poziom stop loss można ustawić przy wywoływaniu funkcji OrderSend() oraz do czasu zamknięcia zlecenia przy pomocy
funkcji OrderSelect() i OrderModify(). Ważne jest, aby pamiętać o dwóch kwestiach, po pierwsze odpowiednim dopasowaniu poziomu stop loss zgodnie z
zasadą, że w przypadku otwarcia długiej pozycji, czyli zakupu instrumentu, poziom stop loss powinien być ustawiony poniżej ceny Bid a w przypadku
otwarcia krótkiej pozycji, czyli sprzedaży, poziom stop loss powinien być ustawiony powyżej ceny Ask, po drugie poziomy stop loss muszą być
odpowiednio oddalone od bieżącej ceny. Różne instrumenty mają różne minimalne poziomy, od których można ustawić poziom stop loss. Dodatkowo
limity te mogą ulec rozszerzeniu w przypadku dużej zmienności na rynku oraz przy publikacji ważnych danych makroekonomicznych.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
Print(OrderStopLoss());
}
//...
}
//+------------------------------------------------------------------+

t. Or der sTotal()

int OrdersTotal()

Funkcja OrdersTotal() zwraca liczbę niezamkniętych zleceń.


Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
start()
{
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
//...
}
//...
}
//+------------------------------------------------------------------+

u. Or derSwap()

double OrderSwap()

Funkcja OrderSwap() zwraca wartość punktów swapowych, czyli kosztów codziennego utrzymywania pozycji. Punkty swapowe naliczane są przy
rolowaniu otwartej pozycji na następny dzień. Konieczność ich naliczania wynika z różnicy stóp procentowej pomiędzy walutami. W zależności od
zajmowanej pozycji konto inwestora jest zasilane albo obciążane kwotą punktów swapowych.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
double swap;
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
swap += OrderSwap();
}
//...
}
//+------------------------------------------------------------------+

v. Or derSymbol()

string OrderSymbol()

Funkcja OrderSymbol() zwraca skróconą nazwę instrumentu dla aktualnie wybranego zlecenia.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"
//---- parametry
extern string cur = “EURUSD”;
//...

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+

int start()
{
int c;
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == cur) c++;
}
//...
}
//+------------------------------------------------------------------+

w. Or derTakePr ofit()

double OrderTakeProfit()

Funkcja OrderTakeProfit() zwraca poziom take profit, na którym chcemy zamknąć pozycje by zrealizować zyski dla aktualnie wybranego zlecenia.
Poziom take profit można ustawić przy wywoływaniu funkcji OrderSend() oraz do czasu zamknięcia zlecenia przy pomocy funkcji OrderSelect() i
OrderModify(). Ważne jest, aby pamiętać o dwóch kwestiach, po pierwsze odpowiednim dopasowaniu poziomu take profit w przypadku długiej pozycji,
czyli zakupu instrumentu, poziom take profit ustawiamy poniżej ceny Bid, a w przypadku krótkiej pozycji, czyli sprzedaży, poziom take profit ustawiamy
powyżej ceny Ask, po drugie poziomy take profit muszą być odpowiednio oddalone od bieżącej ceny. Różne instrumenty mają różne minimalne poziomy,
od których można ustawić poziom take profit. Dodatkowo limity te mogą ulec rozszerzeniu w przypadku dużej zmienności na rynku oraz przy publikacji
ważnych danych makroekonomicznych.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
Print(OrderTakeProfit());
}
//...
}
//+------------------------------------------------------------------+

x. Or derTicket()

int OrderTicket()

Funkcja OrderTicket() zwraca numer zlecenia dla aktualnie wybranego zlecenia.


Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//+------------------------------------------------------------------+
//| Funkcja skryptu |
//+------------------------------------------------------------------+
int start()
{
//...
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
Print(OrderTicket());
}
//...
}
//+------------------------------------------------------------------+
y. Or derType()

int OrderType()

Funkcja OrderType() zwraca typ aktualnie wybranego zlecenia, kupno, długa pozycja lub sprzedaż, krótka pozycja.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_NO_ORDER_SELECTED (4105)
Przykład:
Cls()
{
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 3);
else if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3);
}
29. F UNKCJE OKIEN
⇒ Funkcje okien
⇒ HideTestIndicator s()
⇒ Period()
⇒ Refr eshRates()
⇒ Symbol()
⇒ W indowBar sPerChar t()
⇒ W indowExper tName()
⇒ W indowFind()
⇒ W indowFir stV isibleBar()
⇒ W indowHandle()
⇒ W indowIsV isible()
⇒ W indowOnDr opped()
⇒ W indowPriceMax()
⇒ W indowPriceMin()
⇒ W indowPriceOnDr opped()
⇒ W indowRedr aw()
⇒ W indowScr eenShot()
⇒ W indowTimeOnDr opped()
⇒ W indowsTotal()
⇒ W indowXOnDr opped()
⇒ W indowYOnDr opped()
1. Funkcje okien

W tym rozdziali jest opisany zbiór funkcji odpowiedzialnych za obsługę okien wykresów. Poza Period(), RefreshRates(), Symbol(), WindowFind(),
WindowsScreenShot() i WindowsTotal(), funkcje te nie są często używane, ale programista powinien wiedzieć przynajmniej o ich istnieniu.

2. HideTestIndicator s()

void HideTestIndicators(bool hide)

Funkcja HideTestIndicators() ustawia flagę ukrycia wskaźnika wywołanego przez strategię. Po teście strategii jest otwierany odpowiedni wykres,
jeśli flaga hide będzie ustawiona, wskaźnik nie będzie rysowany na wykresie testowym. Każdy wywołany wskaźnik domyślnie jest wywoływany z flagą
ukrycia. Tylko wskaźniki bezpośrednio wywoływane z testowanej strategii mogą być rysowane w wykresie testowym.
Parametry:
hide - Flaga ukrycia wskaźnika, TRUE - nierysowana na wykresie, FALSE - rysowana na wykresie.
Przykład:
//+------------------------------------------------------------------+
//| przykład.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-2009, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

//---- parametry
extern int ExtWPRPeriod = 14;
//---- bufory
double ExtWPRBuffer[256];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji |
//+------------------------------------------------------------------+
int init()
{
//...
//---- ustawienia rysowania
HideTestIndicators(true);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
double MaxHigh, MinLow;
//----
if(cbars > 0) cbars--;
i = Bars - cbars - ExtWPRPeriod - 1;
if(i > 255) i = 255;
for(; i >= 0; i--) ExtWPRBuffer[i] = iWPR(NULL, 0, ExtWPRPeriod, i);
//...
//----
return(0);
}
//+------------------------------------------------------------------+

c. Period()

int Period()

Funkcja Period() zwraca wartość przedziału czasu stosowaną do wykresu wyrażoną w minutach. Wartość ta definiuje używaną ramę czasową
świecy.
Przykład:
Print("Przedziału czasu stosowaną do wykresu wyrażoną w minutach: ", Period());

d. Refr eshRates()

bool RefreshRates()

Funkcja RefreshRates() aktualizuje dane wbudowanych zmiennych i tablic danych historycznych. Funkcja jest używana, gdy obliczenia są
czasochłonne i istnieje groźba, że dane wejściowe są już nie aktualne. Funkcja zwraca wartość TRUE tylko, gdy dane nie uległy zmianie, w przeciwnym
razie zwraca wartość FALSE.
Przykład:
if(GetLastError() == 135) // jeśli dane są nie aktualne to je odśwież
if(RefreshRates())
// ...
else
alert("Aktualne dane są niedostępne");

e. Symbol()

string Symbol()

Funkcja Symbol() zwraca string z nazwą aktualnego instrumentu.


Przykład:
for(aif = 0; aif < OrdersTotal(); aif++)
{
OrderSelect(aif, SELECT_BY_POS);
if(OrderType() > OP_SELL || OrderSymbol() != Symbol()) continue;
//...
}

f. W indowBar sPerChar t()

int WindowBarsPerChart()
(int BarsPerWindow())

Funkcja WindowBarsPerChart() zwraca liczbę świec, które mieszczą się na wykresie.


Przykład:
double AvarageOnSrcreen(double array[])
{
int i, j;
double result = 0;
for(j = WindowBarsPerChart(), i = j - 1; i => 0; i--) result += array[i];
return(result / j);
}
UWAGA: Każda zmiana wielkości okna czy przybliżanie i oddalanie wykresu a w szczególnych przypadkach zmiana okresu może mieć i zazwyczaj
ma wpływ na wartość zwracaną przez tą funkcję.

g. W indowExper tName()

string WindowExpertName()

Funkcja WindowExpertName() zwraca nazwę wykonywanej strategii, skryptu, wskaźnika lub biblioteki w zależności od programu, z którego ta
funkcja została wywołana.
Przykład:
string nazwa = WindowExpertName();

h. W indowFind()

int WindowFind(string name)

Funkcja WindowFind() zwraca indeks podokna wykresu zawierającego przekazaną do funkcji przez nazwę krótką (short name) wskaźnika. W
przypadku braku wskaźnika o podanej nazwie funkcja zwraca -1.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_FUNC_NOT_ALLOWED_IN_TESTING (4059) ERR_NOT_INITIALIZED_STRING (4008)
ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
name - Krótka nazwa wskaźnika.
Przykład:
int okno = WindowFind("%R(14)");
UWAGA: Nazwa wskaźnika może być ustawiona przez użycie funkcji IndicatorShortName(), WindowFind() zwraca -1 jeśli wskaźnik szuka samego
siebie podczas wykonywania funkcji init.

i. W indowFir stV isibleBar()

int WindowFirstVisibleBar()
(int FirstVisibleBar())

Funkcja WindowFirstVisibleBar() zwraca indeks pierwszej widocznej świecy w aktualnym oknie wykresu. Świece są indeksowane w kolejności
odwrotnej, od ostatniej do pierwszej. Najnowsza świeca ma indeks 0 a najstarsza świeca ma indeks Bars - 1.
Przykład:
int swiec = WindowBarsPerChart();

j. W indowHandle()

int WindowHandle(string symbol, int timeframe)

Funkcja WindowHandle() zwraca uchwyt okna zawierający wykres zadany parametrami. Jeśli wykres dla instrumentu zadanego pierwszym
argumentem i przedziału czasowego zadanego drugim argumentem nie jest dostępny w momencie wywołania funkcji, zwróci ona 0.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_FUNC_NOT_ALLOWED_IN_TESTING (4059) ERR_NOT_INITIALIZED_STRING (4008)
ERR_STRING_PARAMETER_EXPECTED (4062)
Parametry:
symbol - Symbol instrumentu.
timeframe - Przedział czasowy. 0 dla bieżącego przedziału czasowego.
Przykład:
int uchwyt = WindowHandle("EURPLN", PERIOD_H1);
if(uchwyt) Print("Okno EURPLN, H1 jest dostępne.");

k. W indowIsV isible()

bool WindowIsVisible(int index)

Funkcja WindowIsVisible() zwraca wartość TRUE, jeśli okno wykresu zadane argumentem jest widoczne, w przeciwnym razie, zwraca wartość
FALSE. Okno wykresu może zostać schowane z powodu własności widoczności umieszczonego w nim wskaźnika.
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_FUNC_NOT_ALLOWED_IN_TESTING (4059)
Parametry:
index - Indeks okna wykresu.
Przykład:
int okno = WindowFind("MACD");
if(okno > -1 && WindowIsVisible(okno))
Print("Okno MACD widoczne");
else
Print("Nie znaleziono okna MACD lub okno jest nie widoczne ");

l. W indowOnDr opped()

int WindowOnDropped()

Funkcja WindowOnDropped() zwraca indeks okna, gdzie została uruchomiona strategia, skrypt lub wskaźnik przez przeciągnięcie kursorem.
Zwrócony indeks jest numerem okna (wykres główny ma indeks 0, okna podrzędne wskaźników są indeksowane od 1 gdzie wskaźnik pracuje. Wskaźnik
może utworzyć własne okna podrzędne podczas pracy, numery tych okien podrzędnych różnią się od numeru okna, gdzie był wskaźnik umieszczony.
Przykład:
if(WindowOnDropped()) Print("Wskaźnik jest umieszczony w oknie głównym");
UWAGA: Dla wskaźników wynik funkcji WindowOnDropped() wywołanej z ciała funkcji init jest niezdefiniowany.

m. W indowPriceMax()

double WindowPriceMax(int index=0)

Funkcja WindowPriceMax() zwraca wartość maksymalną na skali pionowej zadanego okna podrzędnego, bieżącego wykresu (wykres główny ma
indeks 0, okna podrzędne wskaźników są indeksowane od 1. Jeśli indeks okna podrzędnego nie ma wyznaczonej wartości maksymalnej, zwracana jest
skala okna wykresu głównego.
Parametry:
index - Indeks okna wykresu.
Przykład:
double PriceMax = WindowPriceMax();

n. W indowPriceMin()

double WindowPriceMin(int index=0)

Funkcja WindowPriceMin() zwraca wartość minimalną na skali pionowej zadanego okna podrzędnego, bieżącego wykresu (wykres główny ma
indeks 0, okna podrzędne wskaźników są indeksowane od 1. Jeśli indeks okna podrzędnego nie ma wyznaczonej wartości minimalnej, zwracana jest
skala okna wykresu głównego.
Parametry:
index - Indeks okna wykresu.
Przykład:
double PriceMin = WindowPriceMin();

o. W indowPriceOnDr opped()

double WindowPriceOnDropped()
(double PriceOnDropped())

Funkcja WindowPriceOnDropped() zwraca część ceny współrzędnej wykresu w walucie bazowej wykresu, gdzie została uruchomiona strategia lub
skrypt przez przeciągnięcie kursorem.
Przykład:
double price = WindowPriceOnDropped();
UWAGA: Dla wskaźników, ta wartość jest nieokreślona, funkcja działa tylko z strategiami i z skryptami.

p. W indowRedr aw()

void WindowRedraw()
(void ObjectsRedraw())

Funkcja WindowRedraw() wymusza odświeżenie aktualnego wykresu. Używana przy zmianie właściwości obiektów.
Przykład:
ObjectMove(obj, 0, Time[i], cena);
WindowRedraw();

q. W indowScr eenShot()

bool WindowScreenShot(string filename, int size_x, int size_y, int start_bar=-1, int chart_scale=-1, int chart_mode=-1)
(bool ScreenShot(string filename, int size_x, int size_y, int start_bar=-1, int chart_scale=-1, int chart_mode=-1))

W platformie MetaTrader 4 łatwo jest zachować dowolny wykres, ze wszystkimi narysowanymi na nim wskaźnikami. Wystarczy kliknąć prawym
przyciskiem myszy na wykres, który ma być zachowany i z menu kontekstowego wybrać opcję „Zapisz jako obraz....”. To wywoła okno dialogowe „Zapisz
jako obraz z wyborem jednej z trzech opcji. Opcja „Aktywny pulpit” zapisze zrzut ekranu z całego programu MetaTrader 4 razem z pAskami narzędzi,
menu, wykresami i oknami. Opcja „Aktywny wykres (tak jak jest)” zapisuje wykres w oryginalnym rozmiarze. Opcja „Aktywny wykres” pozwala ustawić
szerokość i wysokość zapisywanego wykresu. Przy czym program sam dostosuje liczbę świec, stosownie do szerokości zapisywanego obrazu. Po
wyborze odpowiedniej opcji i kliknięciu przycisku „OK” pojawi się kolejne okno dialogowe zatytułowane „Zapisywanie jako” z monitem o nazwę pliku i typ
formatu, do wyboru GIF czy JPEG.
Zapisywanie zrzutów ekranu jest trochę bardziej skomplikowane w porównaniu do normalnej metody w platformie, MetaTrader 4 ale dzięki temu
zapisywanie zrzutów ekranu można zautomatyzować, przez co można zaoszczędzić trochę czasu.
Funkcja WindowScreenShot() zapisuje bieżący wykres jako plik w formacie GIF w jednym z dwóch folderów. Jeśli funkcja zakończy się błędem,
zostanie zwrócona wartość FALSE w przeciwnym razie zostanie zwrócona wartość TRUE. Pliki są zapisywane w katalogu .\experts\files lub w jego
podkatalogach a w przypadku testu strategii pliki są zapisywane w katalogu .\tester\files lub w jego podkatalogach.
Tab. 44 Tryb zapisu wykresu.
Stała Wartość Opis
-1 wykres oryginalny
CHART_BAR 0 wykres słupkowy
CHART_CANDLE 1 wykres świecowy
CHART_LINE 2 wykres liniowy
Kody błędów, które mogą być ustawione w zmiennej last_error przez tą funkcje:
ERR_WRONG_FILE_NAME (4101) ERR_INVALID_FUNCTION_PARAMVALUE (4051)
Parametry:
filename - Nazwa pliku.
size_x - Szerokość w pikselach.
size_y - Wysokość w pikselach.
start_bar - Indeks pierwszej świecy, 0 - do pierwszej widocznej świecy, wartość ujemna - koniec wykresu.
chart_scale - Pozioma skala wykresu, zakres 0 - 5. Dla wartości ujemnych będzie użyta aktualna skala wykresu.
chart_mode - Tryb wyświetlania wykresu (Tab. 44).
Przykład:
if(!WindowScreenShot("test.gif", 1920, 1200 )) Print("Zrzut ekranu nie powiódł się");

r. W indowTimeOnDr opped()

datetime WindowTimeOnDropped()
(datetime TimeOnDropped())
Funkcja WindowTimeOnDropped() zwraca część czasu współrzędnej wykresu, gdzie została uruchomiona strategia lub skrypt przez przeciągnięcie
kursorem.
Przykład:
datetime czas = WindowTimeOnDropped();
UWAGA: Dla wskaźników, ta wartość jest nieokreślona, funkcja działa tylko z strategiami i z skryptami.

s. W indowsTotal()

int WindowsTotal()

Funkcja WindowsTotal() zwraca liczbę okien wskaźników na wykresie wliczając wykres główny.
Przykład:
int i = WindowsTotal();

t. W indowXOnDr opped()

int WindowXOnDropped()

Funkcja WindowXOnDropped() zwraca wartość współrzędnej w pikselach na osi X względem obszaru klienckiego w oknie wykresu, gdzie została
uruchomiona strategia lub skrypt przez przeciągnięcie myszą. Wartość będzie prawidłowa, jeśli strategia lub skrypt został przeciągnięty kursorem
techniką „Drag & Drop”.
Przykład:
Print("Program został przeciągnięty w punkt x = ",WindowXOnDropped()," y = ",WindowYOnDropped());

u. W indowYOnDr opped()

int WindowYOnDropped()

Funkcja WindowYOnDropped() zwraca wartość współrzędnej w pikselach na osi Y względem obszaru klienckiego w oknie wykresu, gdzie została
uruchomiona strategia lub skrypt przez przeciągnięcie myszą. Wartość będzie prawidłowa, jeśli strategia lub skrypt został przeciągnięty kursorem
techniką „Drag & Drop”.
Przykład:
Print("Program został przeciągnięty w punkt x = ",WindowXOnDropped()," y = ",WindowYOnDropped());
30. W SKAŹNIKI
⇒ Szablon
⇒ Konstr ukcja
⇒ AMA
⇒ ChV
⇒ FI
⇒ Fish
⇒ Mom
⇒ Ray
⇒ Stoch
⇒ StochRIS
⇒ Vol
1. Szablon

Szablon wskaźnika, który w tym konkretnym przypadku będzie wyświetlany w oknie cen instrumentu. Nie ma zadeklarowanych, żadnych
dynamicznych buforów, na których będzie operował, jednakże istnieje dość mała grupa wskaźników, która operuje tylko na obiektach tworzonych
dynamicznie. Każdy wskaźnik ma trzy predefiniowane funkcje. Są to: funkcja init jest wywoływana podczas dodania wskaźnika do wykresu, funkcja start
jest wywoływana przy każdorazowej zmianie wartości na wykresie, do którego wskaźnik się odnosi, funkcja deinit jest wywoływana podczas usuwania
wskaźnika z wykresu i najczęściej jest usuwana ze względu na to, że w większości przypadków jest nieużywana. Te trzy funkcje zwracają do programu
głównego wartości typu int równe zeru, gdy ich wywołanie zakończyło się pomyślnie, w przeciwnym razie zwracają wartości różne od zera, jako kod
błędu. Wskaźniki są umieszczane w katalogu instalacji programu MetaTrader w podkatalogu .\experts\indicators\.
Kod:
//+------------------------------------------------------------------+
//| szablon.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 indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----

//----
return(0);
}
//+------------------------------------------------------------------+

2. Konstr ukcja

Przed zapoznaniem się z dalszą częścią tego rozdziału, zalecam bardzo uważne przeczytanie pierwszych dziewięciu rozdziałów. W tym rozdzianie
opiszę jak stworzyć prosty wskaźnik przy założeniu, że obsługa IDE MetaEditor jest opanowana w stopniu dobrym. Pierwszy wskaźnik nie będzie bardzo
użyteczny w zastosowaniach handlowych, ale pomoże zrozumieć programowanie w MQL 4. W punkcie pierwszym niniejszego rozdziału jest pokazany
szablon, który jest tworzony automatycznie przez kreator. W tym punkcie rozszerzymy powyższy szablon o komentarze i parę linii kodu. Wskaźnik mierzy
siłę i zwrot ruchu dla pojedynczej świecy.
Kod:
//+------------------------------------------------------------------+
//| szablon.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 indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- bufor
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Funkcja inicjująca wskaźnik |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//---- ustawienia rysowania
SetIndexStyle(0, DRAW_LINE);
//---- przypisywanie bufora wskaźnikowi
SetIndexBuffer(0, ExtBuffer);
//---- nazwa
IndicatorShortName("Nazwa wskaźnika");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Funkcja kończąca prace wskaźnika |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Funkcja wywoływana przy każdej zmianie danych |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();
//---- sprawdzenie czy nie wystąpił błąd w danych
if(counted_bars < 0) return(-1);
//---- dla pewności przeliczany ostatnią świece, jeśli istnieje
if (counted_bars > 0) counted_bars--;
//---- pętla główna
for(int i = Bars - counted_bars - 1; i >= 0; i--) ExtBuffer[i] = Open[i] - Close[i];
//----
return(0);
}
//+------------------------------------------------------------------+
Pierwsze pięć linii kodu to komentarz. Komentarzy używamy, by coś opisać. Komentarze pisze się z różnych powodów. Najważniejsze z nich to:
objaśnienie, co kod sekcji powinien robić i jak powinien pracować, dokumentacja jak prawa autorskie, data utworzenia, kontakt i strona projektu i tym
podobne. Możesz pisać komentarze na dwa sposoby. Komentarz liniowy zaczyna się od // i kończy się znakiem nowej linii. Komentarz blokowy zaczyna
się do /* i kończy się na */, możesz nim komentować wiele linii jak też umieścić wiele takich komentarzy w jednej linii. W ramowym programie
wygenerowanym przez kreator pierwsze pięć linii komentarzy zawierają informacje o nazwie pliki, tym, kto jest autorem programu i link.
Kod:
//+------------------------------------------------------------------+
//| szablon.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| http://www.forex-tower.xt.pl/ |
//+------------------------------------------------------------------+
Instrukcje preprocesora są zwane dyrektywami, zaczynają się od znaku #, który może być poprzedzony, co najwyżej separatorami i są wykowywane
zanim kompilator zacznie swą pracę. Dyrektywy właściwości są instrukcjami dla preprocesora. Składają się z predefiniowanych stałych wbudowanych w
MQL 4 i opcjonalnej listy parametrów i mają wpływ na zachowanie się kompilatora oraz mogą zmieniać opcje właściwości programu. Należy tu jeszcze
raz podkreślić, że dyrektywy preprocesora nie są częścią języka i kończą się znakiem nowej linii (powrotem karetki) a nie średnikiem.
Właściwość copyright ustawia imię, nazwisko / nazwę autora wskaźnika, typ danych, jaki dyrektywa przyjmuje, jako drugi parametr dla tej
właściwość to String.
Właściwość link ustawia łącze do strony WWW autora wskaźnika, podobnie jak w przypadku właściwość copyright typ danych, jaki dyrektywa
przyjmuje, jako drugi parametr dla tej właściwość to String.
Właściwość stacksize ustawia wartość całkowitą wielkości pamięci dla każdego wątku, domyślną wartością jest 16384 bajtów, typ danych, jaki
dyrektywa przyjmuje, jako drugi parametr dla tej właściwość to liczba całkowita.
Właściwość indicator_chart_window powoduje, że wskaźnik będzie rysowany na głównym oknie wykresu, to jest pierwsza z dwóch możliwości,
dyrektywa nie przyjmuje drugiego parametru dla tej właściwość.
Właściwość indicator_separate_window powoduje, że wskaźnik będzie rysowany w oddzielnym oknie wykresu, to jest druga z dwóch możliwości.
Właściwości indicator_separate_window: i indicator_chart_window nie mogą być stosowane jednocześnie. Przy ustawionej właściwości
indicator_separate_window możesz ustawić skalowanie okna używając właściwości indicator_minimum dla minimalnej wartości i indicator_maximum dla
maksymalnej wartości skali. Można też, ustawiać poziomy wskaźnika używając właściwości indicator_levelN, gdzie jest N jest numerem poziomu. W
przykładowym programie wskaźnik jest rysowany w oddzielnym oknie za sprawą właściwość indicator_separate_window. Dyrektywa nie przyjmuje
drugiego parametru dla tej właściwość.
Właściwość indicator_minimum ustawia minimalną wartość, dla skali okna wykresu, która znajduje się na dolnym brzegiem okna, typ danych, jaki
dyrektywa przyjmuje, jako drugi parametr dla tej właściwość to liczba zmiennoprzecinkowa.
Właściwość indicator_maximum ustawia maksymalną wartość, dla skali okna wykresu, która znajduje się na górnym brzegiem okna, typ danych,
jaki dyrektywa przyjmuje, jako drugi parametr dla tej właściwość to liczba zmiennoprzecinkowa.
Właściwość indicator_levelN, gdzie N jest numerem poziomu, ustawia poziom na wykresie wskaźnika. Wartość poziomu na wykresie wskaźnika
musi być większa niż wartość indicator_minimum i mniejsza niż wartość indicator_maximum. N jest numerem poziomu wskaźnika, którego dotyczy
wartość i musi być z zakresu od 1 do 8. Typ danych, jaki dyrektywa przyjmuje, jako drugi parametr dla tej właściwość to liczba zmiennoprzecinkowa.
Właściwość indicator_buffers, ustawia liczbę buforów (z zakresu od 1 do 8) i alokuje dla nich pamięć, wszystkie tak zdefiniowane bufory będą
rysowane. W przykładzie używany jest tylko jeden bufor: indicator_buffers 1. Typ danych, jaki dyrektywa przyjmuje jako drugi parametr dla tej właściwość
to liczba całkowita.
Właściwość indicator_colorN, gdzie N jest numerem buforu wskaźnika z zakresu od 1 do indicator_buffers, zmienia domyślny kolor zadanego
wskaźnika, domyślnym kolorem jest kolor czarny mało się wyróżniający na domyślnie czarnym tle. Użytkownik może zmienić kolory zaproponowane
przez nas przez edycję w oknie właściwości wskaźnika w terminalu użytkownika. Typ danych, jaki dyrektywa przyjmuje jako drugi parametr dla tej
właściwość to liczba całkowita, typ color, często używa się stałych.
Kod:
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
Tablica to indeksowany zbiór elementów tego samego typu. Do elementu tablicy uzyskujemy dostęp przez podanie indeksu elementu wziętego w
nawiasy kwadratowe poprzedzonego identyfikatorem tablicy. Żeby zdefiniować tablicę, trzeba określić jej identyfikator poprzedzony słowem kluczowym
określającym typ jej elementów, bezpośrednio po identyfikatorze występują nawiasy kwadratowe zawierające opcjonalnie rozmiar tablicy. Tablica może
być inicjalizowana poprzez podanie w nawiasach wąsatych elementów tablicy, oddzielonych przecinkami. W przypadku nie podania rozmiarów tablicy
tablica będzie mieć najmniejszy rozmiar, który pomieści wszystkie elementy, w przypadku podania n elementów dla m elementowej tablicy przy
założeniu, że n ≤ m, zainicjalizowanych będzie n pierwszych elementów.
Kod:
//---- bufor
double ExtBuffer[];
Każdy wskaźnik przed wywołaniem jakiś innych funkcji wywołuje funkcję init, to tu odbywa się cała inicjalizacja programu. Funkcja void
SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE) ustawia styl rysowania wskaźnika. Parametr index tej funkcji
przyjmuje wartości od 0 do 7 i identyfikuje wskaźnik, którego parametry mają być ustawiane. Parametr type określa kształt wskaźnika, może to być jedna
ze stałych: DRAW_LINE, DRAW_SECTION, DRAW_HISTOGRAM, DRAW_ARROW, DRAW_NONE lub odpowiednik numeryczny. Parametr style ustala
styl pióra rysującego wskaźnik i może to być jedna z następujących wartości: STYLE_SOLID, STYLE_DASH, STYLE_DOT, STYLE_DASHDOT,
STYLE_DASHDOTDOT lub odpowiednik numeryczny. Domyślną wartością jest EMPTY, co oznacza, że styl nie był zmieniany. Parametr width
odpowiada za szerokość linii, parametr ten jest liczbą całkowitą z zakresu od 1 do 5. Domyślną wartością jest EMPTY, co oznacza, że szerokość pióra
nie była zmieniana. Parametr clr określa kolor wskaźnika, może to być jedna ze stałych koloru lub liczba całkowita z zakresu od 0 do 16777215
zapisywana też w konwencji C’R, G, B’. Domyślną wartością jest CLR_NONE o wartości numerycznej 0. W przykładowym programie funkcja ta ma
postać SetIndexStyle(0, DRAW_LINE); co oznacza, że dla wskaźnika o indeksie 0, funkcja ustawia typ kształtu na DRAW_LINE, reszta parametrów
przyjmuje wartości domyślne.
Funkcja bool SetIndexBuffer(int index, double array[]) alokuje bufor, który jest przypisywany do zadanej tablicy. Funkcja przyjmuje indeks bufora,
gdzie 0 oznacza pierwszy bufor, 1 oznacza drugi bufor i tak dalej. Drugim parametrem jest identyfikator tablicy. Funkcja zwraca wartość logiczną true jeśli
jej działanie zakończy się powodzeniem, w innym przypadku zwraca wartość logiczną false. W powyższym przykładzie tablica, która będzie
przechowywać obliczone wartości to ExtBuffer. Program ma zgodnie z deklaracją preprocesora (#property indicator_buffers 1) tylko jeden bufor, więc do
niego zostanie przypisany identyfikator tablicy.
Funkcja void IndicatorShortName(string name) ustawia tekst, który będzie umieszczony w górnym lewym rogu okna wykresu, począwszy od okna o
indeksie 1. W przykładowym programie funkcja ta ma postać IndicatorShortName("Nazwa wskaźnika");
Operator return(expression); zwróci wartość funkcji init przerywając wykonywanie funkcji i przekaże sterowanie do terminala, który następnie
wykona funkcję start.
Kod:
//+------------------------------------------------------------------+
//| Funkcja inicjująca wskaźnik |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//---- ustawienia rysowania
SetIndexStyle(0, DRAW_LINE);
//---- przypisywanie bufora wskaźnikowi
SetIndexBuffer(0, ExtBuffer);
//---- nazwa
IndicatorShortName("Nazwa wskaźnika");
//----
return(0);
}
Funkcja deinit to ostatnia funkcja, którą program wywoła przed zakończeniem pracy, można na przykład umieścić tutaj wywołania funkcji, które
zamkną wszystkie otwarte przez nasz program pliki i poinformują inne moduły o tym, że nasz wskaźnik kończy pracę.
Kod:
//+------------------------------------------------------------------+
//| Funkcja kończąca prace wskaźnika |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
Funkcje init i deinit, jeśli są zdefiniowane w pliku wskaźnika, są wykonywane przez terminal kliencki tylko raz, za to funkcja start wszystkich
aktywnych wskaźników jest wykonywana za każdym razem, kiedy do terminala klienckiego spływają nowe notowania i to ona wykonuje większość pracy.
Funkcja start jak każda funkcja specjalna powinna zwrócić liczbę całkowitą jako wynik jej działania, gdzie 0 oznacza brak błędu a każda inna wartość
oznacza zgłoszenie błędu.
W przykładzie w pierwszej instrukcji bloku definiujemy zmienną counted_bars typu całkowitoliczbowego, przypisujemy jej wartość funkcji
IndicatorCounted(). Funkcja ta zwraca wartość typu całkowitego, wyrażającą liczbę świec, które przez wskaźnik już zostały przeliczone. Podczas
pierwszego uruchomienia wskaźnika funkcja zwróci, 0 ponieważ, wskaźnik nie przeliczył jeszcze żadnej świecy.
W drugiej instrukcji bloku program wykonuje sprawdzenie czy nie wystąpił błąd w danych a konkretnie, zmienna counted,_bars, która była
zainicjalizowana wartością funkcji IndicatorCounted() musi mieć wartość nie ujemną, wartość ujemna tej funkcji jest wynikiem błędu, w takim przypadku
przerywamy działanie funkcji poprzez operator return z niezerowym argumentem wywołania.
W kolejnej instrukcji bloku program wykonuje sprawdzenie czy counted_bars jest większe od 0. Jeśli nierówność jest spełniona to jest wykonywana
instrukcja dekrementacji. To pozwoli przeliczyć ponownie ostatnio przeliczaną świece.
W przedostatniej instrukcji bloku znajduje się pętla, która przeliczy wszystkie punkty wskaźnika. Każda wartość przypisana do tablicy ExtBuffer,
będzie rysowana na wykresie, ponieważ tablica ta została przypisana do bufora przy pomocy funkcji SetIndexBuffer. Przed wejściem w pętle obliczami
liczbę obrotów pętli przez odjęcie od counted,_bars predefiniowanej zmiennej Bars, która zawiera całkowitą liczbę świec na wykresie. Żeby wszystko się
zgadzało trzeba jeszcze odjąć 1, gdyż świece są numerowane od 1 a tablica jest indeksowana od 0. Zmienna, po której będziemy iterować w tym
przypadku to i. W ciele pętli zmienna ta będzie przechowywała indeks bieżącej świecy a wynik będzie zapisywany w tablicy, ExtBuffer na bieżącej
pozycji.
Omówienie tego punktu byłoby nie kompletne bez wspomnienia o predefiniowanych zmiennych Ask, Bid, Bars, Close, Open, High, Low, Time i
Volume. Zmienne predefiniowane nie mogą stać po lewej stronie operatorów przypisania w przeciwnym wypadku kompilator zgłosi błąd „unexpected,
token”, ponieważ do tych zmiennych niemożna przypisywać wartości. Zmienna Ask jest typu zmiennoprzecinkowego i przechowuje ostatnio
zaktualizowaną cenę dla kupującego Zmienna Bid jest typu zmiennoprzecinkowego i przechowuje ostatnio zaktualizowaną cenę dla sprzedającego
krótko. Zmienna Bars jest typu całkowitoliczbowego i przechowuje całkowitą liczbę świec na aktualnym wykresie. Zmienna tablicowa Open jest typu
zmiennoprzecinkowego i przechowuje referencje do tablicy cen otwarcia świec, gdzie cena otwarcia jest ceną z początku okresu. Zmienna tablicowa
Close jest typu zmiennoprzecinkowego i przechowuje referencje do tablicy cen zamknięcia świec. Dla świec jeszcze niezamkniętych jest przyjmowana
ostatnia znana cena. Zmienna tablicowa High jest typu zmiennoprzecinkowego i przechowuje referencje do tablicy najwyższych zaobserwowanych cen
świec przypadających na cały okres tworzenia się świec. Zmienna tablicowa Low jest typu zmiennoprzecinkowego i przechowuje referencje do tablicy
najniższych zaobserwowanych cen świec przypadającej na cały okres tworzenia się świec. Zmienna tablicowa Volume jest typu zmiennoprzecinkowego i
przechowuje referencje do tablicy średnich całkowitych wolumenów transakcyjnych przypadających na cały okres tworzenia się świec. Zmienna Digits
jest typu całkowitoliczbowego i przechowuje liczbę cyfr decymenalnych po przecinku. Zmienna Point jest typu zmiennoprzecinkowego i przechowuje
wartość pipsa w walucie bazowej. Zmienna Time jest typu całkowitoliczbowego a dokładniej typu datetime i przechowuje referencje do tablicy, w której są
przechowywane czasy otwarcia świec.
Kod:
//+------------------------------------------------------------------+
//| Funkcja wywoływana przy każdej zmianie danych |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();
//---- sprawdzenie czy nie wystąpił błąd w danych
if(counted_bars < 0) return(-1);
//---- dla pewności przeliczamy ostatnio przeliczaną świece jeśli istnieje
if(counted_bars > 0) counted_bars--;
//---- pętla główna
for(int i = Bars - counted_bars - 1; i >= 0; i--) ExtBuffer[i] = Open[i] - Close[i];
//----
return(0);
}
//+------------------------------------------------------------------+

3. AMA

Wskaźnik AMA jest adaptacyjną wersją EMA, która dynamicznie zmienia okres dla EMA stosownie do sytuacji rynkowej. Tak, więc dla rynków
płAskich AMA będzie przyjmowała dłuższe okresy, w tym przykładzie aż do wartości slow1 i slow2 a na rynkach poruszających się w wyraźnym trendzie
AMA będzie przyspieszała aż do wartości fast. Wykres wskaźnika będzie nanoszony na wykres cen zgodnie z dyrektywą #property
indicator_chart_window. Jak w każdym przypadku średnich ruchomych czułość jest determinowana przez ich okres w tym przypadku podstawowym
okresem jest MA_Period1 i MA_Period2. Parametry G i dK determinują tempo przyspieszania/spowolnienia.
Kod:
//+------------------------------------------------------------------+
//| AMA.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Blue
//---- parametry
extern int MA_Period1 = 8, MA_Period2 = 13, fast = 2, slow1 = 13, slow2 = 21;
extern double G = 2.0, dK = 2.0;
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- nazwa
IndicatorShortName(StringConcatenate("AMA(", MA_Period1, ", ", MA_Period2, ", ", fast, ", ", slow1, ", ", slow2, ", ",
G, ", ", dK, ")"));
SetIndexLabel(0, StringConcatenate("AMA(", MA_Period1, ", ", fast, ", ", slow1, ")"));
SetIndexLabel(1, StringConcatenate("AMA(", MA_Period2, ", ", fast, ", ", slow2, ")"));
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy AMA |
//+------------------------------------------------------------------+
void AMA(int MA_Period, int fast, int slow, int ExtCountedBars, double g, double dk, double &ExtMapBuffer[])
{
int i, pos;
double noise, AMA, AMA0, signal, ER, dSC, ERSC, SSC, slowSC, fastSC;
//----
slowSC = (2.0 / (slow + 1));
fastSC = (2.0 / (fast + 1));
if(Bars <= (MA_Period + 2)) return(0);
//---- pętla główna
for(pos = Bars - MA_Period - 2, AMA0 = Close[pos + 1]; pos >= 0; pos--, AMA0 = AMA)
{
signal = MathAbs(Close[pos] - Close[pos + MA_Period]);
for(noise = 0.000001, i = 0; i < MA_Period; i++) noise += MathAbs(Close[pos + i] - Close[pos + i + 1]);
ER = signal / noise;
dSC = (fastSC - slowSC);
ERSC = ER * dSC;
SSC = ERSC + slowSC;
AMA = AMA0 + (MathPow(SSC, g) * (Close[pos] - AMA0));
ExtMapBuffer[pos] = AMA;
}
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
AMA(MA_Period1, fast, slow1, cbars, G, dK, ExtBuffer0);
AMA(MA_Period2, fast, slow2, cbars, G, dK, ExtBuffer1);
//----
return(0);
}
//+------------------------------------------------------------------+

d. ChV

Wskaźnik ChV jest wyświetlany pod oknem wykresu zgodnie z dyrektywą #property indicator_separate_window, w MetaTrader przy wywoływaniu
wskaźnika będzie dostępna zmienna ChVPeriod typu int z domyślną wartością 10. Wskaźnik będzie wyświetlał tylko jedną linię zgodnie z dyrektywą
#property indicator_buffers 1, w kolorze Aqua zgodnie z dyrektywą #property indicator_color1, ale w konstrukcji zadeklarowałem zastosowanie 3 buforów
wskaźników. Należy zwrócić uwagę, że rysowanych jest n pierwszych buforów gdzie n ϵ <0, 7> Λ n < t, gdzie #property indicator_buffers t. Pamiętać też
należy, że t jest o jeden większe od indeksu ostatniego wyświetlanego bufora. Bufory robocze, które nie będą wyświetlane mają indeksy z zakresu <t, 7>.
Kod:
//+------------------------------------------------------------------+
//| ChV.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- parametry
extern int ChVPeriod = 10;
//---- buffers
double ExtBuffer0[], ExtBuffer1[], ExtBuffer2[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
string name;
//---- deklaracja buforów
IndicatorBuffers(3);
//---- ustawienia rysowania
//SetIndexDrawBegin(0, ChVPeriod + 1);
IndicatorDigits(5);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1) &&
!SetIndexBuffer(2, ExtBuffer2)) return(-1);
//---- nazwa
name = StringConcatenate("OsChV(", ChVPeriod, ")");
IndicatorShortName(name);
SetIndexLabel(0, name);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy EMA |
//+------------------------------------------------------------------+
void EMA(int MA_Period, int ExtCountedBars, double &ExtMapBuffer[])
{
int i;
double pr = 2.0 / (MA_Period + 1);
//---- pętla główna
for(i = Bars - ExtCountedBars - 1; i >= 0; i--)
{
if(i == Bars - 2) ExtMapBuffer[i + 1] = High[i + 1] - Low[i + 1];
ExtMapBuffer[i] = (High[i] - Low[i]) * pr + ExtMapBuffer[i + 1] * (1 - pr);
}
}

//+------------------------------------------------------------------+
//| Funkcja liczy EMA z ExtMapBuffer1 |
//+------------------------------------------------------------------+
void EMAOnArray(int MA_Period, int ExtCountedBars, double ExtMapBuffer1[], double &ExtMapBuffer2[])
{
int i;
double pr = 2.0 / (MA_Period + 1);
//---- pętla główna
for(i = Bars - ExtCountedBars - 1; i >= 0; i--)
{
if(i == Bars - 2) ExtMapBuffer2[i + 1] = ExtMapBuffer1[i + 1];
ExtMapBuffer2[i] = ExtMapBuffer1[i] * pr + ExtMapBuffer2[i + 1] * (1 - pr);
}
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
EMA(ChVPeriod, cbars, ExtBuffer1);
EMAOnArray(ChVPeriod, cbars, ExtBuffer1, ExtBuffer2);
for(i = Bars - cbars - 1; i >= 0; i--) ExtBuffer0[i] = (ExtBuffer1[i] - ExtBuffer2[i]) / ExtBuffer2[i];
//----
return(0);
}
//+------------------------------------------------------------------+

e. FI

Wskaźnik FI jest bardzo zmodyfikowaną implementacją wskaźnika Force Index. Używa trzech buforów. Bufor o indeksie 0 jest rysowany linią
przerywaną, za co jest odpowiedzialna funkcja SetIndexStyle(0, DRAW_LINE, STYLE_DOT), na podstawie jego wartości będą rysowane bufory o
indeksach 1 i 2. Jeśli przypisywanie buforów do któregokolwiek wskaźnika się nie powiedzie to inicjalizacja wskaźnika zostanie przerwana z kodem
wyjścia -1. Na osi wartości wykresu wskaźnika mieści się maksymalnie 6 liczb i znaki: - (minus) oraz „.” (kropka decymenalna), więc zazwyczaj niej ma
sensu stosować IndicatorDigits(n); z n > 5 przy założeniu, że wskaźnik generuje jedną cyfrę przez przecinkiem, analogicznie sprawa się ma z dwoma
cyframi przed przecinkiem, wtedy nasze n zostanie obcięte na osi do 4 cyfr po przecinku. Wyjątek tu stanowią wskaźniki, które mogą generować dugą
serię bardzo małych liczb. MetaTrader w sytuacji, gdzie wszystkie widoczne punkty wykresu mają wartość mniejszą od dokładności wykresu nie
wyświetla wykresu albo wyświetla go niewłaściwie. Dlatego w przypadku tego wskaźnika użyłem IndicatorDigits(3); gdyż na niektórych wykresach w skali
minutowej były długie szeregi wartości z pierwszą cyfrą znaczącą na trzecim miejscu po kropce decymenalnej.
Kod:
//+------------------------------------------------------------------+
//| IndFI.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Gold
//---- parametry
extern int MA_Period1 = 2, MA_Period2 = 7, FIPeriod = 14;
//---- buffers
double ExtBuffer0[], ExtBuffer1[], ExtBuffer2[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika użytkownika |
//+------------------------------------------------------------------+
int init()
{
string name;
//---- ustawienia rysowania
SetIndexDrawBegin(0, FIPeriod);
SetIndexDrawBegin(1, FIPeriod);
SetIndexDrawBegin(2, FIPeriod);
SetIndexStyle(0, DRAW_LINE, STYLE_DOT);
IndicatorDigits(3);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1) &&
!SetIndexBuffer(2, ExtBuffer2)) return(-1);
//---- nazwa
name = StringConcatenate("FI(", MA_Period1, ", ", MA_Period2, ", ", FIPeriod, ")");
IndicatorShortName(name);
SetIndexLabel(0, name);
SetIndexLabel(1, StringConcatenate("Open(", MA_Period1, ", ", FIPeriod, ")"));
SetIndexLabel(2, StringConcatenate("Close(", MA_Period2, ", ", FIPeriod, ")"));
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy EMA z ExtMapBuffer1 |
//+------------------------------------------------------------------+
void EMAOnArray(int MA_Period, int ExtCountedBars, int Begin, double ExtMapBuffer1[], double &ExtMapBuffer2[])
{
int i;
double pr = 2.0 / (MA_Period + 1);
//---- pętla główna
for(i = Bars - ExtCountedBars - Begin - 1; i >= 0; i--)
{
if(i == Bars - Begin - 2) ExtMapBuffer2[i + 1] = ExtMapBuffer1[i + 1];
ExtMapBuffer2[i] = ExtMapBuffer1[i] * pr + ExtMapBuffer2[i + 1] * (1 - pr);
}
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika użytkownika |
//+------------------------------------------------------------------+
int start()
{
int i, j, cbars = IndicatorCounted();
double mf, div;
//----
if(cbars > 0) cbars--;
for(i = Bars - cbars - 1; i >= 0; i--)
{
for(j = FIPeriod - 1, mf = 0.0; j >= 0; j--)
{
div = High[i + j] - Low[i + j];
if(div != 0) mf += Volume[i + j] * (Close[i + j] - Open[i + j]) / div;
}
ExtBuffer0[i] = mf;
}
EMAOnArray(MA_Period1, cbars, FIPeriod, ExtBuffer0, ExtBuffer1);
EMAOnArray(MA_Period2, cbars, FIPeriod, ExtBuffer0, ExtBuffer2);
//----
return(0);
}
//+------------------------------------------------------------------+

f. Fish

Wskaźnik tej jest implementacją znanego wskaźnika. Jego siła tkwi w tym, że bardzo ostro akcentuję punkty przegięcia. W tym przypadku poziomy
maksymalny i minimalny wartości wskaźnika są znane z góry, dyrektywa #property indicator_minimum ustawia poziom minimalny a dyrektywa #property
indicator_maximum poziom maksymalny, w tym przypadku są to odpowiednio poziomy 0 i 1. Tak, więc wykres wskaźnika nie przejdzie na liczny ujemne
stąd też argumentem funkcji IndicatorDigits(), jest liczba 6. W wskaźniku użyłem funkcji price(), która pobiera indeks świecy zwraca wartość średnią,
wedle formuły (H + L) / 2, ale zważywszy na to, że ta operacja pędzie wykonywana bardzo często a dzielenie jest dużo bardziej kosztowne od mnożenia
przez ułamek zapisałem formułę funkcji, jako (H + L) * 0.5.
Kod:
//+------------------------------------------------------------------+
//| Fish.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1
#property indicator_buffers 1
#property indicator_color1 Aqua
#property indicator_level1 0.25
#property indicator_level2 0.75
//---- parametry
extern int Period1 = 2, Period2 = 10;
//---- bufory
double ExtBuffer0[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
string name;
//---- ustawienia rysowania
IndicatorDigits(6);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0)) return(-1);
//---- nazwa
name = StringConcatenate("Fish(", Period1, ", ", Period2, ")");
IndicatorShortName(name);
SetIndexLabel(0, name);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy (H + L) / 2 |
//+------------------------------------------------------------------+
double price(int bar)
{
return((High[bar] + Low[bar]) * 0.5);
}

//+------------------------------------------------------------------+
//| Funkcja liczy EMA |
//+------------------------------------------------------------------+
void EMA(int period, int MA_Period, int ExtCountedBars, double &ExtMapBuffer[])
{
int i, k;
double min, max, pr = 2.0 / (MA_Period + 1);
//---- pętla główna
for(i = Bars - ExtCountedBars - 1; i >= 0; i--)
{
for(k = i + period, max = price(k), min = price(k); k >= i; k--)
{
if(price(k) > max) max = price(k);
if(price(k) < min) min = price(k);
}
if(i == Bars - 2) ExtMapBuffer[i + 1] = (price(i + 1) - min) / (max - min);
ExtMapBuffer[i] = (price(i) - min) / (max - min) * pr + ExtMapBuffer[i + 1] * (1 - pr);
}
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, k, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
EMA(Period1, Period2, cbars, ExtBuffer0);
//----
return(0);
}
//+------------------------------------------------------------------+

g. MFI

Wskaźnik MFI jest nieco zmodyfikowaną implementacją wskaźnika Market Facilitation Index. Używa trzech buforów. Bufor o indeksie 0 jest
rysowany linią przerywaną, za co jest odpowiedzialna funkcja SetIndexStyle(0, DRAW_LINE, STYLE_DOT), na podstawie jego wartości będą rysowane
bufory o indeksach 1 i 2. Jeśli przypisywanie buforów do któregokolwiek wskaźnika się nie powiedzie to inicjalizacja wskaźnika zostanie przerwana z
kodem wyjścia -1. Na osi wartości wykresu wskaźnika mieści się maksymalnie 7 liczb oraz „.” (kropka decymenalna), bo wskaźnik nie przyjmuje wartości
ujemnych, więc ma sensu stosować IndicatorDigits(n); z n, > 7 bo wskaźnik generuje tylko jedną cyfrę przez przecinkiem. Dlatego w przypadku tego
wskaźnika użyłem IndicatorDigits(7).
Kod:
//+------------------------------------------------------------------+
//| IndMFI.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Gold
#property indicator_level1 0.2125
#property indicator_level2 0.7875
//---- parametry
extern int MA_Period1 = 2, MA_Period2 = 7, MFIPeriod = 14;
//---- buffers
double ExtBuffer0[], ExtBuffer1[], ExtBuffer2[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika użytkownika |
//+------------------------------------------------------------------+
int init()
{
string name;
//---- ustawienia rysowania
SetIndexDrawBegin(0, MFIPeriod);
SetIndexDrawBegin(1, MFIPeriod);
SetIndexDrawBegin(2, MFIPeriod);
SetIndexStyle(0, DRAW_LINE, STYLE_DOT);
IndicatorDigits(7);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1) &&
!SetIndexBuffer(2, ExtBuffer2)) return(-1);
//---- nazwa
name = StringConcatenate("MFI(", MA_Period1, ", ", MA_Period2, ", ", MFIPeriod, ")");
IndicatorShortName(name);
SetIndexLabel(0, name);
SetIndexLabel(1, StringConcatenate("Open(", MA_Period1, ", ", MFIPeriod, ")"));
SetIndexLabel(2, StringConcatenate("Close(", MA_Period2, ", ", MFIPeriod, ")"));
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy EMA z ExtMapBuffer1 |
//+------------------------------------------------------------------+
void EMAOnArray(int MA_Period, int ExtCountedBars, int Begin, double ExtMapBuffer1[], double &ExtMapBuffer2[])
{
int i;
double pr = 2.0 / (MA_Period + 1);
//---- pętla główna
for(i = Bars - ExtCountedBars - Begin - 1; i >= 0; i--)
{
if(i == Bars - Begin - 2) ExtMapBuffer2[i + 1] = ExtMapBuffer1[i + 1];
ExtMapBuffer2[i] = ExtMapBuffer1[i] * pr + ExtMapBuffer2[i + 1] * (1 - pr);
}
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika użytkownika |
//+------------------------------------------------------------------+
int start()
{
int i, j, cbars = IndicatorCounted();
double div, mf, dPositiveMF, dNegativeMF;
//----
for(i = Bars - cbars - MFIPeriod - 1; i >= 0; i--)
{
for(j = MFIPeriod - 1, dPositiveMF = 0.0, dNegativeMF = 0.0; j >= 0; j--)
{
div = High[i + j] - Low[i + j];
if(div != 0)
{
mf = Close[i + j] - Open[i + j];
if(mf > 0)
dPositiveMF += Volume[i + j] * mf / div;
else
dNegativeMF += Volume[i + j] * (-mf) / div;
}
}
if(dPositiveMF > 0)
ExtBuffer0[i] = 1 / (1 + dNegativeMF / dPositiveMF);
else
ExtBuffer0[i] = 1;
}
EMAOnArray(MA_Period1, cbars, MFIPeriod, ExtBuffer0, ExtBuffer1);
EMAOnArray(MA_Period2, cbars, MFIPeriod, ExtBuffer0, ExtBuffer2);
//----
return(0);
}
//+------------------------------------------------------------------+

h. Ray

Wskaźnik ten napisałem po przeczytaniu książki autorstwa Alexandra Eldera pod tytułem Zawód - Inwestor Giełdowy. Użyłem tu już przedstawianej
w tym kursie średniej AMA. Konstrukcja tego wskaźnika jest bardzo prosta: jeśli cena zamknięcia świecy jest większa od AMA wtedy wyświetl wartość
ceny najwyższej pomniejszonej o wartość AMA, jeśli cena zamknięcia świecy jest mniejsza od AMA wtedy wyświetl wartość ceny najniższej
pomniejszonej o wartość AMA w innym przypadku wyświetl zero.
Kod:
//+------------------------------------------------------------------+
//| Ray.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- parametry
extern int MA_Period = 8, nfast = 2, nslow = 13;
extern double G = 2.0, dK = 2.0;
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
string name;
//---- deklaracja buforów
IndicatorBuffers(2);
//---- ustawienia rysowania
SetIndexDrawBegin(0, nfast + nslow);
IndicatorDigits(5);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- nazwa
name = StringConcatenate("IndRay(", MA_Period, ", ", nfast, ", ", nslow, ", ", G, ", ", dK, ")");
IndicatorShortName(name);
SetIndexLabel(0, name);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy AMA |
//+------------------------------------------------------------------+
void AMA(int MA_Period, int fast, int slow, int ExtCountedBars, double g, double dk, double &ExtMapBuffer[])
{
int i, pos;
double noise, AMA, AMA0, signal, ER, dSC, ERSC, SSC, slowSC, fastSC;
//----
slowSC = (2.0 / (slow + 1));
fastSC = (2.0 / (fast + 1));
if (Bars <= (MA_Period + 2)) return(0);
//---- pętla główna
for(pos = Bars - MA_Period - 2, AMA0 = Close[pos + 1]; pos >= 0; pos--, AMA0 = AMA)
{
signal = MathAbs(Close[pos] - Close[pos + MA_Period]);
for(noise = 0.000001, i = 0; i < MA_Period; i++) noise += MathAbs(Close[pos + i] - Close[pos + i + 1]);
ER = signal / noise;
dSC = (fastSC - slowSC);
ERSC = ER * dSC;
SSC = ERSC + slowSC;
AMA = AMA0 + (MathPow(SSC, g) * (Close[pos] - AMA0));
ExtMapBuffer[pos] = AMA;
}
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
AMA(MA_Period, nfast, nslow, cbars, G, dK, ExtBuffer1);
//----
if(cbars > 0) cbars—;
for(i = Bars - cbars - 1; i >= 0; i--)
{
if(Close[i] > ExtBuffer1[i])
ExtBuffer0[i] = High[i] - ExtBuffer1[i];
else if(Close[i] < ExtBuffer1[i])
ExtBuffer0[i] = Low[i] - ExtBuffer1[i];
else
ExtBuffer0[i] = 0;
}
//----
return(0);
}
//+------------------------------------------------------------------+

i. SMom

Wskaźnik ten jest implementacją nieco bardziej zaawansowaną wskaźnika momentum. Wygładzenie wykładniczo danych w oparciu, o które będzie
budowany wskaźnik ma na celu poprawić jego użyteczność, przy czym długość EMA w tym przypadku reprezentowana przez zmienną Signal jest w
zasadzie bez większego znaczenia. Pomysł jest taki, że dopiero na wykładniczo wygładzonych danych stosujemy formułę wskaźnika momentum. W
funkcji inicjującej na nazwę wskaźnika zarezerwowałem zmienną name, gdyż w kodzie użyłem dwa razy tej samej wartości, konkatenacja stringów jest
bardzo nie efektywna, więc czasem lepiej jest utworzyć gotowe łańcuchy szczególnie, jeśli używamy ich w funkcji start.
Kod:
//+------------------------------------------------------------------+
//| SMom.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- parametry
extern int SMomPeriod = 10, Signal = 13;
//---- bufory
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika użytkownika |
//+------------------------------------------------------------------+
int init()
{
string name;
//---- deklaracja buforów
IndicatorBuffers(2);
//---- ustawienia rysowania
SetIndexDrawBegin(0, SMomPeriod + 1);
IndicatorDigits(5);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1)) return(-1);
//---- nazwa
name = StringConcatenate("OsSMom(", SMomPeriod, ", ", Signal, ")");
IndicatorShortName(name);
SetIndexLabel(0, name);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy EMA |
//+------------------------------------------------------------------+
void EMA(int MA_Period, int ExtCountedBars, double &ExtMapBuffer[])
{
int i;
double pr = 2.0 / (MA_Period + 1);
//---- pętla główna
for(i = Bars - ExtCountedBars - 1; i >= 0; i--)
{
if(i == Bars - 2) ExtMapBuffer[i + 1] = Close[i + 1];
ExtMapBuffer[i] = Close[i] * pr + ExtMapBuffer[i + 1] * (1 - pr);
}
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika użytkownika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
EMA(Signal, cbars, ExtBuffer1);
for(i = Bars - cbars - 1; i >= 0; i--) ExtBuffer0[i] = (ExtBuffer1[i] - ExtBuffer1[i + SMomPeriod]) - (ExtBuffer1[i + 1] -
ExtBuffer1[i + SMomPeriod + 1]);
//----
return(0);
}
//+------------------------------------------------------------------+

j. Stoch

Wskaźnik ten jest połączeniem dwóch wskaźników stochastycznych. Napisałem go z dwóch względów: po pierwsze żeby pozbyć się skalowania
wskaźnika, bo ta operacja nic pożytecznego nie wnosi a zajmuje cenny czas procesora, po drugie potrzebowałem dwóch takich wskaźników z nieco
innymi parametrami, co się wiązało z niepotrzebnym powtarzaniem niektórych obliczeń.
Kod:
//+------------------------------------------------------------------+
//| Stoch.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1
#property indicator_buffers 4
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Gold
#property indicator_color4 Peru
#property indicator_level1 0.2
#property indicator_level2 0.3
#property indicator_level3 0.4
#property indicator_level4 0.6
#property indicator_level5 0.7
#property indicator_level6 0.8
//---- parametry
extern int KPeriod = 10, HDPeriod = 3, HSlowing = 3, LDPeriod = 2, LSlowing = 2;
//---- bufory
double ExtBuffer0[], ExtBuffer1[], ExtBuffer2[], ExtBuffer3[], ExtBuffer4[], ExtBuffer5[], ExtBuffer6[], ExtBuffer7[];
//---- zmienne globalne
int db1, db2;

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- deklaracja buforów
IndicatorBuffers(8);
//---- ustawienia rysowania
db1 = KPeriod + HSlowing;
db2 = KPeriod + LSlowing;
SetIndexDrawBegin(0, db1);
SetIndexDrawBegin(1, db1);
SetIndexDrawBegin(2, db2);
SetIndexDrawBegin(3, db2);
SetIndexStyle(0, DRAW_LINE, STYLE_DOT);
SetIndexStyle(2, DRAW_LINE, STYLE_DOT);
IndicatorDigits(6);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(1, ExtBuffer1) &&
!SetIndexBuffer(2, ExtBuffer2) &&
!SetIndexBuffer(3, ExtBuffer3) &&
!SetIndexBuffer(4, ExtBuffer4) &&
!SetIndexBuffer(5, ExtBuffer5) &&
!SetIndexBuffer(6, ExtBuffer6) &&
!SetIndexBuffer(7, ExtBuffer7)) return(-1);
//---- nazwa
IndicatorShortName(StringConcatenate("Stoch(", KPeriod, ", ", HDPeriod, ", ", HSlowing, ", ", LDPeriod, ", ",
LSlowing, ")"));
SetIndexLabel(0, StringConcatenate("Signal1(", HDPeriod, ")"));
SetIndexLabel(1, StringConcatenate("Stoch(", KPeriod, ", ", HSlowing, ")"));
SetIndexLabel(2, StringConcatenate("Signal2(", LDPeriod, ")"));
SetIndexLabel(3, StringConcatenate("Stoch(", KPeriod, ", ", LSlowing, ")"));
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy EMA z ExtMapBuffer1 |
//+------------------------------------------------------------------+
void EMAOnArray(int MA_Period, int ExtCountedBars, int Begin, double ExtMapBuffer1[], double &ExtMapBuffer2[])
{
int i;
double pr = 2.0 / (MA_Period + 1);
//---- pętla główna
for(i = Bars - ExtCountedBars - Begin - 1; i >= 0; i--)
{
if(i == Bars - Begin - 2) ExtMapBuffer2[i + 1] = ExtMapBuffer1[i + 1];
ExtMapBuffer2[i] = ExtMapBuffer1[i] * pr + ExtMapBuffer2[i + 1] * (1 - pr);
}
}
//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, k, starti, cbars = IndicatorCounted();
double sumlow, sumhigh;
//---- przeliczanie ostatniej świecy
if(cbars > 0) cbars--;
//----
// pierwszy wskaźnik
//----
starti = Bars - cbars - 1;
for(i = starti; i >= 0; i--)
{
ExtBuffer4[i] = Low[iLowest(NULL, 0, MODE_LOW, KPeriod, i)];
ExtBuffer5[i] = High[iHighest(NULL, 0, MODE_HIGH, KPeriod, i)];
}
//---- %K
for(i = starti; i >= 0; i--)
{
for(sumlow = 0.0, sumhigh = 0.0, k = i + HSlowing - 1; k >= i; k--)
{
sumlow += Close[k] - ExtBuffer4[k];
sumhigh += ExtBuffer5[k] - ExtBuffer4[k];
}
if(sumhigh == 0.0)
ExtBuffer1[i] = 1.0;
else
ExtBuffer1[i] = sumlow / sumhigh;
}
//---- linie sygnału
EMAOnArray(HDPeriod, cbars, db1, ExtBuffer1, ExtBuffer0);
//----
// drugi wskaźnik
//----
for(i = starti; i >= 0; i--)
{
for(sumlow = 0.0, sumhigh = 0.0, k = i + LSlowing - 1; k >= i; k--)
{
sumlow += Close[k] - ExtBuffer4[k];
sumhigh += ExtBuffer5[k] - ExtBuffer4[k];
}
if(sumhigh == 0.0)
ExtBuffer3[i] = 1.0;
else
ExtBuffer3[i] = sumlow / sumhigh;
}
//---- linie sygnału
EMAOnArray(LDPeriod, cbars, db2, ExtBuffer3, ExtBuffer2);
//----
return(0);
}
//+------------------------------------------------------------------+

k. StochRSI

Formuła stochastycznego RSI opiera się całkowicie na formule wskaźnika RSI. Wskaźnik jest bardziej czuły i zachowuje się podobnie jak wskaźnik
stochastyczny stąd jego nazwa. Swe ekstrema osiąga często, więc stosowanie do niego poziomów wykupienia i wysprzedania takich jak do RSI mija się
z celem i może prowadzić do poważnych strat na rachunku nieroztropnego inwestora.
Kod:
//+------------------------------------------------------------------+
//| StochRSI.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_level1 0.25
#property indicator_level2 0.3
#property indicator_level3 0.4
#property indicator_level4 0.5
#property indicator_level5 0.6
#property indicator_level6 0.7
#property indicator_level7 0.75
//---- parametry
extern int period = 7;
//---- bufory
double RSIBuffer[], StochRSIB[], PosBuffer[], NegBuffer[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika użytkownika |
//+------------------------------------------------------------------+
int init()
{
string name;
//---- deklaracja buforów
IndicatorBuffers(4);
//---- ustawienia rysowania
SetIndexDrawBegin(0, period);
SetIndexDrawBegin(1, period + period - 1);
SetIndexStyle(0, DRAW_LINE, STYLE_DOT);
IndicatorDigits(6);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, RSIBuffer) &&
!SetIndexBuffer(1, StochRSIB) &&
!SetIndexBuffer(2, PosBuffer) &&
!SetIndexBuffer(3, NegBuffer)) return(-1);
//---- nazwa
name = StringConcatenate("StochRSI(", period, ")");
IndicatorShortName(name);
SetIndexLabel(0, StringConcatenate("RSI(", period, ")"));
SetIndexLabel(1, name);
//----
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika Relative Strength Index |
//+------------------------------------------------------------------+
int start()
{
int i, k, cbars = IndicatorCounted();
double sumn, sump, rel, negative, positive;
//---- inicjalizacja
if(cbars > 0) cbars--;
if(cbars >= period)
i = Bars - cbars - 1;
else
i = Bars - period - 1;
for(; i >= 0; i--)
{
sumn = 0.0;
sump = 0.0;
if(i == Bars - period - 1)
{
//---- inicjalizacja
for(k = Bars - 2; k >= i; k--)
{
rel = Close[k] - Close[k + 1];
if(rel > 0)
sump += rel;
else
sumn -= rel;
}
positive = sump / period;
negative = sumn / period;
}
else
{
//---- wygładzona średnia ruchowa
rel = Close[i] - Close[i + 1];
if(rel > 0)
sump = rel;
else
sumn =- rel;
positive = (PosBuffer[i + 1] * (period - 1) + sump) / period;
negative = (NegBuffer[i + 1] * (period - 1) + sumn) / period;
}
PosBuffer[i] = positive;
NegBuffer[i] = negative;
if(negative == 0.0)
RSIBuffer[i] = 0.0;
else
RSIBuffer[i]= positive / (positive + negative);
for(k = i + period, positive = 0.0, negative = 1.0; k >= i; k--)
{
positive = MathMax(RSIBuffer[k], positive);
negative = MathMin(RSIBuffer[k], negative);
}
if(positive == negative)
StochRSIB[i] = RSIBuffer[i];
else
StochRSIB[i] = (RSIBuffer[i] - negative) / (positive - negative);
}
//----
return(0);
}
//+------------------------------------------------------------------+

l. Vol

Wskaźnik ten napisałem by obserwować korelację zmian cen i odpowiadające im relatywne zmiany wielkości wolumenu. Wskaźnik wyświetla
różnicę między wolumenem a średnią wykładniczą z MA_Period okresów.
Kod:
//+------------------------------------------------------------------+
//| Vol.mq4 |
//| Copyright © 2007, Konrad Kudzin |
//| kjk1983@wp.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Konrad Kudzin"
#property link "http://www.forex-tower.xt.pl/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//---- parametry
extern int MA_Period = 10;
//---- buffers
double ExtBuffer0[], ExtBuffer1[];

//+------------------------------------------------------------------+
//| Funkcja inicjalizacji wskaźnika |
//+------------------------------------------------------------------+
int init()
{
string name;
//---- deklaracja buforów
IndicatorBuffers(2);
//---- ustawienia rysowania
IndicatorDigits(1);
//---- przypisywanie buforów wskaźników
if(!SetIndexBuffer(0, ExtBuffer0) &&
!SetIndexBuffer(0, ExtBuffer1)) return(-1);
//---- nazwa
name = StringConcatenate("Vol(", MA_Period, ")");
IndicatorShortName(name);
SetIndexLabel(0, name);
//---- wskaźnik zainicjalizowany
return(0);
}

//+------------------------------------------------------------------+
//| Funkcja liczy EMA |
//+------------------------------------------------------------------+
void EMA(int MA_Period, int ExtCountedBars, double &ExtMapBuffer[])
{
int i;
double pr = 2.0 / (MA_Period + 1);
//---- pętla główna
for(i = Bars - ExtCountedBars - 1; i >= 0; i--)
{
if(i == Bars - 2) ExtMapBuffer[i + 1] = Volume[i + 1];
ExtMapBuffer[i] = Volume[i] * pr + ExtMapBuffer[i + 1] * (1 - pr);
}
}

//+------------------------------------------------------------------+
//| Funkcja iteracji wskaźnika |
//+------------------------------------------------------------------+
int start()
{
int i, cbars = IndicatorCounted();
//----
if(cbars > 0) cbars--;
EMA(MA_Period, cbars, ExtBuffer1);
for(i = Bars - cbars - 1; i >= 0; i--) ExtBuffer0[i] = Volume[i] - ExtBuffer1[i];
//----
return(0);
}
//+------------------------------------------------------------------+
31. SKRYPTY
⇒ Szablon
⇒ Konstr ukcja
1. Szablon

Szablon skryptu nie ma zadeklarowanych, żadnych dynamicznych buforów, na których będzie operował z powodu założeń tego rodzaju programów.
Każdy program ma trzy predefiniowane funkcje. Są to: funkcja init, która nie jest stosowana, funkcja start jest wywoływana podczas jednorazowego
wykonania skryptu i funkcja deinit, która też nie jest stosowana ze względu na specyfikę skryptu. Funkcja start zwraca do programu głównego wartość
typu int równą zero, gdy jej wywołanie zakończyło się pomyślnie, w przeciwnym razie zwraca wartość różną od zera, jako kod błędu. Skrypty są
umieszczane w katalogu instalacji programu MetaTrader w podkatalogu .\experts\scripts\.
Kod:
//+------------------------------------------------------------------+
//| szablon.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/"

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+

b. Konstr ukcja

W tym skrypcie jest przesuwana wartość stoploss dla wszystkich niezamkniętych zleceń. Skrypt jest programem, który uruchamia się raz, by
wykonać powierzoną mu operację i zostaje zakończony natychmiast po wykonaniu zadania w przeciwieństwie do wskaźników, które są wywoływane za
każdym razem, gdy terminal otrzyma nowe dane. Skrypt nie ma dostępu do funkcji wskaźników. Jak łatwo zauważyć w kodzie szablonu jedynie została
zdefiniowana funkcja start, nie zostały zdefiniowane funkcje init i deinit, ponieważ rzadko się zdarza by skrypt wymagał inicjalizacji i de-inicjalizacji, gdyż
funkcja start wykonuje się tylko raz. Ale tak jak w każdym programie funkcje init i deinit są predefiniowane i mogą zostać użyte.
Kod:
//+------------------------------------------------------------------+
//| szablon.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
//---- parametry
extern int SL = 35;
//+------------------------------------------------------------------+
//| Funkcja główna skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_BUY)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask - SL * Point, OrderTakeProfit(), 0);
}
else if(OrderType() == OP_SELL)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Bid + SL * Point, OrderTakeProfit(), 0);
}
int err = GetLastError();
if((err > 1) && (err != 4000)) Print("Błąd ", err, " przy zleceniu ", OrderTicket());
}
//----
return(0);
}
//+------------------------------------------------------------------+
Analizując kod linia po linii można zauważyć, że pierwsze pięć linii kodu to komentarz wygenerowany przez kreator. Ten komentarz zawiera nazwę
skryptu, prawa autorskie (kto jest autorem programu) i strona projektu (link). Następne dwie linie to dyrektywy preprocesora określające odpowiednio
prawa autorskie przez właściwość copyright i strona projektu przez właściwość link.
Kod:
//+------------------------------------------------------------------+
//| szablon.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/"
Do skryptu została dodana dyrektywa właściwości show_inputs. Bez tej właściwości skrypt nie przyjmie parametrów od użytkownika. W skrypcie
użytkownik może ustalić wartość SL. Jeśli skrypt nie ma żadnych parametrów to wtedy dyrektywę właściwości show_inputs, powinno się pominąć.
Kod:
#property show_inputs
Skrypt ma zdefiniowaną jedną zmienną extern typu całkowitoliczbowego o identyfikatorze SL o wartości domyślnej 35, której wartość użytkownik
może modyfikować w oknie właściwości skryptu w terminalu klienckim. Ta zmienna będzie używana przy wyznaczaniu wartości poziomów stoploss
wszystkich niezamkniętych pozycji.
Kod:
//---- parametry
extern int SL = 35;
Funkcja start jest wywoływana na każdorazowe żądanie użytkownika. Funkcja OrdersTotal() zwraca liczbę wszystkich niezamkniętych pozycji.
Zmienna sterująca pętlą for zaczyna indeksować niezamknięte pozycje od wartości OrdersTotal() - 1 i kończy na wartości 0. Zmienna i jest używana w
pętli z funkcją OrderSelect, jako indeks transakcji, by uzyskać dostęp do wszystkich niezamkniętych transakcji. Każdym obrocie pętli zmienna sterująca
jest dekrementowana o jeden a następnie przyrównywana do zera.
Funkcja OrderSelect(i, SELECT_BY_POS, MODE_TRADES) wybiera, każdą otwartą, pozycje przez indeks zlecenia do dalszego przetwarzania.
Bez tej instrukcji funkcja OrderType() przetwarzałaby ostatnio wybrane zlecenie.
Funkcja OrderType() zwraca typ aktualnego zlecenia, który odpowiada jednemu z literałów stałych: OP_BUY, OP_SELL, OP_BUYLIMIT,
OP_BUYSTOP, OP_SELLLIMIT albo OP_SELLSTOP. W przykładzie funkcja jest wykorzystywana do sprawdzenia typu transakcji, gdyż modyfikowane
są tylko transakcji kupna lub sprzedaży krótkiej. W przypadku natrafienia na transakcje kupna lub sprzedaży krótkiej opcjonalny blok jest wykonywany.
Funkcja OrderModify() w ciele poniższej funkcji jest wykonywana w przypadku natrafienia na transakcje kupna lub sprzedaży krótkiej. Przesuwa
wartości stoploss uwzględniając wartość zmiennej SL. Pierwszym parametrem tej funkcji jest parametr ticket, jest to numer zlecenia, funkcja
OrderTicket() zwraca numer aktualnego zlecenia. Drugim parametrem jest parametr price, jest to cena otwarcia dla zleceń oczekujących, funkcja
OrderOpenPrice() zwraca cenę otwarcia dla zleceń oczekujących. Trzecim parametrem jest parametr stoploss, jest to poziom stop loss. Następnym
parametrem jest parametr takeprofit, jest to poziom take profit, funkcja OrderTakeProfit() zwraca poziom take profit dla aktualnego zlecenia.
Przedostatnim parametrem jest parametr expiration, określa czas wygaśnięcia, funkcja OrderExpiration() zwraca czas wygaśnięcia aktualnego zlecenia.
Ostatni parametr, który jest opcjonalny, to parametr arrow_color, określa kolor zamykającej strzałki na wykresie, domyślnie CLR_NONE (nierysowana na
wykresie).
Funkcja GetLastError() zwraca kod błędu ostatnio wykonanej funkcji, która ustawia kod błędu w przykładzie zapisujemy kod błędu w zmiennej err po
wywołaniu funkcji OrderModify, należy zwrócić uwagę, że wywołanie jakiejkolwiek funkcji ustawiającej kod błędu nadpisuje permanentnie ostatni kod
błędu.
Kod:
//+------------------------------------------------------------------+
//| Funkcja główna skryptu |
//+------------------------------------------------------------------+
int start()
{
//----
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_BUY)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask - SL * Point, OrderTakeProfit(), 0);
}
else if(OrderType() == OP_SELL)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Bid + SL * Point, OrderTakeProfit(), 0);
}
int err = GetLastError();
if((err > 1) && (err != 4000)) Print("Błąd ", err, " przy zleceniu ", OrderTicket());
}
//----
return(0);
}
//+------------------------------------------------------------------+
32. BIBLIOTEKI
⇒ Szablon
⇒ Konstr ukcja
⇒ Funkcja OptimalF()
⇒ Funkcja Kell yCriterion()
⇒ Funkcja PosExp()
⇒ Funkcja MatExp()
⇒ Funkcja MaxLots()
⇒ Funkcja MaxMoney()
⇒ Funkcja MaxML()
1. Szablon

Szablon biblioteki, który w tym konkretnym przypadku jest uzupełniony zmienną zmiennoprzecinkową max_lots z predefiniowaną wartością 50.0.
Nie ma zadeklarowanych, żadnych dynamicznych buforów, na których będzie operowała z powodu założeń. Każda biblioteka może definiować trzy
predefiniowane funkcje. Są to: funkcja init, funkcja start i funkcja deinit. Gdy zdefiniowana jest funkcja init kompilator będzie oczekiwał, iż funkcja start,
także będzie zdefiniowana, jeśli jej nie będzie zgłosi ostrzeżenie. Te trzy funkcje zwracają do programu głównego wartości równe zeru, gdy ich wywołanie
zakończyło się pomyślnie, w przeciwnym razie zwracają wartości różne od zera, jako kod błędu. Biblioteki są domyślnie umieszczane w katalogu
instalacji programu MetaTrader w podkatalogu .\experts\libraries\.
Kod:
//+------------------------------------------------------------------+
//| szablon.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 library

//+------------------------------------------------------------------+
//| My function |
//+------------------------------------------------------------------+
// int MyCalculator(int value,int value2)
// {
// return(value+value2);
// }
//+------------------------------------------------------------------+

2. Konstr ukcja

W tej bibliotece jest zawarta tylko jedna funkcja. Biblioteka nie jest programem, który można uruchomić. Jak łatwo zauważyć w kodzie szablonu nie
zostały zdefiniowane funkcje init, deinit a nawet start, ponieważ rzadko się zdarza by biblioteka wymagała inicjalizacji i de-inicjalizacji, gdyż jest tylko
zbiorem funkcji wykonujących się tylko raz na każde żądanie. Ale tak jak w każdym programie funkcje init, deinit i start są predefiniowane, z tymże mogą
zostać użyte jedynie wewnątrz biblioteki.
Kod:
//+------------------------------------------------------------------+
//| szablon.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 library

//+------------------------------------------------------------------+
//| Przykładowa funkcja |
//+------------------------------------------------------------------+
double fun(double value)
{
return(MathMax(MathMin(value, MarketInfo(Symbol(), MODE_MAXLOT)), MarketInfo(Symbol(), MODE_MINLOT)));
}
//+------------------------------------------------------------------+
Analizując kod linia po linii można zauważyć, że pierwsze siedem linii kodu wygenerowanych przez kreator, jest to szablon, który się nie zmienia,
zawarty tu jest komentarz oraz dyrektywy preprocesora.
Kod:
//+------------------------------------------------------------------+
//| szablon.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/"
Do zaznaczenia, że pisany kod należy traktować jak bibliotekę kreator dodaje dyrektywę właściwości library. Bez właściwości library kompilator
traktowałby kod biblioteki jak zwykły program.
Kod:
#property library
Funkcja fun jest wywoływana na każdorazowe żądanie. Funkcja MathMax() zwraca większą a funkcja MathMin() zwraca mniejszą z dwóch liczb
zmiennoprzecinkowych. Funkcja zwraca wartość zmiennoprzecinkową value, gdy wartość się mieści w przedziale od MarketInfo(Symbol(),
MODE_MINLOT) do MarketInfo(Symbol(), MODE_MAXLOT). Jeśli będzie mniejsza od MarketInfo(Symbol(), MODE_MINLOT) wtedy funkcja zwróci
wartość MarketInfo(Symbol(), MODE_MINLOT), jeśli będzie większa od MarketInfo(Symbol(), MODE_MAXLOT) wtedy funkcja zwróci wartość
MarketInfo(Symbol(), MODE_MAXLOT).
Kod:
//+------------------------------------------------------------------+
//| Przykładowa funkcja |
//+------------------------------------------------------------------+
double fun(double value)
{
return(MathMax(MathMin(value, MarketInfo(Symbol(), MODE_MAXLOT)), MarketInfo(Symbol(), MODE_MINLOT)));
}
//+------------------------------------------------------------------+

c. Funkcja OptimalF()

double OptimalF()

Funkcja OptimalF w założeniu ma zwracać część dostępnego kapitału, jaką należy zainwestować w jednej transakcji, aby optymalnie wykorzystać
całość środków na koncie inwestycyjnym. Jednakże, ten wzór jest bardzo nie doskonały i przy systemie który generuje duże lub nawet średnie
obsunięcia kapitału jest mało użyteczny, chociaż można stosować stały ułamek wartości OptimalF do obliczenia części kapitału jaką będziemy
inwestować. Jeśli system generuje małe obsunięcia kapitału, wtedy można się zastanowić nad użyciem tej funkcji.
Wzór:
b = ((∑ sum_win) / t_win) / ((∑ sum_loss) / t_loss)
p = t_win / (t_win - t_loss)
OptimalF = (b + 1) * (p - 1) / b
gdzie:
b - stosunek średniego zysku do średniej straty
p - stosunek transakcji wygrywających do transakcji o nie zerowym saldzie
Kod:
//+------------------------------------------------------------------+
//| Funkcja oblicza optymalne zaangażowanie według formuły Kelly |
//| optimal f. |
//+------------------------------------------------------------------+
double OptimalF()
{
double b = 0, sum_win = 0.0, sum_loss = 0.0;
int t_win = 0, t_loss = 0;
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if(OrderProfit() > 0)
{
sum_win += OrderProfit();
t_win++;
}
else if(OrderProfit() < 0)
{
sum_loss += OrderProfit();
t_loss++;
}
}
if((sum_loss * t_win) != 0.0)
{
b = (sum_win * t_loss) / (sum_loss * t_win);
return(((b + 1) * (t_win / (t_win + t_loss)) - 1) / b);
}
else
return(0.0);
}

d. Funkcja Kell yCriterion()

double KellyCriterion()

Funkcja KellyCriterion ma takie same założenia, co funkcja OptimalF z tymże bardziej przymilna w działaniu SecureF, używając tej funkcji mamy
realne szanse pograć dużo dłużej niż gdybyśmy bezkrytycznie używali funkcji opisanej wcześniej.
Wzór:
w = t_win / (t_win - t_loss)
r = ((∑ sum_win) / t_win) / ((∑ sum_loss) / t_loss)
KellyCriterion = w - (w - 1) / r
gdzie
w - stosunek transakcji wygrywających do transakcji o nie zerowym saldzie
r - stosunek średniej wygranej do średniej straty
Kod:
//+------------------------------------------------------------------+
//| Funkcja oblicza optymalne zaangażowanie według formuły Kelly |
//| Criterion. |
//+------------------------------------------------------------------+
double KellyCriterion()
{
double sum_win = 0.0, sum_loss = 0.0;
int t_win = 0, t_loss = 0;
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if(OrderProfit() > 0)
{
sum_win += OrderProfit();
t_win++;
}
else if(OrderProfit() < 0)
{
sum_loss += OrderProfit();
t_loss++;
}
}
if((t_win != 0) && (t_loss != 0))
return(t_win / (t_win + t_loss) - (t_loss / (t_win + t_loss)) * (sum_loss * t_win) / (sum_win * t_loss));
else
return(0.0);
}

e. Funkcja PosExp()

double PosExp()

Funkcja PosExp zwraca wynik tak zwanych pozytywnych oczekiwań. Funkcja jest podobna do funkcji OptimalF i moim zdaniem średnio użyteczna
przy obliczaniu optymalnego zaangażowania.
Wzór:
w = ∑ sum_win
l = ∑ sum_loss
p = t_win / (t_win + t_loss)
PosExp = (1 + w / l) * p - 1
gdzie
w - suma transakcji wygrywających
l - suma transakcji przegrywających
p - stosunek transakcji wygrywających do transakcji o nie zerowym saldzie
Kod:
//+------------------------------------------------------------------+
//| Funkcja jest realizacją formuły pozytywnych oczekiwań. |
//+------------------------------------------------------------------+
double PosExp()
{
double sum_win = 0.0, sum_loss = 0.0;
int t_win = 0, t_loss = 0;
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if(OrderProfit() > 0)
{
sum_win += OrderProfit();
t_win++;
}
else if(OrderProfit() < 0)
{
sum_loss += OrderProfit();
t_loss++;
}
}
if((t_win != 0) && (t_loss != 0))
return((1 + (sum_win / sum_loss)) * (t_win / (t_win + t_loss)) - 1);
else
return(0.0);
}

f. Funkcja MathExp()

double MathExp()

Funkcja MathExp() zwraca w wyniku tak zwaną wartość oczekiwaną. Funkcja jest podobna do funkcji KellyCriterion i dla graczy, którzy chcą dłużej
pograć polecałbym branie mniejszej wartości z KellyCriterion i MathExp() przy wyznaczaniu zaangażowania dla pojedynczej transakcji. Gracze bardziej
agresywni mogą używać większej wartości z KellyCriterion i MathExp() przy wyznaczaniu zaangażowania dla pojedynczej transakcji, ale ja bym nie
polecił takiej strategii.
Wzór:
w = (∑ sum_win) / t_win
l = (∑ sum_loss) / t_loss
p = t_win / (t_win + t_loss)
PosExp = (1 + w / l) * p - 1
gdzie
w - średnia wartość transakcji wygrywających
l - średnia wartość transakcji przegrywających
p - stosunek transakcji wygrywających do transakcji o nie zerowym saldzie
Kod:
//+------------------------------------------------------------------+
//| Funkcja jest realizacją formuły wyniku oczekiwanego. |
//+------------------------------------------------------------------+
double MathExp()
{
double sum_win = 0.0, sum_loss = 0.0;
int t_win = 0, t_loss = 0;
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if(OrderProfit() > 0)
{
sum_win += OrderProfit();
t_win++;
}
else if(OrderProfit() < 0)
{
sum_loss += OrderProfit();
t_loss++;
}
}
if((t_win != 0) && (t_loss != 0))
return((1 + (sum_win * t_loss / sum_loss * t_win)) * (t_win / (t_win + t_loss)) - 1);
else
return(0.0);
}

g. Funkcja MaxLots()

double MaxLots(string symbol, double lots, int cmd = OP_BUY)

Funkcja MaxLots zwraca maksymalne możliwe zaangażowanie, ze względu na aktualną wielkość rachunku inwestycyjnego, mniejsze bądź równe
drugiemu parametrowi wyrażonemu w lotach przy zleceniu podanym trzecim parametrem. Wartość domyślna trzeciego parametru podawana dla
zlecenia kupna to OP_BUY, literał stały OP_SELL oznacza zlecenie sprzedaży krótkiej. Wartość jest zwracana w lotach. Formuła rekurencyjna funkcji
jest podyktowana tym, że różni brokerzy stosują różne taktyki do obliczania depozytu zabezpieczającego. Niektórzy brokerzy podnoszą wymagalny
depozyt zabezpieczający na wszystkich otwartych pozycjach, gdy wartość depozytu zabezpieczającego dla wszystkich otwartych pozycji przekroczy z
góry ustalony próg.
Kod:
//+------------------------------------------------------------------+
//| Funkcja oblicza maksymalne zaangażowanie w lotach nie większe od |
//| lots. |
//| parametry: |
//| symbol - symbol instrumentu |
//| lots - maksymalna wielkość zaangażowania |
//| cmd - oblicza dla - OP_BUY: kokna, OP_SELL: sprzedaży |
//+------------------------------------------------------------------+
double MaxLots(string symbol, double lots, int cmd = OP_BUY)
{
double ret = 0.0, afm, afmc, lot_step, min_size, step_size, min_lot = MarketInfo(symbol, MODE_MINLOT);
//----
if(lots >= min_lot)
{
afmc = AccountFreeMarginCheck(symbol, cmd, min_lot);
if(GetLastError() != 134)
{
afm = AccountFreeMargin();
lot_step = MarketInfo(symbol, MODE_LOTSTEP);
min_size = afm - afmc;
step_size = lot_step / min_lot * min_size;
ret = MathFloor(MathMin(MathMin(lots, MarketInfo(symbol, MODE_MAXLOT)), ((afm - min_size) / step_size) *
lot_step + min_lot) / lot_step) * lot_step;
}
}
//----
return(ret);
}

h. Funkcja MaxMoney()

double MaxMoney(string symbol, double money, int cmd = OP_BUY)

Funkcja MaxMoney zwraca maksymalne możliwe zaangażowanie, ze względu na aktualną wielkość rachunku inwestycyjnego, mniejsze bądź
równe drugiemu parametrowi wyrażonemu w gotówce przy zleceniu podanym drugim parametrem. Wartość domyślna trzeciego parametru podawana
dla zlecenia kupna to OP_BUY, literał stały OP_SELL oznacza zlecenie sprzedaży krótkiej. Wartość jest zwracana w lotach. Formuła rekurencyjna funkcji
jest podyktowana tym, że różni brokerzy stosują różne taktyki do obliczania depozytu zabezpieczającego. Niektórzy brokerzy podnoszą wymagalny
depozyt zabezpieczający na wszystkich otwartych pozycjach, gdy wartość depozytu zabezpieczającego dla wszystkich otwartych pozycji przekroczy z
góry ustalony próg.
Kod:
//+------------------------------------------------------------------+
//| Funkcja oblicza maksymalne zaangażowanie w lotach nie większe od |
//| money w przeliczeniu na loty. |
//| parametry: |
//| symbol - symbol instrumentu |
//| money - maksymalna wielkość zaangażowania |
//| cmd - oblicza dla - OP_BUY: kokna, OP_SELL: sprzedaży |
//+------------------------------------------------------------------+
double MaxMoney(string symbol, double money, int cmd = OP_BUY)
{
double ret = 0.0, lots, afm = AccountFreeMargin(), afmc, lot_step, min_size, step_size, min_lot = MarketInfo(symbol,
MODE_MINLOT);
//----
afmc = AccountFreeMarginCheck(symbol, cmd, min_lot);
min_size = afm - afmc;
lots = money / min_size * min_lot;
if((GetLastError()) != 134 && (lots >= min_lot))
{
lot_step = MarketInfo(symbol, MODE_LOTSTEP);
step_size = lot_step / min_lot * min_size;
ret = MathFloor(MathMin(MathMin(lots, MarketInfo(symbol, MODE_MAXLOT)), ((afm - min_size) / step_size) *
lot_step + min_lot) / lot_step) * lot_step;
}
//----
return(ret);
}

i. Funkcja MaxML()

double MaxML(string symbol, double money_lots, int cmd = OP_BUY, bool mode = false)

Funkcja MaxML jest niejako implementacją interfejsu do funkcji MaxLots i MaxMoney. Oczywiście trudno tu mówić o interfejsie skoro MQL 4 nie
wspiera enkapsulacji ale dzięki tej funkcji łatwo będzie przebudować program na przykład zmieniając tylko jeden literał. Funkcja ta zwraca wartość
MaxLots jeśli zmienna logiczna mode posiada wartość true w przeciwnym wypadku zwraca wartość MaxMoney.
Kod:
//+------------------------------------------------------------------+
//| Funkcja oblicza maksymalne zaangażowanie w lotach nie większe od |
//| money_lots w przeliczeniu na loty. |
//| parametry: |
//| symbol - symbol instrumentu |
//| money_lots - maksymalna wielkość zaangażowania |
//| cmd - oblicza dla - OP_BUY: kokna, OP_SELL: sprzedaży |
//| mode - zaangarzowanie w - true: lotach, false: walucie |
//+------------------------------------------------------------------+
double MaxML(string symbol, double money_lots, int cmd = OP_BUY, bool mode = false)
{
if(mode)
return(MaxLots(symbol, money_lots, cmd));
else
return(MaxMoney(symbol, money_lots, cmd));
}

j. Funkcja MinP()

double MinP(double d1, double d2)

Funkcja ManP znawca najmniejszą dodatnią liczbę spośród dwóch zadanych argumentów, jeśli to się okaże nie możliwe, funkcja zwróci zero.
Kod:
//+------------------------------------------------------------------+
//| Funkcja zwraca najmniejszą dodatnią liczbę zadaną parametrami, |
//| lub 0.0 w przypadki gdy obydwie liczby są niedodatnie. |
//+------------------------------------------------------------------+
double MinP(double d1, double d2)
{
return(MathMin(MathMax(d1, 0.0), MathMax(d2, 0.0)));
}
33. AUTOMATYCZNE SYSTEMY TRANSAKCYJNE
⇒ Szablon
⇒ Konstr ukcja
⇒ Przykład
1. Szablon

Kod:
//+------------------------------------------------------------------+
//| szablon.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/"

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+

2. Konstr ukcja

Kod:

3. Przykład

Kod:
34. SPIS TREŚCI
Kurs MetaQuotes Language 4.....................................................................................1
1. Wstęp........................................................................................................2
a. Wstęp......................................................................................................2
b. MQL 4......................................................................................................2
c. Kompilator.................................................................................................3
d. IDE........................................................................................................3
2. Składnia.....................................................................................................4
1. Składnia...................................................................................................4
2. Instrukcje.................................................................................................4
c. Separatory.................................................................................................4
d. Format.....................................................................................................4
e. Komentarze.................................................................................................4
f. Słowa zastrzeżone..........................................................................................5
g. Identyfikatory.............................................................................................5
3. Typy.........................................................................................................6
1. Typy.......................................................................................................6
b. Rzutowanie typów...........................................................................................6
c. Typ całkowity (int)........................................................................................6
d. Typ zmiennoprzecinkowy (double)............................................................................7
e. Typ tekstowy (string)......................................................................................7
f. Typ amorficzny (object)....................................................................................8
g. Typ pusty (void)...........................................................................................8
h. Typ booleanowski (bool)....................................................................................8
i. Typ daty i czasu (datetime)................................................................................8
j. Typ koloru (color).........................................................................................9
4. Operacje i wyrażenia........................................................................................10
1. Operacje i wyrażenia......................................................................................10
b. Priorytet operacji........................................................................................10
c. Operacje arytmetyczne.....................................................................................11
d. Operacje przypisania......................................................................................11
e. Operacje relacji..........................................................................................11
f. Operacje Booleanowskie....................................................................................12
g. Operacje bitowe...........................................................................................12
h. Operacje inne.............................................................................................13
5. Operatory...................................................................................................14
1. Operatory.................................................................................................14
b. Operator wyrażenia........................................................................................14
3. Operator złożony..........................................................................................14
d. Operator warunkowy if.....................................................................................14
e. Operator break............................................................................................15
f. Operator wyboru wielowariantowego switch..................................................................15
g. Operator continue.........................................................................................16
h. Operator pętli while......................................................................................16
i. Operator pętli for........................................................................................17
j. Operator return...........................................................................................17
6. Funkcje.....................................................................................................19
1. Funkcje...................................................................................................19
2. Definicja i deklaracja....................................................................................20
c. Argumenty.................................................................................................20
d. Parametry formalne........................................................................................21
e. Parametry aktualne........................................................................................22
f. Wywołanie funkcji.........................................................................................22
7. Zmienne.....................................................................................................23
1. Zmienne...................................................................................................23
b. Definicja i deklaracja....................................................................................24
c. Zasięg widoczności zmiennych..............................................................................24
d. Zmienne o zasięgu lokalnym................................................................................25
e. Zmienne o zasięgu globalnym...............................................................................25
f. Dyrektywa static .........................................................................................26
g. Dyrektywa extern..........................................................................................26
h. Inicjalizowanie zmiennych.................................................................................27
8. Preprocesor.................................................................................................29
1. Preprocesor...............................................................................................29
b. Dyrektywa property........................................................................................29
c. Dyrektywa define..........................................................................................30
d. Dyrektywa include.........................................................................................30
e. Dyrektywa import..........................................................................................31
9. Wykres......................................................................................................35
1. Wykres....................................................................................................35
b. Słupkowy..................................................................................................35
c. Świecowy..................................................................................................35
d. Liniowy...................................................................................................35
10. Funkcje specjalne..........................................................................................36
1. Funkcje specjalne.........................................................................................36
b. Funkcja init()............................................................................................36
c. Funkcja start()...........................................................................................36
d. Funkcja deinit()..........................................................................................37
11. Zmienne predefiniowane.....................................................................................38
1. Zmienne predefiniowane....................................................................................38
b. Ask.......................................................................................................38
c. Bars......................................................................................................38
d. Bid.......................................................................................................39
e. Close[]...................................................................................................39
f. Digits....................................................................................................40
g. High[]....................................................................................................40
h. Low[].....................................................................................................40
i. Open[]....................................................................................................41
j. Point.....................................................................................................41
k. Time[]....................................................................................................42
l. Volume[]..................................................................................................42
12. Informacje o koncie.......................................................................................43
1. Informacje o koncie.......................................................................................43
2. AccountBalance()..........................................................................................43
c. AccountCredit()...........................................................................................43
d. AccountCompany()..........................................................................................44
e. AccountCurrency().........................................................................................44
f. AccountEquity()...........................................................................................44
g. AccountFreeMargin().......................................................................................45
h. AccountFreeMarginCheck()..................................................................................45
i. AccountFreeMarginMode()...................................................................................45
j. AccountLeverage().........................................................................................46
k. AccountMargin()...........................................................................................46
l. AccountName().............................................................................................47
m. AccountNumber()...........................................................................................47
n. AccountProfit()...........................................................................................47
o. AccountServer()...........................................................................................48
p. AccountStopoutLevel().....................................................................................48
q. AccountStopoutMode()......................................................................................48
13. Funkcje tablicowe..........................................................................................50
1. ArrayBsearch()............................................................................................50
b. ArrayCopy()...............................................................................................50
c. ArrayCopyRates()..........................................................................................50
d. ArrayCopySeries().........................................................................................51
e. ArrayDimension()..........................................................................................51
f. ArrayGetAsSeries()........................................................................................51
g. ArrayInitialize().........................................................................................51
h. ArrayIsSeries()...........................................................................................52
i. ArrayMaximum()............................................................................................52
j. ArrayMinimum()............................................................................................52
k. ArrayRange()..............................................................................................52
l. ArrayResize().............................................................................................53
m. ArraySetAsSeries()........................................................................................53
n. ArraySize()...............................................................................................53
o. ArraySort()...............................................................................................53
14. Funkcje sprawdzające.......................................................................................54
1. Funkcje sprawdzające......................................................................................54
2. GetLastError()............................................................................................54
c. IsConnected().............................................................................................56
d. IsDemo()..................................................................................................57
e. IsDllsAllowed()...........................................................................................57
f. IsExpertEnabled().........................................................................................57
g. IsLibrariesAllowed()......................................................................................58
h. IsOptimization()..........................................................................................58
i. IsStopped()...............................................................................................58
j. IsTesting()...............................................................................................58
k. IsTradeAllowed()..........................................................................................58
l. IsTradeContextBusy()......................................................................................58
m. IsVisualMode()............................................................................................58
n. UninitializeReason()......................................................................................59
15. Terminal kliencki..........................................................................................60
1. TerminalCompany().........................................................................................60
b. TerminalName()............................................................................................60
c. TerminalPath()............................................................................................60
16. Funkcje różne..............................................................................................61
1. Alert()...................................................................................................61
b. Comment().................................................................................................61
c. GetTickCount()............................................................................................61
d. MarketInfo()..............................................................................................61
e. MessageBox()..............................................................................................62
f. PlaySound()...............................................................................................63
g. Print()...................................................................................................63
h. SendFTP().................................................................................................63
i. SendMail()................................................................................................63
j. Sleep()...................................................................................................64
k. SpeechText()..............................................................................................64
17. Funkcje konwersji..........................................................................................65
1. Funkcje konwersji.........................................................................................65
2. CharToStr()...............................................................................................65
c. DoubleToStr().............................................................................................65
d. NormalizeDouble().........................................................................................65
e. StrToDouble().............................................................................................65
f. StrToInteger()............................................................................................66
g. StrToTime()...............................................................................................66
h. TimeToStr()...............................................................................................66
18. Wskaźniki..................................................................................................67
1. Wskaźniki.................................................................................................67
2. IndicatorBuffers()........................................................................................67
c. IndicatorCounted()........................................................................................67
d. IndicatorDigits().........................................................................................68
e. IndicatorShortName()......................................................................................69
f. SetIndexArrow()...........................................................................................69
g. SetIndexBuffer()..........................................................................................70
h. SetIndexDrawBegin().......................................................................................71
i. SetIndexEmptyValue()......................................................................................71
j. SetIndexLabel()...........................................................................................72
k. SetIndexShift()...........................................................................................72
l. SetIndexStyle()...........................................................................................73
m. SetLevelStyle()...........................................................................................74
n. SetLevelValue()...........................................................................................74
19. Funkcje daty i czasu.......................................................................................76
1. Funkcje daty i czasu......................................................................................76
b. Day().....................................................................................................76
c. DayOfWeek()...............................................................................................76
d. DayOfYear()...............................................................................................76
e. Hour()....................................................................................................76
f. Minute()..................................................................................................77
g. Month()...................................................................................................77
h. Seconds().................................................................................................77
9. TimeCurrent().............................................................................................77
j. TimeDay().................................................................................................77
k. TimeDayOfWeek()...........................................................................................78
l. TimeDayOfYear()...........................................................................................78
m. TimeHour()................................................................................................78
n. TimeLocal()...............................................................................................78
o. TimeMinute()..............................................................................................79
p. TimeMonth()...............................................................................................79
q. TimeSeconds().............................................................................................79
r. TimeYear()................................................................................................80
s. Year()....................................................................................................80
20. Funkcje plikowe............................................................................................81
1. Funkcje plikowe...........................................................................................81
2. FileClose()...............................................................................................81
c. FileDelete()..............................................................................................81
d. FileFlush()...............................................................................................81
e. FileIsEnding()............................................................................................82
f. FileIsLineEnding()........................................................................................82
g. FileOpen()................................................................................................82
h. FileOpenHistory().........................................................................................82
i. FileReadArray()...........................................................................................83
j. FileReadDouble()..........................................................................................83
k. FileReadInteger().........................................................................................83
l. FileReadNumber()..........................................................................................83
m. FileReadString()..........................................................................................84
n. FileSeek()................................................................................................84
o. FileSize()................................................................................................84
p. FileTell()................................................................................................84
q. FileWrite()...............................................................................................85
r. FileWriteArray()..........................................................................................85
s. FileWriteDouble().........................................................................................85
t. FileWriteInteger()........................................................................................85
u. FileWriteString().........................................................................................86
21. Zmienne globalne...........................................................................................87
1. Zmienne globalne..........................................................................................87
2. GlobalVariableCheck().....................................................................................87
c. GlobalVariableDel().......................................................................................87
d. GlobalVariablesDeleteAll()................................................................................88
e. GlobalVariableGet().......................................................................................88
f. GlobalVariableName()......................................................................................88
g. GlobalVariableSet().......................................................................................88
h. GlobalVariableSetOnCondition()............................................................................89
i. GlobalVariablesTotal()....................................................................................89
22. Funkcje matematyczne.......................................................................................90
1. MathAbs().................................................................................................90
b. MathArccos()..............................................................................................90
c. MathArcsin()..............................................................................................90
d. MathArctan()..............................................................................................90
e. MathCeil()................................................................................................91
f. MathCos().................................................................................................91
g. MathExp().................................................................................................91
h. MathFloor()...............................................................................................91
i. MathLog().................................................................................................91
j. MathMax().................................................................................................91
k. MathMin...................................................................................................91
l. MathMod().................................................................................................92
m. MathPow().................................................................................................92
n. MathRand()................................................................................................92
o. MathRound()...............................................................................................92
p. MathSin().................................................................................................92
q. MathSqrt()................................................................................................92
r. MathSrand()...............................................................................................93
s. MathTan().................................................................................................93
23. Obiekty....................................................................................................94
1. Obiekty...................................................................................................94
2. ObjectCreate()............................................................................................94
c. ObjectDelete()............................................................................................95
d. ObjectDescription.........................................................................................95
e. ObjectFind()..............................................................................................95
f. ObjectGet()...............................................................................................95
g. ObjectGetFiboDescription()................................................................................96
h. ObjectGetShiftByValue()...................................................................................97
i. ObjectGetValueByShift()...................................................................................97
j. ObjectMove()..............................................................................................97
k. ObjectName()..............................................................................................98
l. ObjectsDeleteAll()........................................................................................98
m. ObjectSet()...............................................................................................98
n. ObjectSetFiboDescription()................................................................................98
o. ObjectSetText()...........................................................................................99
p. ObjectsTotal()............................................................................................99
q. ObjectType()..............................................................................................99
24. Operacje na stringach....................................................................................100
1. StringConcatenate()......................................................................................100
2. StringFind().............................................................................................100
c. StringGetChar()..........................................................................................100
d. StringLen()..............................................................................................100
e. StringSetChar()..........................................................................................100
f. StringSubstr()...........................................................................................101
g. StringTrimLeft().........................................................................................101
h. StringTrimRight()........................................................................................101
25. Wskaźniki techniczne......................................................................................102
1. Accelerator Oscillator - iAC()...........................................................................102
b. Accumulation/Distribution - iAD()........................................................................103
c. Alligator - iAlligator().................................................................................103
d. Average Directional Movement Index - iADX()..............................................................104
e. Average True Range - iATR()..............................................................................105
f. Awesome Oscillator - iAO()...............................................................................106
g. Bears Power - iBearsPower()..............................................................................106
h. Bollinger Bands - iBands()...............................................................................107
i. Bollinger Bands on buffer - iBandsOnArray()..............................................................107
j. Bulls Power - iBullsPower()..............................................................................108
k. Commodity Channel Index - iCCI().........................................................................109
l. Commodity Channel Index on array - iCCIOnArray().........................................................109
m. Custom Indicator - iCustom().............................................................................110
n. DeMarker - iDeMarker()...................................................................................111
o. Envelopes - iEnvelopes().................................................................................111
p. Envelopes on buffer - iEnvOnArray()......................................................................112
q. Force Index - iForce()...................................................................................113
r. Fractals - iFractals()...................................................................................113
s. Gator Oscillator - iGator()..............................................................................114
t. Ichimoku Kinko Hyo - iIchimoku().........................................................................115
u. Market Facilitation Index (Bill Williams) - iBWMFI().....................................................116
v. Momentum - iMomentum()...................................................................................116
w. Momentum on array - iMomentumOnArray()...................................................................117
x. Money Flow Index - iMFI()................................................................................117
y. Moving Average - iMA()...................................................................................118
z. Moving Average on array - iMAOnArray()...................................................................119
aa. Moving Average of Oscillator - iOsMA()..................................................................119
bb. Moving Averages Convergence/Divergence - iMACD()........................................................120
cc. On Balance Volume - iOBV()..............................................................................121
dd. Parabolic SAR - iSAR()..................................................................................121
ee. Relative Strength Index - iRSI()........................................................................122
ff. Relative Strength Index on array - iRSIOnArray()........................................................123
gg. Relative Vigor Index - iRVI()...........................................................................123
hh. Standard Deviation - iStdDev()..........................................................................124
ii. Standard Deviation on array - iStdDevOnArray()..........................................................125
jj. Stochastic Oscillator - iStochastic()...................................................................125
kk. William’s Percent Range - iWPR()........................................................................126
26. Wskaźniki techniczne (opis)...............................................................................128
1. Acceleration/Deceleration................................................................................128
b. Accumulation/Distribution................................................................................128
c. Alligator................................................................................................129
d. Average Directional Movement Index.......................................................................129
e. Average True Range.......................................................................................129
f. Awesome Oscillator.......................................................................................129
g. Bears Power..............................................................................................130
h. Bollinger Bands..........................................................................................130
i. Bulls Power..............................................................................................130
j. Commodity Channel Index..................................................................................130
k. DeMarker.................................................................................................130
l. Envelopes................................................................................................131
m. Force Index..............................................................................................131
n. Fractals.................................................................................................131
o. Gator Oscillator.........................................................................................131
p. Ichimoku Kinko Hyo.......................................................................................131
q. Market Facilitation Index................................................................................132
r. Momentum.................................................................................................132
s. Money Flow Index.........................................................................................132
t. Moving Average...........................................................................................132
u. Exponential Moving Average...............................................................................133
v. Moving Average Convergence/Divergence....................................................................133
w. Moving Average of Oscillator.............................................................................133
x. On Balance Volume........................................................................................133
y. Parabolic SAR............................................................................................134
z. Relative Strength Index..................................................................................134
aa. Relative Vigor Index....................................................................................134
bb. Standard Deviation......................................................................................134
cc. Stochastic Oscillator...................................................................................135
dd. William’s Percent Range.................................................................................135
27. Dane historyczne..........................................................................................136
1. Dane historyczne.........................................................................................136
2. iBars()..................................................................................................136
c. iBarShift()..............................................................................................136
d. iClose().................................................................................................136
e. iHigh()..................................................................................................137
f. iHighest()...............................................................................................137
g. iLow()...................................................................................................137
h. iLowest()................................................................................................137
i. iOpen()..................................................................................................137
j. iTime()..................................................................................................138
k. iVolume()................................................................................................138
28. Funkcje transakcji........................................................................................139
1. OrdersHistoryTotal().....................................................................................139
b. OrderClose().............................................................................................139
c. OrderCloseBy()...........................................................................................140
d. OrderClosePrice()........................................................................................140
e. OrderCloseTime().........................................................................................141
f. OrderComment()...........................................................................................141
g. OrderCommission()........................................................................................141
h. OrderDelete()............................................................................................142
i. OrderExpiration()........................................................................................142
j. OrderLots()..............................................................................................143
k. OrderMagicNumber().......................................................................................143
l. OrderModify()............................................................................................143
m. OrderOpenPrice().........................................................................................144
n. OrderOpenTime()..........................................................................................144
o. OrderPrint().............................................................................................145
p. OrderProfit()............................................................................................145
q. OrderSelect()............................................................................................146
r. OrderSend()..............................................................................................146
s. OrderStopLoss()..........................................................................................147
t. OrdersTotal()............................................................................................148
u. OrderSwap()..............................................................................................148
v. OrderSymbol()............................................................................................148
w. OrderTakeProfit()........................................................................................149
x. OrderTicket()............................................................................................149
y. OrderType()..............................................................................................150
29. Funkcje okien.............................................................................................151
1. Funkcje okien............................................................................................151
2. HideTestIndicators().....................................................................................151
c. Period().................................................................................................152
d. RefreshRates()...........................................................................................152
e. Symbol().................................................................................................152
f. WindowBarsPerChart().....................................................................................152
g. WindowExpertName().......................................................................................152
h. WindowFind().............................................................................................152
i. WindowFirstVisibleBar()..................................................................................153
j. WindowHandle()...........................................................................................153
k. WindowIsVisible()........................................................................................153
l. WindowOnDropped()........................................................................................153
m. WindowPriceMax().........................................................................................153
n. WindowPriceMin().........................................................................................154
o. WindowPriceOnDropped()...................................................................................154
p. WindowRedraw()...........................................................................................154
q. WindowScreenShot().......................................................................................154
r. WindowTimeOnDropped()....................................................................................154
s. WindowsTotal()...........................................................................................155
t. WindowXOnDropped().......................................................................................155
u. WindowYOnDropped().......................................................................................155
30. Wskaźniki.................................................................................................156
1. Szablon..................................................................................................156
2. Konstrukcja..............................................................................................156
3. AMA......................................................................................................159
d. ChV......................................................................................................160
e. FI 161
f. Fish.....................................................................................................162
g. MFI......................................................................................................163
h. Ray......................................................................................................164
i. SMom.....................................................................................................165
j. Stoch....................................................................................................166
k. StochRSI.................................................................................................167
l. Vol......................................................................................................168
31. Skrypty...................................................................................................170
1. Szablon..................................................................................................170
b. Konstrukcja..............................................................................................170
32. Biblioteki................................................................................................172
1. Szablon..................................................................................................172
2. Konstrukcja..............................................................................................172
c. Funkcja OptimalF().......................................................................................173
d. Funkcja KellyCriterion().................................................................................173
e. Funkcja PosExp().........................................................................................174
f. Funkcja MathExp()........................................................................................174
g. Funkcja MaxLots()........................................................................................175
h. Funkcja MaxMoney().......................................................................................175
i. Funkcja MaxML()..........................................................................................176
j. Funkcja MinP()...........................................................................................176
33. Automatyczne systemy transakcyjne.........................................................................177
1. Szablon..................................................................................................177
2. Konstrukcja..............................................................................................177
3. Przykład.................................................................................................177
34. Spis treści...............................................................................................178

You might also like