Jednym z interesujących aspektów używania języka formuł programu AmiBroker jest tworzenie automatycznych komentarzy do wykresów. Realizacja tego wygląda następująco:
Dostęp do komentarzy uzyskujemy z menu Analysis->Commentary. Otwierając okno zobaczysz dwie zakładki: Commentary i Formula. W zakładce Formula możesz wprowadzic wyrażenie AFL, które zostanie wykorzystane przez program AmiBroker do utworzenia dynamicznego komentarza widocznego w zakładce Commentary. W dalszej części poprowadzimy Cię przez kolejne etapy pisania wlasnych komentarzy.
Tworzenie stałego tekstu
Stałe teksty (komunikaty) umieszczane w formułach muszą się zawierać w cudzysłowiach i kończyć średnikiem, jak to zostało pokazane na poniższym przykładzie:
"To jest przykładowy stały tekst";
Możesz pisać wiele komentarzy umieszczając je w oddzielnych wierszach w oknie komentarzy:
"To jest pierwsza linia tekstu";
"To jest druga linia tekstu";
Wprowadź te przykłady do pola edycji w zakładce Formula i przełącz się do zakładki Commentary. Zobaczysz ten sam tekst wyświetlany bez cudzysłowi i średników. Dzieje się tak dlatego, że AmiBroker przetworzył ten prosty tekst na łańcuch i wyświetlił go w oknie.
Wpisując teksty w wielu wierszach możesz za pomocą pokazanej powyżej metody lub używając prostej skwencji przełamującej linię ('\n'):
"To jest pierwsza linia tekstu\nTo jest druga linia tekstu\nTo jest trzecia linia tekstu";
Możesz także połączyć ciągi wyrażeń w jedną linię:
"To" +
" jest" +
" jedna"+
" linia" + " tekstu";
Myślę, że jesteś już zmęczony tymi prostymi przykładami. Weźmy się zatem za treść dynamiczną.
Zawartość dynamiczna
AFL oferuje kilka specjalnych funkcji uaktywniających dynamiczne komentarze, ale dwie z nich są szczególnie ważne: WriteVal() oraz WriteIF(). Funkcja WriteIF() jest wykorzystywana do wyświetlania tekstów warunkowych i będzie opisana w dalszej części artykułu, a tym czasem zobaczmy co możemy zrobić za pomocą funkcji WriteVal().
Podręcznik do AFL mówi:
SKŁADNIA | writeval( LICZBA ); writeval( TABLICA ); |
ZWRACA | ŁAŃCUCH (STRING) |
ZASTOSOWANIE | Funkcja ta może być wykorzystywana wyłącznie przez Guru tworzących komentarze. Jest używana do wyświetlenia liczbowej wartości zmiennej LICZBA lub TABLICA. |
Tak więc jeżeli chcesz wyswietlić wartość liczby lub zaznaczonego notowania w tablicy, powinieneś użyć funkcji writeval(). Ale... zaczekaj chwileczkę - co to znaczy "zaznaczonego notowania w tablicy"? Pozwól mi to wyjaśnić za pomocą prostej formuły (proszę byś wprowadził ją w zakladce Formula):
writeval( close );
Po przełączeniu się do zakładki Commentary zobaczysz wartość ceny zamknięcia (tę samą która jest wyświetlana w nagłówku głównego arkusza cenowego). Ale gdy klikniesz na wykresie w innym miejscu, wybierając inną datę a następnie naciśniesz przycisk "Refresh", zobaczysz inną wartość - cenę zamknięcia zaznaczonego dnia. Tak więc funkcja writeval( close ) wyświetla wartość dotyczącą aktualnie zaznaczonego notowania w tablicy cen zamknięcia. Oczywiście funkcja ta działa w ten sam sposób z innymi tablicami. Pisząc
writeval( macd() );
otrzymasz dokładną wartość wskaźnika MACD w dniu który zaznaczyłeś na wykresie. Dysponując takim stanem wiedzy możemy stworzyć pewną statystykę:
"Cena zamknięcia= " + WriteVal( close );
"Zmiana od wczoraj = " + WriteVal( close - ref( close, -1 ) );
"Procentowa zmiana od wczoraj = " + WriteVal( roc( close, 1 ) ) + " %";
"MACD =" + WriteVal( macd() ) + " , Signal line =" + WriteVal( signal() );
Po przełączeniu się do Commentary zobaczysz co następuje:
Cena zamknięcia = 17.940
Zmiana od wczoraj = -0.180
Procentowa zmiana od wczoraj = -0.993 %
MACD = -0.001 , Signal line = 0.063
Proste, prawda? Możesz także zapisać symbol waloru dla danej akcji i zaznaczoną datę używając funkcji name() oraz date() jak poniżej:
"Dane statystyczne dla " + name() + " dla " + date();
Ale opuściliśmy tutaj możliwość wyświetlenia jednego komunikatu w przypadku spełnienia pewnego warunku i innego w przeciwnym razie...
Warunkowe wyświetlanie tekstu
AFL jest wyposażony w bardzo praktyczną funkcję zwaną WriteIF(), która powoduje wyświetlenie różnych tekstów w zależności od spełnienia lub nie zadanego warunku. Spójrzmy co mówi dokumentacja:
SKŁADNIA | writeif( WYRAŻENIE, "TEKST PRAWDA", "TEKST FAŁSZ" ) |
ZWRACA | LAŃCUCH (STRING) |
ZASTOSOWANIE | Funkcja ta może być wykorzystywana wyłącznie przez Guru tworzących komentarze. Jeżeli "WYRAŻENIE" przyjmuje wartość "prawda", wyświetlany jest "TEKST PRAWDA" jako komentarz. Jeżeli "WYRAŻENIE" przyjmuje wartość "fałsz", wyświetlany jest "TEKST FAŁSZ". |
Tak więc możemy wyświetlić różne teksty w zależności od wyrażenia:
writeif( macd() > signal(), "MACD jest zwyżkujące ponieważ jest powyżej linii sygnałowej", "MACD jest aniżkujące ponieważ jest poniżej linii sygnałowej" );
Możemy połaczyć wiele wywołań funkcji WriteIf() uzyskując więcej możliwości:
"Aktualna sytuacja rynkowa dla "+ name() + " jest ";
avgcond1 = ( c > ema( close, 200) ) + 0.1 * ( close > ema( close, 90) ) + 0.1 * ( close > ema( close , 30 ) );
avgcond2 = -( c < ema( close, 200) ) - 0.1 * ( close < ema( close, 90) ) - 0.1 * ( close < ema( close , 30 ) );
WriteIf( avgcond1 == 1.2,
"silnie zwyżkująca",
WriteIf( avgcond1 == 1.1,
"zwyżkująca",
WriteIf( avgcond1 == 1.0,
"średnio zwyżkująca", "") ) ) +
WriteIf( avgcond2 == -1.2,
"silnie zniżkująca",
WriteIf( avgcond2 == -1.1,
"zniżkująca",
WriteIf( avgcond2 == -1.0,
"średnio zniżkująca", "") ) );
Powyższa formuła zwróci tekst "Aktualna sytuacja synkowa dla {symbol waloru} jest silnie zwyżkująca jeżeli średnia z 30 dni jest wyższa od średniej z 90 dni i średnia z 90 dni jest wyższa od średniej z 200 dni. W innych przypadkach formuła zwróci wyniki: zwyżkująca, średnio zwyżkująca, średnio zniżkująca, zniżkująca i silnie zniżkująca.
Aby uzyskać więcej przykladów tworzenia komentarzy AFL proszę odwiedzić bibliotekę formuł AFL a w szczególności zobaczyć formułę MACD która demonstruje wszystkie przedstawione tu techniki.
No to teraz jesteś już gotów aby ruszyć z własnymi komentarzami. Powodzenia!