Poproszono mnie ostatnio o implementację niestandardowego wskaźnika do ISPAG-a (aplet wykresów) spotykanego pod nazwą Awesome Oscillator lub czasami zamiennie Elliott Wave Oscillator.
Pomyślałem, że może przydać się jeszcze komuś, więc go w tym miejscu publikuję:
/* *** ISPAG - wskaźniki użytkownika *************************************** *
* Awesome Oscillator / Elliott Wave Oscillator *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Wersja: 1.0.0 (2009-03-22) *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Opis: *
* Implementacja niestandardowego oscylatora (Awesome Oscillator lub *
* inaczej Elliott Wave Oscillator) dla apletu ISPAG 9.5. *
* *
* Domyślne parametry: *
* Param(1) = 5 *
* Param(2) = 34 *
* Param(3) = 14 *
* *
* Opis parametrów: *
* Param(1) - liczba okresów szybkiej SMA *
* Param(2) - liczba okresów wolnej SMA *
* Param(3) - generowanie sygnałów kupna/sprzedaży na podstawie reguł: *
* 4 = Saucer *
* 8 = Twin Peaks *
* 6 = Zero Line + Saucer *
* 10 = Zero Line + Twin Peaks *
* 12 = Saucer + Twin Peaks *
* 14 = Zero Line + Saucer + Twin Peaks *
* *
* Wyjaśnienie sygnałów: *
* http://www.metaquotes.net/techanalysis/indicators/awesome_oscillator *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright (c) 2009 Division Logiciel *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Aktualna wersja: http://blog.dvl.pl/snippets/ispag *
* Kontakt z autorem: karol (na) dvl (kropka) pl *
* ************************************************************************* */
/* ************************************************************************* *
* Changelog: *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* + 2009-03-22 v1.0.0 *
* - Pierwsze wydanie *
* ************************************************************************* */
/* ************************************************************************* *
* License: GPL v3 or later (http://www.gnu.org/licenses/gpl.txt) *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 3 of the License, or (at your *
* option) any later version. *
* *
* This program is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
* Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along *
* with this program. If not, see <http ://www.gnu.org/licenses/>. *
* ************************************************************************* */
/* ************************************************************************* *
* Implementacja wskaźnika: *
* ************************************************************************* */
/* Rysowanie wskaźnika - ze względu na brak histogramów w formie ciągłej */
var high = High();
var low = Low();
var median = CreateArray(high.length);
for (var i=0; i<median .length; i++) {
median[i] = (high[i] + low[i]) / 2;
}
var sma1 = SimpleAvg(median, Param(1));
var sma2 = SimpleAvg(median, Param(2));
var AO = CreateArray(median.length);
for (var i=0; i<AO.length; i++) {
AO[i] = sma1[i] - sma2[i];
}
AddGraph(AO, 0);
AddHorizLine(0);
/* Generowanie sygnałów kupna/sprzedaży */
var zeroCross = 0;
var saucer = 0;
var twinPeaks = 0;
/* Ustalenie pożądanego trybu generowania sygnałów */
switch (Param(3)) {
case 2:
zeroCross = 1;
break;
case 4:
saucer = 1;
break;
case 8:
twinPeaks = 1;
break;
case 6:
zeroCross = 1;
saucer = 1;
break;
case 10:
zeroCross = 1;
twinPeaks = 1;
break;
case 12:
saucer = 1;
twinPeaks = 1;
break;
case 14:
zeroCross = 1;
saucer = 1;
twinPeaks = 1;
break;
}
var lastHigh = 0;
var lastLow = 0;
var momentum = 1;
/* Generowanie sygnałów, implementacja najprostsza/najczytelniejsza.
* Przy dużej ilości obrabianych danych mogłaby się przydać optymalizacja
* w paru miejscach.
*/
for (var i=0; i<AO.length; i++) {
if (zeroCross || twinPeaks) {
/* Zero Cross - przebicie poziomu 0 */
if (AO[i-1] * AO[i] < 0) {
if (twinPeaks) {
/* Twin Peaks - reset */
lastLow = 0;
lastHigh = 0;
momentum = 1;
/* Twin Peaks - reset end */
}
if (zeroCross) {
if (AO[i] > 0)
AddBuySignal(i);
else
AddSellSignal(i);
}
}
}
if (saucer) {
/* Saucer - odwrócenie */
if (AO[i] > 0 && AO[i-1] > 0 && AO[i-2] > 0) {
if (AO[i-2] < AO[i-3] && AO[i-1] < AO[i-2] && AO[i] > AO[i-1])
AddBuySignal(i);
}
if (AO[i] < 0 && AO[i-1] < 0 && AO[i-2] < 0) {
if (AO[i-2] > AO[i-3] && AO[i-1] > AO[i-2] && AO[i] < AO[i-1])
AddSellSignal(i);
}
}
if (twinPeaks) {
/* Twin Peaks - mniejszy szczyt */
if (AO[i] < 0) {
if (AO[i] > AO[i-1]) {
if (momentum) {
if (AO[i-1] > lastLow) AddBuySignal(i-1);
lastLow = AO[i-1];
momentum = 0;
}
} else {
momentum = 1;
}
}
if (AO[i] > 0) {
if (AO[i] < AO[i-1]) {
if (momentum) {
if (AO[i-1] < lastHigh) AddSellSignal(i-1);
lastHigh = AO[i-1];
momentum = 0;
}
} else {
momentum = 1;
}
}
}
}
/*::~ EOF */
Co do skuteczności samego wskaźnika nie będę się wypowiadał, bo nie miałem go okazji testować w praktyce.
Z zasadą działania można się zapoznać na następujących stronach:
Elliott Wave Oscillator (ang.)
Zastosowanie Awesome Oscillator w ramach wskaźnika Accelerator/Decelerator (pol.)
Jako że jest to pierwsza wersja implementacji, błędy są jak najbardziej możliwe. Prosiłbym o kontakt w przypadku ich wykrycia. Ze względu na ograniczenia ISPAG-a wskaźnik nie ma charakteru histogramu, ale oscylatora ciągłego. Poza aspektem graficznym nie wpływa to jednak na funkcjonalność.
Wersja wskaźnika w pliku tekstowym do pobrania dostępna jest w ramach repozytorium: http://blog.dvl.pl/snippets/ispag/






0 Responses to “ISPAG – Awesome Oscillator”