Pierwszym błędem jest sięganie po dane przyszłe. Jest to błąd czasami bardzo trudny do znalezienia w kodzie, zwłaszcza gdy jest już zaszyty w bardziej złożonych grupach instrukcji. Więc lepiej od razu przyswoić sobie właściwe nawyki i go nie popełniać.
W Amibrokerze jest taka instrukcja AFL która służy do przesuwania danych. Jest to funkcja Ref ( Tablica, Przesunięcie ). Pozwala ona pobrać do obliczeń dane sprzed dowolnej liczby słupków. Jeżeli spojrzysz na dane w Amibrokerze, to np. zamknięcie najstarszego słupka jest określone jako Close[0], a najnowszego Close[x], gdzie x jest numerem ostatniego słupka.
Teraz wyobraź sobie. Gdy wywołujesz Ref ( Close, -2), sięgasz dwa słupki do tyłu. Czyli np. podczas obliczeń dla słupka 10 dane pobierane są ze słupka 10-2, czyli ze słupka 8. Ponieważ słupek 8 jest starszy, był wcześniej niż 10, tak jest ok. Bo przecież cała analiza techniczna polega na sięganiu w przeszłość i obliczaniu na podstawie tej przeszłości bieżącej sytuacji.
Jednak gdy użyjesz Ref( Close, 2), sięgasz do danych o dwa słupki nowszych. W teście jest to wykonalne. Na przykład licząc dzisiaj gdy to czytasz coś dla szczytu 29 października 2007, znasz notowania dwa słupki później, czyli 31 października. Ale potem w prawdziwym życiu taki system nie otrzyma danych z przyszłości. Dzisiaj nie wiesz co będzie za dwie sesje. Nie znasz przecież przyszłości i Amibroker też jej nie zna.
Prosty system dający niesamowite rezultaty w testach:
Buy = ( 1.02*Close < Ref(Close,1) );
Sell = ( Close > Ref( Close,1) );
Buy = ExRem( Buy,Sell );
Sell = ExRem( Sell,Buy );
Zrobi z 10 000 zł w 10 lat inwestując tylko na danych dziennych 47 552 245zł. Czterdzieści siedem milionów! To jest ponad 475 tysięcy %!
Ale ten system sięga po dane przyszłe. Na prawdziwym rynku nie ma w ogóle szans na zyski i jakiekolwiek podejmowanie decyzji.
Dlatego pilnuj, żeby zawsze parametr który w funkcji Ref() oznacza przesunięcie miał wartość ujemną. Tylko wtedy Twój system działa w realnym świecie.