MQL

ODPOWIEDZ
no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

MQL

poniedziałek 29 lut 2016, 21:43

Bardzo brakuje mi tutaj informacji o wielkim narzędzi jakie udostępnia MT4 - możliwość programowania za pomocą języka MQL. Jeśli istnieje taka możliwość to proszę adminów bym miał dostęp do edycji tego posta przez cały czas - postaram się robić linki do ew. pytań i odpowiedzi jakie mi się pojawiał podczas programowania.

Na początek kilka stron, które udało mi się znaleźć przy okazji szukania informacji do MetaQuotes Language 4.
Bossa -
Słownik poleceń MQL4

tradingexpert - Ogólne informacje o języku Metaquotes
Mql4 Lesson Video
https://www.forex-tsd.com/forum/debates ... rogramming
Jeżeli natomiast chcesz się nauczyć C++ to polecam http://cpp0x.pl

Programowanie było kiedyś moja pasją, niestety ze względu na czas jaki temu poświęcałem i brak możliwości rozwoju i przy okazji zarabiania na tym - zrezygnowałem. Uczyłem się C++, ActionScript(pisałem w tym prace dyplomową), a obecnie trochę pracuję w PowerShellu.
W najbliższym czasie zaprezentuje moje modyfikacji dostępnych rozwiązań, które mają za zadanie pomagać mi w nie straceniu głowy.
Docelowo mam nadzieje, kiedyś napisać prostego robota na podstawie moich obserwacji rynku.

no avatar
irmentruda
Maniak Forex
Posty: 1103
Rejestracja: piątek 19 wrz 2014, 11:30
Lat na Forex: 3
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Silesia

Re: MQL

wtorek 01 mar 2016, 05:59

i jeszcze sama podstawowa strona:
https://docs.mql4.com/

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

piątek 04 mar 2016, 13:26

Obecnie przynajmniej w moim przypadku używany jest już MQL5 - https://www.mql5.com/en/docs

Dodatkowo trafiłem na fajny kurs dla początkujących opisujący podstawowe zagadnienia
Kurs MetaQuotes Language 4.doc.zip
Prezentuje dwa przerobione wskaźnik informacyjne - które mają pomóc mi w zagraniach i nie traceniu głowy.
Pierwszy z nich to kompilacja dwóch wskaźników:
'EndOfBar' indicator by 'karcewzrokiem',
'Profitstat' indicator by 'FxAutomatedcom'. Ja stworzyłem swój własny w oparciu o nie.
Profit_Pozycje.mq4 -
Profit_Pozycje.mq4
Ma on za zadanie informować mnie o tym, czy nie przekroczyłem maksymalnej liczby transakcji na dzień lub maksymalnej dziennej straty zamkniętych pozycji. Dodatkowo wyświetla informacji o czasie po którym skończy się malować słupek M30.

Drugim wskaźnikiem jest oparty o rozwiązanie - Informer - indicator for MetaTrader 4. Wskaźnik ten pokazuje informacje o koncie, oraz historię transakcji (może pokazywać live np. SL TP - ja to jednak usunąłem).
Ogólnie moja rola ograniczyła się do usunięcia tego co mi nie będzie potrzebne. Dodatkowo wskaźnik pokazuje się tylko na H1 (łatwo to zmienić). A statystyki konta pojawiają się po kliknięciu klawisza O i P (hotkey), usuwa się zaś klawiszem ESC lub zmieniając interwał.
Informer_v4_1.mq4 -
Informer_v4_1.mq4
Przykład wyglądu informacji -
Profit_Pozycja_Informer_przyklad_2016.gif
Profit_Pozycja_Informer_przyklad1_2016.gif
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

środa 16 mar 2016, 23:09

GoldWolf pisze:Obecnie przynajmniej w moim przypadku używany jest już MQL5 - https://www.mql5.com/en/docs
Ciut przesadziłem, bo o ile dokumentacja jest podobna, to jednak mnie nie udało się odpalić rozwiązania z mq5 (kompilować można).

Prezentuje mój pierwszy Expert Advisor, który spełni moje oczekiwania http://forum.comparic.pl/viewtopic.php? ... 784#p55152
Głównym założeniem było by za pomocą skrótu klawiszy zająć pozycje i ustawić SL. Dodatkowo by nie można było otworzyć pozycji w byle jakim miejscu. Prezentowany EA zawiera tylko 30% całości, ponieważ dla Buy/Sell przyjąłem swoje założenia systemowe, które usunąłem z kodu.
Natomiast pozostawiłem moduł auto. Moduł ten zakłada automatyczne otworzenie pozycji Buy/Sell w zależności od tego jak zakończył się słupek H4 i czy poprzedni H1 był przeciwny do trendu(domniemany trend), który się rozpoczął.
Spróbuje to wytłumaczyć na prostym przykładzie. Załóżmy obserwuje notowania EURJPY
EURJPY_EA_koncepcja_Buy_Sell.gif
Przyjrzyjmy się pierwszemu trójkątowi z bliska - 29.02.2016
EURJPY_EA_koncepcja_Sell.gif
Zauważyliśmy pierwszy spadkowy H4 i teraz czekamy na pierwszy H1 zakończy się na plus, czyli przeciwnie do trendu, który się rozpoczął (trzeba tutaj pamiętać, że w chwili zobaczenia pierwszego H4 my nie wiemy czy trend się utrzyma).
Po zakończeniu się rysowania świecy H1 wzrostowej (zaznaczonej strzałeczką na wykresie) gdy używając EA wciśniemy klawisz Shift +X - EA sam otworzy pozycje Sell, ale tylko pod pewnymi warunkami:
- jeżeli ostatni H4 jest spadkowy,
- jeżeli poprzedni H1 był wzrostowy,
- i jeżeli cena jest wyżej niż zamknięcie ostatniego H1, ale niższa niż otwarcie ostatniego H4.
Dokładnie warunek wygląda tak

Kod: Zaznacz cały

case KEY_X :{
                  double OtwarcieH_4 = iOpen(NULL,PERIOD_H4,1);
                  double ZamkniecieH_4 = iClose(NULL,PERIOD_H4,1);
                  double OtwarcieH_1 = iOpen(NULL,PERIOD_H1,1);
                  double ZamkniecieH_1 = iClose(NULL,PERIOD_H1,1);
                                       
                  if(OtwarcieH_4 > Bid && ZamkniecieH_1 < Bid && OtwarcieH_4 < ZamkniecieH_4 && OtwarcieH_1 < ZamkniecieH_1){
Mam nadzieję, że w miarę jasno to opisałem. Czyli de facto moglibyśmy zająć 2 razy pozycje spełniające te warunki (zaznaczone na wykresie). Dla pozycji przeciwnej czyli Buy, sprawa wygląda tak samo.
Jeśli zauważymy H4, który naszym zdaniem może tworzyć trend wzrostowy to czekamy na pojawienie się pierwszej świecy spadkowej H1.
EURJPY_EA_koncepcja_Buy.gif
Warunki tak samo:
- jeżeli ostatni H4 jest wzrostowy,
- jeżeli ostatni H1 był spadkowy,
- i jeżeli cena jest niżej niż zamknięcie ostatniego H1, ale wyżej niż otwarcie ostatniego H4. W obu przypadkach zaznaczonych na wykresie pozycje by się utrzymały, bo ustawiam dla nich szerszy SL niż normalnie grając systemem główny.

Ale to nie wszystko Zajęliśmy pozycje, ale trzeba określić SL i wielkość pozycji (w linii kody 15 - 18) mamy takie parametry:

Kod: Zaznacz cały

double lot = 0.06, lot_auto = 0.01;
int SL_Kup = 54; //domyślnie
int SL_Sprzedaj = 54; //domyślnie
int SL_Auto = 0;  //domyślnie
Natomiast w zależności od waloru ustawiam indywidualnie jakie mają być wartości:

Kod: Zaznacz cały

if(Symbol() == "USDCAD"){
   lot = 0.08; 
   SL_Kup = SL_Sprzedaj = 92;  //całość ze int spreed = 25;
   SL_Auto = 209;
   lot_auto = 0.04;
 }else if(Symbol() == "EURJPY"){
   lot = 0.07;
   SL_Kup = SL_Sprzedaj = 89;
   SL_Auto = 209;
   lot_auto = 0.03;
  }else if(Symbol() == "US30"){
   lot = 0.02;
   SL_Kup = SL_Sprzedaj = 61;
   SL_Auto = 99;
   lot_auto = 0.01;
   }
Gram tylko 3 pary więc tylko 3 mam zdeklarowane. Dla prezentowanego modułu interesują nas tylko dwie pozycje w prezentowanym kodzie

Kod: Zaznacz cały

   SL_Auto = 99;
   lot_auto = 0.01;
Dodatkowo przyjąłem, że mogę w danej godzinie tylko raz otworzyć pozycję. Po zajęciu pozycji EA przełącza się na H4 lub gdy jest już po czasie pracy.
Na koniec przy uruchomieniu EA określamy godziny w których będziemy grać, po to by nie można było zająć pozycji gdy nie gram w odpowiedniej dla nas porze.
To chyba wszystko - jakby coś proszę pytać.
Bardzo się cieszę z osiągniętego rezultatu. Szkoda, że od razy nie zająłem się MQL, bo na pewno miałbym mniejsze straty. Jeśli chodzi o to co zostało wycięte, to dla Buy i Sell wygląda to tak samo tylko różni się warunkami i oczywiście SL i wielkością pozycji.
A zapomniałbym gdy zostanie zajęta pozycja, tworzy się plik w lokalizacji C:\Users\GoldWolf\AppData\Roaming\MetaQuotes\Terminal\227B599E761B247E81C4D7230A2150D1\MQL4\Files. Plik zawiera parametry zagrania - pozycję (S lub B), SL i cenę kupna.

PS dla chętnych proponuję pobawić się na Demo by sprawdzić, czy wszystko działa poprawnie - nie wszystko mogłem przewidzieć.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

wtorek 22 mar 2016, 09:01

Dla powyższego warunku znalazłem błąd, prawidłowo powinno to wyglądać tak:
Dla SELL

Kod: Zaznacz cały

case KEY_X :{
                  double OtwarcieH_4 = iOpen(NULL,PERIOD_H4,1);
                  double ZamkniecieH_4 = iClose(NULL,PERIOD_H4,1);
                  double OtwarcieH_1 = iOpen(NULL,PERIOD_H1,1);
                  double ZamkniecieH_1 = iClose(NULL,PERIOD_H1,1);
                  //Print(" OtH4 - ", OtwarcieH_4, "   ZamH4 - ", ZamkniecieH_4, "   Ot1 - ", OtwarcieH_1, "  Zam1 - ", ZamkniecieH_1);
                  if(OtwarcieH_4 > Bid && ZamkniecieH_1 < Bid && OtwarcieH_4 > ZamkniecieH_4 && OtwarcieH_1 < ZamkniecieH_1){
Dla BUY

Kod: Zaznacz cały

}else if(OtwarcieH_1 < Bid && ZamkniecieH_1 > Bid && OtwarcieH_1 > ZamkniecieH_1 && OtwarcieH_4 < ZamkniecieH_4){

Trafiłem na 2 fajne wskaźniki, które dodają możliwość w jednym oknie podglądu na różne timeframy.
Pierwszy z nich - Pipware minichart v 3.0, bardzo ładnie wkomponowuje się w wykres
Pipware_minichart_wskaznik.gif
By dobrze działał w paczcie jest czcionka do instalacji, nie wiem czy wymagana - ja zainstalowałem.

Natomiast drugi Recent Candles (autor - hanover) może mniej estetyczny, ale dla mnie bardziej przydatny ponieważ jest do niego kod
RecentCandles_Wskaznik.gif
Ciut go zmodyfikowałem by nie trzeba było dodatkowego pliku do jego pracy. Więcej informacji i o jego możliwościach poczytacie na stronie http://www.forexfactory.com/showthread. ... 44&page=10.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

wtorek 05 kwie 2016, 10:52

Na początek czas na wskaźnik - InfoGW. Jest on pewną kompilacją rozwiązań, które mi się spodobały.
Wskaźnik składa się z:
1. Profitstat informuje o historii(stracie/zysku, oraz liczbie) zakończonych zagrań dzisiaj i wczoraj. Posiada mechanizm blokujący aplikację, określamy ile zagrań oraz jaką stratę dziennie chcemy przyjąć. Dla konta Demo można ustawić osobno te wartości wprowadzając jest w linii 95

Kod: Zaznacz cały

BudzetDzienny = -299;
Gdy jedna z wartości (LiczbaZagran lub BudzetDzienny) zostanie przekroczona moduł ten wykona polecenia zamknięcia Terminala (blokada trwa do końca dnia) i bez zmiany w kodzie nie będzie się dało uruchomić MT4 bez jego ponownego zamknięcia. W soboty i niedziele moduł nie jest aktywny - nie zamyka MT4.

2. EndOfBar to prosty moduł pokazuje mi czas do zakończenia malowania się słupka M30.

3. Informer informuje o statystyce dla konta, oraz pokazuje historię zakończonych transakcji na wykresie(dla M30 i H4). Dodatkowo zapisuje dane do pliku w moim przypadku wybrałem dane -

Kod: Zaznacz cały

(string) OrderSymbol() + "\t" +(string) OrderStopLoss() + "\t" + (string)  OrderOpenPrice() + "\t" + (string) OrderClosePrice() + "\t\t\t" + DoubleToString(OrderProfit(),2)
Dane te kopiuję do pliku w celu analizy współczynnika R i statystyki.
Moduł ten działa w oparciu o skróty klawiszowe:
- "O" + "I" - pokazuje historię transakcji i zapisuje do pliku
- "O" + "P" - pokazuje statystykę konta

Dodatkowo Klawisz "ESC" usuwa prezentowane informacje z modułu Informer (zmiana interwały też usuwa informacje).
Wprowadziłem też brak możliwości schodzenia na niższe interwały niż M30, prosty warunek

Kod: Zaznacz cały

   if (Period()== PERIOD_M1 || Period()== PERIOD_M5 || Period()== PERIOD_M15) //jeżeli M1,M5,M15 to zmienia na H4
      ChartSetSymbolPeriod(NULL,NULL,PERIOD_H4);
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

piątek 15 kwie 2016, 23:17

Prezentuje moje świeżo zmodyfikowane EA - ZajmijUstawSL. Nazwa sama mówi za siebie, EA ma mi pomóc w zajmowaniu pozycji i automatycznego ustawienia SL. Mam tutaj kilka rozwiązań.


1. Zajmuje pozycje automatycznie obierając kierunek - gdy naciśniemy TAB + Q:
-SELL gdy

Kod: Zaznacz cały

if(ZamkniecieM_30 <= Bid && Otwarcie_M30 <= Bid)
zamknięcie i otwarcie ostatniego zakończonego słupka jest mniejsze od Bid - czyli zajmuje pozycje gdy ostatni namalowany słupek był wzrostowy
-BUY gdy

Kod: Zaznacz cały

if(Otwarcie_M30 > Bid)
cena otwarcia aktualnie malującej się świecy jest wyższa niż Bid
Czyli nasza rola ogranicza się tylko do odpowiedniego skupienia i kliknięcia dwóch klawiszy, reszta zrobi się sama. SL jest ustawiony na maksimum z dwóch ostatnich tygodni dla SELL, a minimum z dwóch ostatnich tygodniu dla BUY. Dlaczego zastosowałem tak odległy SL, ponieważ często mnie wyczesywało na SL, a później i tak kurs wracał na plus - ma to zapobiegać utracie kapitału.

2. Zajmuje pozycje SELL - gdy naciśniemy TAB + , (przecinek):
Otwiera pozycję gdy

Kod: Zaznacz cały

if(Max_M30 > Bid && ZamkniecieM_30 < Bid){
maksimum 2 ostatnich świec jest większe od Bid i cena zamknięcia ostatniej M30 jest mniejsza od Bid.
SL jest ustawiony na max z dwóch ostatnich świeć + spred.
3. Zajmuje pozycje Buy- gdy naciśniemy TAB + . (kropka):
Otwiera pozycję gdy

Kod: Zaznacz cały

if(Min_M30 < Bid && ZamkniecieM_30 > Bid)
minimum 2 ostatnich świec jest mniejsze od Bid i cena zamknięcia ostatniej M30 jest większa od Bid. SL jest ustawiony na min z dwóch ostatnich świeć - spred.

Dla wszystkich wyżej opisanych wariantów opieram się na M30. Dla jednego M30 można otworzyć tylko jedną pozycję Buy lub Sell - dla 1 i podobnie dla 2 i 3. Czyli dla jednego M30 można raz użyć wariantu 1 i raz użyć wariantu 2 lub 3 - czyli w sumie max 2 pozycje można otworzyć dla jednego M30.

Dodatkowo wprowadziłem kilka funkcjonalności

Kod: Zaznacz cały

       if(lparam == KEY_W)  //jeśli nacisnę W idę na Week
         ChartSetSymbolPeriod(NULL,NULL,PERIOD_W1);
      if(lparam == KEY_D)  //jeśli nacisnę D idę na H4
         ChartSetSymbolPeriod(NULL,NULL,PERIOD_H4);
      if(lparam == KEY_A)  //jeśli nacisnę A idę na D1
         ChartSetSymbolPeriod(NULL,NULL,PERIOD_D1);
      if(lparam == KEY_S)  //jeśli nacisnę S idę na M30   //ciekawie ile razy jeszcze to będę zmieniać ;-) 31.03.2016 (było M5)
         ChartSetSymbolPeriod(NULL,NULL,PERIOD_M30);  // zmiana nastąpiła już kolejnego dnia 1.04.2016 ;-(
      if(lparam == VK_END){   //ustawia BE i zamyka terminal
         PrzesunNaBE(2);
         TerminalClose(0);
      }
       if(lparam == KEY_E){   //ustawia BE
         PrzesunNaBE(1);
      }
Klawisz W - przechodzi na W1
Klawisz D - przechodzi na H4
Klawisz S - przechodzi na M30
Klawisz A - przechodzi na D1
Klawisz END - zamyka terminal i ustawia SL na BE (dla wszystkich pozycji, które mają SL ujemny)
Klawisz E - przesuwa SL na BE dla wszystkich pozycji z danego wykresu.
Posiada także mechanizm w jakich godzinach ma handlować.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

piątek 03 cze 2016, 22:35

Trafiłem na źródło pierwszego ze wskaźników opisywanych tutaj - http://forum.comparic.pl/viewtopic.php? ... 231#p57555
Może się Wam przyda, mnie udało się go już przerobić, a właściwie odchudzić z tego co nie jest mi potrzebne. Wskaźnik jest ciekawy bo można dzięki niemu zrobić niezły mega monitoring, podglądając różne TF dla różnych Symboli (walorów).
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

czwartek 01 gru 2016, 14:21

Prezentuje mój pierwszy półautomat - EA, który sam zawiera transakcje. Obrałem sobie jedno główne założenie, kupuj gdy jest trend. EA kupuje codziennie gdy kurs jest wyżej niż ostatnia transakcja. Dodatkowo może otworzyć 2 pozycję jeżeli jakaś H4 zamknie się poniżej otwarcia (próba zagrania na cieniu świecy). Dokładnie tak to wygląda dla SELL

Kod: Zaznacz cały

if(NormalizeDouble(ZamkniecieD1 + StrefaZagrania*Point,Digits) < ZamkniecieH4 && KursZagrania > Bid){
i dla BUY

Kod: Zaznacz cały

if(NormalizeDouble(ZamkniecieD1 - StrefaZagrania*Point,Digits) > ZamkniecieH4 && KursZagrania < Ask){
Nie griduje - zajmuje pozycje tylko gdy kurs jest wyżej niż ostatnio zajęta pozycja.

By program działał w pliku file musi zawierać 2 pliki - "NazwaWaloruKierunek.txt" gdzie nazwa walory to wartość wyrzucona przez polecenie

Kod: Zaznacz cały

 Symbol()
(w prawym górnym roku macie nazwę instrumentu). W XTB nazwy dla mojego konta są ze znakiem "plus" (EURJPY+), dlatego u mnie plik nazywa się np. "EURJPY+Kierunek.txt", a drugi plik to "EURJPY+SL_Sys.txt".
W pierwszym określacie jaki ma być kierunek ruchu (trendu) jeżeli 1 to Buy, jeżeli 2 to Sell. W pliku SL_Sys określacie SL, krytyczny poniżej którego jeżeli zejdzie cena zostaną zamknięte wszystkie zlecenia nie posiadające SL.
W pierwszym etapie budowy EA, postanowiłem nie stosować, żadnego SL (chciałem grać SL jako Stop-out brokera), jednak później zmieniłem zdanie. EA otwiera zlecenia bez SL, ale o tym później.

Proste założenia, a dają dobre rezultaty - Obrazek Obrazek
Nie ma co oczywiście popadać w hurra optymizm, test natomiast odzwierciedla sytuację rynkową której szukam, a EA ma tylko zajmować pozycje i zabezpieczyć przed tym gdyby już na początku coś poszło nie tak.
Przy teście dla EURJPY w pliku "EURJPY+SL_Sys.txt" była wartość 112.4.

Co do samego SL dla pozycji, to w pierwszej fazie projektu chciałem grac SL na kapitale, czyli ile broker pozwoli, ale po przeczytaniu kilku komentarzy na http://spekulant.com.pl/2016/11/26/reset/#comments postanowiłem wprowadzić kilka zmian.

1. SL permanentny (krytyczny - jeszcze się zastanawiam nad nazwą) chodzi o to by na początku określić poziom po którym setup sie nie udał. Może być sytuacja, że EA zajme 1 - 2 pozycje, a później rynek pójdzie w przeciwną stronę - wtedy zastanawiam bym się ile mam czekać. Będzie to poziom wynikający z wykresu - jeżeli wartość będzie zero to EA weźmie max/min z poprzedniego miesiąca.

2. Przy otwarciu nowego dnia, ustawiam SL na BE dla wszystkich (czyli max 2) pozycji, które mogły być otwarte w poprzednim dniu.

3. Na koniec tygodnia (piątek) rano lub wieczorem zamykam wszystkie pozycje(z danego tygodnia), po za 1 - 2, które uważam za otwarte w dobrym miejscu - w ten sposób osiągnę to iż z danego tygodnia zostaje tylko 1 - 2 pozycje na kolejny.


Prezentowany kod i plik EA zawiera tylko mechanizm pierwszy z listy - resztę mechanizmów trzeba samemu sobie dobrać (dopisać).

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                      Pies_01.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property description "Skrypt wspomagający handel ręczny i próba wprowadzenia półautomat. "
               
   double Lot_Q = 0.0; //wielkość pozycji
   double SL_Systemowy = 0.0; // SL który informuje o tym iż setup/zagranie się nie powiodło
                              //od jutra 1, za dwa dni 2 itd.
   static short MaxPozycji = 3; //libcza maksymalnej liczby pozycji 1 + 2 które może otworzyć EA
   int Pozycja = 0; //przechowuje informacje o ostatnio otwartej pozycji dla D1
   int CzySprawdzilH1 = 0; // zmienna przechowuje informacje czy w danej godzinie było już sprawdzane,
                           //by co tik nie sprawdzał - szczególnie, że tylko raz (dwa razy) mogę zająć pozycję
   int CzyZamknietoPozycje = 0; //sprawdza czy zamknieto pozycje gdy wybije SL systemowy (by nie sprawdzał co tick
                                 // gdy to się stanie)                           
                           
   short Kierunek = 0; //zmienna przechowuje informacje czy grać do góry 1 czy na dół 9 
   short GodzinaHandlu = 0;                 
   double StrefaZagrania = 0.0;     //zawiera wartość jaka musi mieć cień by zawrzeć pozycje 
   double KursZagrania = 0.0;
   short MagicznaLiczba = 0;  //wprowadziłem by uszeregować zlecenia, by móc lepiej zarządzać SL i pozycjami
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
      StrefaZagrania = 109;
   if(Symbol() == "W.20+"){
      StrefaZagrania = 19;  //wartość powinna być zależna od ruchu na danym walorze zastosowałem dla GU
      GodzinaHandlu = 9;
   }
   if(Symbol() == "US.30+")
      StrefaZagrania = 48;
   CzytajSL_Systemowy();
      
   if(IsTesting()) 
      FileDelete((string)(Symbol()+"KursZagrania.txt"));
//---
      Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CzyZamknietoPozycje != iBars(NULL, PERIOD_H4))
   switch(Kierunek){
      case 9 : {
         if(SL_Systemowy < Ask){  // jeżeli cena jest wyższa to zamykaj
               Print("Przekroczono SL systemowy. -9- Sprawdzam czy są stratne pozycje i zamykam je");
               ZamknijWszystkoCoTraci();
               CzyZamknietoPozycje = iBars(NULL, PERIOD_H4);
         }
      }break;
      case 1 : {
         if(SL_Systemowy > Bid){  // jeżeli cena jest wyższa to zamykaj
               Print("Przekroczono SL systemowy. -1- Sprawdzam czy są stratne pozycje i zamykam je");
               ZamknijWszystkoCoTraci();
               CzyZamknietoPozycje = iBars(NULL, PERIOD_H4);
         }
      }break;
   }
//---
   if(SL_Systemowy != 0.0)
   if(TimeDayOfWeek(TimeLocal()) != 7) //nie zaczynamy handlu w niedziele !!!
   if(Pozycja != iBars(NULL,PERIOD_D1) && CzySprawdzilH1 != iBars(NULL, PERIOD_H1)){
      CzySprawdzilH1 = iBars(NULL, PERIOD_H1);
        
      string walor = Symbol();
      string NazwaPliku = walor+"_SlupekPozycji.txt";
      int handle;
      
      if(FileIsExist(NazwaPliku)){                         
         handle=FileOpen(NazwaPliku, FILE_TXT|FILE_READ);
         if(handle!=INVALID_HANDLE){
            FileSeek(handle, 0, SEEK_SET);
            Pozycja = (int) FileReadString(handle);
            FileClose(handle);
         }else Print("Operation FileOpen failed, error ",GetLastError());
         handle = NULL;
         
      }else
         Print("Plik ", NazwaPliku, " nie istnieje!!!");
         //Sprawdza jak ma grać   
      NazwaPliku = walor+"Kierunek.txt";   
      if(FileIsExist(NazwaPliku)){
         //int handle;                          
         handle=FileOpen(NazwaPliku, FILE_TXT|FILE_READ);
         if(handle!=INVALID_HANDLE){
            FileSeek(handle, 0, SEEK_SET);
            Kierunek = (short) FileReadString(handle);
            FileClose(handle);
         }else Print("Operation FileOpen failed, error ",GetLastError());
         handle = NULL;
      }else
         Print("Plik ", NazwaPliku, " nie istnieje!!!");
      
      NazwaPliku = walor+"KursZagrania.txt";
      if(FileIsExist(NazwaPliku)){
         handle=FileOpen(NazwaPliku, FILE_TXT|FILE_READ);
         if(handle!=INVALID_HANDLE){
            FileSeek(handle, 0, SEEK_SET);
            KursZagrania = (double) FileReadString(handle);
            FileClose(handle);
         }else Print("Operation FileOpen failed, error ",GetLastError());
         handle = NULL;
         NazwaPliku = NULL;
      }
      if(TimeHour(iTime(NULL,PERIOD_H1,0)) == GodzinaHandlu)
         SprawdzKursPozycji();
      if(Pozycja != iBars(NULL,PERIOD_D1)) 
         ZajmijPozycje(Kierunek);
      
      //Print(Pozycja);
      //Print(Kierunek);
      //Print("KursZagrania 2 : ", KursZagrania, " Godz. ", TimeHour(iTime(NULL,PERIOD_H1,0)));
      //Print("Pon ", iClose(NULL, PERIOD_D1, 3), "; Wto ", iClose(NULL, PERIOD_D1, 2), "; Srod ", iClose(NULL, PERIOD_D1, 1), "; Dzis ", iClose(NULL, PERIOD_D1, 0), "; Niedziela ", iClose(NULL, PERIOD_D1, 4));
      //Print(iBars(NULL,PERIOD_D1));
   }
   
  }
//+------------------------------------------------------------------+
/*    Funkcja zajmij pozycję /*/
void  ZajmijPozycje(short kierunek){
   Print("SL_Systemowy123 - ", SL_Systemowy);
   double ZamkniecieD1 = iClose(NULL,PERIOD_D1, 1);
   double ZamkniecieH4 = iClose(NULL, PERIOD_H4, 1);
   // pamiętać by sprawdzić kto jak maluje świecie 
   if(TimeDayOfWeek(TimeLocal()) == 0)
      ZamkniecieD1 = iClose(NULL,PERIOD_D1, 2);
      //Print("KursZagrania 1: ", KursZagrania);
   switch((int)kierunek){
      case 9 : {
         if(SL_Systemowy > Ask){  // jeżeli cena jest niższa od SL to można grać
            WielkoscPozycji();
            if(KursZagrania == 0.0){
               SprawdzKursPozycji();
               if(KursZagrania == 0.0)
                  KursZagrania = iHigh(NULL,PERIOD_D1, 1);
            }      
            if(Lot_Q > 0.001)
               if(TimeHour(iTime(NULL,PERIOD_H1,0)) == GodzinaHandlu && NormalizeDouble(KursZagrania - StrefaZagrania*Point,Digits) > Bid){
                  int ticket = 0;
                  ticket = OrderSend(Symbol(), OP_SELL, Lot_Q, Bid, 3, NULL,NULL,NULL,79);  //zajmowanie pozycji
                  if(ticket<0)
                        Print("Nie otwarto pozycji 2 - error #",GetLastError());
                  
               }else if(NormalizeDouble(ZamkniecieD1 + StrefaZagrania*Point,Digits) < ZamkniecieH4 && KursZagrania > Bid){
                  int ticket = 0;
                  ticket = OrderSend(Symbol(), OP_SELL, Lot_Q, Bid, 3, NULL,NULL,NULL,MagicznaLiczba);  //zajmowanie pozycji
                  double KursPozycji = Bid;
                  if(ticket<0)
                        Print("Nie otwarto pozycji 2 - error #",GetLastError());
                  else{
                     Pozycja = iBars(NULL,PERIOD_D1);//iBars(NULL, PERIOD_H4);
                     ZapiszPozycje(KursPozycji);
                  } 
               }else
                  Print("Nie zajęto pozycji.");
            }else{
               Print("Przekroczono SL systemowy. Sprawdzam czy są stratne pozycje i zamykam je");
               ZamknijWszystkoCoTraci();  
            }   
      } break;        
      case 1 : {
         if(SL_Systemowy < Bid){  // jeżeli cena jest wyższa od SL to można grać
            WielkoscPozycji();
            if(KursZagrania == 0.0){
               SprawdzKursPozycji();
               if(KursZagrania == 0.0)
                  KursZagrania = iLow(NULL,PERIOD_D1, 1);
            }   
            if(Lot_Q > 0.001)
               if(TimeHour(iTime(NULL,PERIOD_H1,0)) == GodzinaHandlu && NormalizeDouble(KursZagrania + StrefaZagrania*Point, Digits) < Ask){
                  int ticket = 0;
                  ticket = OrderSend(Symbol(),   OP_BUY,  Lot_Q,  Ask,  3, NULL,NULL,NULL,79); //zajmowanie pozycji
                  if(ticket<0)
                        Print("Nie otwarto pozycji 2 - error #",GetLastError());
               
               }else if(NormalizeDouble(ZamkniecieD1 - StrefaZagrania*Point,Digits) > ZamkniecieH4 && KursZagrania < Ask){
                  int ticket = 0; 
                  ticket = OrderSend(Symbol(),   OP_BUY,  Lot_Q,  Ask,  3, NULL,NULL,NULL,MagicznaLiczba); //zajmowanie pozycji
                  double KursPozycji = Ask;
                  if(ticket<0)
                     Print("Nie otwarto pozycji 1 - error #",GetLastError());
                  else{
                     Pozycja = iBars(NULL,PERIOD_D1);//iBars(NULL, PERIOD_H4);
                     ZapiszPozycje(KursPozycji);
                  }   
                  
               }else
                  Print("Nie zajęto pozycji. KursZagrania ", KursZagrania, " ; Ask ", Ask);
         }else{
            Print("Przekroczono SL systemowy. Sprawdzam czy są stratne pozycje i zamykam je");
            ZamknijWszystkoCoTraci();
         }      
      } break;
   //default :
   
   }
}
//+-----------------------------------------------------------------+
void SprawdzKursPozycji(){

   int total = OrdersTotal();

   if (total >= 0)
      for(int cnt=total; cnt > 0; cnt--){
         if(OrderSelect(cnt,SELECT_BY_POS)){
            //Print("cnt - ", cnt, "  , Total ", total);
            //Print("KursZagrania3 - ", KursZagrania);
            if(OrderSymbol() == Symbol())
               switch(Kierunek){
                  case 1:{    
                     if (OrderType() == OP_BUY)
                        if(KursZagrania < OrderOpenPrice()){
                             KursZagrania = OrderOpenPrice();
                             cnt = 0;
                        }
                  }break;
                  case 9:{    
                     if (OrderType() == OP_SELL)
                        if(KursZagrania > OrderOpenPrice()){
                             KursZagrania = OrderOpenPrice();
                             cnt = 0;
                        }
                  }break;
               }
         }
      }   
                       
}   
//+------------------------------------------------------------------+
/*    Funkcja zapisu do pliku informacji o pozycjach */
void ZapiszPozycje(double KursPozycji){
      //zapisywanie kursy pozycji by nie otworzył poniżej ostatniego kursu zajęcia pozycji
      string walor = Symbol();
      
      string NazwaPliku = walor+"KursZagrania.txt";
      int handle;                          
      handle=FileOpen(NazwaPliku, FILE_WRITE|FILE_TXT|FILE_READ);
      if(handle!=INVALID_HANDLE){
         FileSeek(handle, 0, SEEK_SET);
         FileWrite(handle,(string)KursPozycji);
         FileClose(handle);
      }else Print("Operation FileOpen failed, error ",GetLastError());
      handle = NULL;
      NazwaPliku = NULL;
      
      NazwaPliku = walor+"_SlupekPozycji.txt";
      if(handle!=INVALID_HANDLE){
         FileSeek(handle, 0, SEEK_SET);
         FileWrite(handle,(string)Pozycja);
         FileClose(handle);
      }else Print("Operation FileOpen failed, error ",GetLastError());
      handle = NULL;
}         
//+------------------------------------------------------------------+
/* Funkcja sprawdza czy cena jest powyżej SL Systemowego będącego zabezpieczniem
przed nie wykonaniem się założenia (złego określenia kierunku ruchu - trendu) 
*/
void CzytajSL_Systemowy(){
   
   if(SL_Systemowy == 0){
      string walor = Symbol();
      string NazwaPliku = walor+"SL_Sys.txt";
      int handle;
      
      if(FileIsExist(NazwaPliku)){                         
         handle=FileOpen(NazwaPliku, FILE_TXT|FILE_READ);
         if(handle!=INVALID_HANDLE){
            FileSeek(handle, 0, SEEK_SET);
            SL_Systemowy = (double) FileReadString(handle);
            FileClose(handle);
         }else Print("Operation FileOpen failed, error ",GetLastError());
         handle = NULL;
         NazwaPliku = NULL;
         
      }else{
         Print("Plik ", NazwaPliku, " nie istnieje!!! Nie mogą rozpoczać zajmowania pozycji!");
         Kierunek = 0; //blokuję zajmowanie pozycji
      }
   
   }
}
/*
Funkcja do zamykania pozycji po nieudanym setapie - zamyka wszystko co nie ma ustawionego SL czyli 
wszystko co straci
*/
void ZamknijWszystkoCoTraci(){
   bool Zaliczone = false;
   int total = OrdersTotal();
   if (total >= 0){
      for(int cnt=total; cnt > 0; cnt--){
         if(OrderSelect(cnt,SELECT_BY_POS)){
            //Print("cnt - ", OrderMagicNumber());
            if(OrderSymbol() == Symbol()){
               if(OrderStopLoss() == 0)
                  Zaliczone=OrderClose(OrderTicket(),OrderLots(),Bid,3);
               if(!Zaliczone)
                  Print("OrderSend failed with error #",GetLastError());
               else
                  Print("Zamknięto pozycję ", OrderSymbol(), " : ", OrderOpenTime());
            }
         }
      }
   }
 }
/*    Funkcja obliczająca jaką pozycję można otworzyć w zależności od
      dostępnego kapitału i depozytu zabezpieczajacego Ustawiona na podstawie GBPUSD
*/
void WielkoscPozycji(){
   if(AccountBalance() <= 1000){
         Lot_Q = 0.01;
         if(Symbol() == "W.20+")
            Lot_Q = 3 * Lot_Q;
         MagicznaLiczba = 82;
   }else if (AccountBalance() > 1000 && AccountBalance() < 2000){
         Lot_Q = 0.02;
         if(Symbol() == "W.20+")
            Lot_Q = 3 * Lot_Q;
         MagicznaLiczba = 82;
   }else if (AccountBalance() >= 2000 && AccountBalance() < 3000){  //do edycji
         Lot_Q = 0.04;
         /*if(Symbol() == "US30+")
            Lot_Q = 0.03;*/
         if(Symbol() == "W.20+")
            Lot_Q = 3 * Lot_Q;
         MagicznaLiczba = 82;
   }else if (AccountBalance() >= 3000 && AccountBalance() < 4000){
         Lot_Q = 0.08;
         /*if(Symbol() == "US30")
            Lot_Q = 0.04;*/
         if(Symbol() == "W.20+")
            Lot_Q = 3 * Lot_Q;   
         MagicznaLiczba = 82;
   }else if (AccountBalance() >= 4000 && AccountBalance() < 5000){
         Lot_Q = 0.1;
         /*if(Symbol() == "US30")
            Lot_Q = 0.06;*/
         if(Symbol() == "W.20+")
            Lot_Q = 3 * Lot_Q;
         MagicznaLiczba = 82;
   }else if (AccountBalance() >= 5000 && AccountBalance() < 8000){
         Lot_Q = 0.15;
         /*if(Symbol() == "US30")
            Lot_Q = 0.08;*/
         if(Symbol() == "W.20+")
            Lot_Q = 3 * Lot_Q;
         MagicznaLiczba = 82;
   }else if (AccountBalance() >= 8000){
         Lot_Q = 0.2;
         /*if(Symbol() == "US30")
            Lot_Q = 0.1;*/
         if(Symbol() == "W.20+")
            Lot_Q = 3 * Lot_Q;
         MagicznaLiczba = 82; 
   }
}
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

piątek 02 gru 2016, 11:38

Wykryłem błąd w jedne z funkcji

Kod: Zaznacz cały

void SprawdzKursPozycji(){

   int total = OrdersTotal();

   if (total >= 0)
      for(int cnt=total; cnt >= 0; cnt--){
         if(OrderSelect(cnt,SELECT_BY_POS)){
            //Print("cnt - ", cnt, "  , Total ", total, "  OrderType()- ", OrderType(), " Kierunek - ", Kierunek);
            //Print("KursZagrania3 - ", KursZagrania);
            if(OrderSymbol() == Symbol())
               switch(Kierunek){
                  case 1:{    
                     if (OrderType() == OP_BUY)
                        if(KursZagrania == 0){
                             KursZagrania = OrderOpenPrice();
                             cnt = 0;
                        }else if(KursZagrania < OrderOpenPrice()){
                             KursZagrania = OrderOpenPrice();
                             cnt = 0;
                        }
                  }break;
                  case 9:{    
                     if (OrderType() == OP_SELL)
                        if(KursZagrania == 0){
                             KursZagrania = OrderOpenPrice();
                             cnt = 0;
                        }else if (KursZagrania > OrderOpenPrice()){
                           KursZagrania = OrderOpenPrice();
                             cnt = 0;                        
                        }
                  }break;
               }
         }
      }
      //Print("KursZagrania3 - ", KursZagrania);   
                       
}   

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

piątek 02 gru 2016, 11:51

Po wprowadzeniu wszystkich modyfikacji sprawa wygląda tak Obrazek Obrazek

no avatar
irmentruda
Maniak Forex
Posty: 1103
Rejestracja: piątek 19 wrz 2014, 11:30
Lat na Forex: 3
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Silesia

Re: MQL

poniedziałek 05 gru 2016, 08:34

Bogaty bedziesz. Serio to tak dziala?

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

poniedziałek 05 gru 2016, 10:00

Zadaj sobie inne pytanie, czy trend na prawdę działa, czy jest obiektywny? A może to wszystko iluzja (rachunek demo) - Obrazek .

no avatar
GoldWolf
Stały Bywalec
Posty: 218
Rejestracja: wtorek 15 gru 2015, 20:48
Lat na Forex: 5
Rodzaj rachunku: Rachunek rzeczywisty
Lokalizacja: Bielsko-Biała

Re: MQL

środa 07 gru 2016, 14:42

Poprawiłem trochę błędów w kodzie EA, które wykryłem oraz wprowadziłem SL na kapitale.
Gdy osiągnie SL na kapitale zamyka wszystkie stratne pozycje.
Użytkownik decyduje jaki ma byś SL na kapitale (nie może być mniejszy niż ustawił broker) oraz czy EA ma działać czy nie.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
kwfx
Maniak Forex
Posty: 1022
Rejestracja: środa 24 wrz 2014, 07:43
Lat na Forex: 4
Rodzaj rachunku: Rachunek rzeczywisty

Re: MQL

czwartek 08 gru 2016, 10:56

Biorę się za testy :) W końcu pies to najlepszy przyjaciel człowieka ;)

ODPOWIEDZ

Kto jest online

Użytkownicy przeglądający to forum: Google [Bot] i 6 gości