piątek, 1 października 2010

Roboty na giełdzie - automatyczne inwestowanie cz.1

W poście o automatycznym inwestowaniu pisałem, że będę kontynuował wątek automatycznych systemów inwestycyjnych i pokażę, jak napisać sobie prosty system na platformie Meta Trader 4, który będzie inwestował za nas.. Do dzieła więc!

Weźmy pod lupę jakiś prosty system oparty o średnie - niech to będą sygnały ze wskaźnika MACD - i zobaczmy jakie przyniesie nam zyski po uruchomieniu go na rynku kontraktów terminowych na wig20. Do uruchomienia takiego automatycznego systemu potrzebne nam będzie konto u brokera oferującego platformę Meta Trader 4. Dla początkujących polecam brokera TMS Brokers i platformę Go4X. Można bezpłatnie założyć konto testowe. Sam używam tej platformy.

Kiedy mamy już zainstalowany program Meta Trader otwieramy MetaEditor i klikamy na "Nowy". Uruchomi się wizard, który pomoże nam stworzyć szablon kodu nowego doradcy ekspertowego. W pierwszym kroku, na pytanie "co chciałbyś utworzyć:" odpowiadamy wybierając "Doradca Ekspertowy".


 W drugim kroku wypełniamy pola:

- Nazwa - nazwa naszego systemu, niech będzie "MACD system"
- Autor - autor kodu skryptu
- Link - dodatkowa informacja na temat, np. strony domowej autora
- Parametry - parametry, które będzie można wykorzystać w kodzie oraz ustawiać z zewnątrz skryptu, np. w procesie optymalizacji parametrów. Na razie nic nie wypełniamy, dodamy je ręcznie później.



Klikamy zakończ i tworzy się nam nowy plik zawierający szablon kodu naszego doradcy ekspertowego, który wygląda mniej więcej tak (usunąłem niektóre komentarze):
//+------------------------------------------------------------------+
//|                                                  MACD system.mq4 |
//|                                          Copyright © 2010, Tomek |
//|                                 http://do-wolnosci.blogspot.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Tomek"
#property link      "http://do-wolnosci.blogspot.com/"


int init() {
   return(0);
}


int deinit() {
   return(0);
}


int start() {
   return(0);
}

Czyli w nagłówku mamy wpisane dane, które wypełniliśmy przechodząc wizard a poniżej domyślne ciała trzech metod:

- init - wywoływana podczas startu doradcy ekspertowego
- deinit - wywoływana podczas zatrzymywania doradcy ekspertowego
- start - wywoływana podczas każdego ticku instrumentu dla którego uruchomiony został doradca ekspertowy.


Metodki init i deinit nas nie interesują, więc pozostaje wypełnić metodkę start, w której będziemy sprawdzali czy nie nastąpił sygnał kupna lub sprzedaży. Możemy przyjąć, że sygnał kupna będzie otwierał długą pozycję i zarazem zamykał pozycję krótką, jeżeli była otwarta, natomiast sygnał sprzedaży będzie otwierał krótką pozycję i zarazem zamykał pozycję długą, jeżeli była otwarta. Jako sygnał kupna przyjmiemy przecięcie od dołu długiej średniej przez krótką średnią a jako sygnał sprzedaży przecięcie od góry długiej średniej przez krótką średnią. Jeżeli wykorzystamy wskaźnik MACD, możemy użyć wartości histogramu tego wskaźnika, wtedy będziemy badać jedynie, czy histogram przekroczył wartość zero od góry lub od dołu.

Weźmy więc wartość histogramu z MACD z aktualnego przedziału czasu z przedziału poprzedniego i sprawdźmy, czy nie nastąpiło przebicie przez histogram wartości zero. Metodka start będzie więc wyglądać tak:

int start() {
   double macd0=iMACD(NULL, 0, MACD_szybka, MACD_wolna ,MACD_sygnal, PRICE_OPEN, MODE_MAIN, 0);
   double macd1=iMACD(NULL, 0, MACD_szybka, MACD_wolna, MACD_sygnal, PRICE_OPEN, MODE_MAIN, 1);

   bool kup = macd1 < 0 && macd0 > 0;
   bool sprzedaj = macd1 > 0 && macd0 < 0;

   int pozycja = znajdzPozycje(identyfikator);

   if(kup) {
      if(pozycja > 0)
         roluj(pozycja, OP_BUY);
      else
         kup();
   }
   if(sprzedaj) {
      if(pozycja > 0)
         roluj(pozycja, OP_SELL);
      else
         sprzedaj();
   }

   return(0);
}


Widzimy więc, że funkcja powinna działać zgodnie z założeniami, czyli kup, jeśli macd1 (poprzednia wartość histogramu MACD) mniejszy od zera i macd0 większy od zera (aktualna wartość histogramu MACD) a więc nastąpiło przebicie lini zero na histogramie MACD. Podobnie wyznaczany jest warunek sprzedaży, lecz badamy przecięcie linii zera od góry. Dalej pod zmienną pozycja podstawiamy identyfikator otwartej pozycji. Jeżeli aktualnie nie mamy otwartej pozycji na danym instrumencie funkcja znajdzPozycje zwróci nam 0. Niżej mamy warunki, w których używam wcześniej wyznaczonych sygnałów kupna/ sprzedaży i ewentualnie, jeżeli mam aktualnie pozycję na rynku to próbuje ją zmienić na pozycję przeciwną - funkcja roluj.

Prawda, że nie wygląda to aż tak strasznie? Może na pierwszy rzut oka dla kogoś kto nigdy nie używał żadnego języka programowania kod wydaje się skomplikowany, lecz wystarczy wgłębić się w analizę paru skryptów, które są łatwo dostępne w sieci, żeby załapać o co tu chodzi. Fakt, że brak na razie przykładów skryptów z omówieniem w języku polskim, ale po angielsku znajdziemy masę przykładów i tutoriali.

Ponieważ post staje się już zbyt długi, nie będę omawiał już wykorzystanych tu funkcji pomocniczych - znajdzPozycje, kup, sprzedaj i roluj. Przedstawię je w którymś z kolejnych postów. No i oczywiście zobaczymy jak system działa w praktyce na danych historycznych! Polecam śledzić kolejne posty ;]

1 komentarz:

  1. Moim zdaniem roboty się nie sprawdzają. Zdecydowanie samemu podejmować decyzje. Jeżeli byłoby one, aż tak skuteczne, to nikt by nie sprzedawał tych "wynalazków".

    OdpowiedzUsuń

Related Posts with Thumbnails