Błąd czwarty nie jest błędem charakterystycznym tylko dla programowania systemów inwestycyjnych, czy dla Amibrokera i języka AFL. Jest to błąd dokuczający programistom w wielu językach programowania, choćby w C/C++, PHP i kilku innych.
Chodzi o drobny błąd zapisu. Jeden znak za mało, ale rezultaty są bardzo nieprzewidywalne. Zwłaszcza, że akurat Amibroker nie ma porządnego debuggera z wykonywaniem kodu linijka po linijce i podglądaniem zawartości zmiennych.
Ten błąd zapisu, to użycie znaku = zamiast == w instrukcjach warunkowych.
W AFL zapis
sesja = Close - Open;
oznacza, że do zmiennej sesja zostanie przypisany wynik obliczenia. W tym wypadku różnica między zamknięciem i otwarciem słupka.
Natomiast porównanie wymaga dwóch znaków równa się "==". Czyli dla przykładu, jeżeli chcesz wyłapać wszystkie sesje które zamknęły się na tym samym poziomie co otworzyły (tak zwana świece doji), możesz zapisać to wg potrzeb:
if( Close[i] == Open [i] ) ...
lub
Iif( Close == Open, ...
lub wreszcie możesz przypisać to do zmiennej
doji = ( Close == Open );
Co się jednak stanie, gdy np. w ostatnim zapisie pomylisz się i zapomnisz o drugim "="?
doji = ( Close = Open );
Otóż Amibroker potraktuje to jako przypisanie. Do zmiennej Close przypisze wartość z Open, a następnie tą sama wartość przypisze do zmiennej doji. Czyli wykona:
Close = Open;
doji = Close;
Nie będzie w tym żadnego sprawdzania i porównywania. Wyjdzie zwykłe podstawienie zmiennych.
A co z instrukcjami warunkowymi If i Iif? Błędnie zapisane:
if( Close[i] = Open [i] ) ...
lub
Iif( Close = Open, ...
również spowodują podstawienie wartości z prawej do zmiennej z lewej strony. I wartość tego podstawienia będzie brana pod uwagę przy decydowaniu o spełnieniu warunku.
W AFL fałsz (False) jest równy 0. Prawda (True) natomiast jest domyślnie liczbą 1. Jednak każda wartość różna od 0 jest uznawana za wynik prawdziwy. Czyli w takich dwóch zapisach jak powyżej, warunek będzie prawdziwy dla wszystkich Open różnych od 0, a fałszywy dla wszystkich Open równych 0. Natomiast Close będzie miało skasowaną oryginalną zawartość i przyjmie wartości z tablicy po prawej stronie zapisu.
Jak bronić się przed tym błędem? Najlepiej pamiętać o "==" w trakcie pisania. Jednak dodatkowo po napisaniu kodu możesz wyszukać w nim wszystkie "if" i sprawdzić czy któryś nie zawiera samego "=" w wyniku pomyłki. Cofnij się kursorem tekstowym na sam początek programu i wciśnij Ctrl-F. Wyskoczy okienko w którym wpiszesz "if". Następnie obserwując wciskaj [Enter] aż do końca kodu. Komputer po kolei pokaże Ci wszystkie miejsca, gdzie znajduje się instrukcja "if". Dodatkowo pokaże także wszystkie instrukcje "Iif". Ty musisz tylko patrzeć uważnie czy zapisy są prawidłowe i ewentualnie dokonać poprawek.