-
Notifications
You must be signed in to change notification settings - Fork 52
Pattern Algorithms
- Identifying Pivots
- Are two points forming a straight line
- Head & Shoulders
- Pennants
- Double Top
- Volatility Contraction Pattern
Implementation: utils.py:getMaxMin
By default,
- a pivot high is a high, unbroken by 6 candles before or after.
- a pivot low is a low, unbroken by 6 candles before or after.
This means after a new local High or Low is formed, it takes 6 additional candles to confirm the pivot.
The getMaxMin(df, barsLeft=6, barsRight=6)
function returns a Pandas Series
of the pivot high and lows. The default argument ensures only major pivots are returned. The pivots are used to identify patterns.
You can tweak the result by changing the barsLeft
and barsRight
argument. Reducing the values will result in more pivots (major and minor) being returned.
Two points are considered on a straight line if their absolute difference falls within the average candle range (High - Low).
For ex: A and B are in a straight line in abs(a - b) <= averageCandleRange
.
This is followed throughout the script, whenever straight lines are desired. Lines drawn across these points will often appear with some degree of slope.
Implementation: utils.py:isHNS
c > max(a, e) and max(b, d) < min(a, e) and f < e and abs(b - d) < avgBarLength
- C is the highest point
- A and E are below C
- B and D are lower than all other points
- F is the Close and has not breached E or D
-
avgBarLength
is the average candle range (High - Low) between B and D
HEAD & SHOULDERS (BEARISH)
C
/\
A / \ E
/\ / \ /\
/ \ / \ / \F
/ \/________\/_______Neckline
/ B D
/
Some patterns will have a degree of slope in the neckline. see Straight Line
Implementation: utils.py:findHNS
- Create a list of High and Low pivot points from the price data and assign it to P.
- F is the last Close value in the price data
- Set the highest point in
P
to C. - From the pivots P:
- Set the highest point before
C
to A. - Set the lowest point between
A
andC
to B - Set the highest point after
C
to E - Set the lowest point between
C
andE
to D
- Set the highest point before
- Check if points
A, B, C, D, E, and F
validate against the Head and Shoulder rules. - If not validated, set C equal to E (
E
being the next highest pivot) and repeat step 4. - If validated:
- Draw a trendline (Neckline) below
B
andD
. - If the last closing price has not breached below the neckline, we have a confirmed pattern.
- Draw a trendline (Neckline) below
Implementation: Utils.py:isPennant
Symetrical Ascending Descending
A A C E A
/\ C /\ /\ /\ /\ C
/ \ /\ E / \ / \ / \ / \ /\ E
/ \ / \ /\ / \ / \ / \ / \ / \ /\
/ \ / \/ F / \ / \/ F / \ / \ / \
/ \/ D / \/ D / \/ \/ F
/ B / B / B D
Returns the first pattern that matches:
-
Symetrical Triangle:
A
,C
andE
are lower highs andB
andD
are higher lows.F
has not breachedE
orD
.
a > c > e and b < d < f and e > f
-
Ascending Triangle:
A
,C
andE
form a relatively straight line.B
,D
andF
are forming higher lows.F
has not breachedE
orD
`abs(a - c) <= avgBarLength and abs(c - e) <= avgBarLength and b < d < f < e`
-
Descending Triangles:
B
,D
are in a relatively straight line.A
,C
andE
are forming lower lows.F
has not breachedE
orD
`abs(b - d) <= avgBarLength and a > c > e > f and f > d`
-
AvgBarLength
is the average candle range (High - Low) between A to D.
Ascending and Descending Triangles can appear pointing upward or downward. In some rare cases, triangles may appear in a broadening formation. These are valid patterns and rules are purposefully set to allow these variations.
Implementation: utils.py:findHNS
- Create a list of High and Low pivot points from the price data and assign it to P.
- F is the last Close value in the price data
- Set the highest point in
P
to A. - From the pivots P:
- Set the lowest point after
A
to B - Set the lowest point after
B
to D - Set the highest point between
B
andD
to C. - Set the highest point between
D
andF
to E. - Get the average candle range between
A
andD
- Set the lowest point after
- Check if the points validate against the pennant rules.
- If validated, check for additional conditions:
- Any candle Close after
C
, has breached the pointC
or any candle Close afterD
, has breached the pointD
. If yes, assign pointC
to A and continue fromstep 4
. - Draw a trendline across the highs of
A
andC
and lows ofB
andD
. If the lines have crossed eachother at the last close, the pattern has played out. Skip to next symbol.
- Any candle Close after
- Finally if not validated, assign point
C
to A and continue from `step 4.
Implementation: utils.py:isDoubleTop
Double Top
A C
/\ /\
/ \ / \
/ \/ D
/ B
/
abs(a - c) <= avgBarLength and cVol < aVol and b < min(a, c) and b < d < c
-
A
andC
form a relatively straight line. -
B
is less thanA
andC
and D (Last Close price) has not breachedC
orB
. - Volume on
C
is lower than onA
. -
AvgBarLength
is calculated as the average candle range betweenA
andC
.
Implementation: utils.py:findDoubleTop
- Create a list of High and Low pivot points from the price data and assign it to P.
- D is the last Close value in the price data
- Set the highest point in
P
to A. Set the volume onA
to aVol - From the pivots P:
- Set the highest point after
A
to C. Set the volume onC
to cVol. - Check if
C
was breached on a closing basis after its formation. If yes, assign price and volume ofC
toA
and continue fromstep 4
. - Set the minimum point between
A
andC
to B. - Calculate the average candle range between
A
andC
- Set the highest point after
- Check if the above points, validate against Double Top rules. If no, follow
step 6
else perform additional checks.- Check if
C
andD
was breached by any candle close after its formation. If yes, followstep 6
.
- Check if
- Assign price and volume of
C
toA
and continue fromstep 4
.
Implementation: utils.py:bullishVCP
Volatilty Contraction pattern
A C
\ /\ E
\ / \ /
\ / \/
\/ D
B
abs(a - c) <= avgBarLength and b < min(a, c, d, e) and d < min(a, c, e) and e < c
-
B
is the lowest. -
D
is the second lowest. -
A
andC
for a relatively straight line. -
E
is the last Close price, and has not breachedC
orD
Implementation: utils.py:findBullishVCP
- Create a list of High and Low pivot points from the price data and assign it to P.
- E is the last Close in the price data
- Set the highest point in
P
to A. - From the pivots P:
- Set the lowest point from
A
to B. - Set the lowest point after
B
to D. - Set the highest point between
B
andD
to C. - Get the average candle range between
A
andC
- Set the lowest point from
- Check if above points, validate against bullish VCP rules. If No, follow
step 6
, else perform additional checks:- Check if
C
andD
was breached by any candle close after its formation. If yes, followstep 6
.
- Check if
- If not validated, assign the value of
C
toA
and continue fromstep 4
.