Category Trend  Published on 25/10/2023

WSO & WRO indicator

An update for this algorithm is currently pending moderation. Please revisit this page shortly to access the algorithm's latest version.
Description

This custom oscillator is based on the 'Automated Support And Resistance' concept from an article by Mel Widner published in TASC.

The indicator consists of two components: the WSO (Widner Support Oscillator) and the WRO (Widner Resistance Oscillator).

The WSO compares the current Close with the six most recent support levels. Values range from 0 to 100. WSO = 0 indicates that the Close is below all six support levels, while WSO = 100 indicates that the current Close is above all six support levels. Changes in WSO indicate shifts in support, either breaking an old level or establishing a new one.

A similar concept applies to the WRO. The WRO compares the current Close with the six most recent resistance levels. Values also range from 0 to 100. WRO = 0 means that the Close is below all six resistance levels, and WRO = 100 means that the current Close is above all six resistance levels. Changes in WRO indicate changes in resistance, which can involve breaking an old level or establishing a new one.

using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;

namespace cAlgo
{
    [Levels(0, 50, 100)]
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class mWsoWro : Indicator
    {
        [Parameter("Periods (9)", DefaultValue = 9)]
        public int inpPeriod { get; set; }

        [Output("WSO Support", LineColor = "Green", PlotType = PlotType.Line, Thickness = 2)]
        public IndicatorDataSeries outWSO { get; set; }
        [Output("WRO Resistance", LineColor = "Red", PlotType = PlotType.Line, Thickness = 2)]
        public IndicatorDataSeries outWRO { get; set; }

        private IndicatorDataSeries _wso, _wro;
        private double[] _min, _max;
        private int centerid;
        

        protected override void Initialize()
        {
            _min = new double[6];
            _max = new double[6];
            _wso = CreateDataSeries();
            _wro = CreateDataSeries();
            centerid = Convert.ToInt16((inpPeriod - 1) / 2); //4
        }

        public override void Calculate(int i)
        {
            if(Bars.LowPrices.Minimum(inpPeriod) == Bars.LowPrices[i-centerid])
            {
                 _min[5] = _min[4];
                 _min[4] = _min[3];
                 _min[3] = _min[2];
                 _min[2] = _min[1];
                 _min[1] = _min[0];
                 _min[0] = Bars.LowPrices[i-centerid];
            }
            
            if(Bars.HighPrices.Maximum(inpPeriod) == Bars.HighPrices[i-centerid])
            {
                 _max[5] = _max[4];
                 _max[4] = _max[3];
                 _max[3] = _max[2];
                 _max[2] = _max[1];
                 _max[1] = _max[0];
                 _max[0] =  Bars.HighPrices[i-centerid];
            }
            
            _wso[i] = 100 * (1 -
                        ( Sigmo(_min[0] / Bars.ClosePrices[i])
                        + Sigmo(_min[1] / Bars.ClosePrices[i])
                        + Sigmo(_min[2] / Bars.ClosePrices[i])
                        + Sigmo(_min[3] / Bars.ClosePrices[i])
                        + Sigmo(_min[4] / Bars.ClosePrices[i])
                        + Sigmo(_min[5] / Bars.ClosePrices[i])
                        ) / 6.0);
                        
            _wro[i] = 100 * (1 -
                        ( Sigmo(_max[0] / Bars.ClosePrices[i])
                        + Sigmo(_max[1] / Bars.ClosePrices[i])
                        + Sigmo(_max[2] / Bars.ClosePrices[i])
                        + Sigmo(_max[3] / Bars.ClosePrices[i])
                        + Sigmo(_max[4] / Bars.ClosePrices[i])
                        + Sigmo(_max[5] / Bars.ClosePrices[i])
                        ) / 6.0);
                        
            outWSO[i] = _wso[i];
            outWRO[i] = _wro[i];
        }
        
        private double Sigmo(double inValue)
        {
            return(inValue >= 1.0 ? 1 : 0);
        }
    }
}



mfejza's avatar
mfejza

Joined on 25.01.2022

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: mWsoWro.algo
  • Rating: 5
  • Installs: 645
  • Modified: 25/10/2023 16:36