ISPAG – Awesome Oscillator

Bookmark and Share

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:

Awesome Oscillator (ang.)

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/

Similar posts:

0 Responses to “ISPAG – Awesome Oscillator”


  1. No Comments

Leave a Reply




Subscribe without commenting