How to Create a Price Momentum Indicator

How to Create a Price Momentum Indicator

#region Namespaces
# ---------- DON'T REMOVE OR EDIT THESE LINES -------------------
# These lines are required for integrating Python with our .NET platform.
import clr
clr.AddReference("Tickblaze.Model")
import ScriptCode
from IndicatorAPI import *
from AssemblyIndicator_3000_ImportedScripts import *
# ---------------------------------------------------------------
#endregion

## <summary> 
## Indicator scripts are used for calculating a series of numerical values based on the price, volume and open interest of an underlying symbol. 
## Common use-cases include plotting them on a chart, displaying them as watchlist columns and using them to implement other scripts.
## </summary>
class MyIndicator(ScriptCode.IndicatorScriptBase): # NEVER CHANGE THE CLASS NAME
    #region Variables
    # Variables Content
    #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>
    ## --------------------------------------------------------------------------------------------------
    ##                                 INSTRUCTIONS - PLEASE READ CAREFULLY
    ## --------------------------------------------------------------------------------------------------
    ## 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' (The 'long' data type can only be used for date/time representation)
    ## Set to "DateTimeArray" when the data type is 'long[]' (The 'long' data type can only be used for date/time representation)
    ## 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, String or an API Type.
    ## (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="symbolIndex" type="Symbol">The symbol on which to calculate the indicator, it can be replaced with a script that is based on a symbol (drawing, indicator, pattern or signal).</param>
    ## <param name="periods" type="Integer" default="14" min="1">The number of periods to use in calculating the price momentum.</param>
    def OnInitialize(self,symbolIndex,periods):
        # Create a variable to hold the number of periods provided.
        self._periods = periods
        # Create an indicator to hold the close price.
        self._close = IndicatorCLOSE(self, symbolIndex)
    #endregion

    #region OnBarUpdate
    ## <summary>
    ## This function is used for calculating the indicator value for the latest bar (see the Indicator functions).
    ## </summary>
    ## <returns type="Double">The indicator value for the latest bar.</returns>
    def OnBarUpdate(self):
        # Check if there is enough price history to calculate momentum.
        if self._close[self._periods] != 0:
            # Return the current momentum value.
            return self._close[0] - self._close[self._periods]
        else:
            return 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>
    def OnChartSetup(self):
        # Register a pen to the 0 pen index.
        IndicatorChartRegisterPen(0, "Pen", C_Color.BLUE, C_DashStyle.SOLID, 2)
    #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 OnRegisterPens function in order to register an indicator pen.
    ## </summary>
    ## <returns type="Byte">The indicator pen index to use for coloring the latest indicator value.</returns>
    def OnSelectPen(self):
        return 0
    #endregion