śro, 30 kwi 2025, 3:29 CEST, NY 21:29, Londyn 2:29, Tokio 10:29, ^SPX +0.58%
 Symbol np: ^SPX   
 Symbol np: ^SPX   
Login i hasło     zapisz  
Jak konstruować własne oscylatory?
< Powrót do wykresu
Skorzystanie z opcji tworzenia własnych oscylatorów, wymaga w pierwszej kolejności aktywacji jej obsługi w konfiguratorze aplikacji. Włącz tam opcję "Obsługa własnych oscylatorów".

Aby utworzyć, przeedytować lub usunąć własny oscylator, kliknij prawy przycisk myszy nad menu z listą oscylatorów w aplikacji Analizy Technicznej.

Funkcje predefiniowane

Własne oscylatory budować można przy pomocy języka javascript.
Do konstrukcji używać można kilkunastu predefiniowanych funkcji:

Open() - Kurs otwarcia
High() - Kurs najwyższy
Low() - Kurs najniższy
Close() - Kurs zamknięcia lub kurs ostatni
Volume() - Wartość wolumenu
OpenInt() - Wartość liczby otwartych pozycji

Max(array, period) - Najwyższa wartość z wartości tablicy array dla danego period czyli okresu
Min(array, period) - Najniższa wartość z wartości tablicy array dla danego period czyli okresu
SimpleAvg(array, period) - Średnia arytmetyczna z wartości tablicy array dla danego period czyli okresu
ExpAvg(array, period) - Średnia wykładnicza z wartości tablicy array dla danego period czyli okresu
StdDev(array, period) - Odchylenie standardowe z wartości tablicy array dla danego period czyli okresu

CreateArray(length) - Inicjuje tablice z liczbą elementów równą length
Param(n) - Wartość n parametru czyli wartości z pierwszego, drugiego lub trzeciego pola parametrów

AddGraph(array, index) - Rysuje linie z wartości tablicy array, począwszy od elementu numer index (wartość index jest opcjonalna)
AddHorizLine(value) - Rysuje linię poziomą na wysokości wartości value
AddBuySignal(index) - Umieszcza sygnał kupna na elemencie tablicy numer index
AddSellSignal(index) - Umieszcza sygnał sprzedaży na elemencie tablicy numer index


Jak budować własne oscylatory?

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...

var close = Close();

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.

AddGraph(chng, 1);

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.

AddHorizLine(0);

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...

var n = Param(1);

...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.


Ewentualne problemy

Jeśli po utworzeniu własnego oscylatora nie wyświetla się jego przebieg, należy celem odświeżenia danych zmienić interwał wykresu np. z dziennego na tygodniowy. Po tym zabiegu oscylator winien wyświetlać się prawidłowo.


© 2000-2025 Stooq