SMA Slope Indicator

by lec0456 in category Trend at 17/04/2015
Description

My slope indicator calculates the slope of a smoothed SMA.  You can enter the backstep, meaning the length of time you want to go back to measure the slope.  A slope limit allows you to judge when a threshold is reached for trading.  MA tolerance sets a value for the amount of change in the moving average needed to register a peak. Slope peak tolerance sets a minimum value to register a peak in the slope.

The slope indicator registers peaks in the ma and slope.  It also gives a signal if the slope is flat for 12 periods.

   

Download
1902 downloads
How to install
Notification Publishing copyrighted material is strictly prohibited. If you believe there is copyrighted material in this section you may use the Copyright Infringement Notification form to submit a claim.
Formula / Source Code
Language: C#
Trading Platform: cAlgocTrader
using System;
using cAlgo.API;
using cAlgo.API.Indicators; 

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = false, ScalePrecision = 2, AutoRescale=false)]
    public class mySmoothSMASlope : Indicator
    {
        [Parameter("MAPeriods",DefaultValue = 24)]
        public int paramPeriods { get; set; }
        [Parameter("MASmoothing",DefaultValue = 3)]
        public int paramSmoothing { get; set; }
        [Parameter("SlopeBackStep",DefaultValue = 2)] //it take 3 periods to determine a peak
        public int paramBackstep { get; set; } //a 3 pip slope has enough momentum to generate a 10 pip reversal
        [Parameter("SlopeLimit", DefaultValue = 1)]
        public double paramSlopeLimit { get; set; }
        [Parameter("MATolerance", DefaultValue = 2)]//MA must reverse greater than this value to register a peak
        public double paramMATolerance { get; set; }
        [Parameter("SlopePeakTolerance", DefaultValue = .25)]//slope must be greater than this value to register a peak
        public double paramSlopePeakTolerance { get; set; }        
		
		[Output("Slope", PlotType = PlotType.Histogram, Thickness = 2, Color = Colors.Purple)]
        public IndicatorDataSeries Result { get; set; }
        [Output("CrossRatio", Color = Colors.Aqua, Thickness = 1, PlotType = PlotType.Histogram)]
        public IndicatorDataSeries Xsignal { get; set; }
        [Output("CrossRatioPts", Color = Colors.White, Thickness = 3, PlotType = PlotType.Points)]
        public IndicatorDataSeries XsignalPoints { get; set; }
        [Output("Peak", PlotType = PlotType.Points, Thickness = 4, Color = Colors.Blue)]
        public IndicatorDataSeries Peak { get; set; }
        [Output("Valley", PlotType = PlotType.Points, Thickness = 4, Color = Colors.Red)]
        public IndicatorDataSeries Valley { get; set; }
        [Output("FlatSignal", Color = Colors.Yellow, Thickness = 3, PlotType = PlotType.Points)]
        public IndicatorDataSeries FlatSignal { get; set; }
        [Output("Center", LineStyle=LineStyle.DotsRare, Color = Colors.White)]
        public IndicatorDataSeries CenterLine { get; set; }
        [Output("UpperLimit", PlotType = PlotType.Line, LineStyle=LineStyle.DotsRare,Thickness = 1, Color = Colors.Red)]
        public IndicatorDataSeries UpperLimit { get; set; }
        [Output("LowerLimit", PlotType = PlotType.Line, LineStyle=LineStyle.DotsRare, Thickness = 1, Color = Colors.Red)]
        public IndicatorDataSeries LowerLimit { get; set; }

		private mySmoothSMA MA;
		double LastSlopePeak;
		double LastSlopeValley;
		double LastPeakMA;
		double LastPeakClose;
		int PeakCount;

        protected override void Initialize()
        {            
            string IndicatorName = GetType().ToString().Substring(GetType().ToString().LastIndexOf('.') + 1);//  returns ClassName
            Print("Indicator: "+IndicatorName);
            Print("IndicatorTimeZone: {0} Offset: {1} DST: {2}", TimeZone, TimeZone.BaseUtcOffset, TimeZone.SupportsDaylightSavingTime);
            
            PeakCount=0;
            LastSlopePeak=paramSlopePeakTolerance;
            LastSlopeValley=-paramSlopePeakTolerance;
            LastPeakClose=0;

            MA = Indicators.GetIndicator<mySmoothSMA>(MarketSeries.Close,paramPeriods,paramSmoothing);
        }

        public override void Calculate(int index)
        { 
			int t0 = index;
			int t1 = t0 - 1;
			int t2 = t1 - 1;
			int t3 = t2 - 1;
			int tb = t0 - paramBackstep;
			double MADiff;
			double CloseDiff;
			
			if(tb<0)return;//** prevent crash caused by posibly using a negetive index value
			
			if(double.IsNaN(MA.Result[tb]))return; //** skip printing bar until moving average data is calculated
			
			double close0 = MarketSeries.Close[t0];
			decimal MAt0 = (decimal) MA.Result[t0];
	        decimal MAtb = (decimal) MA.Result[tb];
			decimal maslope0 = decimal.Round((MAt0-MAtb)/((decimal)Symbol.PipSize*paramBackstep),2);
//Print("{0,20}{1,20}{2,20}{3,20}",MarketSeries.OpenTime[t0].AddHours(2).ToString("MM/dd/yyyy HH:mm"),MAt0, MAt1,maslope0);

			Result[index]= (double)(maslope0);
			
            int i=1;
			double divisor;
			while(Result[index-i]==0){i++;}
			divisor=Result[index-i];
			
			double SlopeRatio=Math.Round(Result[index]/divisor,2);			
            
             if(SlopeRatio<0)
             {
                MADiff=Math.Round((MA.Result[t0]-LastPeakMA)/Symbol.PipSize,2);
                CloseDiff=LastPeakClose!=0?Math.Round((MarketSeries.Close[index]-LastPeakClose)/Symbol.PipSize,2):0;
                if (MADiff<-paramMATolerance || MADiff>paramMATolerance || double.IsNaN(MADiff))
                {
                    Xsignal[index]=Result[index]>0?-paramSlopeLimit:paramSlopeLimit;
                    XsignalPoints[index]=Xsignal[index];
                    LastSlopePeak=paramSlopePeakTolerance; //Reset after a peak
                    LastSlopeValley=-paramSlopePeakTolerance;
                    LastPeakClose=close0; //set the closing price at the last MA peak 
                    LastPeakMA=(double)(MAt0); //set the last MA peak
                    PeakCount++;
                    //Print("PeakCount: "+PeakCount); //for testing
                    ChartObjects.DrawText("MADiffs" + index, Convert.ToString(MADiff), index, Xsignal[index], Result[index]<=0?VerticalAlignment.Top:VerticalAlignment.Bottom, HorizontalAlignment.Center, Colors.Blue);                
                    //ChartObjects.DrawText("CloseDiffs" + index, Convert.ToString(CloseDiff), index, Xsignal[index], Result[index]<=0?VerticalAlignment.Top:VerticalAlignment.Bottom, HorizontalAlignment.Center, Colors.Red);
                }    
             }
            if(Result[t1]>LastSlopePeak && ((Result[t3]<Result[t2] && Result[t2]==Result[t1]) || Result[t2]<Result[t1]) && Result[t1]>Result[index])
			{Peak[index]=Result[t1];// Set a peak
			LastSlopePeak=Result[t1];}
			
			if(Result[t1]<LastSlopeValley && ((Result[t3]>Result[t2] && Result[t2]==Result[t1]) || Result[t2]>Result[t1]) && Result[t1]<Result[index])
			{Valley[index]=Result[t1];// Set a valley
			LastSlopeValley=Result[t1];}

            if(Result.Maximum(12)<paramSlopePeakTolerance && Result.Minimum(12)>-paramSlopePeakTolerance)            
            FlatSignal[index]=0;

            UpperLimit[index]=paramSlopeLimit;
			LowerLimit[index]=-paramSlopeLimit;
			CenterLine[index]=0;
	    }
    }
}
Comments

Carlos Duarte - April 17, 2015 @ 17:09

Could provide the custom indicator mySmoothSMA ?

lec0456 - April 19, 2015 @ 19:27

Sure, its just a sma wit an sma applied to it. It removes some of the choppyness between close periods.

using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
 
namespace cAlgo
{
    [Indicator(IsOverlay = true, ScalePrecision = 7,TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class mySmoothSMA : Indicator
    {
        [Parameter()]
        public DataSeries Source { get; set; }

        [Parameter(DefaultValue = 24)]
        public int paramPeriods { get; set; }

        [Parameter(DefaultValue = 3)]
        public int paramSmoothing { get; set; }

        [Output("SMA", Color = Colors.Red)]
        public IndicatorDataSeries Result { get; set; }

        private SimpleMovingAverage sma;
        private SimpleMovingAverage smoothsma;

        protected override void Initialize()
        {sma = Indicators.SimpleMovingAverage(Source, paramPeriods);
         smoothsma = Indicators.SimpleMovingAverage(sma.Result, paramSmoothing);}


        public override void Calculate(int index){ Result[index] = smoothsma.Result[index];}
    }

hiba7rain - June 21, 2017 @ 14:20

how it is possible to use your indicator on Cbot ?

0