Adaptive moving average by md.safari.ci55
744 downloads / 1398 views / Created: 19.01.2024 Average Rating: 0
Indicator Description
AdaptiveMovingAverage
Comments
//==============================================================
// Forex Strategy Builder
// Copyright © Miroslav Popov. All rights reserved.
//==============================================================
// THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE.
//==============================================================
using System;
using System.Drawing;
using ForexStrategyBuilder.Infrastructure.Enums;
using ForexStrategyBuilder.Infrastructure.Interfaces;
namespace ForexStrategyBuilder.Indicators.Custom
{
public class AdaptiveMovingAverage : MainChartSingleLineIndicator
{
public AdaptiveMovingAverage()
{
IndicatorName = "Adaptive Moving Average";
IndicatorVersion = "1.0";
IndicatorAuthor = "Miroslav Popov";
IndicatorDescription = "Adaptive Moving Average - AMA";
}
public override void Initialize(SlotTypes slotType)
{
base.Initialize(slotType);
// List parameters
IndParam.ListParam[1].Enabled = false; // Hides the MA method beacuse is not used
// Adds two numeric parameters more
IndParam.NumParam[1].Caption = "Fast period";
IndParam.NumParam[1].Value = 2;
IndParam.NumParam[1].Min = 1;
IndParam.NumParam[1].Max = 200;
IndParam.NumParam[1].Enabled = true;
IndParam.NumParam[1].ToolTip = "Period of fast EMA.";
IndParam.NumParam[2].Caption = "Slow period";
IndParam.NumParam[2].Value = 30;
IndParam.NumParam[2].Min = 1;
IndParam.NumParam[2].Max = 200;
IndParam.NumParam[2].Enabled = true;
IndParam.NumParam[2].ToolTip = "Period of slow EMA.";
}
public override void Calculate(IDataSet dataSet)
{
InitCalculation(dataSet);
int fastPeriod = (int)IndParam.NumParam[1].Value;
int slowPeriod = (int)IndParam.NumParam[2].Value;
FirstBar = IndicatorPeriod + fastPeriod + slowPeriod;
double fastConstant = 2.0/(fastPeriod + 1);
double slowConstant = 2.0/(slowPeriod + 1);
double[] basePrice = Price(IndicatorBasePrice);
for (int bar = FirstBar; bar < Bars; bar++)
{
double ef = CalculateEfficiencyRatio(basePrice, IndicatorPeriod, bar);
double sc = ef*(fastConstant - slowConstant) + slowConstant;
IndicatorLine[bar] = IndicatorLine[bar - 1] + sc*sc*(basePrice[bar] - IndicatorLine[bar - 1]);
}
PostCalculation();
Component[0].ChartColor = Color.DarkOrchid; // Override default color
}
private double CalculateEfficiencyRatio(double[] basePrice, int period, int bar)
{
double direction = basePrice[bar] - basePrice[bar - period];
double volatility = 0;
for (int i = 0; i < period; i++)
volatility += Math.Abs(basePrice[bar - i] - basePrice[bar - i - 1]);
return volatility < Point ? 0 : direction/volatility;
}
}
}
Risk warning: Forex, spread bets and CFD are leveraged products. They may not be suitable for you as they carry a high degree of risk to your capital and you can lose more than your initial investment. You should ensure you understand all of the risks.
Copyright © 2006 - 2024, Forex Software Ltd.;
Copyright © 2006 - 2024, Forex Software Ltd.;