czwartek, 2 lutego 2012

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #4

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #4

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak te kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić.

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.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #3

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #3

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak te kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić.

Błąd trzeci wiąże się również z ceną, ale ma również cechy sięgania do danych przeszłych. Tak samo trudny jest do wykrycia gdy zostanie już mocno obudowany innym kodem. Aby się przed nim uchronić trzeba wyrobić sobie prawidłowy nawyk analizy już na etapie tworzenia założeń systemu.

Błąd ten sięga do danych przeszłych, ale robi to subtelniej. Nie używa on bowiem funkcji Ref(), a jedynie steruje ceną i sygnałem w sposób nie do powtórzenia na rzeczywistym rynku.

Przykładem jego jest wygenerowanie sygnału w trakcie trwania lub na koniec słupka i zawarcie transakcji po cenie otwarcia tego samego słupka.

Zobacz bardzo prosty, ale skrajny kod takiej sytuacji:

Buy = (Close>Open);
Sell = Buy;
BuyPrice = Open;
SellPrice = Close;

Wszystko wygląda w porządku. Amibroker nie wniesie żadnych poprawek do transakcji, bo ceny przyjęte do transakcji rzeczywiście występowały na rynku. Nie ma instrukcji Ref(), więc wydaje się, że nie ma nawet co sprawdzać, czy przypadkiem nie sięgasz do danych przyszłych. Jednak zastanów się nad chronologią.

Kupujesz w cenie otwarcia wg. jakiegoś sygnału - możliwe.

Sprzedajesz w cenie zamknięcia zaraz w tym samym dniu - możliwe.

Sygnał kupna masz gdy słupek jest rosnący, czyli gdy zamknie się wyżej niż się otworzył - jak najbardziej możliwe.

Ale ale. Sygnał przecież jest generowany po zamknięciu słupka. Wtedy dopiero znasz prawdziwą cenę Close. Załóżmy, że inwestujesz na interwale dziennym. Jak zamierzasz wieczorem na koniec sesji zawrzeć realną transakcję w cenie z samego rana?

Musisz zachować uważność nie tylko w trakcie użycia funkcji Ref(). Tak samo w trakcie wyznaczania ceny transakcji nie wystarczy sprawdzić, czy jest ona realnie osiągalna na rynku. Musisz jeszcze pomyśleć nad chronologią.

Po prostu zawsze sprawdź w jakim momencie występuje sygnał, a w jakim momencie występuje przyjmowana cena. Amibroker ma bardzo ograniczone możliwości przypilnowania Ciebie w takiej sytuacji. Jeżeli cena jest dostępna równocześnie z sygnałem - ok. W wielu przypadkach tak będzie dobrze. Jeżeli cena jest brana z otwarcia kolejnego słupka lub transakcja jest jeszcze bardziej opóźniona - masz sytuację idealną i najbardziej zgodną z tym jak inwestowanie wygląda w rzeczywistości.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #2

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #2

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak te kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić.

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.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #1

6 największych błędów przez które Twój system inwestycyjny w AFL będzie oszukiwał przy testach, a potem będzie tracił na giełdzie - błąd #1

Autorem artykułu jest Rafał Wysocki



Język AFL w Amibrokerze jest potężnym narzędziem konstruowania systemów inwestycyjnych. Można też przeprowadzić bardzo rozbudowane testy zanim zainwestuje się prawdziwe pieniądze. Jednak kilka błędów może spowodować, że wszystkie testy będą przekłamane, a Twoja inwestycja będzie zagrożona. Zobacz jak się przed tym uchronić

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.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na
http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl

Jak zaprogramować stop który się nie cofa za pomocą Amibrokera i języka AFL

Jak zaprogramować stop który się nie cofa za pomocą Amibrokera i języka AFL

Autorem artykułu jest Rafał Wysocki



W Amibrokerze bardzo łatwo wylicza się podstawę do skutecznego zlecenia stop. Czy to odległość procentową, czy odległość liczoną ze zmienności. Jednak linia taka narysowana na wykresie będzie iść za wykresem w obydwu kierunkach. Poznaj prosty sposób aby przesuwała się tylko w jednym kierunku.

Podstawową zasadą większości zleceń stop jest podążanie za wykresem po rozpoczęciu inwestycji. Jednak podążanie to powinno odbywać się tylko w kierunku ochrony kapitału. Są przecież sytuacje, kiedy poziom stop wynikający z aktualnych obliczeń jest niższy niż wyliczony poprzednio. Są też takie momenty, kiedy rynek się cofa w kierunku Twojego ostatniego poziomu ochrony. W takich sytuacjach zlecenie stop powinno pozostawać na wartości do której już raz dotarło. Ono nie ma prawa się cofać.

Łatwo powiedzieć, ale początkującemu systemowcowi trudno to uzyskać. Istnieje jednak proste rozwiązanie - wystarczy zastosować zwykłą pętlę.

Jak zwykle w programowaniu taki sam efekt można uzyskać na kilka sposobów. To jest zaledwie jedno rozwiązanie. Drugim jest chociażby użycie instrukcji tablicowych. Kod będzie jeszcze krótszy, ale trudniejszy do zrozumienia. Dlatego poznaj najpierw sposób łatwiejszy.

W tym przykładzie zobaczysz jedynie rozwiązanie problemu cofania. Zakładam, że masz już policzoną odległość stop dla każdego słupka. Obliczenia umieść w tablicy stop1. Np. dla stopu na 5% inwestycji:

stop1 = High * 0.95;

Czas na właściwą linię stop. Umieść ją w zmiennej liniaStop. Dla pierwszego słupka oczywiście musisz przyjąć, że liniaStop jest na tym samym poziomie co stop1:

liniaStop[0] = stop1[0];

Ale co dalej?

Teraz należy przejrzeć wszystkie kolejne słupki od 1 do końca stosując następujące regułę:

Jeżeli stop1 przesuwa się dalej niż dotychczasowa liniaStop, to przesuń liniaStop na wartość taką jak stop1.
Jeżeli nie, oznacza to, że stop1 się cofnął lub nie zmienił. Użyj wtedy dotychczasowej wartości liniaStop.

Po zapisaniu jako AFL wygląda to tak:

for ( i =1; i {
if ( stop1[i] > liniaStop[i-1] ) liniaStop[i] = stop1[i];
else liniaStop[i] = liniaStop[i-1];

//*
}

Jednak brakuje jeszcze jednego ważnego elementu. Tak narysowany stop będzie szedł w górę wykresu również wtedy, gdy zostanie zrealizowany. Będzie się wspinał na wyższe i wciąż wyższe poziomy. Trzeba dodać jeszcze warunek zrealizowania stopu:

Gdy cena zamknięcia zejdzie poniżej liniaStop, pozwól na cofnięcie.

Uznajesz wtedy, że nastąpiło przecięcie i nastąpiła realizacja zlecenia ochronnego. Tym samym zakaz cofania stopu przestaje obowiązywać i przywracasz mu wartość obliczoną w stop1.

W kodzie w miejscu gwiazdki wystarczy dodać:

if ( Close[i] < liniaStop[i] ) liniaStop[i] = stop1[i];


To wszystko. Najprostszy stop masz już zaprogramowany i linia się nie cofa do momentu jego realizacji.

Oczywiście można teraz dodać instrukcje rysujące linie, dodać zaznaczanie sygnałów itd. Można też zastosować bardziej skomplikowane reguły wyliczania linii stop1, nie tylko jako odległość procentową. Jednak ten kod już jest podstawą do rozbudowy w kierunku dowolnie skomplikowanych systemów inwestycyjnych.

---

Zbuduj swój własny, skuteczny system inwestycyjny.
Więcej dowiesz się na http://zobacz.CzarodziejAFL.pl/

Akcje, Kontrakty FW20, DAX, S&P500, Forex.


Artykuł pochodzi z serwisu www.Artelis.pl