piątek, 17 grudnia 2010

Roboty na giełdzie - automatyczne inwestowanie cz.2

Aż wstyd się przyznać, że już ponad dwa miesiące temu zacząłem pisać o automatycznym inwestowaniu i obiecałem skończyć a dopiero teraz zabieram się za pisanie następnej części! Cóż, nie ma co przepraszać za opóźnienie, tylko do roboty i kończyć temat! :)

Nie będę opisywał drugi raz strategii, którą chciałbym testowo tu zautomatyzować. Chętnych zapraszam tu po więcej szczegółów. W tym poście, tak jak wcześniej obiecałem, wkleję treść wykorzystanych metod i krótko je omówię. Jeżeli będzie jakieś zainteresowanie tematem, wtedy przedstawię to nieco bardziej szczegółowo.

Na początku skryptu zadeklarowane są zmienne, które wykorzystuje strategia:

extern int MACD_szybka = 12;
extern int MACD_wolna = 26;
extern int MACD_sygnal = 9;

extern int identyfikator = 12345;
extern double loty = 0.1;
extern int takeProfit = 500;
extern int stopLoss = 30;


Myślę, że nie trzeba tego omawiać, bo nazwy zmiennych mówią za siebie. Dodam tylko, że te zmienne można optymalizować w strategii, czyli na przykład znaleźć takie wartości dla MACD, które przyniosą największy zysk. Pokażę, jak optymalizować strategię w którymś z kolejnych wpisów! :)

Wykorzystane przeze mnie metodki:

znajdzPozycje:

int znajdzPozycje(int identyfikator) {
   int i = 0;
   for(i=0; i
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber() == identyfikator) {
         return (OrderTicket());
      }
   }
   return (0);
}

Metodka ta ma za zadanie znalezienie numeru transakcji na rachunku, która była wykonana wcześniej na testowanym symbolu (walorze). Identyfikator przekazany do metody to unikalny identyfikator dla pozycji zajmowanej przez skrypt. W ten sposób można odnaleźć transakcję zawartą przez naszą strategię, a nie np. zamknąć pozycję, którą mamy otwartą przez inną strategię, lub sami ją otworzyliśmy na rachunku. Jeżeli nie mamy otwartej pozycji zwracane jest 0.

kup:

void kup() {
   int ticket = OrderSend(Symbol(),OP_BUY,loty,Ask,5,Bid-stopLoss*Point,Ask+takeProfit*Point,"MACD system",identyfikator,0,Blue);
   if(ticket>0) {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Zająłem długą pozycję: ",OrderOpenPrice());
   } else {
      Print("Błąd podczas otwierania długiej pozycji: ",GetLastError());
   }
}


Ta metoda otwiera długą pozycję na walorze wykorzystując systemową funkcję OrderSend. Jeżeli nie udało się z jakiś powodów otworzyć pozycji (np. przez poślizg cen) to wypisywany jest komunikat o błędzie. Otwierana pozycja jest wielkości loty (zmienna wcześniej zadeklarowana) i zaznaczona jest na wykresie kolorem niebieskim. Ustawiane są dodatkowo take profit i stop loss (przy wykorzystaniu zmiennych, które są wcześniej zadeklarowane i które można optymalizować).

sprzedaj:

void sprzedaj() {
   int ticket = OrderSend(Symbol(),OP_SELL,loty,Bid,5,Bid+stopLoss*Point,Bid-takeProfit*Point,"MACD system",identyfikator,0,Red);
   if(ticket>0) {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Zająłem krótką pozycję: ",OrderOpenPrice());
   } else {
      Print("Błąd podczas otwierania krótkiej pozycji: : ",GetLastError());
   }
}


Metoda sprzedaj zajmuje krótką pozycję na rynku na testowanym walorze zaznaczając na wykresie otworzenie transakcji na czerwono.

roluj:

void roluj(int identyfikator, int typ) {
   if(OrderType() != typ) {
      double price = Bid;
      if(OrderType() == OP_SELL)
         price = Ask;
      OrderClose(identyfikator, OrderLots(), price, 3, Yellow);
      if(typ == OP_BUY)
         kup();
      else
         sprzedaj();
   }
}



Roluj roluje pozycję, czyli jeżeli mieliśmy długą pozycję to zajmowana jest krótka i na odwrót. Wykorzystane są tu metodki kup i sprzedaj. Zamknięcie pozycji przez funkcję roluj zaznaczane jest na żółto.

To na razie tyle. Mam nadzieję, że nie wystraszyłem tymi kawałkami kodu.W kolejnym wpisie (mam nadzieję, że już niedługo) przedstawię, jak wyglądają historyczne wyniki strategii inwestowania w oparciu o MACD.

1 komentarz:

  1. Roboty transakcyjne są mało skuteczne, wciąż należy je weryfikować do aktualnej sytuacji. Jakby były dość skuteczne, to nikt by ich nie sprzedawał.

    OdpowiedzUsuń

Related Posts with Thumbnails