Category Trend  at 25/10/2023

WSO & WRO indicator

Notice. There is an update for this algorithm which is awaiting moderation. Please check back soon to view the latest version of this algorithm.
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);
        }
    }
}



MF
mfejza

Joined 25.01.2022

  • Type: Free
  • Language: C#
  • Trading Platform: cTrader Automate
  • Filename: mWsoWro.algo
  • Rating: 5
  • Installs: 228
Comments
Only logged in users can post a comment