Pips, punkt, spread, kursy bid i ask



Podobne dokumenty
Pips, punkt, spread, kursy bid i ask

Wielokrotne zamknięcie przez. Zlecenie po cenie rynkowej. Zlecenie oczekujące z limitem

Pips, punkt, spread, kursy bid i ask

Komputerowe systemy na rynkach finansowych (KSnRF)

Komputerowe systemy na rynkach finansowych. wykład 3 funkcje MQL4

Instrukcja użytkownika mforex WEB

Cena Bid, Ask i spread

Instrukcja użytkownika Platformy BRE WebTrader

Instrukcja użytkownika

SUPERMAKLER FX INSTRUKCJA OBSŁUGI TERMINALA TRANSAKCYJNEGO

Platforma transakcyjna BOSSA FX. Platforma Metatrader 4 najpopularniejsza na świecie platforma transakcyjna

Zarządzanie Kapitałem

Pierwsze kroki w mforex Trader Instrukcja

Poradnik Inwestora część 3. Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktach indeksowych

0,20% nominału transakcji nie mniej niż 5 USD

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

0,20% nominału transakcji nie mniej niż 5 USD

Przykładowe scenariusze kosztów dla transakcji w systemie transakcyjnym TMS Trader MT5

mforex WEB Instrukcja obsługi

Instrukcja użytkownika Smart Orders

Jaki jest limit odległości ceny aktywacji od ceny rynkowej dla zleceń oczekujących? Czy mogę zająć pozycje przeciwstawne w jednym instrumencie?

1. Rynek Forex. a) Opis rynku

BANK ZACHODNI WBK S.A. SPÓŁKA AKCYJNA CZŁONEK ZARZĄDU BANKU

Wprowadzenie do rynków walutowych

KROK 4 OTWIERANIE POZYCJI

Przykładowe scenariusze kosztów dla transakcji w systemie transakcyjnym TMS Connect Professional MT5

Analiza danych w biznesie

I. Tabela Opłat i Prowizji TMS Trader MT5. Tabela Opłat i Prowizji TMS Trader MT4

Spis treści. Wstęp. Pierwsze logowanie. Wygląd platformy po zalogowaniu. Składnianie zleceń. Widok nowego zlecenia na wykresie oraz w zakładce handel

Inwestor musi wybrać następujące parametry: instrument bazowy, rodzaj opcji (kupna lub sprzedaży, kurs wykonania i termin wygaśnięcia.

Prowizja za wykonanie transakcji na CFD na kryptowalutę 0.08% nominału transakcji brak prowizji 0.08% nominału transakcji brak prowizji

Krok 4: Zamykamy pozycję

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

Informacje o Rynkach FX

0,20% nominału transakcji nie mniej niż 5 USD

DIF Freedom WEB (CFD) Komputer, Tablet oraz Telefon Szybki Start

Pierwsze kroki na rynku Forex.

Zajmujemy pozycję na grupie instrumentów walutowych (Forex)

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

Przed zapoznaniem się z poniższą instrukcję, zalecamy zapoznanie się z instrukcją Ustawienie platformy.

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

OPCJE WARSZTATY INWESTYCYJNE TMS BROKERS

Instrukcja użytkownika Advanced Orders

Poradnik Inwestora część 4. Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktach indeksowych

Spis treści: Uzyskiwanie dostępu do konta GWAZY 3. Sekcje platformy 4. Informacje o platformie 5. Lista obserwowanych 5.

StarterPack do konkursu Stratotrade

Advanced Orders Zlecenia zaawansowane dla dodatku Smart Orders

Tabela Opłat i Prowizji TMS Connect MT4. Przykładowe scenariusze kosztów dla transakcji w systemie transakcyjnym TMS Connect MT4

Podręcznik do platformy MetaTrader dla STP NDD

Walutowe kontrakty terminowe notowane na GPW. Warszawa, 28 maja 2014 r.

Do końca 2003 roku Giełda wprowadziła promocyjne opłaty transakcyjne obniżone o 50% od ustalonych regulaminem.

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

System transakcyjny oparty na średnich ruchomych. ś h = gdzie, C cena danego okresu, n liczba okresów uwzględnianych przy kalkulacji.

Forward kontrakt terminowy o charakterze rzeczywistym (z dostawą instrumentu bazowego).

Działając w najlepiej pojętym interesie Klientów HFT Brokers w sytuacji trudnych do przewidzenia, a mogących mieć

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

ONE WORLD BROKER WEB (FOREX) Komputer, Tablet oraz Telefon Szybki Start

System transakcyjny NS Forex Instrukcja obsługi

Podstawy przedsiębiorczości kolokwium zakres materiału

Należy zauważyć, iż z tego typu inwestycjami wiąże się również obowiązek podatkowy.

KONTRAKTY WALUTOWE. Warszawa, kwiecień

System finansowy gospodarki. Zajęcia nr 3 Rynek walutowy

Szczegóły Szybkiego Polecenia Transakcji

SUPERMAKLER FX MODUŁ RAPORTÓW

Zarządzanie Kapitałem

HANDEL OPCJAMI W PLATFORMIE DEALBOOK 360

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

Rynek Finansowy Platforma Transakcyjna XTB-Trader

Ćwiczenia ZPI. Katarzyna Niewińska, ćwiczenia do wykładu Zarządzanie portfelem inwestycyjnym 1

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

Warszawska Giełda Towarowa S.A.

Non-FIFO, hedging oraz zlecenia powiązane (attached orders)

Dużo Mocnej Adrenaliny (DMA) na polskim i globalnym rynku akcji

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

Rynek akcji a rynek Forex w Polsce

Kontrakty terminowe w teorii i praktyce. Marcin Kwaśniewski Dział Rynku Terminowego

Interwały.

Forward Rate Agreement

Podręcznik do platformy xtab

Platforma Transakcyjna X-Trade obsługa, analiza, transakcje

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Powtórzenie. Ćwiczenia ZPI. Katarzyna Niewińska, ćwiczenia do wykładu Zarządzanie portfelem inwestycyjnym 1

PRZEWODNIK. Wymiana walut w kantorze internetowym topfx

Kontrakty terminowe bez tajemnic. Marcin Kwaśniewski Dział Rynku Terminowego

Krok 5: ZAMYKANIE ZLECENIA

WebTrader w Noble Markets

Platforma BPH Inwestor

FOREX. Wprowadzenie Programowanie w MQL4

1 Podstawy c++ w pigułce.

Podstawy inwestowania na rynku Forex, rynku towarowym oraz kontraktów CFD

Instrukcja użytkownika Platforma Walutowa

Spis treści. Wstęp 3. Logowanie 4. Ekran główny 5. Dodawanie instrumentów i wykresów 6. Składanie zleceń w panelu One Click 7. Zlecenia oczekujące 8

Kontrakty terminowe. This presentation or any of its parts cannot be used without prior written permission of Dom Inwestycyjny BRE Banku S..A.

Szczegółowe informacje o usługach maklerskich. Corporate actions

Wytyczne dotyczące Depozytu Zabezpieczającego

Kontrakty terminowe na akcje

Transkrypt:

Forex Nazwa FOREX pochodzi od angielskiego foreign exchange i oznacza najogólniej rzecz biorąc miejsce hurtowej wymiany walut poza zorganizowanym systemem obrotu, takim jak giełdy papierów wartościowych. Dzienny obrót na foreksie cały czas rośnie i przekracza już 3-4 bln USD do czego przyczyniło się otwarcie się rynku na inwestorów detalicznych dzięki rosnącej liczbie platform do handlu elektronicznego. Forex jest rynkiem OTC (Over The Counter) - to zdecentralizowany rynek pozagiełdowy. Wymiana odbywa się bezpośrednio za pomocą systemów elektronicznych i teleinformatycznych. Nie ma, zatem tylko jednego miejsca na świecie, gdzie handluje się walutami. Najogólniej rzecz biorąc aktywność rynku jest zależna od stref czasowych, gdyż handel odbywa się przez całą dobę, oprócz weekendów. Na terenie Polski większość platform umożliwia handel od niedzieli o godz. 23:00 do piątku o godz. 22:00. Transakcje na rynku OTC ze względu na moment rozliczenia dzielą się na natychmiastowe (spot), oraz terminowe. Do pierwszej grupy należą wszystkie transakcje wymiany dokonywane przez dealerów po bieżących kursach. Transakcje terminowe polegają na uzgadnianiu transakcji, które mają zostać zawarte w przyszłości w określonym terminie i po ustalonej cenie. Do najbardziej popularnych

transakcji terminowych należą transakcje swap, futures, forward i opcje. Są to instrumenty dające prawo, możliwość lub powodujące zobowiązanie do zawarcia określonych transakcji w przyszłości. Są to także instrumenty pochodne, ponieważ ich cena (wartość) są uzależnione od kształtowania się ceny instrumentu, na który opiewają. Najbardziej płynną parą walutową na świecie jest EUR/USD, czyli relacja euro do amerykańskiego dolara. Przykładowe zawarcie transakcji polega na kupnie euro za dolary (pozycja długa zarabiamy na wzrostach euro do dolara), lub sprzedaży euro za dolary (pozycja krótka zarabiamy na spadkach euro do dolara). Pozostałe najbardziej płynne pary walutowe to GBP/USD, USD/JPY, EUR/JPY. Wyróżniamy tzw. walutę bazową i walutę kwotowaną w przypadku EUR/USD, to euro jest walutą bazową (pierwsza waluta z danej pary), a dolar kwotowaną (druga waluta z danej pary). Pips, punkt, spread, kursy bid i ask Popularny wśród traderów punkt to nic innego jak przyjęty na rynku standard minimalnego kroku ceny. Jest to odpowiednik tików z rynku terminowego na giełdzie. W zależności od specyfiki pary walutowej, kursy podaje się z dokładnością od dwóch do pięciu miejsc po przecinku". Punkt w większości przypadków równy jest pipsowi,

dlatego pojęcia te są często używane zamiennie. Wyjątek stanowią Majorsy i Second Majorsy, dla których przyjmuje się wartość pipsa równą 10 punktom. Oznacza to, że jeżeli kurs bid EURUSD wzrośnie z 1.39241 na 1.39259 to mówimy o zmianie równej 18 punktom lub 1.8 pisa. Każde kwotowanie zawiera dwie ceny: kupna (Bid) i sprzedaży (Ask). Różnica między nimi stanowi spread transakcyjny, czyli jest kosztem otwarcia i zamknięcia pozycji. Kupno waluty bazowej następuje zawsze po kursie wyższym (Ask), zaś sprzedaż po kursie niższym (Bid). Zamykanie pozycji to sytuacja odwrotna tzn. odsprzedaż waluty po kursie Bid i zamknięcie długiej pozycji lub zamknięcie krótkiej pozycji przez odkup danej waluty po kursie Ask. Kluczowym pojęciem w handlu walutami jest także spread (podawany w pipsach), który jest po prostu różnicą pomiędzy ceną zakupu i sprzedaży waluty w danym momencie. Jest on jednocześnie kosztem zawarcia naszej transakcji. Warto wyróżnić też pojęcie spreadu docelowego, który utrzymywany jest przez brokera w momencie umiarkowanej aktywności rynku, a okresowo wyższego spreadu występującego w momencie publikacji istotnych danych i silnej zmienności rynku. Dla przykładu, jeżeli spread docelowy na złotym oscyluje wokół 30 pipsów (0,0030 PLN), a kurs EUR/PLN kwotowany jest na poziomie 4,4570/4,4600, to inwestor dokonujący transakcji kupna euro za złotówki nabywa je po cenie 4,4600 i jeżeli będzie chciał je teraz sprzedać bez straty, to rynek musi przesunąć się o co najmniej

30 pipsów w górę (tj. 0,0673proc.) do 4,4600/4,4630. Słowem, im na danym rynku jest mniejszy spread tym lepiej. Dla najbardziej popularnej pary EUR/USD spread docelowy wynosi zaledwie 1.8 pipsa (jak widać na powyższym przykładzie). Przed zawarciem transakcji na danej parze walut warto wpierw poznać jakie są obowiązujące spready docelowe, a także depozyty zabezpieczające. Dobrym pomysłem jest też przeliczenie wartości 1 pipsa w kontekście wartości transakcji. Depozyt, loty i dźwignia finansowa W języku inwestora operującego na rynku walutowym ważnym pojęciem jest tzw. lot. Oznacza on po prostu transakcję o wartości 100.000 jednostek waluty bazowej. Dla przykładu chcąc zawrzeć transakcję kupna 100 tys. euro za dolary, mówimy o kupnie 1 lota EUR/USD. Dla wygody inwestorów, ale też w ramach ograniczenia ryzyka, jest możliwość przeprowadzenia transakcji w oparciu o mini loty, które odpowiadają 10.000 jednostek waluty bazowej (1/10 standardowego lota). I tak dochodzimy do pojęcia dźwigni finansowej. Czy chcemy, czy nie po prostu z niej korzystamy. Wynika to z faktu, iż iż aby zawrzeć transakcję wystarczy wnieść depozyt zabezpieczający, który w niektórych przypadkach (EUR/USD) wynosi zaledwie 1 proc. wartości transakcji. W tym przypadku możliwa do uzyskania dźwignia wynosi 100:1. Depozyt zabezpieczający = Wartość zlecenia * wymagany depozyt(%)* kurs pary walutowej

Realnie stałoby się tak jednak dopiero w sytuacji, kiedy wykorzystalibyśmy wszystkie posiadane środki na depozyt. Dla przykładu: mając 10.000 USD lub równowartość tej kwoty w PLN, dokonalibyśmy transakcji na 1 mln USD. W praktyce, inwestor wykorzystujący maksymalną dźwignię jest z góry na przegranej pozycji. Nawet, jeżeli przyjmiemy, iż dzienna zmienność na walutach wynosi przeciętnie 1-2 proc., to już spadek o 0,5 proc. uszczupliłby nasz portfel aż o 50 proc. Gorzej, jeżeli rynek jest bardziej zmienny. Dobra rada korzystajmy z dźwigni z rozsądkiem. Najlepiej, jeżeli stosunek wartości transakcji do posiadanego kapitału nie przekracza 10:1, a w przypadku wysokiej zmienności na rynku 5:1. Nie zmuszajmy brokera do tego, aby był zmuszony do automatycznego zamknięcia naszych pozycji w przypadku drastycznego uszczuplenia depozytu. Zwracajmy, zatem uwagę na ryzyko związane z każdą transakcją, a także charakterystykę danego rynku. W przypadku mniej płynnych par walut, wymagany depozyt zabezpieczający będzie wyższy, podobnie jak też spread, który jest przecież kosztem naszej transakcji (liczonym od jej całkowitej wartości).

Przykład Saldo rachunku inwestora: 4800 PLN Zlecenie: sprzedaż 1.4 lota USDPLN Kurs otwarcia bid USDPLN: 3.4050 Kurs zamknięcia ask USDPLN: 3.3810 Wartość 1 punktu dla otwartej pozycji: 14 PLN (liczona na podstawie zależności wartość zlecenia* minimalny krok notowania, czyli 140.000 *0,0001) Inwestor posiadający na rachunku 4800 PLN zawarł transakcję sprzedaży 1.4 lota USD/PLN po kursie Bid 3.4050 deponując pod nią 4767 PLN ( 140 000*1%*3.4050). Posiadanie takiej lub wyższej kwoty w momencie zawierania transakcji jest konieczne, aby system przyjął dyspozycję. Wartość najmniejszego kroku notowań jakim jest pips wyniosła 14 PLN (140 000 *0.0001). Zamykając zlecenie po kursie 3.3810 został zrealizowany zysk w wysokości 3360 PLN {((3.4050 3.3810):0,0001)* 14PLN}. Wartość nominalna zlecenia to 140 000 USD czyli 3.4050*140 000 = 476 700 PLN. Inwestor osiągnął stopę zwrotu: / Saldo pierwotne r-ku) 3 360 PLN / 4 800 PLN = 70% (Zysk na transakcji

Było to możliwe przy relatywnie małej zmianie kursu o 240 punktów czyli 2,4 grosza. Inwestor posiadając 4800 PLN zawarł transakcję o wartości 476 700 PLN (stosunek wartości posiadanego kapitału do wartości otwartej pozycji wyniosła blisko 1:100!). Wykorzystywanie tak dużej dźwigni wiąże się z dużym ryzykiem poniesienia strat, ponieważ zmiana kursu o 1% spowoduje zmianę depozytu na rachunku o 100%. Przy braku dźwigni należałoby zaangażować środki równe wolumenowi transakcji, czyli równowartość 140 000 USD: 3.4050*140 000 = 476 700 PLN, zatem stopa zwrotu wyniosłaby tylko: 3 360 PLN / 476 700 PLN = 0.7% Depozyt minimalny i ograniczanie strat Depozyt minimalny nieodłącznie jest związany z terminami depozyt zabezpieczający i dźwignia finansowa. Na platformie transakcyjnej z reguły wynosi on 30 proc. depozytu początkowego. Oznacza to, iż wartość rachunku nie może spaść do poziomu 30% depozytu początkowego (depozytu zabezpieczającego w momencie zawierania transakcji), ponieważ spowoduje to automatyczne zamknięcie najbardziej stratnej pozycji. Sytuację tą warto zilustrować przykładem, który jest rozwinięciem poprzedniego punktu.

Saldo na rachunku inwestora wynosi 4 800 PLN z czego pod depozyt transakcji sprzedaży 1 lota USD/PLN i 0.4 lota USD/PLN zostało w sumie zablokowane 4 767 PLN. Jest to depozyt początkowy. Oznacza to iż najbardziej stratna transakcja zostanie zamknięta gdy wartość rachunku spadnie do wysokości: 30% * 4 767 PLN = 1 430 PLN Łatwo zauważyć, że wiązałoby się to z łączną stratą z otwartych pozycji: Saldo depozyt minimalny = 4 800 1 430 = 3 370 PLN Posiadając na rachunku łączną pozycję 1.4 lota USD/PLN, zmiana kursu o 1 punkt powoduje zmianę wartości rachunku o 140 000 * 0.0001 = 14 PLN. Strata 3 370 PLN powodująca zamknięcie najbardziej stratnej pozycji pojawi się po niekorzystnej zmianie kursu o: 3 370 PLN/14PLN = 241 punktów, czyli 2,42 grosza np. z 3.0200 na 3.0441. Waluta rachunku, a zawieranie transakcji Wiele osób zastanawia się jak mając złotówki można zawierać transakcje na rynku eurodolara (EUR/USD), albo kupować euro za funty (EUR/GBP). To proste. Broker (platforma transakcyjna) dokonuje automatycznego przewalutowania złotych na walutę potrzebną w danym momencie do zawarcia transakcji. Jest to możliwe dzięki temu, iż dokonywane przez nas operacje nie polegają na fizycznej wymianie

walut, lecz na chęci uzyskania pozytywnej różnicy między ceną kupna/sprzedaży i późniejszą ceną zamknięcia transakcji. Analogicznie po zamknięciu transakcji, w której waluta kwotowaną nie jest złoty, system dokona automatycznego przeliczenia. W praktyce nie jest to tak trudne, zobaczmy to na przykładzie: Inwestor spodziewa się umocnienia euro wobec dolara amerykańskiego wobec czego o godzinie 09:23 kupuje 0.5 lota EUR/USD co jest równoznaczne z kupnem 50 000 EUR. Będzie on posiadał, zatem długą pozycję w euro i krótką w dolarze. Kursy z tego momentu przedstawiają się następująco: Bid Ask EUR/USD 1.44553 1.44571 EUR/PLN 4.3310 4.3350 Zysk w pipsach wyniósł 1.45784 1.44571 = 121,3 pipsa W transakcji sprzedaży EUR/USD euro jest sprzedawane, a dolar kupowany. Wartość punktach jest liczona zatem po kursie ask (zakupu dolarów) USD/PLN. Analogicznie, przy kupnie EUR/USD, kiedy to euro jest kupowane, a dolar sprzedawany, wartość punktu będzie przeliczana z USD na PLN po kursie bid (sprzedaży dolarów) USD/PLN. Łatwo więc zauważyć, iż 1 punkt na pozycji sprzedanej EUR/USD będzie wart w złotówkach minimalnie więcej niż jeden punkt na pozycji kupionej EUR/USD

i różnica ta będzie się zmieniać w zależności od spreadu na parze USD/PLN. Wartość punktu w PLN: 50 000*0.0001*3.1500=15.75 PLN Zysk z transakcji wyniósł: 121*15.75 PLN= 1 905.75 PLN Spot, forward i punkty swapowe Dokonanie transakcji zakupu, bądź sprzedaży waluty na rynku międzybankowym bez podania terminu na który ma być ona zawarta, jest przyjmowane jako zawarcie transakcji spot. Oznacza to, iż musi ona zostać rozliczona w terminie dwóch dni roboczych. Tym samym mowa tutaj o krótkoterminowych, spekulacyjnych transakcjach, ewentualnie o dostawach waluty zgłaszanych przez podmioty gospodarcze. Każda transakcja, która jest zawierana na tydzień, miesiąc, czy też rok, jest uznawana jako forward. Cena transakcji odzwierciedla premię, lub dyskonto w stosunku do bieżącej ceny na rynku (spot). Zależy to od wartości tzw. punktów swapowych, które mogą być dodatnie, bądź ujemne. To z kolei jest wynikiem różnicy w rynkowym oprocentowaniu dwóch walut. Generalnie, jeżeli poziom tygodniowych rynkowych stóp procentowych w przypadku waluty kwotowanej jest wyższy, niż bazowej, to punkty są dodatnie. Dla przykładu, obecnie stopy procentowe w Polsce są wyższe, niż w strefie euro stąd też dla kursu EUR/PLN punkty swapowe będą dodatnie. W przeciwnym wypadku byłyby ujemne.

Warto jednak pamiętać o tym, że w przypadkach małej różnicy w oprocentowaniu obu walut punkty swap mogą być ujemne zarówno na długiej jak i krótkiej pozycji ze względu na przyjęte na rynku podawanie oprocentowania w spreadzie np.: WIBID 4.57% / WIBOR 4.77% oraz doliczaną przez brokera marżę. Klienci internetowych platform nie muszą jednak zawierać transakcji forward, jeżeli myślą o dłuższym przetrzymywaniu pozycji. Z założenia nie są oni zainteresowani fizyczną dostawą waluty, a celem jest tylko osiąganie zysków z tytułu różnic kursowych. Stąd też otwarte przez nich pozycje nigdy nie osiągają swoich dat rozliczenia pozycje spot są automatycznie przedłużane na kolejny dzień roboczy. Dodatkowo są one korygowane o wartość punktów swapowych na dany dzień. Wszystkie instrumenty oferowane na platformach transakcyjnych (np. BOSSAFX) są instrumentami krótkoterminowymi co oznacza, że pozycja może pozostać otwarta maksymalnie przez okres 12 miesięcy po czym zostanie automatycznie zamknięta. Utrzymywane pozycje są swapowane (są naliczane lub odejmowane odsetki) między godz. 23:59 a 24:00.Warto pamiętać o weekendach (wtedy inwestor jest obciążany potrójnie). Tabela bieżących punktów swapowych. Przykład Inwestor posiada długą pozycję 0.5 lota EUR/USD (50.000 EUR/USD) i oczekując dalszych wzrostów kursu EUR/USD postanawia przetrzymać ją do następnego dnia. O godzinie 24:00 do pozycji zostają naliczone punkty swap. Punkty

swap w danym tygodniu wynoszą: Pozycja długa Pozycja krótka EUR/USD -0.359-0.796 Wartości punktów swap są podawane w pipsach. Oznacza to, iż od pozycji długiej na EUR/USD zostanie odliczona kwota równa wartości 0.359 pipsa na otwartej pozycji. Aby oszacować koszt przetrzymania pozycji o jeden dzień, należy obliczyć wartość 1 pipsa: Wolumen transakcji * dokładność kwotowania (pips) * kurs USD/PLN (w tym przypadku Bid) z godziny 24:00 50 000 * 0.0001 * 3.1500 = 15.75 PLN W omawianym przypadku rachunek zostanie obciążony kwotą równą: 0.359 * 15.75 PLN = 5.65 PLN W przypadku dalszego utrzymywania otwartej pozycji odpowiednia kwota będzie odejmowana od rachunku codziennie o północy, natomiast w nocy z piątku na sobotę w wielkości potrójnej (16.95 PLN) za przetrzymanie pozycji aż do poniedziałku.

Zlecenie po cenie rynkowej Oznacza, że godzimy się na zawarcie transakcji po cenie, jaka jest w danym momencie na rynku. To najprostsze z dostępnych zleceń. W większości przypadków transakcje są otwierane po bieżącym kursie przez wydanie dyspozycji kup / sprzedaj z poziomu platformy. W zależności od instrumentu są to zlecenia z natychmiastową realizacją, lub zlecenia przez zapytanie, gdzie kwotowanie jest każdorazowo dostarczane przez dealera po wciśnięciu przycisku zapytaj. Warto jednak pamiętać, że w pewnych sytuacjach rynkowych (np. publikacje ważnych danych makroekonomicznych) możemy zawrzeć transakcje po innej cenie, niż w momencie składania zlecenia. Jest to wynikiem gwałtownej zmiany cen. Zlecenie oczekujące z limitem Jest to zlecenie oczekujące stosowane w sytuacjach, kiedy myślimy o zawarciu transakcji, ale obecna cena nam nie odpowiada, lub czekamy na odpowiednią sytuację rynkową. Może być ono wprowadzone do systemu w godzinach handlu instrumentu na jaki opiewa. Powinno zawierać przynajmniej rodzaj instrumentu, wolumen transakcji, oraz cenę aktywacji (limit ceny). W przypadku zlecenia zakupu wskazany poziom cenowy musi być niższy od obecnego na rynku, a w przypadku zlecenia sprzedaży wyższy. Zlecenie może być złożone na dowolny okres (kilka godzin, kilka dni), lub do odwołania. Zostanie ono zrealizowane automatycznie w momencie pojawienia się żądanej ceny na rynku.

Zlecenia oczekujące z limitem a) Buy limit zlecenie kupna, w którym cena musi być niższa od bieżącej ceny Ask b) Sell limit zlecenie sprzedaży, w którym cena sprzedaży musi być wyższa od bieżącej ceny Bid

Cena wykonania zlecenia oczekującego kupna jest ceną Ask, zaś zlecenia oczekującego sprzedaży, ceną Bid. Ponieważ wykresy na platformie BOSSAFX są rysowane według cen Bid, wszystkie zlecenia kupna będą realizowane, zanim wykres dotrze do wyznaczonego poziomu. Przykładowo, dla zlecenia buy stop EUR/USD po 1.42222 do jego realizacji dojdzie, gdy przy 1.8 pipsa spreadu wykres dotrze do ceny 1.42240. Zlecenia sprzedaży są realizowane przy poziomie widocznym na wykresie. Zlecenia take profit i stop-loss To w zasadzie nieodłączne elementy każdego zlecenia skutkującego zawarciem transakcji na rynku finansowym, nie tylko na foreksie. Zlecenie take profit określa poziom, przy którym chcemy zrealizować nasz zysk (poziom bid). Z kolei zlecenie stop-loss pokazuje, gdzie chcemy uciec z pozycji, kiedy sprawy na rynku zaczynają przybierać niekorzystny dla nas obrót. Jeżeli mamy otwartą pozycję długą (kupiliśmy walutę), to poziom aktywacji zlecenia stop loss będzie dotyczył poziomu bid (sprzedaży waluty). I tak mając otwartą pozycję długą na EURUSD po poziomie 1,38207, ustawiamy zlecenie stop loss na poziomie 1,37607. Jeżeli rynek spadnie do 1,37607 to zlecenie stop-loss zostanie zrealizowane po 1,37607. Istnieje jednak ryzyko, iż faktyczna realizacja zlecenia nastąpi nieco niżej ze względu na tzw. poślizg wynikający z warunków

rynkowych (np. dużej zmienności po publikacji danych makroekonomicznych, czy za sprawą luki otwarcia po weekendzie podczas którego napłynęły ważne informacje np. szczyt państw grupy G7). Zazwyczaj na platformach realizacja zleceń oczekujących typu stop na lukach cenowych odbywa się po pierwszej cenie rynkowej, przez co realizacja zlecenia może nastąpić po mniej korzystnej cenie. Przykładowo (rys. poniżej), zlecenie sell stop po 1.39910 w wyniku luki cenowej może zostać ostatecznie otwarte po cenie 1.39850.

Wracając do charakterystyki zleceń stop-loss, mając pozycję krótką (sprzedaliśmy walutę, czyli gramy na jej spadek), zlecenie stop-loss będzie dotyczyło poziomu ask (kupna waluty). Dla przykładu, mając otwartą pozycję krótką na EUR/USD po 1,38200 ustawiamy stop-loss na poziomie 1,38720. Oznacza to, iż pozycja zostanie zamknięta w sytuacji, kiedy na rynku pojawi się kurs ask na poziomie 1,38720. Biorąc pod uwagę docelowy spread na EUR/USD w wysokości 1,8 pipsa, będzie to odpowiadać kwotowaniu 1,38702/1,38720. Zlecenia typu buy stop i sell stop Zlecenia oczekujące typu stop są wykorzystywane w momencie, kiedy chcemy zawrzeć transakcję po cenie wyższej, niż ma to miejsce obecnie, tj. np. podczas wybicia z technicznej formacji zlecenie buy stop. Kiedy oczekujemy, iż rynek wybije się dołem, rozważamy zlecenie sell stop. a) Buy stop cena kupna musi być wyższa od bieżącej ceny Ask scenariusz 4 (odpowiada mu giełdowe zlecenie kupna z LimAkt). Zlecenie zostanie zrealizowane, jeżeli na rynku pojawi się wskazany poziom aktywacji po stronie ask

b) Sell stop cena sprzedaży jest niższa od bieżącej ceny Bid scenariusz 3 (odpowiada mu giełdowe zlecenie sprzedaży z LimAkt). Zlecenie zostanie zrealizowane, jeżeli na rynku pojawi się wskazany poziom aktywacji po stronie bid. Zlecenie trailing stop, czyli tzw. stop kroczący Jest to bardzo przydatne zlecenie w bieżącym zarządzaniu ryzykiem portfela. Poziom stop-loss nie jest wtedy sztywny, a zmienia się w zależności od ruchów instrumentu bazowego o zadaną przez nas wartość. Dla przykładu, jeżeli mamy pozycję długą, a stop kroczący wynosi 15 pipsów, to w przypadku wzrostu notowań o 15 pipsów poziom stop-loss zostanie przesunięty o daną wartość w górę. Jeżeli kurs rynkowy zacznie spadać, to SL nie ulegnie zmianie. To pozwala inwestorowi szybciej ucinać straty, lub zachowywać potencjalne zyski (bo TS może działać też jako pewnego rodzaju wędrujące zlecenie take profit przy strategii

średnioterminowej). Złożenie zlecenia trailing stop jest możliwe niezależnie po której stronie rynku w danym momencie jesteśmy trzeba tylko pamiętać o ogólnych regułach dla zleceń typu stop-loss, tj. kiedy liczone jest od strony bid, a kiedy od ask. Zlecenie trailing stop działa jednak tylko w sytuacji, kiedy jesteśmy zalogowani do systemu. W każdym innym przypadku system stosuje zwykłe zlecenia stop-loss. Tym samym, jeżeli ustawiliśmy zlecenie trailing stop, ale po pewnym czasie wylogowaliśmy się z systemu transakcyjnego, to automatycznie jest ono zamieniane w zwykłe zlecenie stop-loss po ostatnim poziomie trailing-stop. Zamykanie pozycji Otwieranie pozycji na rynku forex jest analogiczne do składania zleceń giełdowych. Zamykanie pozycji podobnie jak na rynku akcji polega na zajęciu pozycji przeciwstawnej, jednak z technicznego punktu widzenia należy dosłownie wybrać polecenie Zamknij. Otwarcie zlecenia przeciwnego skutkowało będzie tym, że na rachunku będziemy posiadali dwie przeciwstawne pozycje. Doskonałe skorelowanie zredukuje ryzyko do zera, jednak punkty swap naliczane będą od obu pozycji. Dlatego aby zrealizować wynik z otwartej pozycji należy wybrać opcję Zamknij zlecenie.

Zamykanie zleceń przeciwstawnych - tryb "Zamknij przez" Zlecenie Zamknij przez umożliwia zamknięcie pozycji przeciwstawnych. Jeżeli na jednym instrumencie mamy otwarte transakcje kupna i sprzedaży, to zamykając jedną z transakcji możemy skorzystać z opcji zamknij przez. Po dokonaniu operacji na rachunku pozostanie wartość netto z dwóch transakcji. Jeżeli transakcja kupna i sprzedaży są sobie równe co do wolumenu, to wartość netto będzie wynosiła zero, zaś wynik z transakcji będzie równy sumie wyników z dwóch zamkniętych transakcji. Jeżeli wolumen jednej z transakcji jest większy, to wynikiem operacji zamknij przez będzie wynik z transakcji o mniejszym wolumenie i proporcjonalna część z wyniku drugiej transakcji. Przykład: Załóżmy, że w danym instrumencie posiadamy dwie otwarte pozycje, długą i krótką, obie o nominale 2 lotów. Ponieważ kupiliśmy poniżej obecnego kursu, sprzedaliśmy zaś po cenie większa niż obecna, to wyniki z obu pozycji są na plusie. Dopóki nie zamkniemy pozycji, łączny wynik na nich będzie niezależny od zmian kursu instrumentu. Jeżeli chcemy zamknąć obie pozycje jednocześnie, powinniśmy wybrać opcję Zamknij przez. Wtedy jedna pozycja zostanie zamknięta przez drugą, a wynik z nich dopisany do salda rachunku.

Zamykanie zleceń przeciwstawnych - tryb "Wielokrotne zamknięcie przez" Wielokrotne zamknięcie przez to opcja zamknięcia transakcji przeciwstawnych podobna do trybu Zamknij przez. Dotyczy ona jednak sytuacji, w której posiadamy w danym instrumencie pozycję długą i krótką porozbijane na wiele transakcji. Załóżmy, że po wzroście kursu danego instrumentu o 50 pispów dokupowaliśmy po 1 locie, zabezpieczając 100 pipsowy zysk z każdego pojedynczego zlecenia zawarciem transakcji sprzedaży o wolumenie 0.6 lota. Po pewnym czasie okazało się, że posiadamy pozycję długą równą 10 lotom i pozycję krótką równą 6 lotom, obie rozbite na 20 pojedynczych zleceń. Po wybraniu opcji wielokrotne zamknięcie przez pozycje zostaną zredukowane do wartości netto, co w naszym przypadku oznaczać będzie, że będziemy posiadali 4 loty pozycji długiej. Przymusowe zamknięcie pozycji - "Stop Out" Wszyscy wiemy, że strat w przeciwieństwie do zysków nie można pielęgnować w nieskończoność. Kiedyś przychodzi czas na powiedzenie sobie dość. Niestety z reguły wcześniej robi to za nas broker dokonując automatycznego zamknięcia transakcji. I tak system transakcyjny w czasie trwania transakcji sprawdza, czy aktualna Wartość rachunku wystarczy na pokrycie minimalnego depozytu, który

wynosi 30% Depozytu. W momencie jego spadku do tego poziomu lub poniżej, na rachunku jest zamykana najbardziej stratna pozycja. Jeżeli instrument, który generuje największą stratę, nie jest w tym momencie handlowany (nie dotyczy to walut), zamknięciu podlega następna w kolejności najbardziej stratna pozycja. Mechanizm stop out (s.o) umieszcza w komentarzu zamkniętej transakcji adnotację s.o. wraz z informacją o stanie środków z momentu zamknięcia (rysunek poniżej). Fragment z historii rachunku pokazujący transakcję zamkniętą przez s.o. Kolejne kolumny: godzina zamknięcia automatycznego, cena, punkty swap, wynik, stan rachunku- 29.7% obliczone jako Wartość rachunku 18 113.8/ Depozyt 60 972.3. Zlecenie przekazane do zamknięcia przez mechanizm stop out nie może już być modyfikowane, ani zamknięte przez klienta. Dealer po sprawdzeniu poprawności cen dokonuje zamknięcia pozycji.

Automatyczne zamknięcie pozycji - "Limit jednego roku" Zgodnie z Regulaminem OTC zlecenie nie może być utrzymywane na rachunku dłużej niż rok. Dotyczy to tylko zawartych transakcji kupna i sprzedaży - zlecenia oczekujące nie mają limitu czasu. Przed upływem roku klient jest wzywany do zamknięcia pozycji. Jeżeli tego nie zrobi, to pozycja zostanie zamknięta automatycznie po ostatnim kursie występującym w przededniu upływu roku. Forex market maker i jego odpowiedzialność Cena danego instrumentu finansowego to oczywiście wypadkowa oczekiwań inwestorów, którzy kierują się w swoich decyzjach mnóstwem różnego rodzaju czynników. Ogromną rolę na nim odgrywają tzw. market makers. Najczęściej są nimi banki, lub brokerzy, którzy w celu zapewnienia ciągłości notowań, nieustannie obserwują popyt i podaż na rynku, wystawiając na tej podstawie oferty po jakich są gotowi kupić, lub sprzedać daną walutę. Z cen tych korzystają bezpośredni uczestnicy rynku i pośrednicy- instytucje finansowe, które obsługują własnych klientów. Oferowana cena nigdzie nie jest taka sama, gdyż specyfika OTC zakłada, że tym samym instrumentem można w danym momencie handlować w różnych miejscach na świecie. Ceny są więc zbliżone do siebie, ale różnice nie są zbyt duże. Takie zostałyby

szybko wykryte przez arbitrażystów. Po drugie, z tego samego powodu nie jest możliwy do ustalenia wolumen transakcji, ani liczba otwartych pozycji (analitycy techniczni nie mogą, zatem analizować wskaźników powiązanych z obrotami). Spotyka się jedynie szacunkowe dane, które są podawane przez agencje informacyjne na podstawie raportów przekazywanych im przez instytucje finansowe. W Polsce działalność na rynku forex mogą podejmować wyłącznie licencjonowane domy maklerskie (nadzór jest prowadzony przez KNF). Brokerzy walutowi kierując ofertę do swoich klientów zapewniają im ciągłość notowań (pokazując ceny do transakcji) oraz płynność tzn. gotowość do zawierania transakcji po podawanych cenach i przy wybranym przez klienta wolumenie. Na rodzimym rynku można zauważyć dwa modele handlu: pośredników i animatorów. Pierwszy z nich to grupa pośredników (agentów), która zlecenia klientów natychmiast przekazuje na zewnątrz do większych instytucji finansowych. W praktyce oznacza to, iż firma taka nie posiada własnych dealerów ani zaplecza technicznego służącego do rozliczania transakcji. Całe ryzyko jest natychmiast eksportowane, a zyskiem staje się prowizja pobierana za dokonywany obrót wypłacana przez firmę do której trafiają zlecenia. Druga grupą są tzw. market makers, którzy handlują bezpośrednio z klientami. Dom maklerski będący market maker em jest zawsze drugą stroną transakcji i sam decyduje w jaki sposób będzie ją zabezpieczał. W tym przypadku zawierane z klientami transakcje mogą się wzajemnie znosić (jeżeli w danej chwili

klienci zarówno kupują jak i sprzedają dany instrument), być zabezpieczane przez dealerów lub utrzymywane na własne ryzyko firmy w jej portfelu. Handel z market makerem obarczony jest ryzykiem związanym z występowaniem konfliktu interesów. Polega on na występowaniu sytuacji, w których interes domu maklerskiego jest sprzeczny z interesem Klienta, np.: strata poniesiona przez Klienta może stać się zyskiem domu maklerskiego. Szereg regulacji wewnętrznych, m.in. obowiązek podawania źródła kwotowań w sytuacjach spornych, oraz maksymalny czas realizacji transakcji, mają za zadanie ochronę praw klienta tak, by wyłączyć ryzyko powstałe z konfliktu interesów.

CFD Kontrakty różnic kursowych (ang. Contracts For Difference kontrakty na różnicę, CFD) to grupa tzw. instrumentów pochodnych. Oznacza to, iż ich wartość zależy bezpośrednio od wartości instrumentu bazowego na który opiewają. Instrumentami bazowymi mogą być zarówno instrumenty rynku kasowego, takie jak pary walutowe, złoto czy srebro, jak i terminowego np. kontrakty terminowe na indeksy oferowane na giełdach światowych, instrumenty pochodne giełd towarowych itp. Kontrakty CFD umożliwiają zajmowanie długiej lub krótkiej pozycji, zaś wynik jest obliczany tylko na podstawie różnic kursowych. Handel instrumentami CFD nie wiąże się więc z fizycznym zajęciem pozycji. Konstrukcja CFD jest w pewnym stopniu zbliżona do konstrukcji kontraktów futures, jednak z kilkoma istotnymi różnicami. Na rynku forex transakcje są dokonywane po kursie natychmiastowym (spot) bez z góry określonego momentu wyjścia z transakcji. Może ona zostać zamknięta w dowolnym momencie na co pozwala ogromna płynność rynku.

MQL 4 MQL4 czyli MetaQuotes Language 4 jest językiem programowania, który został wbudowany w platformę transakcyjną Meta Trader, z myślą o projektowaniu własnych narzędzi wspomagających zawieranie transakcji i zarządzanie pozycją. Narzędzia, które stworzyć można za pomocą MQL4, podzielone zostały na trzy grupy: skrypty, wskaźniki własne i strategie automatyczne. Podział ten zdeterminowany jest charakterem funkcjonowania powyższych grup narzędzi. Skrypty włączane są ręcznie i po wykonaniu swojej funkcji zostają zamknięte. Można im przypisać przeróżne funkcje. Istotą ich działania jest zagregowanie wielu czynności w jedno polecenie. Np. skrypt umożliwiający złożenie zlecenia za pomocą skrótu klawiszowego. Złożenie zlecenia metodą tradycyjną wymaga wybrania instrumentu, otwarcia okna zleceń, wybrania wolumenu i zatwierdzenia przyciskiem [Sprzedaj] lub [Kup]. Złożenie zlecenia za pomocą skryptu sprowadza się jedynie do wybrania odpowiedniego klawisza skrótu. Kolejną grupą narzędzi, które można tworzyć za pomocą MQL4, są wskaźniki własne. Oprócz funkcji typowo analitycznych mogą one pełnić

także rolę informacyjną ( np. informować o ilości otwartych pozycji, wielkości punktów swapowych czy korelacji między instrumentami w portfelu). Wskaźniki załączane są bezpośrednio do wykresów, ich wskazania widoczne są bezpośrednio na wykresie lub w oknie pod wykresem. Zmiany wartości wskaźników następują po zmianie ceny instrumentu, do wykresu którego, załączony został wskaźnik. Wskaźniki pełnią rolę czysto informacyjną, nie ma możliwości, by spełniały funkcje handlowe. Strategie automatyczne są najbardziej zaawansowaną grupą narzędzi MQL. Mogą pełnić funkcje zarówno analityczne, jak i handlowe. W przeciwieństwie do skryptów funkcjonują w sposób ciągły od momentu załączenia ich do wykresu. Umożliwiają zastosowanie strategii inwestycyjnych w sposób automatyczny. Oznacza to, że po otrzymaniu sygnałów, system będzie otwierał i zamykał pozycje na wybranych instrumentach bez naszego udziału. Pozwala to na wyeliminowanie emocji, które często prowadzą do przedwczesnego ucinania zysków i przetrzymywania strat.

Składnia MQL4 jest bardzo podobna do języka C. Zawiera dużą ilość funkcji i wskaźników potrzebnych do analizy bieżących i historycznych notowań, podstawowe operacje logiczne i arytmetyczne jak również funkcje służące do zarządzania pozycjami. MQL4 obsługiwany jest przez MetaEditor, który jest wbudowanym składnikiem platformy transakcyjnej. Jest on przeznaczony do tworzenia, edytowania i kompilacji kodu źródłowego napisanego w MQL4. Może być używany do tworzenia strategii, własnych wskaźników, skryptów i bibliotek funkcji. Słownik MetaQuotes zawiera opis konstrukcji języka i funkcji wbudowanych w edytor. Wprowadzenie do MetaQuotes Language 4 Meta Quotes Language 4 (MQL4) jest nowym językiem programowania. Jest to język wbudowany w platformę transakcyjną MetaTrader i dedykowany do budowania własnych strategii handlowych. Język ten pozwala na tworzenie własnych strategii automatycznych (Expert Advisor) w postaci automatycznych systemów transakcyjnych i doskonale

nadaje się do realizacji własnej strategii handlowej. Poza tym, można używać MQL4 do tworzenia własnych wskaźników (Custom Indicator) oraz skryptów (Scripts), a także bibliotek (Library). W MQL4 zostało wbudowanych bardzo dużo funkcji niezbędnych do analizy aktualnych i historycznych notowań, a także podstawowe działania arytmetyczne i operacje logiczne oraz polecenia testowe i sprawdzające. MetaEditor 4 (edytor kodu źródłowego), który przedstawia różne konstrukcje języka MQL4, służy do pisania kodu programu. Wspiera użytkownika w pisaniu kodu system eksperckiego za pomocą prostego i czytelnego interfejsu. Można korzystać także z wbudowanego słownika pomocy, opisującego składnię języka MQL4 w postaci pliku pomocy. Skrócona instrukcja zawiera funkcje podzielone na kategorie działań, słowa zastrzeżone i inne konstrukcje języka. Programy napisane w MetaQuotes Language 4 mają różne funkcje i zastosowania opisane poniżej: Expert Advisor (EA) - jest to mechaniczny system handlu działający zgodnie ze ściśle określonymi zasadami i regułami. EA dokonuje obliczeń, analizy i wykonuje określone działania przy każdym

pojawieniu się nowego kwotowania dla danego instrumentu. Działanie EA jest szeregowane, to znaczy nowe przeliczenia nie zostaną rozpoczęte po pojawieniu się nowego kwotowania w przypadku gdy poprzednie nie zostały jeszcze zakończone. EA może działać jednocześnie na wielu instrumentach (być uruchomiony na wielu wykresach dostępnych w terminalu), może otwierać, monitorować, zamykać transakcje w sposób w pełni automatyczny poprzez wysyłanie zapytań bezpośrednio do serwera transakcyjnego. Podobnie jak większość systemów transakcyjnych, terminal obsługuje strategie napisane za pomocą MQL4 i umożliwia równoległe działanie wielu EA wykorzystując do obliczeń zarówno dane bieżących kwotowań, jak i dane historyczne. Pliki wykonywalne EA przechowywane są w następującej lokalizacji terminal_directory\experts. Custom Indicator jest to wskaźnik analizy technicznej napisany samodzielnie przez użytkownika, który jest zintegrowany i wykonywany na wykresie w terminalu klienckim. Charakterystyczne dla wskaźników jest to, że nie służą do automatycznego handlu i są przeznaczone tylko do realizacji obliczeń analitycznych i prezentacji

wyników na wykresach. Pliki wykonywalne Custom Indicator przechowywane są w następującej lokalizacji terminal_directory\experts\indicators. Script - to program przeznaczony dla jednorazowego wykonania niektórych działań i obliczeń. Charakterystyczne dla skryptów jest to, że nie dokonują obliczeń przy nadejściu nowego kwotowania tak jak EA oraz Custom Indicator, tylko na żądanie użytkownika. Pliki wykonywalne Scripts przechowywane są w następującej lokalizacji terminal_dictionary\experts\scripts. Library to moduł biblioteczny zawierający zbiór często wykorzystywanych funkcji użytkownika. Charakterystyczne dla bibliotek jest to, że nie są wykonywana na wykresie, a dostęp do funkcji w nich zawartych możliwy jest tylko z poziomu innych EA, Custom Indicator, Script oraz Library. Pliki Library przechowywane są w następującej lokalizacji terminal_directory\experts\library. Included file to pliki źródłowe (tak zwane nagłówkowe), służące do przechowywania najczęściej używanych bloków programów wykorzystywanych przez użytkownika. Pliki takie mogą być włączone

do kodów źródłowych EA, Custom Indicator, Script oraz Library na etapie kompilacji. Wykorzystanie Included file jest bardziej zalecane niż stosowanie pojedynczych Library, ponieważ szybkość wykonywania kodów zawartych w plikach nagłówkowych jest znacznie większa niż w przypadku korzystania z funkcji zawartych tylko w Library. Pliki Included file przechowywane są w następującej lokalizacji terminal_directory\experts\include. Uwaga! Język programowania MQL4 jest ciągle rozwijany (jest już wersja MQL5), w kolejnych wydaniach nazwy niektórych funkcji mogły zostać zmienione, a także mogły zostać przeniesione do innych grup funkcjonalnych w celu ich lepszego usystematyzowania. Stare nazwy funkcji nie są podświetlane w MetaEditorze.

Podstawy MetaQuotes Language 4 Składnia MetaQuotes Language 4 jest bardzo podobna do składni języka C, ale nie oznacza to, że jest to język programowania C, ponieważ wykonywalny kod wynikowy jest specyficzny dla platformy transakcyjnej. Komentarze W kodzie źródłowym można stosować komentarze, które stanową fragment kodu niepodlegający bezpośredniej kompilacji. Istnieje dwa typy komentarzy: Komentarze pojedynczej linii - // komentarz w jednej linii Komentarze wielu linii - / * komentarz wielu linii * /. Identyfikatory Identyfikatory są używane, jako nazwy zmiennych, funkcji i typów danych. Długość identyfikatora nie może przekraczać 31 znaków. W nazwach identyfikatorów można używać: cyfr od 0 do 9, małych liter od a do z, dużych liter od A do Z, symbolu podkreślenia (_). Rozróżniane są małe

i duże litery. Pierwszy znak nie może być cyfrą. Jako identyfikatorów nie można stosować słów zastrzeżonych w MQL4. Słowa zastrzeżone Poniżej wymienione słowa są zastrzeżonymi identyfikatorami języka MQL4. Słowa zastrzeżone mają przypisane konkretne zadania i nie mogą być wykorzystywane, jako identyfikatory użytkownika. Znaczenie operatorów zostało opisane poniżej:

Typy danych Główne typy danych to: Całkowity (int), Bitowy, Logiczny (bool) - typ logiczny może przyjmować jedną z dwóch wartości prawda (true) lub fałsz (false), co jest reprezentowane wewnętrznie przez znany już nam typ integer w postaci liczbowej przyjmując odpowiednio wartości 1 lub 0. Znakowy (char) Ciąg znaków (string) Liczba zmiennoprzecinkowa (double) - Typ double to typ zmiennoprzecinkowy posiadający część całkowitą oraz część ułamkową, które rozdzielone są znakiem dziesiętnym w postaci kropki (.). kolor (color) - zmienna typu color może być reprezentowana na trzy sposoby: opisowo przez rzutowanie, przez typ całkowity int, przez stałą nazwę określającą kolor (zakres nazw kolorów to standard opisu kolorów web). Typ rzutowany opisany jest za pomocą trzech części,

stałej znakowej C (Color) oraz trzech zmiennych RGB: czerwony, zielony, niebieski. Zmienna rozpoczyna się od C i zmiennych RGB umieszczonych w pojedynczym cudzysłowiu. Poszczególne wartości liczbowe mogą zawierać się w przedziałach składniowych kolorów, czyli od 0 do 255. Reprezentacja koloru za pomocą liczby integer, zapisanej w postaci liczby dziesiętnej lub postaci szesnastkowej. Zapis w postaci szesnastkowej wygląda następująco 0x00BBGGRR, gdzie RR to wartość koloru czerwonego, GG koloru zielonego, BB to kolor niebieski. Dziesiętne stałe nie mają bezpośredniego odzwierciedlenia w RGB data i czas (datetime) Zmienna typu datetime może być reprezentowana opisowo w postaci ciągu znaków składającego się z 6 części (rok, miesiąc, dzień, godzina, minuta, sekunda). Budowa zmiennej to stała znakowa D oraz zawarty w cudzysłowach ciąg znaków opisujący datę i czas. W cudzysłowach można zawrzeć samą datę w postaci (rok, miesiąc, dzień) bez czasu, wówczas czas przyjmie wartości 00:00:00 lub w postaci czasu (godzina, minuta, sekunda), wówczas data przyjmie wartość domyślną (aktualną datę kompilacji).

Zakres daty i czasu może zawierać się po między 1 stycznia 1970-31 grudnia 2037. Typy color oraz datetime zostały wprowadzone w celu łatwiejszego operowania tymi danymi, ponieważ wewnętrznie przez MQL4 są traktowane, jako typ integer. Taka reprezentacja typów color oraz datetime znaczenie ułatwia operowanie tymi zmiennymi, jako parametrami, na przykład w karcie parametrów, EA czy Custom Indicator. Wywoływanie funkcji Wywołanie funkcji, czyli uruchomienie bloku wykonywalnego funkcji jest możliwe wówczas, gdy wcześniej zadeklarujemy oraz zdefiniujemy funkcję. Funkcja jest tak zwanym operatorem złożonym. Deklaracja funkcji polega na określeniu nazwy funkcji, ilości oraz typu przekazywanych parametrów do funkcji oddzielonych średnikami (,), które zamknięte są w nawiasach zwykłych (()) oraz typu wartości zwracanej przez funkcję. Definicja funkcji polega na umieszczeniu w bloku wykonywalnym funkcji ograniczonym nawiasami klamrowymi ({}) instrukcji, operatorów, obliczeń, które ma wykonać funkcja. W języku MQL4 tworząc EA, wskaźniki, skrypty możemy

jednocześnie deklarować i definiować funkcję, ale istnieje też możliwość rozdzielenia tego poprzez specjalnie do tego opracowane, tak zwane pliki nagłówkowe mające rozszerzenie (mqh) wówczas w plikach nagłówkowych umieszczamy tylko deklaracje funkcji, a w plikach EA, wskaźników, skryptów, bibliotek dokonujemy definicji funkcji. Parametry mogą być przekazywane do funkcji przez wartość lub przez referencje. Przekazanie przez wartość oznacza, że funkcja nie ma możliwości modyfikacji tych parametrów w bloku wykonywalnym funkcji, w rzeczywistości funkcja pobiera kopie parametrów, natomiast przekazują parametr przez referencje funkcja może zmodyfikować ten parametr inaczej mówiąc funkcja operuje na rzeczywistej zmiennej, a nie na jej kopi. Aby przekazać parametry przez referencje wystarczy poprzedzić je znakiem ampersand (&). Maksymalna ilość parametrów, które mogę być przekazywane do funkcji wynosi 64.

Funkcje specjalne W języku MQL4 istnieją trzy predefiniowane funkcje specjalne, o których wspomniane było wyżej: init() - jest to funkcja uruchamiana jednorazowo przy inicjalizacji EA, wskaźnika, skryptu, czyli przy umieszczeniu na wykresie, włączeniu strategii lub zmianie parametrów, włączeniu/wyłączeniu EA. start() - jest to najważniejsza i obligatoryjna funkcją każdego EA, wskaźnika, skryptu. Jest uruchomiona dla EA i wskaźników za każdym razem zmiany kwotowań, natomiast w skryptach uruchamiana jest jednorazowo. Jeśli w naszym programie nie umieścimy funkcji start nie zostanie on skompilowany, a programista dostanie komunikat, że brak funkcji start(). deinit() - jest to funkcja uruchamiana jednorazowo przy zamykaniu EA, wskaźnika, skryptu, czyli w momencie usuwania EA, wskaźnika, skryptu z wykresu lub w momencie przeładowania parametrów, a także włączenia / wyłączenia EA.

Powyższe predefiniowane funkcje specjalne mogą mieć przekazywane parametry, ale parametry te będą ignorowane podczas uruchamiania w terminalu, ale domyślne wartości można pobierać. Funkcji start(), init() i deinit() można wywołać z dowolnego miejsca programu, tak jak każdą inną funkcję, ale należy być przy tym bardzo uważnym, aby nie spowodować błędnego działania programu lub zapętlenia się wywołania funkcji. Nie jest zalecane wzajemne wywoływanie funkcji specjalnych start() w funkcji init() lub dokonywanie obliczeń danych z wykresów w funkcji init(), w której wykres i zmienne są dopiero inicjowane. Init() i deinit() nie powinny zawierać skomplikowanych obliczeń powinny być zoptymalizowane do jak najszybszego wykonania się. Stałe zdefiniowane w MQL4 W celu uproszczenia pisania oprogramowania oraz zwiększenia przejrzystości kodu źródłowego wprowadzono tak zwane stałe zdefiniowane. Stałe zdefiniowane zapisywane są w postaci czytelnego tekstu, a w rzeczywistości reprezentują je podstawowe typy wartości dostępne w MQL4 czyli int, double, color, datetime. W kolejnych podpunktach opisane są

zmienne zdefiniowane, które zostały pogrupowane w kontekście ich konkretnego obszaru zastosowania. Stałe dla danych tablicowych wykresu. Stałe dla zakresów czasowych wykresu.

Stałe dla operacji handlowych Stałe handlowe wykorzystywane są przez funkcję SendOrder() i mogą przyjmować poniższe wartości: Stałe ceny Stałe ceny mogą przyjmować poniższe wartości:

Stałe dla funkcji MarketInfo Stałe identyfikatory stosowane w funkcji MarketInfo mogą przyjmować następujące wartości:

Zmienne predefiniowane w MQL4 Język programowania MQL4 został opracowany i dostosowany do specyficznych wymagań tworzenia EA, wskaźników i skryptów czyli w większości przypadków do operowania na rynkach które mają dużą zmienność i szybkość zmian jeśli tak można określić kwotowania real-time. W celu przyspieszenia obliczeń i szybkiego dostępu do najczęściej wykorzystywanych zmiennych, którymi jest między innymi wartość kwotowań, udostępniono programistom tak zwane zmienne predefiniowane, którymi są Ask, Bid, Open, High, Close, Digits, Point, Time, Volume. Dostęp do zmiennych predefiniowanych jest z każdego rodzaju programu, czyli z EA, wskaźnika, skryptu, biblioteki. Aby zapewnić szybki i bezpieczny dostęp do tych danych, terminal klienta przechowuje lokalne kopie predefiniowanych zmiennych dla każdego niezależnie uruchomionego programu. Dane te są aktualizowane przy każdej zmianie wartości kwotowań czy parametrów symbolu typu Digits, Point. Można też dokonać programowej aktualizacji tych danych za pomocą funkcji RefreshRates(). Ask Ask przechowuje ostatnią znaną wartość ceny Ask dla symbolu wykresu, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka.

Bid Bid przechowuje ostatnią znaną wartość ceny Bid dla symbolu wykresu, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka. Open Open[] jest zmienną tablicową i przechowuje wszystkie wartości ceny otwarcia dla każdego słupka wykresu, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka. Dostęp do poszczególnych wartości zmiennej Open jest taki sam jak do każdej zmiennej tablicowej, czyli przez indeks poczynając od 0 (zero), co jest pierwszą, najświeższą wartością ceny zamknięcia. Indeks najstarszej wartości ceny zamknięcia na wykresie równy jest zmiennej predefiniowanej Bars-1. High High[] jest zmienną tablicową i przechowuje wszystkie wartości najwyższej ceny dla każdego słupka wykresu, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka. Dostęp do poszczególnych wartości zmiennej High jest taki sam jak do każdej tablicy, czyli przez indeks poczynając od 0 (zero), co jest pierwszą, najświeższą wartością najwyższej ceny. Indeks najstarszej wartości ceny zamknięcia na wykresie równy jest zmiennej predefiniowanej Bars-1.

Low Low[] jest zmienną tablicową i przechowuje wszystkie wartości najniższej ceny dla każdego słupka wykresu, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka. Dostęp do poszczególnych wartości zmiennej Low jest taki sam jak do każdej tablicy, czyli przez indeks poczynając od 0 (zero), co jest pierwszą, najświeższą wartością najniższej ceny. Indeks najstarszej wartości ceny zamknięcia na wykresie równy jest zmiennej predefiniowanej Bars-1. Close Close[] jest zmienną tablicową i przechowuje wszystkie wartości ceny zamknięcia dla każdego słupka wykresu, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka. Dostęp do poszczególnych wartości zmiennej Close jest taki sam jak do każdej zmiennej tablicowej, czyli przez indeks poczynając od 0 (zero), co jest pierwszą, najświeższą wartością ceny zamknięcia. Indeks najstarszej wartości ceny zamknięcia na wykresie równy jest zmiennej predefiniowanej Bars-1. Volume Volume[] jest zmienną tablicową i przechowuje wszystkie wartości wielkości obrotu dla każdego słupka wykresu, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka. Dostęp do poszczególnych wartości zmiennej Volume jest taki sam

jak do każdej zmiennej tablicowej, czyli przez indeks poczynając od 0 (zero), co jest pierwszą, najświeższą wartością ceny zamknięcia. Indeks najstarszej wartości ceny zamknięcia na wykresie równy jest zmiennej predefiniowanej Bars-1. Time Time[] jest zmienną tablicową i przechowuje wszystkie wartości czasu dla każdego słupka wykresu, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka. Dostęp do poszczególnych wartości zmiennej Time jest taki sam, jak do każdej zmiennej tablicowej, czyli przez indeks poczynając od 0 (zero), co jest pierwszą, najświeższą wartością ceny zamknięcia. Indeks najstarszej wartości ceny zamknięcia na wykresie równy jest zmiennej predefiniowanej Bars-1. Bars Bars przechowuje liczbę słupków, jakie są dostępne na bieżącym wykresie, na którym został uruchomiony EA, wskaźnik, skrypt, biblioteka. Przykład: // drukuje wszystkie ceny zamknięcia for(int i=0; i <= Bars-1; i++) { Print( Close[i] ); }

Digits Digits przechowuje wartość określającą ile dany symbol posiada pozycji po przecinku w cenie bieżących kwotowań. Point Zmienna Point przechowuje wartość punkta danego symbolu. Dla instrumentu kwotowanego z dokładnością do 5 miejsc po przecinku wartość ta wynosi 0.00001, dla instrumentu kwotowanego z dokładnością jedności wartość ta wynosi 1. Dostęp do danych (spoza wykresu) Zmienne predefiniowane zapewniają szybki dostępu do najczęściej wykorzystywanych zmiennych typu Ask, Bid, Open, High, Close, Digits, Point, Time, Volume. Dostęp do zmiennych predefiniowanych jest z każdego rodzaju programu, czyli z EA, wskaźnika, skryptu, biblioteki, ale ograniczony tylko do wykresu na którym został uruchomiony program MQL4 dlatego wprowadzone funkcje pomocnicze umożliwiające dostęp do tych danych z innych okien wykresu. To co wyróżnia funkcje, które zostały poniżej zamieszczone to konieczność podania parametrów określających dany wykres, czyli nazwa symbolu oraz zakres czasowy, a także nazwa funkcji poprzedzona literą i.

Może się zdarzyć, że próbujemy pobrać dane z wykresu który nie istnieje lub nigdy nie był otwarty przez użytkownika i nie były pobrane dla tego wykresu dane historyczne z serwera. W takiej sytuacji otrzymamy komunikat błędu ERR_HISTORY_WILL_UPDATED (4066 - dane historyczne są właśnie aktualizowane). Uwaga! Podczas testowania strategii, dane z poza innych wykresów są wyznaczane i uśredniane poprzez algorytm testera strategii. iopen Funkcja zwraca cenę otwarcia ze słupka określonego parametrem indeks, na wykresie określonym parametrami symbol i skala czasowa. Indeks musi znajdować się po między wartością 0, a Bars-1 lub odczytanej za pomocą funkcji ibars()-1. Składnia: Parametry double iopen( string symbol, int timeframe, int shift) symbol nazwa symbol wykresu lub NULL co oznacza aktualny symbol z wykresu timeframe zakres czasowy wykresu lub 0 co oznacza aktualny zakres czasowy z wykresu

shift numer indeksu słupka z zakresu od 0 do Bars - 1 Wartość zwracana: cena otwarcia z określonego słupka Przykład: Print( "Cena otwarcia EURUSD H1: ",iopen("eurusd",period_h1,0) ); Na tej samej zasadzie funkcjonują funkcje: double ihigh( string symbol, int timeframe, int shift) double ilow( string symbol, int timeframe, int shift) double iclose( string symbol, int timeframe, int shift ) double ivolume( string symbol, int timeframe, int shift)datetime itime( string symbol, int timeframe, int shift ) Przykłady: int ibars( string symbol, int timeframe ) Print( "Cena najwyższa EURUSD H1: ",ihigh("eurusd",period_h1,0) ); Print( "Cena najniższa EURUSD H1: ",ilow("eurusd",period_h1,0) ); Print( "Cena zamknięcia EURUSD H1: ",iclose("eurusd",period_h1,0) );

Print( "Wolumen słupka EURUSD H1: ",ivolume("eurusd",period_h1,0) ); Print( "Czas otwarcia słupka EURUSD H1: ",itime("eurusd",period_h1,0) ); Print( "Liczba słupków na wykresie 'EURUSD' skala 1 godzina =",ibars("eurusd",period_h1)) ibarshift Funkcja wyszukuje słupek z określoną datą na wykresie, określonym parametrami symbol i skala czasowa. Funkcja zwraca numer słupka lub wartość -1 jeśli słupek z podaną datą jako parametry nie został znaleziony. Dodatkowo można skorzystać z parametru exec który ustawiony na true szuka dokładnie sprecyzowanej daty lub jeśli jest ustawiony na false (wartość domyślna) to zwraca numer najbliższego słupka. Składnia: int ibarshift( string symbol, int timeframe, datetime time, bool exact=false ) Parametry symbol nazwa symbol wykresu lub NULL co oznacza aktualny symbol z wykresu timeframe zakres czasowy wykresu lub 0 co oznacza aktualny zakres czasowy z wykresu

time czas otwarcia (Open) słupka który ma zostać znaleziony exact tryb szukania: false szuka najbliższego słupka o określonej dacie true szuka dokładnie tego słupka o określonej dacie lub zwraca -1 Wartość zwracana: numer poszukiwanego słupka lub wartość -1 jeśli nie znaleziono słupka Przykład: datetime szukany_slupek = D'2009.09.21 12:00'; int shift = ibarshift("eurusd",period_m1, szukany_slupek); Print("Szukany słupek o dacie ",TimeToStr(szukany_slupek)," ma numer ",shift) ihighest Funkcja wyszukuje i zwraca numer słupka (indeks) o najwyższej wartości w określonym zakresie. Wyszukiwania rozpoczyna się od słupka określonego parametrem start i kończy się na liczbie słupków określonych parametrem count. Najwyższa wartość może być przeszukiwana w stosunku do określonego typu danych z wykresu opisanych poniżej w tabeli

Składnia: Parametry int ihighest( string symbol, int timeframe, int type, int count=whole_array, int start=0 ) symbol nazwa symbol wykresu lub NULL co oznacza aktualny symbol z wykresu timeframe zakres czasowy wykresu lub 0 co oznacza aktualny zakres czasowy z wykresu type typ określający jakiego rodzaju wartość ma być poszukiwana na wykresie count liczba słupków która ma być przeszukiwana od pozycji start lub wartość domyślna WHOLE_ARRAY oznaczająca wszystkie słupki start początkowy numer słupka od którego ma być poszukiwana najwyższa wartość Wartość zwracana: numer słupka o najwyższej wartości Przykład: // wyznacza najwyższą cenę z 20 słupków od słupka 5 do 24 double wartosc; wartosc = High[iHighest(NULL,0,MODE_HIGH,20,5)]; Print(Wartość najwyższ =, wartosc);

ilowest Funkcja wyszukuje i zwraca numer słupka (indeks) o najniższej wartości w określonym zakresie. Wyszukiwania rozpoczyna się od słupka określonego parametrem start i kończy się na liczbie słupków określonych parametrem count. Najniższa wartość może być przeszukiwana w stosunku do określonego typu danych z wykresu opisanych poniżej w tabeli Składnia: int ilowest( string symbol, int timeframe, int type, int count=whole_array, int start=0 ) Parametry symbol nazwa symbol wykresu lub NULL co oznacza aktualny symbol z wykresu timeframe zakres czasowy wykresu lub 0 co oznacza aktualny zakres czasowy z wykresu type typ określający, jakiego rodzaju wartość ma być poszukiwana na wykresie count liczba słupków która ma być przeszukiwana od pozycji start lub wartość domyślna WHOLE_ARRAY oznaczająca wszystkie słupki start początkowy numer słupka od którego ma być poszukiwana najniższe wartość

Wartość zwracana: numer słupka o najniższej wartości. Przykład: // wyznacza najniższą cenę z 20 słupków od słupka 5 do 24 double wartosc; wartosc = Low[iLowest(NULL,0,MODE_LOW,20,5)]; Print(Wartość najniższa =, wartosc); Funkcje informacyjne konta AccountBalance funkcja zwraca wartość stanu konta wszystkich zamkniętych pozycji w walucie bazowej konta klienta. Przykład: Print( "Stan konta =" AccountBalance() ); AccountCredit funkcja zwraca wartość kredytu (zadłużenia) klienta w stosunku do brokera w walucie bazowej konta. Przykład: Print( "Stan kredytu =" AccountCredit() );

AccountCompany funkcja zwraca nazwę brokera, do którego serwera aktualnie jest zalogowany klient. Przykład: Print( "Nazwa brokera =" AccountCompany() ); AccountCurrency funkcja podaje walutę rachunku bieżącego klienta. Przykład: Print( "Waluta rachunku bieżącego =" AccountCurrency() ); AccountEquity funkcja zwraca wartość rachunku obrotów bieżących. Podaje w walucie rachunku bieżącego wartość aktualnego stanu konta (balans) powiększoną/pomniejszoną o wartość aktualnie otwartych pozycji. Przykład: Print( "Aktualny stan konta =" AccountEquity() ); AccountFreeMargin funkcja podaje wartość dostępnych środków w walucie konta bieżącego, które są dostępne do otwierania nowych pozycji. Przykład: Print( "Dostępne środki na nowe pozycje=" AccountFreeMargin() );

AccountFreeMarginCheck funkcja zwraca informację na temat możliwości otworzenie określonej wielkości pozycji podawanej jako parametr. Jeśli brak wolnych środków na nowe pozycje to generowany jest błąd nr 134 (ERR_NOT_ENOUGH_MONEY). Przykład: if ( AccountFreeMarginCheck( Symbol(), OP_BUY, 10) <= 0 GetLastError() == 134) Print( "Brak wolnych środków do otwarcia pozycji 10 lotów" ); AccountFreeMarginMode funkcja zwraca kod sposobu wyliczenia depozytu zabezpieczającego dla rynku, symbolu na którym została uruchomiona funkcja. Zwracana wartość sposobu wyliczenia może przyjąć poniższe wartości: 0 zysk/strata z otwartych pozycji nie są uwzględniane w wyliczeniach; 1 zysk/strata z otwartych pozycji są uwzględniane w wyliczeniach; Print( "Dostępne środki na nowe pozycje =" AccountFreeMargin() ); 2 tylko wartość zysku jest uwzględniana w wyliczeniach, a straty nie są uwzględniane; 3 tylko wartość zamkniętych strat jest wykorzystywany w wyliczeniach, a straty z aktualnie otwartych pozycji nie.

Przykład: if ( AccountFreeMarginMode() == 0 ) Print ( "Tryb wyliczeń: zysk/strata z otwartych pozycji nie są uwzględnione w wyliczeniach"); AccountLeverage funkcja zwraca wartość dźwignię finansowej na danym koncie., "dźwignia finansowa", AccountLeverage ()); Przykład: Print( "Numer konta=", AccountNumber(),"Stan konta=", AccountLeverage() ); AccountMargin funkcja zwraca wartość aktualnie wykorzystywanego marginesu na wszystkie otwarte pozycje w bieżącej walucie konta. Przykład: Print( "Wykorzystany margines środków =" AccountMargin() ); AccountName funkcja zwraca nazwę konta aktualnie zalogowanego klienta. Przykład: Print( "Nazwa konta =" AccountName() );

AccountNumber funkcja zwraca numer aktualnie zalogowanego klienta. Przykład: Print( "Numer konta klienta =" AccountNumber() ); AccountProfit funkcja zwraca zysk na rachunku zalogowanego klienta w walucie bieżącego rachunku. Przykład: Print( "Zysk na rachunku =" AccountProfit() ); AccountServer funkcja zwraca nazwę serwera brokera, do którego aktualnie zalogowany jest klient. Przykład: Print( "Serwer brokera =" AccountServer() ); AccountStopoutLevel funkcja zwraca wartość minimalnego stanu konta klienta, przy którym pozycje będą automatycznie zamykane. Przykład: Print( "Poziom zamykania pozycji stratnych =" AccountStopoutLevel() );

AccountStopoutMode funkcja zwraca kod sposobu wyliczania poziomu, przy którym będą zamykane stratne pozycje klienta i może przyjąć poniże wartości: 0 wyliczenia procentowego stanu konta na podstawie dostępnego marginesu zabezpieczającego oraz aktualnego stanu konta pozycji zamkniętych jak i otwartych; 1 wyliczenia na podstawie dostępnych środków na zabezpieczenie nowych pozycji oraz aktualnego stanu (bilansu) konta. Przykład: int poziom = AccountStopoutLevel(); if( AccountStopoutMode() == 0) { Print( "poziom zamykania pozycji =" poziom "%"); } else Print( "poziom zamykania pozycji =" poziom ", AccountCurrency());

Funkcje zarządzania zleceniami (transakcjami) Jednym z podstawowych rodzajów programów tworzonych w MQL4 są tak zwane doradcze systemy eksperckie (Expert Advisor), które oprócz wyznaczania sygnałów tradingowych na podstawie wyliczeń wskaźników, własnych algorytmów umożliwiają automatyczny handel. Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). W celu umożliwienia realizacji automatycznego handlu przez oprogramowanie konieczne jest, aby broker miał włączoną możliwość automatycznego handlu, a po stronie terminala musi być włączony handel automatyczny, co można sprawdzić z poziomu programu MQL4 za pomocą funkcji IsTradeAllowed(). Uwaga! Funkcje handlowe mogą być używane tylko w EA oraz skryptach i nie mogą być używane z programach typu wskaźnik własny użytkownika.

OrderSend Funkcja umożliwia otwieranie zleceń natychmiastowych oraz oczekujących. Funkcja zwraca numer zlecenia, jeśli zakończy się powodzeniem lub wartość -1, jeśli wystąpił błąd wykonania funkcji (otwarcia nowego zlecenia). Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Jest to podstawowa funkcja z operacji handlowych oraz jedyna służąca do otwierania nowych pozycji z poziomu własnego programu. Uwaga! W przypadku zleceń po cenie rynkowej typu OP_SELL lub OP_BUY, jako cenę otwarcia możemy podać tylko aktualną cenę Bid dla typu OP_SELL lub Ask dla typu OP_BUY i nie powinniśmy stosować wyliczanych, normalizowanych cen. Jeśli podamy cenę wyliczoną o nieprawidłowym formacie np. za mało pozycji po przecinku to otrzymamy błąd numer 129 (ERR_INVALID_PRICE). Jeśli podana cena będzie z aktualną ceną rynkową otrzymamy błąd numer 138 (ERR_REQUOTE), w tym przypadku możemy zastosować parametr slippage i określić maksymalne odchylenie od aktualnej ceny rynkowej, przy jakim zgadzamy się na otworzenie pozycji. Jeśli stosujemy parametr slippage to cena po której pozycja będzie otwarta określona jest przez widełki = aktualna cena +- parametr slippage. Wartość StopLoss i TakeProfit możemy określić podczas otwierania nowego zlecenia, ale muszą być większe niż dopuszczalna przez brokera minimalna wartość

stopów (stop level), którą możemy odczytać korzystając z funkcji MarketInfo() parametr MODE_STOPLEVEL. W przypadku ustawienia nieprawidłowych, najczęściej za bliskich poziomów stop otrzymamy błąd o kodzie 130 (ERR_INVALID_STOPS). Jeśli otwieramy zlecenia oczekujące cena otwarcia nie może być ceną rynkową Ask lub Bid. Minimalny poziom odstępu od aktualnej ceny dla zleceń oczekujących określony przez brokera możemy odczytać za pomocą funkcji MarketInfo() parameter MODE_STOPLEVEL. W przypadku ustawienia nie prawidłowych cen oczekujących otrzymamy błąd o kodzie 130 (ERR_INVALID_STOPS). Broker może zablokować zlecenia oczekujące wówczas przy próbie wywołania takiego zlecenie otrzymamy błąd o kodzie 147 (ERR_TRADE_EXPIRATION_DENIED). Może też zostać nałożone ograniczenie na maksymalna ilość zleceń otwartych i oczekujących wówczas zostanie wygenerowany błąd o kodzie 148 (ERR_TRADE_TOO_MANY_ORDERS).

Składnia 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 ) Parametry symbol symbol rynku cmd identyfikator typ zlecenia volume wielkość zlecenia wlotach price cena po jakiej ma zostać otwarte zlecenie slippage maksymalne dopuszczalne odchylenie ceny rynkowej w pipsach od ceny otwarcia stoploss poziom StopLoss takeprofit poziom TakeProfit comment komentarz tekstowy do zlecenia magic identyfikator dla EA expiration czas wygaśnięcia tylko dla zleceń oczekujących arrow_color kolor strzałki otwierającej zlecenie lub wartość domyślna

CLR_NONE czyli brak koloru Wartość zwracana: numer nowego zlecenia lub -1 jeśli błąd Przykład: int zlecenie; zlecenie = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Moje zlecenie kupna", 16384, 0, Green); if(zlecenie < 0 ) { Print("Błąd wykonania funkcji OrderSend ",GetLastError()); } return(0);

OrderType Funkcja z wraca typ zlecenia dla aktualnie wybranego zlecenia. Zwracana wartość odpowiada dostępnym w terminalu typom zleceń, które zamieszczone zostały poniżej. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia Wartość zwracana: typ zlecenia Przykład: int OrderType()

if(orderselect(0 SELECT_BY_POS)==true) { Print("Typ zlecenia dla pozycji o indeksie 0", OrderType()); } OrderTicket Funkcja zwraca numer zlecenia dla aktualnie wybranego zlecenia. Jeśli funkcja powiedzie się zwraca wartość true, w przeciwnym razie false. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia int OrderTicket() Wartość zwracana numer identyfikacyjny zlecenia Przykład: if( OrderSelect(124, SELECT_BY_TICKET)==true ) { Print("Czas wygaśnięcia zlecenia #124 to ",TimeToStr(OrderExpiration())); }else { Print("Błąd wykonania funkcji OrderSelect ",GetLastError());}

OrderSymbol Funkcja zwraca ciąg znaków, który reprezentuje nazwę symbolu instrumentu finansowego dla aktualnie zaznaczonego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia string OrderSymbol() Wartość zwracana nazwa symbolu rynku Przykład: if(orderselect(124, SELECT_BY_POS)==true) { Print("Symbol rynku dla zlecenia #124 ", OrderSymbol()); } else { Print("Błąd wykonania funkcji OrderSelect ",GetLastError());}

OrderClose Funkcja zamyka otwartą pozycje transakcyjną. Jeśli funkcja powiedzie się zwraca wartość true, w przeciwnym razie false. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Składnia bool OrderClose( int ticket, double lots, double price, int slippage, Parametry ticket identyfikator zlecenia lots wielkość zamykanej pozycji w lotach price preferowana cena zamknięcia color Color=CLR_NONE ) slippage maksymalna wielkość odchylenia ceny kwotowanej od ceny zamknięcia color kolor strzałki symbolizującej zamknięcie pozycji lub wartość domyślna CLR_NONE brak koloru Wartość zwracana: true jeśli zamknięcie pozycji powiodło się false jeśli zamknięcie pozycji nie powiodło się

Przykład: int zlecenie; zlecenie = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Moje zlecenie kupna", 16384, 0, Green); if( OrderClose( numer_zlecenia, 1, Ask, 3, Red) == false ) Print("Błąd wykonania funkcji OrderClose ",GetLastError()); return(0); OrderSelect Funkcja wybiera i zaznacza jako aktualną pozycję do dalszego użycia przez inne funkcje operacji handlowych. Jest to podstawowa funkcja, którą musimy użyć za każdym razem, gdy chcemy pobrać informacje z terminala o aktualnie otwartych, oczekujących lub historycznych pozycjach. Jeśli funkcja powiedzie się zwraca wartość true, w przeciwnym razie false. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Pozycje mogą być wybierane na podstawie niepowtarzalnego identyfikatora zlecenia, wówczas parametr select przyjmuje wartość SELECT_BY_TICKET lub poprzez indeks pozycji wówczas parametr select przyjmuje wartość SELECT_BY_POS. Pozycje mogę być wybierane z aktualnie otwartych lub historycznych co ustalamy

parametrem pool, który przyjmuje wartość MODE_TRADES lub MODE_HISTORY. Składnia bool OrderSelect( int index, int select, int pool=mode_trades ) Parametry index identyfikator zlecenia zależny od drugiego parametru select select parametr oznaczający typ zaznaczanego indeksu: SELECT_BY_POS identyfikator indeksu pozycji SELECT_BY_TICKET identyfikator zlecenia pool stosowany tylko w trybie SELECT_BY_POS, może przyjmować poniższe wartości: MODE_TRADES (default) wybierane są zlecenia z otwarte i oczekujące MODE_HISTORY wybierane są zlecenia zamknięte z historii rachunku Wartość zwracana true jeśli funkcja zakończona powodzeniem false jeśli funkcja zakończona niepowodzeniem

OrderDelete Funkcja usuwa wcześniej otwarte zlecenie oczekujące. Jeśli funkcja powiedzie się zwraca wartość true, w przeciwnym razie false. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Składnia Parametry ticket numer zlecenia bool OrderDelete( int ticket, color Color=CLR_NONE) color kolor strzałki na wykresie oznaczającej usunięcie zlecenia lub wartość domyślna CLR_NONE czyli brak koloru Wartość zwracana true jeśli funkcja zakończona powodzeniem false jeśli funkcja zakończona niepowodzeniem

OrderModify Funkcja modyfikuje wcześniej otwartą pozycję lub zlecenie oczekujące. Jeśli funkcja powiedzie się zwraca wartość true, w przeciwnym razie false. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Uwaga! Cena otwarcia oraz czas wygaśnięcia może być modyfikowany tylko dla zleceń oczekujących. Składnia bool OrderModify( int ticket, double price, double stoploss, double takeprofit, Parametry ticket identyfikator zlecenia datetime expiration, color arrow_color=clr_none) price cena otwarcia tylko dla zleceń oczekujących stoploss nowy poziom StopLoss takeprofit nowy poziom TakeProfit

expiration czas wygaśnięcia zlecenia oczekującego arrow_color color strzałek dla poziomów StopLoss/TakeProfit lub wartość domyślna CLR_NONE czyli brak koloru Wartość zwracana true jeśli funkcja, modyfikacja zlecenie zakończona powodzeniem false jeśli funkcja, modyfikacja zlecenie zakończona niepowodzeniem OrdersTotal Funkcja z liczbą aktualnie otwartych pozycji wraz ze zleceniami oczekującymi. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Składnia: int OrdersTotal() Wartość zwracana: liczba aktualnie otwartych pozycji

OrderLots Funkcja zwraca wielkość, wolumen aktualnie wybranego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia double OrderLots() Wartość zwracana wielkość pozycji w lotach OrderCloseBy Funkcja zamyka zlecenia przeciwstawne. Jeśli funkcja powiedzie się zwraca wartość true, w przeciwnym razie false. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Składnia bool OrderCloseBy( int ticket, int opposite, color Color=CLR_NONE)

Parametry ticket identyfikator zlecenia opposite identyfikator zlecenia przeciwstawnego color kolor strzałki symbolizującej zamknięcie pozycji lub wartość domyślna CLR_NONE brak koloru OrderClosePrice Funkcja zwraca cenę zamknięcia aktualnie zaznaczonego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia double OrderClosePrice() Wartość zwracana: cena zamknięcia zlecenia

OrderCloseTime Funkcja zwraca datę i czasu zamknięcia wybranego zlecenia, które jest zamknięte lub zwraca wartość 0 dla zleceń otwartych oraz oczekujących. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect (). Składnia datetime OrderCloseTime() Wartość zwracana: data i czas zamknięcia zlecenia OrderComment Funkcja zwraca łańcuch znakowy opisujący zlecenie, komentarz do zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect (). Składnia Wartość zwracana: komentarz do zlecenia string OrderComment()

OrderCommission Funkcja oblicza i zwraca wartość prowizji pobieranych od aktualnie zaznaczonego zlecenia. Jeśli funkcja powiedzie się zwraca wartość true, w przeciwnym razie false. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect (). Składnia: double OrderCommission() Wartość zwracana: wielkość opłat i prowizji OrderExpiration Funkcja zwraca datę ważności dla aktualnie zaznaczonego zlecenia oczekującego. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect().

Składnia datetime OrderExpiration() Wartość zwracana data i czas wygaśnięcia pozycji oczekującej OrderMagicNumber Funkcja zwraca identyfikator (magic numer) aktualnie wybranego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia Wartość zwracana identyfikator pomocniczy MagicNumber int OrderMagicNumber()

OrderOpenPrice Funkcja zwraca wartość ceny otwarcia pozycji dla aktualnie wybranego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga: aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia Wartość zwracana cena otwarcia zlecenia OrderOpenTime double OrderOpenPrice() Funkcja zwraca datę i czas aktualnie wybranego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocąm funkcji OrderSelect(). Składnia datetime OrderOpenTime() Wartość zwracana data i czas otwarcia zlecenia w formacie datetime

OrderPrint Funkcja wyświetla podstawowe informacje w Dzienniku na temat aktualnie wybranego zlecenia. Format informacji to: numer zlecenia czas otwarcia typ zlecenia wielkość pozycji cena otwarcia StopLoss Take Profit czas zamknięcia cena zamknięcia prowizje i opłaty Swap zysk/strata komentarz MagicNumber czas wygaśnięcia zlecenia oczekującego. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia OrderProfit void OrderPrint() Funkcja zwraca aktualny zysk/stratę otwartej i aktualnie zaznaczonej pozycji (bez swap i prowizji). W otwartej pozycji, jest uzwzględniony niezrealizowany zysk. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia double OrderProfit() Wartość zwracana zysk/strata z aktualnie otwartych pozycji (bez swap i prowizji)

OrdersHistoryTotal Funkcja zwraca liczbę zamkniętych zleceń, które znajdują się w historii rachunku i zależy od zakresu daty wyświetlanej w zakładce pozycji historycznych rachunku. Składnia int OrdersHistoryTotal() Wartość zwracana: liczba zamkniętych pozycji znajdujących się w historii. OrderSwap Funkcja zwraca wartość Swap dla aktualnie wybranego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia double OrderSwap() Wartość zwracana wielkość pozycji Swapowych OrderStopLoss Funkcja zwraca wartość StopLoss dla aktualnie zaznaczonego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect().

Składnia Wartość zwracana wartość StopLoss OrderTakeProfit double OrderStopLoss() Funkcja zwraca wartość TakeProfit dla aktualnie zaznaczonego zlecenia. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError(). Uwaga! Aby korzystać z tej funkcji konieczne jest wcześniejsze zaznaczenie zlecenia za pomocą funkcji OrderSelect(). Składnia Wartość zwracana wartość TakeProfit double OrderTakeProfit()

Kody błędów operacji handlowych W poniższej tabeli zamieszczono błędy krytyczne, które powodują natychmiastowe zatrzymanie wykonywania się programu: