#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 PatternAPI import *
from AssemblyPattern_3000_ImportedScripts import *
# ---------------------------------------------------------------
#endregion
## <summary>
## Pattern scripts are used for recognizing and highlighting chart patterns 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 MyPattern(ScriptCode.PatternScriptBase): # 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 pattern 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 pattern.
##
## 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 pattern.</param>
## <param name="minCandleSize" type="Double" default="1">The minimum percentage change (open to close) that a candlestick must change in order to be considered a long candlestick. </param>
def OnInitialize(self,symbolIndex,minCandleSize):
# Create a variable to hold the minimum candle size provided.
self._minCandleSize = minCandleSize
#endregion
#region OnBarUpdate
## <summary>
## This function is used to determine whether a pattern match exists in which the latest bar is the last bar of the pattern.
## If such a pattern match is found, the function returns the number of bars in the pattern, otherwise it returns zero.
## </summary>
## <returns type="Integer">The total number of bars in the pattern ending at the latest bar (or zero if the pattern is not found).</returns>
def OnBarUpdate(self):
# Find the minBodyPrice.
minBodyPrice = min(DataOpen(0), DataClose(0))
# Find the maxBodyPrice.
maxBodyPrice = max(DataOpen(0), DataClose(0))
# Check whether the bull hammer pattern has been found.
if maxBodyPrice == DataHigh(0) and minBodyPrice - DataLow(0) > 2 * (maxBodyPrice - minBodyPrice) and 100 * abs((DataClose(0) - DataOpen(0)) / DataOpen(0)) > self._minCandleSize:
return 1
else:
return 0
#endregion