Change%Przykład oscylatora obrazującego procentowe zmiany cen względem poprzedniej sesji
var close = Close(); var chng = CreateArray(close.length); for(var i = 0;i < close.length; i++) chng[i] = (close[i] - close[i-1]) / close[i-1] * 100; AddGraph(chng, 1); AddHorizLine(0);
|
... po kolei...
Wyrażenie var umieszczamy przed każdą definiowana zmienna, co zapewnia, iż nie będzie ona zmienna typu globalnego, czyli nie będzie kolidować z definicjami innych oscylatorów.
close to nasza nazwa zmiennej, której przypiszemy tablice z wartościami zamknięcia kursów (Close()).
Średnik na końcu wiersza oznacza koniec linii kodu.
var chng = CreateArray(close.length);
|
Zmiennej chng przypiszemy funkcją CreateArray typ "tablica" (array) oraz określimy liczbę jej elementów. Liczbę tą uzyskamy z długości (length) tablicy close, którą zdefiniowaliśmy wcześniej. Całe wyrażenie close.length zwróci więc ilość elementów tablicy close.
for(var i=0; i < close.length; i++) chng[i] = (close[i] - close[i-1]) / close[i-1] * 100;
|
for to pętla, która wykonywać się będzie tyle razy, aż spełniony zostanie warunek "i < close.length". Na początku pętli, zmiennej i przypisujemy wartość 0. Wraz z każdym przeskokiem pętli, zmienna będzie inkrementowana (powiększana) o jeden (wyrażenie "i++" tożsame jest z zapisem "i+=1").
Każde przejście pętli realizuje polecenia opisane formułą "chng[i] = (close[i] - close[i-1]) / close[i-1] * 100", czyli wcześniej już utworzonej zmiennej chng typu array, wraz z kolejnym indeksem i, przypisywany będzie wynik ilorazu różnicy bieżącej wartości close (close[i]) i poprzedniej wartości close (close[i-1]) oraz iloczynu poprzedniej wartości close (close[i-1]) i liczby 100.
Cała operacja zwróci wartości tablicy chng odpowiadające dziennym procentowym zmianom cen.
Czas na wyrysowanie linii z elementów tablicy chng przy użyciu predefiniowanej funkcji AddGraph. Wartość 1 podana jako drugi argument funkcji oznacza iż rysowanie zaczniemy od drugiego elementu.
Na koniec wyrysujemy poziomą linię na wysokości 0 pkt. przy pomocy predefiniowanej funkcji AddHorizLine.
Rate of Change
var close = Close(); var roc = CreateArray(close.length); var n = Param(1); for(var i = 0; i < close.length; i++) roc[i] = (close[i] - close[i-n]) / close[i-n] * 100; AddGraph(roc, n); AddHorizLine(0); AddHorizLine(10); AddHorizLine(-10);
|
Powyższy przykład jest modyfikacją wcześniej opisanego już oscylatora Change%. Tutaj przy pomocy pierwszego pola parametru...
...możemy określić liczbę sesji, jakie będą brane pod uwagę przy obliczaniu procentowej zmiany cen (korzystając z pól parametrów należy pamiętać aby wpisać wartość domyślną dla odpowiedniego pola, w prawej, górnej części okna edycji oscylatorów).
Ponadto, dodane zostały dwie poziome linie na wysokości 10 oraz -10 pkt.
AddHorizLine(10); AddHorizLine(-10);
|
MACD
var close = Close(); var avg1 = ExpAvg(close, Param(1)); var avg2 = ExpAvg(close, Param(2)); var macd = CreateArray(avg1.length); for(var i = 0; i < avg1.length; i++) macd[i] = avg1[i] - avg2[i]; AddGraph(macd, Param(2)); var signal = ExpAvg(macd, Param(3)); AddGraph(signal, Param(2) + Param(3)); AddHorizLine(0);
|
Powyższa funkcja buduje wskaźnik MACD, do czego wymagane jest użycie średnich wykładniczych.
var avg1 = ExpAvg(close, Param(1)); var avg2 = ExpAvg(close, Param(2));
|
Funkcja ExpAvg tworzy tablicę z wartościami średniej wykładniczej kursów close dla okresu odpowiadającego wartości pól Param(1) i Param(2).
var signal = ExpAvg(macd, Param(3));
|
Z kolei zmiennej signal przypiszemy tablicę z wartościami średniej wykładniczej przebiegu macd (wyliczonego dwie linijki wcześniej) dla okresu odpowiadającego wartości pola Param(3).
MACD z sygnałami kupna/sprzedaży
var close = Close(); var avg1 = ExpAvg(close, Param(1)); var avg2 = ExpAvg(close, Param(2)); var macd = CreateArray(avg1.length); for(var i = 0; i < avg1.length; i++) macd[i] = avg1[i] - avg2[i]; AddGraph(macd, Param(2)); var signal = ExpAvg(macd, Param(3)); AddGraph(signal, Param(2) + Param(3)); AddHorizLine(0); for(var i = Param(2) + Param(3); i < macd.length; i++) { if((macd[i-1] < signal[i-1]) && (macd[i] > signal[i])) AddBuySignal(i); else if((macd[i-1] > signal[i-1]) && (macd[i] < signal[i])) AddSellSignal(i); }
|
W powyższym przykładzie dodana została sekwencja, w której pętla for ...
for(var i = Param(2) + Param(3); i < macd.length; i++) { ... }
|
... sprawdza warunki położenia względem siebie linii macd i jej średniej, czyli linii signal.
if((macd[i-1] < signal[i-1]) && (macd[i] > signal[i])) AddBuySignal(i); else if((macd[i-1] > signal[i-1]) && (macd[i] < signal[i])) AddSellSignal(i);
|
Jeśli poprzednia wartość macd (macd[i-1]) jest mniejsza od poprzedniej wartości signal (signal[i-1]) i bieżąca wartość macd (macd[i]) jest większa od bieżącej wartości signal (signal[i]), funkcją AddBuySignal generowany jest sygnał kupna i umieszczony jest on na przebiegu tablicy macd w miejscu gdzie indeks i spełnia powyższe warunki.
Analogicznie jest z sygnałem sprzedaży AddSellSignal, lecz oczywiście dla odwrotnych warunków.