Forex Algorithmic Trading: Praktyczna opowieść dla inżynierów

Opublikowany: 2022-03-11

Jak być może wiesz, rynek walutowy (Forex lub FX) służy do handlu między parami walutowymi. Ale możesz nie zdawać sobie sprawy, że jest to najbardziej płynny rynek na świecie.

Kilka lat temu, kierując się moją ciekawością, postawiłem pierwsze kroki w świecie handlu algorytmicznego na rynku Forex, tworząc konto demo i rozgrywając symulacje (z fałszywymi pieniędzmi) na platformie handlowej Meta Trader 4.

Ilustracja okładki Forex

Po tygodniu „handlu” prawie podwoiłem swoje pieniądze. Zachęcony moim własnym udanym handlem algorytmicznym, pogrzebałem głębiej i ostatecznie zarejestrowałem się na wielu forach walutowych. Wkrótce spędziłem godziny czytając o algorytmicznych systemach handlu (zestawy reguł, które określają, czy powinieneś kupić, czy sprzedać), niestandardowych wskaźnikach, nastrojach rynkowych i nie tylko.

Mój pierwszy klient

Mniej więcej w tym czasie przypadkowo usłyszałem, że ktoś próbował znaleźć programistę do automatyzacji prostego systemu transakcyjnego. To było w moich czasach studenckich, kiedy uczyłem się programowania współbieżnego w Javie (wątki, semafory i inne śmieci). Pomyślałem, że ten zautomatyzowany system nie może być o wiele bardziej skomplikowany niż moja zaawansowany kurs nauki o danych, więc zapytałem o pracę i wszedłem na pokład.

Klient chciał oprogramowania do handlu algorytmicznego zbudowanego przy użyciu MQL4, funkcjonalnego języka programowania używanego przez platformę Meta Trader 4 do wykonywania działań związanych z akcjami.

Od tego czasu MQL5 został wydany. Jak można się spodziewać, rozwiązuje niektóre problemy MQL4 i zawiera więcej wbudowanych funkcji, co ułatwia życie.

Rolą platformy handlowej (w tym przypadku Meta Trader 4) jest zapewnienie połączenia z brokerem Forex. Następnie broker udostępnia platformę z informacjami o rynku w czasie rzeczywistym i realizuje Twoje zlecenia kupna/sprzedaży. Dla czytelników niezaznajomionych z handlem na rynku Forex, oto informacje, które są dostarczane przez plik danych:

Ten diagram przedstawia dane związane z handlem algorytmicznym na rynku Forex.

Dzięki Meta Trader 4 możesz uzyskać dostęp do wszystkich tych danych za pomocą funkcji wewnętrznych, dostępnych w różnych ramach czasowych: co minutę (M1), co pięć minut (M5), M15, M30, co godzinę (H1), H4, D1, W1, MN .

Ruch Ceny Bieżącej nazywa się tickiem . Innymi słowy, tick to zmiana ceny Bid lub Ask dla pary walutowej. Podczas aktywnych rynków może występować wiele tików na sekundę. Podczas wolnych rynków mogą być minuty bez tiku. Tik to bicie serca robota rynku walutowego.

Kiedy składasz zamówienie za pośrednictwem takiej platformy, kupujesz lub sprzedajesz określony wolumen określonej waluty. Ustawiasz również limity stop-loss i take-profit. Limit stop-loss to maksymalna ilość pipsów (zmienności cen), którą możesz stracić, zanim zrezygnujesz z transakcji. Limit take-profit to ilość pipsów, które zgromadzisz na swoją korzyść przed wypłatą.

Jeśli chcesz dowiedzieć się więcej o podstawach handlu (np. pipsy, rodzaje zleceń, spread, poślizg, zlecenia rynkowe i inne), zobacz tutaj.

Specyfikacje algorytmicznego handlu klienta były proste: chcieli robota Forex opartego na dwóch wskaźnikach. Na przykład wskaźniki są bardzo pomocne podczas próby zdefiniowania stanu rynku i podejmowania decyzji handlowych, ponieważ opierają się na danych z przeszłości (np. najwyższa wartość ceny w ciągu ostatnich n dni). Wiele z nich jest wbudowanych w Meta Trader 4. Jednak wskaźniki, którymi interesował się mój klient, pochodziły z niestandardowego systemu transakcyjnego.

Chcieli handlować za każdym razem, gdy dwa z tych niestandardowych wskaźników przecinają się i tylko pod pewnym kątem.

Ten przykład algorytmu handlowego pokazuje wymagania mojego klienta.

Praktyczny

Kiedy ubrudziłem sobie ręce, dowiedziałem się, że programy MQL4 mają następującą strukturę:

  • [Dyrektywy preprocesora]
  • [Parametry zewnętrzne]
  • [Zmienne globalne]
  • [Uruchom funkcję]
  • [Funkcja deinicji]
  • [Rozpocznij funkcję]
  • [Funkcje niestandardowe]

Funkcja start jest sercem każdego programu MQL4, ponieważ jest wykonywana za każdym razem, gdy rynek się porusza (ergo, ta funkcja zostanie wykonana raz na tik). Dzieje się tak bez względu na ramy czasowe, z których korzystasz. Na przykład możesz operować w przedziale czasowym H1 (jedna godzina), ale funkcja startu wykonywałaby się wiele tysięcy razy w jednym przedziale czasowym.

Aby obejść ten problem, wymusiłem wykonanie funkcji raz na jednostkę okresu:

 int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...

Uzyskanie wartości wskaźników:

 // Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }

Logika decyzyjna, w tym przecięcie wskaźników i ich kąty:

 int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }

Wysyłanie zamówień:

 void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }

Jeśli jesteś zainteresowany, możesz znaleźć kompletny, uruchamialny kod na GitHub.

Testowanie wsteczne

Kiedy zbudowałem swój algorytmiczny system handlu, chciałem wiedzieć: 1) czy zachowywał się właściwie, i 2) czy stosowana przez niego strategia handlowa na rynku Forex była dobra.

Backtesting (czasami pisemne „testowanie historyczne”) to proces testowania konkretnego (zautomatyzowanego lub nie) systemu pod kątem wydarzeń z przeszłości. Innymi słowy, testujesz swój system, używając przeszłości jako proxy dla teraźniejszości.

MT4 jest dostarczany z akceptowalnym narzędziem do testowania historycznego strategii Forex (obecnie istnieją bardziej profesjonalne narzędzia, które oferują większą funkcjonalność). Na początek ustawiasz ramy czasowe i uruchamiasz program w ramach symulacji; narzędzie będzie symulować każdy tik, wiedząc, że dla każdej jednostki powinno otworzyć się po określonej cenie, zamknąć po określonej cenie i osiągnąć określone szczyty i dołki.

Po porównaniu działań programu z cenami historycznymi będziesz mieć dobre wyczucie, czy działa on poprawnie.

Wybrane przez niego wskaźniki wraz z logiką decyzji nie były opłacalne.

Z analizy historycznej sprawdziłem współczynnik zwrotu robota FX dla pewnych losowych przedziałów czasowych; Nie trzeba dodawać, że wiedziałem, że mój klient się na tym nie wzbogaci — wskaźniki, które wybrał, wraz z logiką podejmowania decyzji, nie były opłacalne . Oto przykładowe wyniki uruchomienia programu w oknie M15 dla 164 operacji:

Oto wyniki działania opracowanego przeze mnie oprogramowania do algorytmów handlowych.

Zauważ, że nasze saldo (niebieska linia) kończy się poniżej punktu początkowego.

Jedno zastrzeżenie: stwierdzenie, że system jest „dochodowy” lub „nieopłacalny” nie zawsze jest prawdziwe. Często systemy są (nie)opłacalne przez pewien czas w oparciu o „nastrój” rynku, który może podążać za szeregiem wzorców wykresów:

Kilka trendów w naszym przykładzie handlu algorytmicznego.

Optymalizacja parametrów i jej kłamstwa

Chociaż testy historyczne sprawiły, że obawiałem się użyteczności tego robota FX, byłem zaintrygowany, gdy zacząłem bawić się jego zewnętrznymi parametrami i zauważyłem duże różnice w ogólnym współczynniku zwrotu. Ta konkretna nauka jest znana jako optymalizacja parametrów .

Zrobiłem kilka wstępnych testów, aby spróbować wywnioskować znaczenie parametrów zewnętrznych na współczynniku zwrotu i wymyśliłem coś takiego:

Jednym z aspektów algorytmu Forex jest współczynnik zwrotu.

Lub posprzątać:

Algorytmiczny współczynnik zwrotu może wyglądać tak po oczyszczeniu.

Możesz pomyśleć (tak jak ja), że powinieneś użyć parametru A. Ale decyzja nie jest tak prosta, jak mogłoby się wydawać. W szczególności zwróć uwagę na nieprzewidywalność parametru A: w przypadku małych wartości błędów jego zwrot zmienia się dramatycznie. Innymi słowy, parametr A z dużym prawdopodobieństwem przewiduje przyszłe wyniki, ponieważ jakakolwiek niepewność, jakakolwiek zmiana w ogóle spowoduje gorszą wydajność.

Ale rzeczywiście, przyszłość jest niepewna! Tak więc zwrot parametru A jest również niepewny. W rzeczywistości najlepszym wyborem jest poleganie na nieprzewidywalności. Często parametr o niższym maksymalnym zwrocie, ale lepszej przewidywalności (mniejsze fluktuacje) będzie preferowany od parametru o wysokim zwrocie, ale słabej przewidywalności.

Jedyne, czego możesz być pewien, to to, że nie znasz przyszłości rynku, a myślenie, że wiesz, jak rynek będzie sobie radził na podstawie danych z przeszłości, jest błędem. Z kolei musisz uwzględnić tę nieprzewidywalność w swoich przewidywaniach na rynku Forex.

Myślenie, że wiesz, jak rynek będzie sobie radził na podstawie danych z przeszłości, jest błędem.

Niekoniecznie oznacza to, że powinniśmy używać parametru B, ponieważ nawet niższe zwroty parametru A działają lepiej niż parametr B; to tylko po to, aby pokazać, że parametry optymalizacji mogą skutkować testami, które zawyżają prawdopodobne przyszłe wyniki, a takie myślenie nie jest oczywiste.

Ogólne uwagi dotyczące handlu algorytmicznego na rynku Forex

Od czasu tego pierwszego doświadczenia z algorytmicznym handlem na rynku Forex zbudowałem kilka automatycznych systemów transakcyjnych dla klientów i mogę powiedzieć, że zawsze jest miejsce na eksplorację i dalszą analizę rynku Forex. Na przykład niedawno zbudowałem system oparty na znajdowaniu tak zwanych ruchów „wielkiej ryby”; to znaczy ogromne zmiany w pipsach w maleńkich, maleńkich jednostkach czasu. To temat, który mnie fascynuje.

Zbudowanie własnego systemu symulacji FX to doskonała opcja, aby dowiedzieć się więcej o handlu na rynku Forex, a możliwości są nieograniczone. Na przykład możesz spróbować rozszyfrować rozkład prawdopodobieństwa zmian cen jako funkcję zmienności na jednym rynku (na przykład EUR/USD) i być może stworzyć model symulacji Monte Carlo, wykorzystując rozkład według stanu zmienności, używając dowolnego stopnia dokładność, jakiej potrzebujesz. Zostawię to jako ćwiczenie dla chętnego czytelnika.

Świat Forex może być czasami przytłaczający, ale mam nadzieję, że ten artykuł dał ci kilka wskazówek, jak zacząć własną strategię handlową na rynku Forex.

Dalsza lektura

Obecnie istnieje ogromna pula narzędzi do budowania, testowania i ulepszania automatyzacji systemu handlowego: Trading Blox do testowania, NinjaTrader do handlu, OCaml do programowania, żeby wymienić tylko kilka.

Dużo czytałem o tajemniczym świecie, jakim jest rynek walutowy. Oto kilka artykułów, które polecam programistom i entuzjastycznym czytelnikom:

  • BabyPips: To jest punkt wyjścia, jeśli nie znasz się na handlu na rynku Forex.
  • Droga żółwia autorstwa Curtis Faith: Moim zdaniem jest to Biblia Forex . Przeczytaj ją, gdy zdobędziesz trochę doświadczenia w handlu i poznasz niektóre strategie na rynku Forex.
  • Analiza techniczna dla handlowca — strategie i techniki dla dzisiejszych niespokojnych globalnych rynków finansowych — Constance M. Brown
  • Expert Advisor Programming – Tworzenie zautomatyzowanych systemów transakcyjnych w MQL dla Meta Trader 4, Andrew R. Young
  • Systemy transakcyjne – nowe podejście do rozwoju systemu i optymalizacji portfela, Urban Jeckle i Emilio Tomasini: Bardzo techniczne, bardzo skoncentrowane na testach walutowych.
  • Wdrożenie krok po kroku wieloagentowego systemu handlu walutami, Rui Pedro Barbosa i Orlando Belo: Ten jest bardzo profesjonalny i opisuje, jak można stworzyć system transakcyjny i platformę testową.