# Moving Average Convergence Divergence (MACD)

Indicator that uses 2 different averages of prices to calculate a trend’s momentum, direction and strength.

Moving Average Convergence Divergence (MACD) is considered one of the most important indicators. It uses 2 different averages of prices to calculate a trend’s momentum, direction and strength.

## Trading application

MACD and Signal Line oscillate through a 0 reference line. There are 2 kinds of events that suggest a buy or sell action. When MACD crosses up through the Signal Line, it is a buy signal. Conversely, if MACD crosses down through the Signal Line, it is seen as a sell signal.

We can also consider it a signal to buy when MACD crosses the 0 line from negative into positive values, and a signal to sell when it crosses the 0 line from positive to negative values. As long as MACD is above 0, we can consider the asset to be in a bullish trend, while MACD staying below zero indicates bearish conditions.

Divergences also reflect bullish or bearish conditions: we can consider it bearish if the asset’s price increases more than the MACD (e.g. reaching a new high while the indicator doesn’t), in the same way that it would be bullish to see the asset’s price decreasing more than the MACD does.

## Calculation

MACD Line:

$(n1 Period EMA - n2 Period EMA)$

Signal Line:

$n3 Period EMA of MACD Line$

EMA: Exponential Moving Average

## Parameters

### Input Parameters

 Name Type Range of value Description fast int <1, int.MaxValue> Number of bars to calculate the fast EMA inside MACD indicator. slow int <1, int.MaxValue> Number of bars to calculate the slow EMA. smooth int <1, int.MaxValue> The number of bars to calculate the EMA signal line.

### Output Parameters

Indicator ouptuts an object of values.

 Name Type Range of value Description Value double (0, double.MaxValue) Output value of MACD indicator. Average double (0, double.MaxValue) Average of MACD indicator. Difference double (0, double.MaxValue) The difference of MACD indicator.

## Examples

// Prints the current MACD valuemacd = indicators.MACD(12, 26, 9).OnSeries(dailyBars.Close);Log("The current MACD value is " + macd.Value.Value.ToString());​// Prints the current MACD average valuemacd = indicators.MACD(12, 26, 9).OnSeries(dailyBars.Close);Log("The current MACD average value is " + macd.Value.Average.ToString());​// Prints the current MACD difference valuemacd = indicators.MACD(12, 26, 9).OnSeries(dailyBars.Close);Log("The current MACD difference value is " + macd.Value.Difference.ToString());​// Prints the previous MACD valuemacd = indicators.MACD(12, 26, 9).Keep(2).OnSeries(dailyBars.Close);Log("The previous MACD value is " + macd.Values[1].Value.ToString());

### Complete example

using Signals.DataSeries.Bars;using Signals.Framework;using Signals.Indicators.MACD;​public class MyStrategy : SingleMarketStrategy{    private Bars dailyBars;    private MACD macd;​    public override void Setup(DataMarketplace data, IndicatorsMarketplace indicators)    {        dailyBars = data.Bars(BarPeriodType.Day, 1).WithOffset(25);        macd = indicators.MACD(12, 26, 9).Keep(2).OnSeries(dailyBars.Close);    }​    public override void RegisterActions()    {        OnUpdateOf(dailyBars).Do(() =>        {               // Prints the current MACD value            Log("The current MACD value is " + macd.Value.Value.ToString());​            // Prints the previous MACD value            Log("The previous MACD value is " + macd.Values[1].Value.ToString());​            // Prints the current MACD average value            Log("The current MACD average value is " + macd.Value.Average.ToString());​            // Prints the current MACD difference value            Log("The current MACD difference value is " + macd.Value.Difference.ToString());        });    }}