Ostatnich kilka artykułów z cyklu „Profesjonalny inwestor" poświęconych było testowaniu prostych systemów transakcyjnych bazujących na najbardziej popularnych wskaźnikach analizy technicznej. Zaprezentowałem m.in. system wybicia z kanałów cenowych, zwany systemem żółwi, oraz koncepcję Wellesa Wildera opartą na przekroczeniu przez cenę progu zmienności liczonego wskaźnikiem ATR. Strategie te testowałem na rynku kontraktów terminowych na WIG20, a wszystkie testy zostały przeprowadzone w programie MetaStock. W poniższym artykule chciałbym się skupić właśnie na możliwościach tego programu, a konkretnie na jego module „system tester". Postaram się przybliżyć podstawy języka MetaStock i pokazać, w jaki sposób, krok po kroku, można przeprowadzić test systemu na danych historycznych.
Trochę matematyki i logiki
MetaStock to jeden z najpopularniejszych programów dedykowanych analizie technicznej. Oprócz standardowych możliwości „zabawy" wykresem, czyli nanoszenia na niego różnych wskaźników (ponad 200 wskaźników wbudowanych w programie), posiada on również możliwość budowania i testowania systemów transakcyjnych. Opcja ta jest dostępna dzięki wbudowanemu, prostemu językowi programowania, który umożliwia zapis naszych kryteriów inwestycyjnych w formie precyzyjnego kodu. Język ten bazuje na pięciu identyfikatorach ceny, zapisywanych w języku angielskim: open (cena otwarcia), high (cena maksymalna), low (cena minimalna), close (cena zamknięcia) oraz volume (wielkość obrotu). Używając w kodzie tych identyfikatorów, pokazujemy programowi, którą cenę (albo wolumen) ma on brać pod uwagę podczas testu. Przykładowo, jeśli warunek kupna zapiszemy jako: cross(close,mov()), MetaStock zrozumie to jako przecięcie od dołu przez cenę zamknięcia konkretnej średniej kroczącej.
Oprócz identyfikatorów, język zawiera również operatory matematyczne, które są spoiwem łączącym poszczególne elementy kodu. Są to podstawowe działania: dodawanie (+), odejmowanie (-), dzielenie (/) oraz mnożenie (*). Zapisujące więc w kodzie wyrażenie: (high+low)/2, program będzie nam zwracał średnią z cen najwyższej i najniższej. Nawiasy wykorzystywane w kodzie służą pokazywaniu kolejności przeprowadzania działań.
Drugim ważnym spoiwem elementów kodu są operatory logiczne „and" oraz „or". Pierwszego używamy wtedy, gdy chcemy, by pewne warunki były spełnione łącznie, a drugiego, gdy wystarczy spełnienie tylko jednego spośród zapisanych w kodzie. Przykładowo, jeśli napiszemy: close>2 and macd()>0, program zrozumie, że cena zamknięcia musi być większa od dwóch i jednocześnie wskaźnik MACD musi być wyższy od 0, by całe wyrażenie było prawdziwe. Gdyby oba elementy łączył operator „or", wystarczyłoby spełnienie tylko jednego z warunków.