środa, 19 listopada 2014

"Trata tata, Osioł strzela z automata", czyli zaprzęgamy do pracy komputer na rynku forex; część I

Wpis ten będzie dotyczyć moich eksperymentów w wykorzystaniu tak zwanych automatów do gry na rynku forex. Automat to nic innego jak program komputerowy, który pracuje zgodnie z przyjętymi założeniami. Otwiera, zamyka pozycje, ustala poziomy obronne i wszystko inne co możemy realizować ręcznie. Automaty rozpalają naszą wyobraźnię – poszukujących "Świętego Grala”, czyli sposobu na zarobienia mitycznych milionów. Teoretycznie taki automat pracuje samodzielnie i tylko patrzymy jak kolejne zera pojawiają się na naszym koncie. Program nie ulega emocjom, czyli głównym przyczynom niepowodzeń na giełdzie. A jak jest w praktyce?
 
Moje doświadczenia opierają się na pisaniu, testowaniu i działaniu programów w języku Meta Quotes Language 4 (MQL4). Język ten pozwala na tworzenie własnych strategii (Expert Advisor) w postaci automatycznych systemów transakcyjnych. Programy te działają na platformach MT4 i MT5, z czego ja korzystałem tylko z MT4. W języku tym pisane są też wszystkie wskaźniki i proste automaty dostarczane wraz z platformą brokera. Warto dodać, że moje eksperymenty dotyczą tylko brokerów typu „Market Maker”. W tym modelu klient dokonuje transakcji bezpośrednio z brokerem MM. Broker pobiera kwotowania  wprost z rynku międzybankowego i na ich podstawie określa własne kursy (z odpowiednio szerszym spreadem),  oferując je klientowi. Broker stanowi w tym modelu dla inwestora drugą stronę transakcji, bo tylko on dostarcza, na swoją platformę tradingową płynność. Ewentualnie zabezpiecza swoje pozycje  innych uczestników rynku. Czyli mamy do czynienia z kopią realnego rynku który obserwujemy. To jak bardzo giełda danego "Market Makera" odzwierciedla prawdziwy rynek forex, zależy tylko od danego brokera. To dosyć istotna informacja, bo będzie miała także wpływ na praktyczne działanie automatów.

Jak opisowo działa taki program. Wbrew pozorom to bardzo prosta zabawka. Wykorzystuje on informacje o zmieniającej się cenie (otwarcia, zamknięcia, max, min) w danym interwale czasowym. Popularne wskaźniki MACD, Moving Average,  czy inne magiczne parametry są efektem dodawania, odejmowania bądź wymnażania powyższych historycznych informacji. Wszystko to jest obrazowane na graficznych wykresach (świece, słupki lub linie). Na przykład nie będziemy mieli informacji o wolumenie. To co oferuje nam broker to tylko informacja o liczbie zawartych transakcji u MM, co się nam w niczym nie przyda. Tak więc to na czym bazujemy to tylko wykresy rysowane przez oprogramowanie brokera, które mogą się różnić od prawdziwego rynku.

Żeby przetestować techniczne aspekty działania takiego automatu nawet nie trzeba nic pisać, bo często przykładowe strategie Expert Advisor są dołączane do platformy udostępnianej przez brokera. Ja też pracę rozpocząłem od modyfikacji jednej z takich gotowych strategii.

Poniżej przykład automatu nazwanego przeze mnie "MAOpen SL Pending" – podążający stop-loss.  Bazuje on na wskaźniku MovingAverage, czyli prostych średnich ruchomych. Otwieranie i zamykanie pozycji następuje w momencie przecięcia się wykresu cenowego ze średnia ruchomą, czyli jeśli poziom średniej ruchomej napotyka na cenę w taki sposób, że poprzednia wartość jest wyższa niż cena otwarcia i niższa niż cena zamknięcia to wtedy pozycja długa zostanie otworzona (średnia ruchoma zostanie przecięta przez wykres ceny od dołu).


Analogicznie jeśli wykres ceny przetnie średnią ruchomą od góry, czyli poprzednia wartość średniej jest niższa niż cena otwarcia i wyższa niż cena zamknięcia z poprzedniego okresu to wtedy pozycja krótka zostanie otwarta.



Co się dzieje dalej. W prezentowanej strategii możemy samodzielnie zdefiniować poziom stop-loss (SL) w procentowej zależności od wielkości otwartej pozycji (depozytu). Przykładowo Jeżeli depozyt wyniósł 100 zł a parametr SL ustawimy na 90% to system automatycznie ustawi SL w "odległości" 90 zł. Jeżeli kurs otwartej pozycji zacznie się zmieniać zgodnie z naszymi oczekiwaniami, to system będzie automatycznie przesuwał SL o stałą wartość 90 zł. To dość istotne w odróżnieniu od standardowego skryptu Take Profit, który aktywuje się dopiero po przekroczeniu zadanej "odległości" od poziomu otwarcia pozycji. W tym przypadku nasz automat przesuwa poziom SL w "dół" lub w "górę" (w zależności czy pozycja jest Bid lub Ask) od momentu otwarcia zlecenia. Zlecenie zostanie automatycznie zamknięte kiedy niekorzystna zmiana kursu przekroczy w dowolnym momencie wartość SL. Dodatkowo możemy ustawiać parametry średniej kroczącej czyli okres i przesunięcie (period and shift).

Podsumowując, w powyższej  strategii możemy ustawić:
a) interwał czasowy M1, M5, M15 itd.
b) parametry średniej kroczącej
c) stałą odległość poziomu SL od aktualnego kursu otwartej pozycji.

Wyniki testowania strategii w zależności od powyższych parametrów były następujące:


W tabeli ujęto tylko "obiecujące" wyniki testów na bazie danych historycznych. Przeważająca większość testów z innymi parametrami przynosiła straty.  

Był to jeden z pierwszych dość prostych automatów testowanych przeze mnie, ale niektóre wyniki były ciekawe i zachęciły mnie do dalszych prac w tym temacie. Kod EA załączam poniżej.

W kolejny poście dotyczącym tego tematu przedstawię bardziej zaawansowane automaty, oraz równie ważne wnioski płynące z ich testowania oraz praktycznego działania w rzeczywistości.


Zapraszam



//+------------------------------------------------------------------+
//|                                                   MAOpen SLPending.mq4 |
//|                                                      SR&WP |
//|                                                                                       |
//+------------------------------------------------------------------+
#property copyright "www.donkey.org.pl"
#property link      "www.donkey.org.pl"

#define MAGICMAOASLP  20120719

extern double StopLossPercentage = 5.0;
double r;

//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMAOASLP)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }

void CheckForOpen()
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   ma=iMA(NULL,0,7.0,1.0,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  
     {
      r=Ask*(1+(StopLossPercentage/(AccountLeverage()*100)))-Bid;
      res=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Bid+r,0,"",MAGICMAOASLP,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  
     {
      r=Ask-Bid/(1+(StopLossPercentage/(AccountLeverage()*100)));
      res=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,r,0,"",MAGICMAOASLP,0,Blue);
      return;
     }
//----
  }

void CheckForModify() {
   bool modify = false;
   double StopLoss;
   for(int i=0;i<OrdersTotal();i++)
     {
      modify = false;
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMAOASLP && OrderType() <= 1)
        {
         switch (OrderType()) {
           case OP_SELL:
             if (Ask < OrderOpenPrice()-r) {
               StopLoss = Ask+(r*r/(OrderOpenPrice()-Ask));
             }
             else {
               StopLoss = Ask+r;
             }
             if (StopLoss < OrderStopLoss()) modify = true;
             break;
             
           case OP_BUY:
             if (Bid > OrderOpenPrice()+r) {
               StopLoss = Bid-(r*r/(Bid-OrderOpenPrice()));
             }
             else {
               StopLoss = Bid-r;
             }
             if (StopLoss > OrderStopLoss()) modify = true;
             break;
         }
         if (modify) {
           OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,0,0);
         }
        }
     }
}

//+------------------------------------------------------------------+
//| script program start function                                             |
//+------------------------------------------------------------------+
int start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else CheckForModify();
//----
   return(0);
  }
//+------------------------------------------------------------------+

5 komentarzy:

  1. "praktycznego działania w rzeczywistości"

    Witam Pana,
    to praktyczne działanie w rzeczywistosci jest tutaj kluczowa sprawa. Moje EA w testach byly cudowne, po 400€ na miesiac przy 0,1 lota. Ale rzeczywiste warunki nie byly juz takie rozowe. Czekam na dalsze wpisy.

    OdpowiedzUsuń
  2. Taki system świetnie sprawdza się na rynku trendowym. Niestety podczas wąskich konsolidacji sukcesywnie przynosi straty.

    OdpowiedzUsuń
    Odpowiedzi
    1. Będą przykłady fajniejszych automatów. Muszę tylko znaleźć czas na przygotowanie posta...

      Usuń
  3. W spekulacjach korzystasz wciąż z automatów czy pokazujesz to jako ciekawostka "historyczna"?

    OdpowiedzUsuń
    Odpowiedzi
    1. przyłączam się do pytania

      Usuń