Summary:
This indicator script is a momentum oscillator which measures the difference between two exponential moving averages, it is also one of the simplest and most reliable indicators available. The most popular MACD is the difference between a symbol's 26-period and 12-period exponential moving averages, with a 9-period signal line.

Calculation:
The difference between two exponential moving averages.

Developer:
Gerald Appel

Interpretation:
1. Overbought: When the underlying indicator is moving upwards, but the indicator script is approaching its upper bound, the underlying indicator is likely to reverse direction and move downwards.
2. Oversold: When the underlying indicator is moving downwards, but the indicator script is approaching its lower bound, the underlying indicator is likely to reverse direction and move upwards.
3. Positive Divergence: When the underlying indicator is moving downwards, but the indicator script is moving upwards, the underlying indicator is likely to reverse direction and move upwards.
4. Negative Divergence: When the underlying indicator is moving upwards, but the indicator script is moving downwards, the underlying indicator is likely to reverse direction and move downwards.
5. Upwards Trend: When the indicator script is moving upwards, the underlying indicator is in an upwards trend.
6. Downwards Trend: When the indicator script is moving downwards, the underlying indicator is in a downwards trend.
7. Upwards Momentum: When the indicator script is positive and moving upwards, the underlying indicator has upwards momentum and is likely to continue moving upwards.
8. Downwards Momentum: When the indicator script is negative and moving downwards, the underlying indicator has downwards momentum and is likely to continue moving downwards.

                    
#region Namespaces using System; #endregion namespace ScriptCode { /// <summary> /// Indicator scripts are used for calculating a series of numerical values. /// /// This script can be used in several ways: /// (1) It can be used on a chart. /// (2) It can be used from another script. /// (3) It can be used as a script column in a watchlist. /// </summary> public partial class MyIndicator : IndicatorScriptBase // NEVER CHANGE THE CLASS NAME { #region Variables // Use for the underlying indicator on which to calculate the indicator script. private Indicator _indicator; // Use for the short EMA. private Indicator _shortEMA; // Use for the long EMA private Indicator _longEMA; #endregion #region OnInitialize /// <summary> /// This function accepts the user parameters for the script and is called when a new indicator instance is created. /// One of the parameters accepted by it must be that of a symbol or another script that is /// based on a symbol (drawing, indicator, pattern or signal). This symbol will be used as the underlying symbol for the indicator. /// /// The parameter values can be specified from the user interface (UI) or from another script, depending on usage. /// </summary> /// -------------------------------------------------------------------------------------------------- /// PLEASE USE THE SCRIPT WIZARD (CTRL+W) TO ADD, EDIT AND REMOVE THE SCRIPT PARAMETERS /// -------------------------------------------------------------------------------------------------- /// YOU MUST SET A PARAM TAG FOR EACH PARAMETER ACCEPTED BY THIS FUNCTION. /// ALL PARAM TAGS SHOULD BE SET IN THE 'OnInitialize' REGION, RIGHT ABOVE THE 'OnInitialize' FUNCTION. /// THE ORDER OF THE TAGS MUST MATCH THE ORDER OF THE ACTUAL PARAMETERS. /// REQUIRED ATTRIBUTES: /// (1) name: The exact parameter name. /// (2) type: The type of data to collect from the user: /// Set to "Integer" when the data type is 'int' /// Set to "IntegerArray" when the data type is 'int[]' /// Set to "DateTime" when the data type is 'long' /// Set to "DateTimeArray" when the data type is 'long[]' /// Set to "Boolean" when the data type is 'bool' /// Set to "BooleanArray" when the data type is 'bool[]' /// Set to "Double" when the data type is 'double' /// Set to "DoubleArray" when the data type is 'double[]' /// Set to "String" when the data type is 'string' /// Set to "StringArray" when the data type is 'string[]' /// Set to "Indicator" when the data type is 'Indicator' /// Set to "Pattern" when the data type is 'Pattern' /// Set to "Signal" when the data type is 'Signal' /// Set to "Drawing" when the data type is 'Drawing' /// Set to "Symbol" when the data type is 'int' representing a symbol index. /// OPTIONAL ATTRIBUTES: /// (3) default: The default parameter value is only valid when the type is Integer, Boolean, Double or String. /// (4) min: The minimum parameter value is only valid when the type is Integer or Double. /// (5) max: The maximum parameter value is only valid when the type is Integer or Double. /// EXAMPLE: <param name="" type="" default="" min="" max="">Enter the parameter description here.</param> /// -------------------------------------------------------------------------------------------------- /// <param name="indicator" type="Indicator">Use for the underlying indicator on which to calculate the indicator script.</param> /// <param name="shortPeriods" type="Integer" default="12" min="1">Use for the number of periods in the short / fast exponential moving average used to calculate the indicator script. </param> /// <param name="longPeriods" type="Integer" default="26" min="1">Use for the number of periods in the long / slow exponential moving average used to calculate the indicator script.</param> public void OnInitialize( Indicator indicator, int shortPeriods, int longPeriods) { // Set the parameter to a script variable. _indicator = indicator; // Initialize the short EMA. _shortEMA = IndicatorEMA(indicator, shortPeriods); // Initialize the long EMA. _longEMA = IndicatorEMA(indicator, longPeriods); } #endregion #region OnBarUpdate /// <summary> /// This function is used for calculating the indicator value for the latest bar (see the Indicator functions). /// </summary> /// <returns>The indicator value for the latest bar.</returns> public override double OnBarUpdate() { // Calculate the MACD return _shortEMA[0] - _longEMA[0]; } #endregion #region OnChartSetup /// <summary> /// This function is used for setting up the indicator on the chart and registering its pens (see the IndicatorRegisterPen function). /// </summary> public override void OnChartSetup() { // Register a pen. IndicatorRegisterPen(0, "Positive Pen", new byte[] { 25, 200, 25, 255 }, IQ_DashStyle.SOLID, 2); // Register a pen. IndicatorRegisterPen(1, "Negative Pen", new byte[] { 175, 25, 25, 255 }, IQ_DashStyle.SOLID, 2); // Set the indicator in a new panel. IndicatorChartSetNewPanel(true); // Set a default plot style. IndicatorChartSetPlotStyle(IQ_PlotStyle.BOX_ZERO); } #endregion #region OnSelectPen /// <summary> /// This function is used for selecting a registered indicator pen with which to color the latest indicator value. /// Call the IndicatorRegisterPen function from the OnChartSetup function in order to register an indicator pen. /// </summary> /// <returns>The indicator pen index to use for coloring the latest indicator value.</returns> public override byte OnSelectPen() { // Check whether the indicator is going up. if (this[0] > 0) // Return the positive pen index 0 return 0; // The indicator is going down so return the negative pen index 1. else return 1; } #endregion } }

The Automated Trading Software for Hedge Funds and Quants