Warning! This section will be deprecated on February 1st 2025. Please move all your Indicators to the cTrader Store catalogue.
Description
The TOSC oscillator shows the difference between the exponential moving average and the recursive trendline.
using System;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo
{
[Levels(0)]
[Indicator(IsOverlay = false, AccessRights = AccessRights.None)]
public class mTOSC : Indicator
{
[Parameter("Period (20)", DefaultValue = 20, MinValue = 1)]
public int inpPeriod { get; set; }
[Parameter("Smooth Period (7)", DefaultValue = 7, MinValue = 2)]
public int inpPeriodSmooth { get; set; }
[Parameter("Data Source (weighted)", DefaultValue = enumPriceTypes.Weighted)]
public enumPriceTypes inpPriceType { get; set; }
[Output("TOSC", LineColor = "Black", PlotType = PlotType.Line, Thickness = 1)]
public IndicatorDataSeries outTOSC { get; set; }
[Output("FIR", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)]
public IndicatorDataSeries outFIR { get; set; }
private MovingAverage _sma, _ema;
private IndicatorDataSeries _price, _tmp0, _tmp1, _tosc, _fir;
private double alpha;
protected override void Initialize()
{
alpha = (2.0/((double)inpPeriod + 1));
_price = CreateDataSeries();
_sma = Indicators.MovingAverage(_price, 1, MovingAverageType.Simple);
_ema = Indicators.MovingAverage(_price, inpPeriod, MovingAverageType.Exponential);
_tmp0 = CreateDataSeries();
_tmp1 = CreateDataSeries();
_tosc = CreateDataSeries();
_fir = CreateDataSeries();
}
public override void Calculate(int i)
{
switch (inpPriceType)
{
case enumPriceTypes.Open:
_price[i] = Bars.OpenPrices[i];
break;
case enumPriceTypes.Close:
_price[i] = Bars.ClosePrices[i];
break;
case enumPriceTypes.High:
_price[i] = Bars.HighPrices[i];
break;
case enumPriceTypes.Low:
_price[i] = Bars.LowPrices[i];
break;
case enumPriceTypes.Median:
_price[i] = Bars.MedianPrices[i];
break;
case enumPriceTypes.Typical:
_price[i] = Bars.TypicalPrices[i];
break;
case enumPriceTypes.Weighted:
_price[i] = Bars.WeightedPrices[i];
break;
default:
_price[i] = Bars.ClosePrices[i];
break;
}
_tmp0[i] = i>inpPeriod ? (1 - alpha) * _tmp0[i-1] + _sma.Result[i] : _sma.Result[i];
_tmp1[i] = i>inpPeriod ? (1 - alpha) * _tmp1[i-1] + alpha * (_sma.Result[i] + _tmp0[i] - _tmp0[i-1]) : alpha * (_sma.Result[i] + _tmp0[i]);
_tosc[i] = (_tmp1[i] - _ema.Result[i]) / Symbol.TickSize;
_fir[i] = i>4 ? (_tosc[i] + 2.0 * _tosc[i-1] + 2.0 * _tosc[i-2] + _tosc[i-3]) / 6.0 : _tosc[i];
outTOSC[i] = _tosc[i];
outFIR[i] = _fir[i];
}
}
public enum enumPriceTypes
{
Open,
Close,
High,
Low,
Median,
Typical,
Weighted
}
}
mfejza
Joined on 25.01.2022
- Distribution: Free
- Language: C#
- Trading platform: cTrader Automate
- File name: mTOSC.algo
- Rating: 5
- Installs: 598
- Modified: 01/04/2023 17:01
Note that publishing copyrighted material is strictly prohibited. If you believe there is copyrighted material in this section, please use the Copyright Infringement Notification form to submit a claim.
Comments
Log in to add a comment.
No comments found.