Błąd drugi wiąże się z ceną. Również może być trudny do wykrycia. Na dodatek nie wiadomo na ile fałszuje wynik testu. Może to robić tylko trochę, ale może też powodować wyniki niesamowicie różne od możliwych w rzeczywistości.
W Amibrokerze w momencie kiedy zawierasz transakcję masz możliwość zadecydowania po jakiej cenie jest ona wykonywana. Dotyczy to oczywiście wszystkich czterech możliwych transakcji - czy to kupna, czy sprzedaży, czy odpowiednich transakcji dla pozycji krótkiej.
Najlepszą praktyką jest zawsze zawieranie transakcji po cenie zamknięcia słupka, lub jeszcze lepiej po cenie otwarcia następnego słupka. Jednak są sytuacje, kiedy nie będzie to wystarczające. Np. jeżeli wykreślasz linię stop. Możesz sprawdzać jej przekroczenie dopiero po cenach zamknięcia i sprawa jest prosta. Stosujesz wtedy właśnie jedną z dwóch przedstawionych przed chwilą cen.
Ale możesz też traktować stop jako zlecenie oczekujące na rynku. Wtedy nawet gdy inwestujesz wg danych dziennych, stop musisz obserwować w danych intraday. Tak musi być, ponieważ stop ten zadziała również w trakcie sesji, a nie tylko na jej koniec. Jeżeli sesja otworzy się nad linią stop i w ciągu dnia ją przetnie, masz prawo założyć, że zlecenie zrealizowało się dokładnie w cenie przez nią wyznaczanej.
Jednak właśnie tu tkwi jedna z pułapek. Co bowiem, gdy rynek otworzy się luką i od razu będzie sporo poniżej linii stop? Jeżeli przyjmiesz jako cenę transakcji wartość wynikającą z tej linii, to stwarzasz sytuację niemożliwą do osiągnięcia na prawdziwym rynku. W tej konkretnej sytuacji najlepszym rozwiązaniem jest przyjęcie ceny otwarcia słupka. Po prostu zakładasz, że widząc otwarcie słupka poniżej linii stop od razu zamykasz transakcję.
Jest to przykład wzięty z prawdziwych systemów inwestycyjnych. A nie jest on jedyną możliwością zafałszowania ceny.
Tak naprawdę w kodzie AFL możesz podstawić dowolną cenę transakcji. Bez względu na to, czy była ona realnie do osiągnięcia. Bez względu nawet na to, czy taka cena występowała na rynku.
Amibroker stara się taki błąd wyeliminować i ogranicza cenę do takiej jaka w danym słupku była możliwa. Także jeżeli Ty przyjmiesz cenę spoza słupka, on do transakcji weźmie maksimum lub minimum. Jednak dalej jest to sytuacja nieprawdopodobna i wynik testu będzie nieprawdziwy.
Zobacz skrajny przykład kodu fałszującego cenę
Buy = (DayOfWeek()==1);
Sell = Ref(Buy,-1);
BuyPrice = Low;
SellPrice = Ref(Low,-1)*10;
Kod ten kupuje zawsze w cenie minimum w poniedziałek, a usiłuje sprzedać we wtorek w cenie 10 razy wyższej. Samo to, że Amibroker przyjmie przy sprzedaży cenę maksimum nie powoduje prawidłowego działania takiego systemu. Choćby dlatego, że cena minimum i maksimum słupka znana jest dopiero po fakcie, po zakończeniu tego słupka. Więc jest to cena nierealna dla prawdziwych transakcji.
Dlatego właśnie zawsze musisz przemyśleć realność stosowanych cen. Zawsze musisz też sprawdzić, czy były one znane w momencie zawierania transakcji.