Description
Several averages in a single component. For those who, like me, sometimes forget the trend! :-D
There are 5 averages, the first two and the last two form a cloud, the color can't be changed on the 2nd cloud but on the first it depends on curves 1 and 2.
There's also a Belkhayate curve.
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo
{
[Cloud ( "MMA 1-Cloud 1", "MMA 2-Cloud 1", Opacity = 0.4)]
[Cloud ( "MMA 4-Cloud 2", "MMA 5-Cloud 2", Opacity = 0.17, FirstColor = "#8800BF00", SecondColor = "#B9FF3334")]
[Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AutoRescale = false, AccessRights = AccessRights.None)]
public class LucMAs : Indicator
{
[Parameter("Source")]
public DataSeries Source { get; set; }
[Output("MMA 1-Cloud 1", LineColor = "#8800BF00")]
public IndicatorDataSeries mma1 { get; set; }
[Parameter("Period 1", DefaultValue = 21, MinValue = 1, Group="MMA")]
public int pmma1 { get; set; }
[Parameter("Type 1", DefaultValue = typeMMA.Exponential, Group = "MMA")]
public typeMMA mma1_type { get; set; }
[Output("MMA 2-Cloud 1", LineColor = "#B9FF3334")]
public IndicatorDataSeries mma2 { get; set; }
[Parameter("Period 2", DefaultValue = 55, MinValue = 1, Group="MMA")]
public int pmma2 { get; set; }
[Parameter("Type 2", DefaultValue = typeMMA.Exponential, Group = "MMA")]
public typeMMA mma2_type { get; set; }
[Output("MMA 3", LineColor = "#FF40E0D0")]
public IndicatorDataSeries mma3 { get; set; }
[Parameter("Period 3", DefaultValue = 20, MinValue = 1, Group="MMA")]
public int pmma3 { get; set; }
[Parameter("Type 3", DefaultValue = typeMMA.Simple, Group = "MMA")]
public typeMMA mma3_type { get; set; }
[Output("MMA 4-Cloud 2", LineColor = "#FFFED966", LineStyle = LineStyle.Lines)]
public IndicatorDataSeries mma4 { get; set; }
[Parameter("Period 4", DefaultValue = 50, MinValue = 1, Group="MMA")]
public int pmma4 { get; set; }
[Parameter("Type 4", DefaultValue = typeMMA.Smoothed, Group = "MMA")]
public typeMMA mma4_type { get; set; }
[Output("MMA 5-Cloud 2", LineColor = "#FFFF7600", LineStyle = LineStyle.Lines)]
public IndicatorDataSeries mma5 { get; set; }
[Parameter("Period 5", DefaultValue = 200, MinValue = 1, Group="MMA")]
public int pmma5 { get; set; }
[Parameter("Type 5", DefaultValue = typeMMA.Smoothed, Group = "MMA")]
public typeMMA mma5_type { get; set; }
[Parameter("WMA length", DefaultValue = 30, MinValue = 1, Group = "Belkhayate")]
public int perioddBelkhayate { get; set; }
[Output("Belkhayate Line Up Trend", LineColor = "Green", PlotType = PlotType.DiscontinuousLine, Thickness = 2)]
public IndicatorDataSeries BelkhayateUp { get; set; }
[Output("Belkhayate Line Down Trend", LineColor = "Red", PlotType = PlotType.DiscontinuousLine, Thickness = 2)]
public IndicatorDataSeries BelkhayateDown { get; set; }
[Output("Belkhayate Line Neutral Trend", LineColor = "Blue", PlotType = PlotType.DiscontinuousLine, Thickness = 2)]
public IndicatorDataSeries BelkhayateNeutral { get; set; }
private MovingAverage _mma1, _mma2, _mma3, _mma4, _mma5;
private WeightedMovingAverage _belkhayate;
public enum typeMMA {
Simple, Smoothed, Exponential, Weighted
}
public MovingAverageType GetMMAType(typeMMA type)
{
switch(type)
{
case typeMMA.Simple:
return MovingAverageType.Simple;
case typeMMA.Exponential:
return MovingAverageType.Exponential;
case typeMMA.Weighted:
return MovingAverageType.Weighted;
default:
return MovingAverageType.Simple;
}
}
protected override void Initialize()
{
_belkhayate = Indicators.WeightedMovingAverage(Bars.ClosePrices, perioddBelkhayate);
_mma1 = Indicators.MovingAverage(Bars.ClosePrices, pmma1, GetMMAType(mma1_type));
_mma2 = Indicators.MovingAverage(Bars.ClosePrices, pmma2, GetMMAType(mma2_type));
_mma3 = Indicators.MovingAverage(Bars.ClosePrices, pmma3, GetMMAType(mma3_type));
_mma4 = Indicators.MovingAverage(Bars.ClosePrices, pmma4, GetMMAType(mma4_type));
_mma5 = Indicators.MovingAverage(Bars.ClosePrices, pmma5, GetMMAType(mma5_type));
}
public void CalculSMMA(int index, IndicatorDataSeries x, int Periods)
{
if (index <= Periods) return;
if (double.IsNaN(x[index-1]))
{
var sum = 0.0;
for (var i = index-Periods; i < index; i++)
sum += Source[i];
x[index-1] = sum / Periods;
}
x[index] = (x[index-1] * (Periods - 1) + Source[index]) / Periods;
}
public double getRange()
{
double AvgRange = 0.0;
for(int x = 11; x > 0; x--)
{
AvgRange += Math.Abs(Bars.HighPrices.Last(x) - Bars.LowPrices.Last(x));
}
return AvgRange/10.0;
}
public override void Calculate(int index)
{
// MMA
if (mma1_type == typeMMA.Smoothed)
CalculSMMA(index, mma1, pmma1);
else
mma1[index] = _mma1.Result[index];
if (mma2_type == typeMMA.Smoothed)
CalculSMMA(index, mma2, pmma2);
else
mma2[index] = _mma2.Result[index];
if (mma3_type == typeMMA.Smoothed)
CalculSMMA(index, mma3, pmma3);
else
mma3[index] = _mma3.Result[index];
if (mma4_type == typeMMA.Smoothed)
CalculSMMA(index, mma4, pmma4);
else
mma4[index] = _mma4.Result[index];
if (mma5_type == typeMMA.Smoothed)
CalculSMMA(index, mma5, pmma5);
else
mma5[index] = _mma5.Result[index];
if (index > 1)
{
if (_belkhayate.Result[index] > _belkhayate.Result[index-1])
{
BelkhayateUp[index] = _belkhayate.Result[index];
if (double.IsNaN(BelkhayateUp[index-1]))
if (!double.IsNaN(BelkhayateDown[index-1]))
BelkhayateUp[index-1] = BelkhayateDown[index-1];
else
BelkhayateUp[index-1] = BelkhayateNeutral[index-1];
}
else
if (_belkhayate.Result[index] < _belkhayate.Result[index-1])
{
BelkhayateDown[index] = _belkhayate.Result[index];
if (double.IsNaN(BelkhayateDown[index-1]))
if (!double.IsNaN(BelkhayateUp[index-1]))
BelkhayateDown[index-1] = BelkhayateUp[index-1];
else
BelkhayateDown[index-1] = BelkhayateNeutral[index-1];
}
else
{
BelkhayateNeutral[index] = _belkhayate.Result[index];
if (double.IsNaN(BelkhayateNeutral[index-1]))
if (!double.IsNaN(BelkhayateUp[index-1]))
BelkhayateNeutral[index-1] = BelkhayateUp[index-1];
else
BelkhayateNeutral[index-1] = BelkhayateDown[index-1];
}
}
}
}
}
LB
lbellego
Joined on 20.06.2024
- Distribution: Free
- Language: C#
- Trading platform: cTrader Automate
- File name: Luc MAs_withSourceCode.algo
- Rating: 0
- Installs: 409
- Modified: 25/07/2024 14:56
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.