Warning! This section will be deprecated on February 1st 2025. Please move all your Indicators to the cTrader Store catalogue.
Description
This is the John Carter Squeeze Momentum indicator implementation for cTrader.
Github:
using cAlgo.API;
using cAlgo.API.Indicators;
namespace cAlgo
{
[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class SqueezeMomentum : Indicator
{
private BollingerBands _bbands;
private KeltnerChannels _keltnerChannels;
private MovingAverage _ma;
private LinearRegressionForecast _linearRegression;
private IndicatorDataSeries _deltaSeries;
[Parameter("Source", Group = "Bollinger Bands")]
public DataSeries BollingerBandsSource { get; set; }
[Parameter("Periods", DefaultValue = 20, MinValue = 1, Group = "Bollinger Bands")]
public int BollingerBandsPeriods { get; set; }
[Parameter("Multiplier", DefaultValue = 2, MinValue = 0, Group = "Bollinger Bands")]
public double BollingerBandsMultiplier { get; set; }
[Parameter("MA Type", DefaultValue = MovingAverageType.Simple, Group = "Bollinger Bands")]
public MovingAverageType BollingerBandsMaType { get; set; }
[Parameter("MA Periods", DefaultValue = 20, MinValue = 1, Group = "Keltner Channels")]
public int KeltnerMaPeriods { get; set; }
[Parameter("MA Type", DefaultValue = MovingAverageType.Simple, Group = "Keltner Channels")]
public MovingAverageType KeltnerMaType { get; set; }
[Parameter("ATR Multiplier", DefaultValue = 1.5, MinValue = 0, Group = "Keltner Channels")]
public double KeltnerAtrMultiplier { get; set; }
[Parameter("ATR Periods", DefaultValue = 20, MinValue = 1, Group = "Keltner Channels")]
public int KeltnerAtrPeriods { get; set; }
[Parameter("ATR MA Type", DefaultValue = MovingAverageType.Simple, Group = "Keltner Channels")]
public MovingAverageType KeltnerAtrMaType { get; set; }
[Parameter("Midline Periods", DefaultValue = 20, MinValue = 1, Group = "Donchian")]
public int DonchianMidlinePeriods { get; set; }
[Parameter("Source", Group = "Moving Average")]
public DataSeries MaSource { get; set; }
[Parameter("Periods", DefaultValue = 20, MinValue = 1, Group = "Moving Average")]
public int MaPeriods { get; set; }
[Parameter("MA Type", DefaultValue = MovingAverageType.Simple, Group = "Moving Average")]
public MovingAverageType MaType { get; set; }
[Parameter("Periods", DefaultValue = 20, MinValue = 1, Group = "Linear Regression")]
public int LinearRegressionPeriods { get; set; }
[Output("Up Histogram Bars", LineColor = "Blue", PlotType = PlotType.Histogram, Thickness = 3)]
public IndicatorDataSeries UpHistogramBars { get; set; }
[Output("Down Histogram Bars", LineColor = "Red", PlotType = PlotType.Histogram, Thickness = 3)]
public IndicatorDataSeries DownHistogramBars { get; set; }
[Output("Squeeze On Dots", LineColor = "Lime", PlotType = PlotType.Points, Thickness = 5)]
public IndicatorDataSeries SqueezeOnDots { get; set; }
[Output("Squeeze Off Dots", LineColor = "DarkRed", PlotType = PlotType.Points, Thickness = 5)]
public IndicatorDataSeries SqueezeOffDots { get; set; }
protected override void Initialize()
{
_bbands = Indicators.BollingerBands(BollingerBandsSource, BollingerBandsPeriods, BollingerBandsMultiplier, BollingerBandsMaType);
_keltnerChannels = Indicators.KeltnerChannels(KeltnerMaPeriods, KeltnerMaType, KeltnerAtrPeriods, KeltnerAtrMaType, KeltnerAtrMultiplier);
_ma = Indicators.MovingAverage(MaSource, MaPeriods, MaType);
_deltaSeries = CreateDataSeries();
_linearRegression = Indicators.LinearRegressionForecast(_deltaSeries, LinearRegressionPeriods);
}
public override void Calculate(int index)
{
var donchianMidline = (Bars.HighPrices.Maximum(DonchianMidlinePeriods) + Bars.LowPrices.Minimum(DonchianMidlinePeriods)) / 2;
var donchainMidlineAndMaAverage = (donchianMidline + _ma.Result[index]) / 2;
_deltaSeries[index] = Bars.ClosePrices[index] - donchainMidlineAndMaAverage;
UpHistogramBars[index] = double.NaN;
DownHistogramBars[index] = double.NaN;
var linearRegression = _linearRegression.Result[index];
if (linearRegression > 0)
{
UpHistogramBars[index] = linearRegression;
}
else
{
DownHistogramBars[index] = linearRegression;
}
SqueezeOnDots[index] = double.NaN;
SqueezeOffDots[index] = double.NaN;
var isSqueezeOn = _bbands.Top[index] < _keltnerChannels.Top[index] && _bbands.Bottom[index] > _keltnerChannels.Bottom[index];
if (isSqueezeOn)
{
SqueezeOnDots[index] = 0;
}
else
{
SqueezeOffDots[index] = 0;
}
}
}
}
Spotware
Joined on 23.09.2013
- Distribution: Free
- Language: C#
- Trading platform: cTrader Automate
- File name: Squeeze Momentum.algo
- Rating: 5
- Installs: 2001
- Modified: 13/10/2021 09:55
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.