Podstawy Przedsiębiorczości wykład 4 MQL4 - wskaźniki analizy technicznej + przykłady W terminalu MetaTrader dostępny jest szereg wbudowanych wskaźników analizy technicznej, które dostępne są też z poziomu języka MQL4. Wskaźniki te mogą być używane w każdym typie aplikacji MQL4, czyli z EA, wskaźnikami własnymi, skryptami, bibliotekami. Podczas próby dostępu do wyliczeń wskaźnika dla danych z innych wykresów może wystąpić sytuacja, że wykres nigdy wcześniej nie był otwierany i nie ma danych historycznych do obliczeń. Wówczas wygenerowany zostanie błąd o kodzie ERR_HISTORY_WILL_UPDATED (4066 wymagane dane muszą zostać zaktualizowane).
RSI Wskaźnik RSI (Relative Strength Index - wskaźnik względnej siły) wprowadził w 1978 roku Welles Wilder, chcąc skorygować niedoskonałości, jakie cechowały jego zdaniem standardowe oscylatory impetu. Interpretacja RSI na poziomie 70 i więcej sygnał sprzedaży, RSI na poziomie 30 i mniej sygnał kupna.
Funkcja irsi wyznacza wartość wskaźnika RSI i zwraca jego wartość. Składnia: double irsi( string symbol, int timeframe, int period, int applied_price, int shift) Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period ilość słupków dla średniej applied_price wskazanie na której wartości ceny mają być dokonywane obliczenia: PRICE_CLOSE - cena zamknięcia PRICE_OPEN - cena otwarcia PRICE_HIGH - cena najwyższa PRICE_LOW - cena najniższa PRICE_MEDIAN - cena średnia liczona następująco (high+low)/2 PRICE_TYPICAL - cena średnia liczona nastęująco (high+low+close)/3 PRICE_WEIGHTED - cena średnia liczona następująco (high+low+close+close)/4 shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku if( irsi(symbol(), 0, 14, PRICE_CLOSE,0) < 30 ) { Alert( Sygnał kupna );
Średnie ruchome Szczególne znaczenie w analizie szeregów czasowych i analizie technicznej pełnią średnie ruchome. Stosowanie procesów MA w modelu ekonometrycznym i ekonomicznym wynika z tego, że wiele wskaźników ekonomicznych zależy od czysto losowych procesów o stosunkowo długim okresie wygaszania wpływu tych czynników Analiza techniczna w latach 60-tych i 70-tych wykształciła cały szereg średnich ruchomych: prosta średnia ruchoma (SMA - Simple Moving Average) obliczona dla N kolejnych cen zamknięcia, liniowo ważona (WMA - Weighted Moving Average) - waga zmienia się wprost proporcjonalnie wraz ze wzrostem N, wykładnicza (EMA - Exponential Moving Average) - będąca modyfikacją liniowo ważonej średniej, przy czym stosowane wagi nie zwiększają się liniowo.
Funkcja ima wyznacza wartość wskaźnika MA i zwraca jego wartość. Składnia: double ima( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period ilość słupków dla średniej ma_shift przesunięcie linii wskaźnika w stosunku do wykresu głównego ma_method typ liczonej średniej: MODE_SMA - średnia prosta MODE_EMA - średnia exponencjalnie ważona MODE_SMMA - średnia wygładzana MODE_LWMA - średnia ważona applied_price wskazanie, na której wartości ceny mają być dokonywane PRICE_CLOSE - cena zamknięcia PRICE_OPEN - cena otwarcia PRICE_HIGH - cena najwyższa PRICE_LOW - cena najniższa PRICE_MEDIAN - cena średnia liczona następująco (high+low)/2 PRICE_TYPICAL - cena średnia liczona następująco (high+low+close)/3 PRICE_WEIGHTED - cena średnia liczona następująco (high+low+close+close)/4 shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku Przykład: double sredniasma = ima(symbol(), 0, 15, 0, MODE_SMA, PRICE_CLOSE, 1);
WSTĘGA BOLLINGERA Wstęga Bollingera to narzędzie analizy technicznej wynalezione przez Johna Bollingera na początku lat 80. XX wieku. Powstała ona na podstawie obserwacji, że zmienność cen jest dynamiczna, a nie statyczna. Zadaniem wstęg jest określanie względnych dołków i szczytów cenowych. Czyli według definicji cena osiąga szczyt przy górnej wstędze, a dołek przy dolnej. Wstęga Bollingera składa się z: środkowej wstęgi będącej n-okresową średnią ruchomą, górnej wstęgi będącej k-krotnością n-okresowego odchylenia standardowego powyżej środkowej wstęgi, dolnej wstęgi będącej k-krotnością n-okresowego odchylenia standardowego poniżej środkowej wstęgi. Standardowo przyjmuje się: n = 20 i k = 2.
Funkcja ibands wyznacza wartość wskaźnika Bollingera Bands i zwraca jego wartość. Składnia: double ibands( string symbol, int timeframe, int period, int deviation, int bands_shift, int applied_price, int mode, int shift)
Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period ilość słupków dla średniej deviation odchylenie od głównej linii wskaźnika bands_shift przesunięcie względne od liczonych wartości wykresu applied_price wskazanie na której wartości ceny mają być dokonywane obliczenia: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED mode typ liczonej wartości wskaźnika: MODE_UPPER - górna linia MODE_LOWER - dolna linia shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku Przykład: double wst_gorna, wst_dolna, sred_kurs; wst_gorna = ibands(symbol(), 0, 20, 2, 0, PRICE_OPEN, MODE_UPPER,0); wst_dolna = ibands(symbol(), 0, 20, 2, 0, PRICE_OPEN, MODE_LOWER,0); sred_kurs = ima(symbol(), 0, 20, 0, MODE_SMA, PRICE_OPEN, 0); if(sred_kurs < wst_dolna) { Alert( Sygnal kupna ); if(sred_kurs > wst_gorna) { Alert( Sygnal sprzedaży );
ALLIGATOR Wskażnik ALLIGATOR pozwala określić siłę oraz kierunek trendu. Składa się on z trzech lini kierunkowych, których odpowiednie ułożenie określa pozycję kupna/sprzedaży oraz zamknięcia pozycji: Alligator s jaws - najdłuższy okres, Alligator s teeth - średni okres, Alligator s lips - krótki okres. Jeśli trzy linie biegną bardzo blisko siebie i/lub wzajemnie się przecinają oznacza to brak trendu i "śpiący" rynek (ALLIGATOR śpi). Gdy układają się w kolejności od najkrótszej do najdłuższej i jednocześnie zwiększają odległość od siebie, oznacza to, że rynek obudził się i powstał trend (ALLIGATOR obudził się i wymaga karmienia;)). Gdy linie ponownie zbliżają się do siebie, rynek staje się spokojny (ALLIGATOR zasypia).
Funkcja ialligator wyznacza wartość wskaźnika Bill Williams Alligator i zwraca jego wartość. Składnia: 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 )
Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu jaw_period ilość słupków dla średniej, niebieskiej linii (szczęka aligatora) jaw_shift przesunięcie dla średniej, niebieskiej linii teeth_period - okres dla średniej, czerwonej linii (zęby aligatora) teeth_shift przesunięcie dla średniej, czerwonej linii lips_period - okres dla średniej, zielonej linii (usta aligatora) lips_shift przesunięcie dla średniej, zielonej linii ma_method typ liczonej średniej: MODE_SMA, MODE_EMA, MODE_SMMA, MODE_LWMA applied_price wskazanie na której wartości ceny mają być dokonywane obliczenia: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED mode typ liczonej wartości wskaźnika: MODE_GATORJAW niebieska linia, szczęka aligatora MODE_GATORTEETH czerwona linia, zęby aligatora MODE_GATORLIPS zielona linia, usta aligatora shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku Przykład: double szczeka = ialligator(symbol(), 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, 1)
DeMarker Wskaźnik DeMarker określa obszary w których zlecenia kupna/sprzedaży są obarczone ryzykiem, gdyż istnieje możliwość zmiany trendu. Wskazania poniżej 0,3 wskazują na ryzyko w przypadku sprzedaży, powyżej 0,7 ryzyko w przypadku kupna. Wartości między 0,3-0,7 wskazują na umiarkowane ryzyko.
Funkcja idemarker wyznacza wartość wskaźnika DeMarker i zwraca jego wartość. Składnia double idemarker( string symbol, int timeframe, int period, int shift ) Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period ilość słupków dla średniej shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku Przykład: double valdm=idemarker(symbol(), 0, 13, 1); if(valdm < 30) { Alert( Sygnal kupna ); if(valdm > 70) { Alert( Sygnal sprzedaży );
FORCE INDEX (FI) Wskaźnik prezentowany jest w formie graficznej jako wykres na skali oscylujący wokół zera. Kiedy wartość wskaźnika FI jest większa niż 0, oznacza to że byki mają przewagę nad niedźwiedziami jeśli chodzi o dany instrument. Analogicznie, jeśli FI jest mniejsze od 0, 'niedźwiedzie' mają przewagę. Natomiast gdy FI jest bardzo bliskie zeru, oznacza to że a) wolumen jest bardzo niski, b) duży wolumen nieznacznie tylko zmienił ceny instrumentu. Sytuacja ta może być traktowana jako zwiastun zmiany trendu. Wykres samego wskaźnika jednakże jest raczej zmienny i nierówny, dlatego dla uzyskania lepszych efektów łączy się go z dwudniową kroczącą średnią wykładniczą (dla prognoz krótkoterminowych) lub z trzynastodniową kroczącą średnią wykładniczą (dla prognoz długoterminowych). Ponadto wskaźnik można interpretować poprzez obserwację punktów przecięcia się wykresu z poziomem zero. Kiedy wykres przecina ten poziom z góry na dół, jest to sygnał sprzedaży (S), natomiast gdy przecina go z dołu do góry, jest to sygnał kupna (K). Sygnały powinny być potwierdzone przez odpowiednie sygnały na średniej wykładniczej.
Funkcja iforce wyznacza wartość wskaźnika Force i zwraca jego wartość. Składnia: double iforce( string symbol, int timeframe, int period, int ma_method, int applied_price, int shift)
Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period ilość słupków dla średniej ma_method typ liczonej średniej: MODE_SMA, MODE_EMA, MODE_SMMA, MODE_LWMA, applied_price wskazanie na której wartości ceny mają być dokonywane obliczenia: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku. Przykład: double IF = iforce(symbol(), 0, 13, MODE_SMA, PRICE_CLOSE, 0); if (IF>0) { Alert( Sygnal kupna ); if(if<0) { Alert(Sygnał sprzedaży );
Momentum Jest to podstawowy wskaźnik impetu mierzący wielkość zmiany ceny w zadanym okresie. Kierunek notowań powinien być potwierdzony analogiczną tendencją wskaźnika. Jeżeli wskaźnik osiąga nowe minimum i zaczyna rosnąć jest to wstępny sygnał kupna, osiągnięcie nowego szczytu i następujący po nim spadek jest wstępnym sygnałem sprzedaży. Dla potrzeb systemów transakcyjnych jako sygnał wykorzystywane też jest przebijanie poziomu równowagi. Również istotne od strony przebiegu wskaźnika jest poszukiwanie dywergencji. Możliwe jest także kreślenie linii trendu, których przebicie traktowane jest jako sygnał zmiany tendnecji oraz poczukiwanie formacji. Momentum jest uproszczoną wersją ROC.
Funkcja imomentum wyznacza wartość wskaźnika Momentum i zwraca jego wartość. Składnia: double imomentum( string symbol, int timeframe, int period, int applied_price, int shift) Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period ilość słupków do wyznaczenia zmienności ceny applied_price wskazanie na której wartości ceny mają być dokonywane obliczenia: PRICE_CLOSE - cena zamknięcia PRICE_OPEN - cena otwarcia PRICE_HIGH - cena najwyższa PRICE_LOW - cena najniższa PRICE_MEDIAN - cena średnia liczona następująco (high+low)/2 PRICE_TYPICAL - cena średnia liczona nastęująco (high+low+close)/3 PRICE_WEIGHTED - cena średnia liczona następująco (high+low+close+close)/4 shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku Przykład: if(imomentum(symbol(),0,12,price_close,0)>imomentum(symbol(),0,20,price_close,0) ) { Alert( Sygnał kupna );
Bulls Power, Bear Power Bulls Power, Bear Power wskaźniki te zostały opracowane przez Aleksandra Eldera i zaprezentowane w jego książce Trading for a Living w 1989 roku. Opierają się na porównaniu cen zamknięcia z wykładniczą średnią kroczącą. Jak nazwa wskazuje są to dwa oddzielne wskaźniki opisujące siłę trendu wzrostowego i spadkowego. Według autora, Bear Power powinien przez większość czasu pozostawać ujemny, a Bulls Power dodatni. Mogą być stosowane osobno, jak i razem. Autor jednak zaleca trzymania się zasady, która mówi, że pozycje powinno się otwierać zgodnie z kierunkiem obowiązującego trendu wyznaczonego przez średnią kroczącą. Wskaźniki Bulls i Bears Power służą do zdefiniowania momentu wejścia i wyjścia z pozycji.
Składnia: double ibearspower( string symbol, int timeframe, int period, int applied_price, int shift) double ibullspower( string symbol, int timeframe, int period, int applied_price, int shift) Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period ilość słupków dla średniej applied_price wskazanie na której wartości ceny mają być dokonywane obliczenia: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku Przykład: double bears= ibearspower(symbol(), 0, 13, PRICE_CLOSE, 0); double bulls= ibullspower(symbol(), 0, 13, PRICE_CLOSE, 0);
ATR ATR (Average True Range) został utworzony przez J.Wellesa Wildera. Mierzy on zmienność zaobserwowaną na danym instrumencie w następujący sposób: dla danego okresu liczy True Range, czyli rzeczywisty zakres zmian wyrażony jako: różnica między wartością maksymalną i minimalną w danym okresie t, różnica między ostatnią wartością w poprzednim okresie t a wartością maksymalną w danym okresie t, różnica między ostatnią wartością w poprzednim okresie t a wartością minimalną w danym okresie t.
Wskaźnik ten w prosty sposób pozwala pomiar istniejącej zmienności na rynku i przez to odczytanie odpowiednich sygnałów przy budowie strategii opartych o skoki zmienności. Dodatkowo wskaźnik ten często jest wykorzystywany do budowy strategii zarządzania kapitałem. Składnia: double iatr( string symbol, int timeframe, int period, int shift) Parametry: symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period ilość słupków dla średniej shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku Przykład: double wartosc = iatr(symbol(), 0, 12, 0);
MFI MFI (Money Flow Index) - indeks przepływów pieniężnych. Jest to oscylator mierzący wielkość strumieni pieniężnych dopływających i wychodzących z rynku. W konstrukcji jest to wskaźnik zbliżony do RSI, przy czym oprócz zmian ceny bierze pod uwagę wolumen. Sesjom wzrostowym towarzyszy pozytywny przepływ środków pieniężnych, sesjom spadkowym negatywny. Wskaźnik jest wykorzystywany jako miernik stanów wykupienia i wyprzedania rynku. Wartości oscylatora powyżej 80 pkt. sugerują bliskie maksimum rynkowe, poniżej 20 pkt. jest to stan wyprzedania rynku i w związku z tym zbliżające się minimum. Dodatkowo zalecane jest poszukiwanie dywergencji w wymienionych wyżej strefach.
Składnia: double imfi( string symbol, int timeframe, int period, int shift ) Parametry symbol symbol rynku lub NULL dla aktualnego symbolu z wykresu timeframe skala czasowa danych lub 0 dla aktualnej skali czasowej z wykresu symbolu period - ilość słupków dla wyznaczenia wartości wskaźnika shift przesunięcie względem aktualnego numeru słupka Wartość zwracana: wynik obliczeń wskaźnika na danym słupku Przykład: if( imfi(symbol(),0,14,0) > 80 ) { Alert( Sygnał sprzedaży ); if( imfi(symbol(),0,14,0) < 20 ) { Alert( Sygnał kupna ); Źródło: http://bossa.pl/edukacja/at/wskazniki/ http://bossa.pl/fx/narzedzia/automatyzacja/slownik/funkcje/wskaznikowat/
Przykład 1 - skrypt int start() { int wybor; wybor = MessageBox("Mam otworzyc pozycje long czy short (YES/NO)", "Wybor rodzaju pozycji", MB_YESNO MB_ICONQUESTION); if(wybor==6) { if(accountfreemargincheck( Symbol(), OP_BUY, 0.1) > 0) OrderSend(Symbol(), OP_BUY, 0.1, Ask, 10, 0, 0, NULL, MAGICMA, 0, Green); if(wybor==7) { if(accountfreemargincheck( Symbol(), OP_SELL, 0.1) > 0) OrderSend(Symbol(), OP_SELL, 0.1, Bid, 10, 0, 0, NULL, MAGICMA, 0, Red); return(0);
Przykład 2 skrypt int start() { if(orderstotal()>0) { if(orderselect(0,select_by_pos)==true) { // jeśli long if(ordertype()==0) { Alert("Long Numer=",OrderTicket()," wolumen=", OrderLots()); OrderClose(OrderTicket(), OrderLots(), Bid, 10); // jeśli short if(ordertype()==1) { Alert("Short Numer=",OrderTicket()," wolumen=", OrderLots()); OrderClose(OrderTicket(), OrderLots(), Ask, 10); else { Alert("brak pozycji do zamkniecia"); return(0);
Przykład 3 skrypt otwiera 3 pozycje long a następnie zamyka je po upływie 5 sekund int start() { int i; double konto=accountequity(); if(orderstotal()==0) { if( AccountFreeMarginCheck( Symbol(), OP_BUY, 0.6) > 0) { OrderSend(Symbol(), OP_BUY, 0.1, Ask, 5, 0, 0, NULL, MAGICMA, 0, Green); OrderSend(Symbol(), OP_BUY, 0.2, Ask, 5, 0, 0, NULL, MAGICMA, 0, Green); OrderSend(Symbol(), OP_BUY, 0.3, Ask, 5, 0, 0, NULL, MAGICMA, 0, Green); Sleep(5000); for(i=0; i<3; i++) { if(orderselect(0,select_by_pos)==true) { if(ordertype()==0) { OrderClose(OrderTicket(), OrderLots(), Bid, 10); Alert("Bylo=",konto," jest=",accountequity()); return(0);
Przykład 4 skrypt zamyka lub wycofuje pozycje z rynku int start() { if(orderstotal()>0) { while(orderstotal()>0) { if(orderselect(0,select_by_pos)==true) { switch(ordertype()) { case 0: Alert("Wynik pozycji long otw. po kursie ",OrderOpenPrice()," to ", OrderProfit()); OrderClose(OrderTicket(), OrderLots(), Bid, 50); break; case 1: Alert("Wynik pozycji short otw. po kursie ",OrderOpenPrice()," to ", OrderProfit()); OrderClose(OrderTicket(), OrderLots(), Ask, 50); break; case 2: Alert("Wycofane zlecenie BuyLimit wynik=",orderprofit()); OrderDelete(OrderTicket()); break; case 3: Alert("Wycofane zlecenie SellLimit wynik=",orderprofit()); OrderDelete(OrderTicket()); break; case 4: Alert("Wycofane zlecenie BuyStop wynik=",orderprofit()); OrderDelete(OrderTicket()); break; case 5: Alert("Wycofane zlecenie SellStop wynik=",orderprofit()); OrderDelete(OrderTicket()); break; default: break; return(0);
Przykład 5 skrypt zlecenia z aktywowanymi poziomami SL i TP int start() { datetime czas=time[0]; int odl=marketinfo(symbol(),mode_stoplevel); double xxx=(odl+10)*point; if(accountfreemargincheck(symbol(),op_sell,0.1)>0) OrderSend(Symbol(), OP_SELL, 0.1, Bid, 20, Ask+xxx, Bid-xxx, NULL, MAGICMA, 0, Red); if(accountfreemargincheck(symbol(),op_sell,0.1)>0) OrderSend(Symbol(), OP_SELLLIMIT, 0.1, Ask+xxx, 20, Ask+2*xxx, Ask, NULL, MAGICMA, 0, Red); if(accountfreemargincheck(symbol(),op_sell,0.1)>0) OrderSend(Symbol(), OP_SELLSTOP, 0.1, Bid-xxx, 20, Bid, Bid-2*xxx, NULL, MAGICMA, 0, Red); if(accountfreemargincheck(symbol(),op_buy,0.1)>0) OrderSend(Symbol(), OP_BUY, 0.1, Ask, 20, Bid-xxx, Ask+xxx, NULL, MAGICMA, 0, Green); if(accountfreemargincheck(symbol(),op_buy,0.1)>0) OrderSend(Symbol(), OP_BUYLIMIT, 0.1, Bid-xxx, 20, Bid-2*xxx, Bid, NULL, MAGICMA, 0, Green); if(accountfreemargincheck(symbol(),op_buy,0.1)>0) OrderSend(Symbol(), OP_BUYSTOP, 0.1, Ask+xxx, 20, Ask, Ask+2*xxx, NULL, MAGICMA, 0, Green); while(czas==time[0]) { Sleep(5000); Alert("czekam ", czas," ", Time[0]); RefreshRates(); if(orderstotal()>0) { while(orderstotal()>0) { if(orderselect(0,select_by_pos)==true)
{ switch(ordertype()) { case 0: Alert("Wynik pozycji long otw. po kursie ",OrderOpenPrice()," to ", OrderProfit()); OrderClose(OrderTicket(), OrderLots(), Bid, 50); break; case 1: Alert("Wynik pozycji short otw. po kursie ",OrderOpenPrice()," to ", OrderProfit()); OrderClose(OrderTicket(), OrderLots(), Ask, 50); break; case 2: Alert("Wycofane zlecenie BuyLimit",OrderProfit()); OrderDelete(OrderTicket()); break; case 3: Alert("Wycofane zlecenie SellLimit",OrderProfit()); OrderDelete(OrderTicket()); break; case 4: Alert("Wycofane zlecenie BuyStop",OrderProfit()); OrderDelete(OrderTicket()); break; case 5: Alert("Wycofane zlecenie SellStop",OrderProfit()); OrderDelete(OrderTicket()); break; default: break; return(0);
Przykład 6 strategia int init() { czas=time[0]; return(0); int start() { if(czas!=time[0]) { if(open[0] > Open[1]) { if( OrdersTotal()==0) { if(accountfreemargincheck( Symbol(), OP_BUY, 0.1) > 0) { OrderSend(Symbol(), OP_BUY, 0.1, Ask, 5, 0, 0, NULL, MAGICMA, 0, Green); else { if(orderselect(0,select_by_pos)==true) { if(ordertype()==1) { OrderClose(OrderTicket(), OrderLots(), Ask, 10);
if(open[0] < Open[1]) { if( OrdersTotal()==0) { if(accountfreemargincheck( Symbol(), OP_SELL, 0.1) > 0) { OrderSend(Symbol(), OP_SELL, 0.1, Bid, 5, 0, 0, NULL, MAGICMA, 0, Red); else { if(orderselect(0,select_by_pos)==true) { if(ordertype()==0) { OrderClose(OrderTicket(), OrderLots(), Bid, 10); return(0);
Przykład 7 strategia int init() { czas=time[0]; return(0); int start() { int liczba_pozycji, i; if(czas!=time[0]) { if(open[0] > Open[1]) { if( OrdersTotal()==0) { if(accountfreemargincheck( Symbol(), OP_BUY, 0.1) > 0) { OrderSend(Symbol(), OP_BUY, 0.1, Ask, 5, 0, 0, NULL, MAGICMA, 0, Green); else { if(orderselect(0,select_by_pos)==true) { if(ordertype()==0 && OrdersTotal()<3 && AccountFreeMarginCheck( Symbol(), OP_BUY, 0.1) > 0) { OrderSend(Symbol(), OP_BUY, 0.1, Ask, 5, 0, 0, NULL, MAGICMA, 0, Green); if(ordertype()==1) { liczba_pozycji=orderstotal(); for(i=0; i<liczba_pozycji; i++) { if(orderselect(0,select_by_pos)==true)
{ OrderClose(OrderTicket(), OrderLots(), Ask, 10); if(open[0] < Open[1]) { if( OrdersTotal()==0) { if(accountfreemargincheck( Symbol(), OP_SELL, 0.1) > 0) { OrderSend(Symbol(), OP_SELL, 0.1, Bid, 5, 0, 0, NULL, MAGICMA, 0, Red); else { if(orderselect(0,select_by_pos)==true) { if(ordertype()==1 && OrdersTotal()<3 && AccountFreeMarginCheck( Symbol(), OP_SELL, 0.1) > 0) { OrderSend(Symbol(), OP_SELL, 0.1, Bid, 5, 0, 0, NULL, MAGICMA, 0, Red); if(ordertype()==0) { liczba_pozycji=orderstotal(); for(i=0; i<liczba_pozycji; i++) { if(orderselect(0,select_by_pos)==true) { OrderClose(OrderTicket(), OrderLots(), Bid, 10); return(0);
Przykład 8 strategia zastosowanie wskaźników analizy technicznej #define MAGICMA 111111 datetime czas; int init() { czas=time[0]; return(0); int start() { double RSI, SD, SK; if(czas!=time[0]) { czas=time[0]; RSI=iRSI(Symbol(), 0, 4, PRICE_CLOSE,1); SD=iMA(Symbol(), 0, 15, 0, MODE_EMA, PRICE_CLOSE, 1); SK=iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, 1); if(rsi<35 && SK> SD) { if(orderstotal()==0 && AccountFreeMarginCheck(Symbol(),OP_BUY,0.1)>0) { OrderSend(Symbol(), OP_BUY, 0.1, Ask, 20, 0, 0, NULL, MAGICMA, 0, Green); else { if(orderselect(0, SELECT_BY_POS)==true) { if( OrdersTotal()==1 && OrderType()==0 && AccountFreeMarginCheck(Symbol(),OP_BUY,0.1)>0)
{ OrderSend(Symbol(), OP_BUY, 0.1, Ask, 20, 0, 0, NULL, MAGICMA, 0, Green); else { if(ordertype()==1) { OrderClose(OrderTicket(), OrderLots(), Ask, 50); if(rsi>65 && SK<SD) { if(orderstotal()==0 && AccountFreeMarginCheck(Symbol(),OP_SELL,0.1)>0) { OrderSend(Symbol(), OP_SELL, 0.1, Bid, 20, 0, 0, NULL, MAGICMA, 0, Red); else { if(orderselect(0, SELECT_BY_POS)==true) { if(orderstotal()==1 && OrderType()==1 && AccountFreeMarginCheck(Symbol(),OP_SELL,0.1)>0) { OrderSend(Symbol(), OP_SELL, 0.1, Bid, 20, 0, 0, NULL, MAGICMA, 0, Red); else { if(ordertype()==0) { OrderClose(OrderTicket(), OrderLots(), Bid, 50); return(0);
Przykład 9 strategia #define MAGICMA 111111 datetime czas; int init() { czas=time[0]; return(0); int start() { double RSI, SD, SK; if(czas!=time[0]) { czas=time[0]; int j; RSI=iRSI(Symbol(), 0, 4, PRICE_CLOSE,1); SD=iMA(Symbol(), 0, 15, 0, MODE_EMA, PRICE_CLOSE, 1); SK=iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, 1); if(rsi<35 && SK> SD) { if(orderstotal()==0 && (AccountEquity()*0.2>=AccountEquity() AccountFreeMarginCheck(Symbol(),OP_BUY,0.1))) { OrderSend(Symbol(), OP_BUY, 0.1, Ask, 20, 0, 0, NULL, MAGICMA, 0, Green);
else { if(orderselect(0, SELECT_BY_POS)==true) { if(ordertype()==0 && (AccountEquity()*0.2>=AccountEquity() AccountFreeMarginCheck(Symbol(),OP_BUY,0.1))) { OrderSend(Symbol(), OP_BUY, 0.1, Ask, 20, 0, 0, NULL, MAGICMA, 0, Green); else { if(ordertype()==1) { j=0; while(orderstotal()-j>0) { if(orderselect(0+j, SELECT_BY_POS)==true) { if(ordertype()==1) { OrderClose(OrderTicket(), OrderLots(), Ask, 50); else j++; else j++; if(rsi>65 && SK<SD) { if(orderstotal()==0 && (AccountEquity()*0.2>=AccountEquity() AccountFreeMarginCheck(Symbol(),OP_SELL,0.1)))
{ OrderSend(Symbol(), OP_SELL, 0.1, Bid, 20, 0, 0, NULL, MAGICMA, 0, Red); else { if(orderselect(0, SELECT_BY_POS)==true) { if(ordertype()==1 && (AccountEquity()*0.2>=AccountEquity() AccountFreeMarginCheck(Symbol(),OP_SELL,0.1))) { OrderSend(Symbol(), OP_SELL, 0.1, Bid, 20, 0, 0, NULL, MAGICMA, 0, Red); else { if(ordertype()==0) { j=0; while(orderstotal()-j>0) { if(orderselect(0+j, SELECT_BY_POS)==true) { if(ordertype()==0) { OrderClose(OrderTicket(), OrderLots(), Bid, 50); else j++; else j++; return(0);
Przykład 10 strategia - zastosowanie optymalizowanych parametrów #define MAGICMA 111111 extern int zasiegrsi=12, int EMAshort=8, EMAlong=12; datetime czas; int init() { czas=time[0]; return(0); int start() { double WRSI, WEMA, short, long; if(time[0]!=czas) { czas=time[0]; WRSI=iRSI(Symbol(),0,zasiegRSI,PRICE_CLOSE, 1); short=ima(symbol(), 0, EMAshort, 0, MODE_EMA, PRICE_CLOSE, 1); long=ima(symbol(), 0, EMAlong, 0, MODE_EMA, PRICE_CLOSE, 1); WEMA= short-long; if(wrsi<=30 && WEMA>0) transakcja(0, 0.5); if(wrsi>30 && WRSI<70 && WEMA>0) transakcja(0, 0.1); if(wrsi>30 && WRSI<70 && WEMA<0) transakcja(1, 0.1); if(wrsi>=70 && WEMA<0)
transakcja(1, 0.5); return(0); void transakcja(int pozycja, double size) { int ticket; double lots; if(orderstotal()==0) { if(pozycja==0) OrderSend(Symbol(), OP_BUY, size, Ask, 5, 0, 0, NULL, MAGICMA, 0, Green); if(pozycja==1) OrderSend(Symbol(), OP_SELL, size, Bid, 5, 0, 0, NULL, MAGICMA, 0, Red); else { if(orderselect(0,select_by_pos)==true) { lots=orderlots(); ticket=orderticket(); if( (OrderType()==0) && (pozycja==1)) OrderClose(ticket, lots, Bid, 2); if( (OrderType()==1) && (pozycja==0)) OrderClose(ticket, lots, Ask, 2);
Przykład 11 strategia zastosowanie optymalizowanych parametrów #define MAGICMA 111111 extern int krok=10, zasiegrsi=4, EMAkrotka=4, EMAdluga=20; extern double wstega_zakres=20, wstega_odl=2, wsp=0.0002; double inwestycja, xxx, WRSI, WEMA, wst_gorna, wst_dolna; datetime czas; int init() { czas=time[0]; inwestycja=accountequity(); xxx=(marketinfo(symbol(),mode_stoplevel)+krok)*point; wsp=bid*wsp; return(0); int start() { int sygnal=-1; double size=1; if(czas!=time[0]) { WRSI=iRSI(Symbol(),0, zasiegrsi,price_close, 1); WEMA= ima(symbol(), 0, EMAkrotka, 0, MODE_EMA, PRICE_CLOSE, 1) ima(symbol(), 0, EMAdluga, 0, MODE_EMA, PRICE_CLOSE, 1); wst_gorna = ibands(symbol(), 0, wstega_zakres, wstega_odl, 0, PRICE_OPEN, MODE_UPPER,0); wst_dolna = ibands(symbol(), 0, wstega_zakres, wstega_odl, 0, PRICE_OPEN, MODE_LOWER,0);
ustal_sygnal(sygnal, size); zarzadzaj_transakcjami(sygnal, size); return(0); void ustal_sygnal(int &decyzja, double &wol) { if(wrsi<35 && WEMA>wsp && Ask<wst_dolna) { decyzja=0; wol=1; if( (WRSI>=35 && WRSI<=65 && WEMA>wsp && Ask<wst_dolna) (WRSI<35 && WEMA>wsp && Bid>wst_dolna && Ask<wst_gorna) (WRSI<35 && WEMA>=-wsp && WEMA<=wsp && Ask<wst_dolna) ) { decyzja=0; wol=0.5; if( (WRSI>=35 && WRSI<=65 && WEMA>=-wsp && WEMA<=wsp && Ask<wst_dolna) (WRSI>=35 && WRSI<=65 && WEMA>wsp && Bid>wst_dolna && Ask<wst_gorna) (WRSI<35 && WEMA>=-wsp && WEMA<=wsp && Bid>wst_dolna && Ask<wst_gorna) ) { decyzja=2; wol=0.2;
if(wrsi>70 && WEMA<-wsp && Bid>wst_gorna) { decyzja=1; wol=1; if( (WRSI<=65 && WRSI>=35 && WEMA<-wsp && Bid>wst_gorna) (WRSI>65 && WEMA>=-wsp && WEMA<=wsp && Bid>wst_gorna) (WRSI>65 && WEMA<-wsp && Bid>wst_dolna && Ask<wst_gorna) ) { decyzja=1; wol=0.5; if( (WRSI<=65 && WRSI>=35 && WEMA>=-wsp && WEMA<=wsp && Bid>wst_gorna) (WRSI<=65 && WRSI>=35 && WEMA>-wsp && Bid>wst_dolna && Ask<wst_gorna) (WRSI>70 && WEMA>=-wsp && WEMA<=wsp && Bid>wst_dolna && Ask<wst_gorna) ) { decyzja=3; wol=0.2; void zarzadzaj_transakcjami(int sygnal, double size) { int j; if(orderstotal()>0) { for(j=0; j<orderstotal(); j++) { if(orderselect(j, SELECT_BY_POS)==true)
{ if(ordertype()==0) { if( (Bid - (OrderStopLoss() + 10*Point) > xxx*point) ( (OrderTakeProfit() + 5*Point) - Ask > xxx*point) ) { if(ordermodify(orderticket(),orderopenprice(),orderstoploss() + 10*Point,OrderTakeProfit() + 5*Point,0,Blue)==False) { Alert("Blad modyfikacji pozycji long o numerze "); else Alert("Zmodyfikowano pozycje long"); else Alert("Brak warunkow do modyfikacji pozycji long" ); if(ordertype()==1) { if( ((OrderStopLoss() - 10*Point)- Ask > xxx*point) (Bid - (OrderTakeProfit() - 5*Point)) > xxx*point) { if(ordermodify(orderticket(),orderopenprice(),orderstoploss() 10*Point,OrderTakeProfit() - 5*Point,0,Blue)==False) { Alert("Blad modyfikacji pozycji short "); else Alert("Zmodyfikowano pozycje short");
else Alert("Brak warunkow do modyfikacji pozycji short"); if(accountequity()> 0.5 *inwestycja ) { if(sygnal==0 && AccountFreeMarginCheck(Symbol(),OP_BUY,size)>0) OrderSend(Symbol(), OP_BUY, size, Ask, 10, Bid-xxx, Ask+xxx, NULL, MAGICMA, 0, Green); if(sygnal==1 && AccountFreeMarginCheck(Symbol(),OP_SELL,size)>0) OrderSend(Symbol(), OP_SELL, size, Bid, 10, Ask+xxx, Bid-xxx, NULL, MAGICMA, 0, Red); if(sygnal==2 && AccountFreeMarginCheck(Symbol(),OP_BUY,size)>0) OrderSend(Symbol(), OP_BUYLIMIT, size, Bid-xxx, 10, Bid-2*xxx, Bid, NULL, MAGICMA, 0, Green); if(sygnal==3 && AccountFreeMarginCheck(Symbol(),OP_SELL,size)>0) OrderSend(Symbol(), OP_SELLLIMIT, size, Ask+xxx, 10, Ask+2*xxx, Ask, NULL, MAGICMA, 0, Red);
MataTrader Własne strategie handlowe
Optymalizacji dokonuje się na wybranej parze walutowej (EURUSD) i horyzoncie czasowym (od 2014-01-01 do 2014-04-11) przy uwzględnieniu danych pogrupowanych według wskazanego przedziału czasowego (H1 1 godzina). W zakładce rezultaty widzimy efekty przeprowadzonej optymalizacji (tylko dodatnie wartości zysku ). Klikając na kolumnę zysk sortujemy otrzymane wyniki od najlepszego do najgorszego. Poprzez podwójne kliknięcie na dany wiersz dokonuje się wprowadzenia do systemu wartości przypisanych do tego wiersza (kolumna Wpisz parametry).
Dostęp do danych do analizy w jakich okolicznościach został uzyskany dany wynik optymalizacji dokonuje się poprzez dwukrotnie naciśnięcie danego wiersza a następnie przycisku Start.