Indicator · Pine Script v5 · On the chart

All Chart Patterns [theEccentricTrader]

by webcrack4· code credited to theEccentricTrader

Calculates and plots various classical chart patterns directly on the price chart using swing high and low detection libraries.

View on GitHub

Repaints

GitHub stars1on the repository
Pine versionv5runs as is
Lines of code840
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update9 months ago10 Jan 2026

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

840 lines of Pine Script v5 from 22AllChartPattern.pine, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

22AllChartPattern.pine
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © 2024 theEccentricTrader
// © 2024 Ozan Kaplanbasoglu
//@version=5

indicator("All Chart Patterns [theEccentricTrader]", overlay = true, max_lines_count = 500, max_labels_count = 500)

/////////////
// IMPORTS //
/////////////

import theEccentricTrader/PubLibSwing/1 as sw
import theEccentricTrader/PubLibPattern/2 as pa

/////////////////////
// SWING VARIABLES //
/////////////////////

shp_0 = sw.shp(0) 
shpbi_0 = sw.shpbi(0) 
shrr_0 = sw.shrr(0)

slp_0 = sw.slp(0) 
slpbi_0 = sw.slpbi(0) 
slrr_0 = sw.slrr(0)

shp_1 = sw.shp(1) 
shpbi_1 = sw.shpbi(1) 
shrr_1 = sw.shrr(1)

slp_1 = sw.slp(1) 
slpbi_1 = sw.slpbi(1) 
slrr_1 = sw.slrr(1)

shp_2 = sw.shp(2) 
shpbi_2 = sw.shpbi(2) 
shrr_2 = sw.shrr(2)

slp_2 = sw.slp(2) 
slpbi_2 = sw.slpbi(2) 
slrr_2 = sw.slrr(2)

shp_3 = sw.shp(3) 
shpbi_3 = sw.shpbi(3) 
shrr_3 = sw.shrr(3)

slp_3 = sw.slp(3) 
slpbi_3 = sw.slpbi(3) 
slrr_3 = sw.slrr(3)

////////////////////
// PATTERN INPUTS //
////////////////////

bear_pattern_colour = input(color.red, 'Bearish Pattern Colour', group = 'Pattern Colours')
bull_pattern_colour = input(color.green, 'Bullish Pattern Colour', group = 'Pattern Colours')
neutral_pattern_colour = input(color.blue, 'Neutral Pattern Colour', group = 'Pattern Colours')
dot_colour = input(color.blue, 'Dotted Line Colour', group = 'Pattern Colours')
label_colour = input(color.blue, 'Label Colour', group = 'Pattern Colours')

show_asc_broadening = input(true, 'Show Asc. Broadening', group = 'Patterns')
show_broadening = input(true, 'Show Broadening', group = 'Patterns')
show_desc_broadening = input(true, 'Show Desc. Broadening', group = 'Patterns')
show_double_bot = input(true, 'Show Double Bottom', group = 'Patterns')
show_double_top = input(true, 'Show Double Top', group = 'Patterns')
show_triple_bot = input(true, 'Show Triple Bottom', group = 'Patterns')
show_triple_top = input(true, 'Show Triple Top', group = 'Patterns')
show_bear_elliot = input(true, 'Show Bear Elliot Wave', group = 'Patterns')
show_bull_elliot = input(true, 'Show Bull Elliot Wave', group = 'Patterns')
show_bear_alt_flag = input(true, 'Show Bear Alt. Flag', group = 'Patterns')
show_bull_alt_flag = input(true, 'Show Bull Alt. Flag', group = 'Patterns')
show_bear_flag = input(true, 'Show Bear Flag', group = 'Patterns')
show_bull_flag = input(true, 'Show Bull Flag', group = 'Patterns')
show_bear_asc_head_shoulders = input(true, 'Show Bear Asc. Head and Shoulders', group = 'Patterns')
show_bull_asc_head_shoulders = input(true, 'Show Bull Asc. Head and Shoulders', group = 'Patterns')
show_bear_desc_head_shoulders = input(true, 'Show Bear Desc. Head and Shoulders', group = 'Patterns')
show_bull_desc_head_shoulders = input(true, 'Show Bull Desc. Head and Shoulders', group = 'Patterns')
show_bear_head_shoulders = input(false, 'Show Bear Head and Shoulders', group = 'Patterns')
show_bull_head_shoulders = input(false, 'Show Bull Head and Shoulders', group = 'Patterns')
show_bear_pennant = input(true, 'Show Bear Pennant', group = 'Patterns')
show_bull_pennant = input(true, 'Show Bull Pennant', group = 'Patterns')
show_asc_wedge = input(true, 'Show Asc. Wedge', group = 'Patterns')
show_desc_wedge = input(true, 'Show Desc. Wedge', group = 'Patterns')
show_wedge = input(true, 'Show Wedge', group = 'Patterns')

ab_ratio = input(defval = 100, title = 'AB Minimum Ratio', group = 'Pattern Ratios')
bc_ratio = input(defval = 30, title = 'BC Maximum Ratio', group = 'Pattern Ratios')
be_ratio = input(defval = 40, title = 'BE Maximum Ratio', group = 'Pattern Ratios')

low_tol = input(defval = 10, title = 'Lower Tolerance (%)', group = 'Pattern Tolerances')
up_tol = input(defval = 10, title = 'Upper Tolerance (%)', group = 'Pattern Tolerances')

asc_broadening_alert = input(true, 'Asc. Broadening Alert', group = 'Alerts')
broadening_alert = input(true, 'Broadening Alert', group = 'Alerts')
desc_broadening_alert = input(true, 'Desc. Broadening Alert', group = 'Alerts')
double_bot_alert = input(true, 'Double Bot Alert', group = 'Alerts')
double_top_alert = input(true, 'Double Top Alert', group = 'Alerts')
triple_bot_alert = input(true, 'Triple Bot Alert', group = 'Alerts')
triple_top_alert = input(true, 'Triple Top Alert', group = 'Alerts')
bear_elliot_alert = input(true, 'Bear Elliot Wave Alert', group = 'Alerts')
bull_elliot_alert = input(true, 'Bull Elliot Wave Alert', group = 'Alerts')
bear_alt_flag_alert = input(true, 'Bear Alt. Flag Alert', group = 'Alerts')
bull_alt_flag_alert = input(true, 'Bull Alt. Flag Alert', group = 'Alerts')
bear_flag_alert = input(true, 'Bear Flag Alert', group = 'Alerts')
bull_flag_alert = input(true, 'Bull Flag Alert', group = 'Alerts')
bear_asc_head_shoulders_alert = input(true, 'Bear Asc. Head and Shoulders Alert', group = 'Alerts')
bull_asc_head_shoulders_alert = input(true, 'Bull Asc. Head and Shoulders Alert', group = 'Alerts')
bear_desc_head_shoulders_alert = input(true, 'Bear Desc. Head and Shoulders Alert', group = 'Alerts')
bull_desc_head_shoulders_alert = input(true, 'Bull Desc. Head and Shoulders Alert', group = 'Alerts')
bear_head_shoulders_alert = input(false, 'Bear Head and Shoulders Alert', group = 'Alerts')
bull_head_shoulders_alert = input(false, 'Bull Head and Shoulders Alert', group = 'Alerts')
bear_pennant_alert = input(true, 'Bear Pennant Alert', group = 'Alerts')
bull_pennant_alert = input(true, 'Bull Pennant Alert', group = 'Alerts')
asc_wedge_alert = input(true, 'Asc. Wedge Alert', group = 'Alerts')
desc_wedge_alert = input(true, 'Desc. Wedge Alert', group = 'Alerts')
wedge_alert = input(true, 'Wedge Alert', group = 'Alerts')

//////////////////////////
// ASCENDING BROADENING //
//////////////////////////

var asc_broadening_line_1 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var asc_broadening_line_2 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var asc_broadening_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_none, text = 'ASC. BROADENING', textcolor = label_colour)

if sw.sh() and pa.asc_broadening() and barstate.isconfirmed
    if show_asc_broadening 
        line.set_xy1(asc_broadening_line_1, slpbi_1, slp_1)
        line.set_xy2(asc_broadening_line_1, slpbi_0, slp_0)
        line.set_xy1(asc_broadening_line_2, shpbi_1, shp_1)
        line.set_xy2(asc_broadening_line_2, shpbi_0, shp_0)
        label.set_xy(asc_broadening_label_1, shpbi_0, shp_0)
        label.set_style(asc_broadening_label_1, label.style_label_down)
    if asc_broadening_alert
        alert('Asc. Broadening')

if sw.sl() and pa.asc_broadening() and barstate.isconfirmed
    if show_asc_broadening 
        line.set_xy1(asc_broadening_line_1, slpbi_1, slp_1)
        line.set_xy2(asc_broadening_line_1, slpbi_0, slp_0)
        line.set_xy1(asc_broadening_line_2, shpbi_1, shp_1)
        line.set_xy2(asc_broadening_line_2, shpbi_0, shp_0)
        label.set_xy(asc_broadening_label_1, slpbi_0, slp_0)
        label.set_style(asc_broadening_label_1, label.style_label_up)
    if asc_broadening_alert
        alert('Asc. Broadening')

////////////////
// BROADENING //
////////////////

var broadening_line_1 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var broadening_line_2 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var broadening_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_none, text = 'BROADENING', textcolor = label_colour)

if sw.sh() and pa.broadening() and barstate.isconfirmed
    if show_broadening 
        line.set_xy1(broadening_line_1, slpbi_1, slp_1)
        line.set_xy2(broadening_line_1, slpbi_0, slp_0)
        line.set_xy1(broadening_line_2, shpbi_1, shp_1)
        line.set_xy2(broadening_line_2, shpbi_0, shp_0)
        label.set_xy(broadening_label_1, shpbi_0, shp_0)
        label.set_style(broadening_label_1, label.style_label_down)
    if broadening_alert
        alert('Broadening')

if sw.sl() and pa.broadening() and barstate.isconfirmed
    if show_broadening 
        line.set_xy1(broadening_line_1, slpbi_1, slp_1)
        line.set_xy2(broadening_line_1, slpbi_0, slp_0)
        line.set_xy1(broadening_line_2, shpbi_1, shp_1)
        line.set_xy2(broadening_line_2, shpbi_0, shp_0)
        label.set_xy(broadening_label_1, slpbi_0, slp_0)
        label.set_style(broadening_label_1, label.style_label_up)
    if broadening_alert
        alert('Broadening')

///////////////////////////
// DESCENDING BROADENING //
///////////////////////////

var desc_broadening_line_1 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var desc_broadening_line_2 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var desc_broadening_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_none, text = 'DESC. BROADENING', textcolor = label_colour)

if sw.sh() and pa.desc_broadening() and barstate.isconfirmed
    if show_desc_broadening 
        line.set_xy1(desc_broadening_line_1, slpbi_1, slp_1)
        line.set_xy2(desc_broadening_line_1, slpbi_0, slp_0)
        line.set_xy1(desc_broadening_line_2, shpbi_1, shp_1)
        line.set_xy2(desc_broadening_line_2, shpbi_0, shp_0)
        label.set_xy(desc_broadening_label_1, shpbi_0, shp_0)
        label.set_style(desc_broadening_label_1, label.style_label_down)
    if desc_broadening_alert
        alert('Desc. Broadening')

if sw.sl() and pa.desc_broadening() and barstate.isconfirmed
    if show_desc_broadening 
        line.set_xy1(desc_broadening_line_1, slpbi_1, slp_1)
        line.set_xy2(desc_broadening_line_1, slpbi_0, slp_0)
        line.set_xy1(desc_broadening_line_2, shpbi_1, shp_1)
        line.set_xy2(desc_broadening_line_2, shpbi_0, shp_0)
        label.set_xy(desc_broadening_label_1, slpbi_0, slp_0)
        label.set_style(desc_broadening_label_1, label.style_label_up)
    if desc_broadening_alert
        alert('Desc. Broadening')

///////////////////////
// DOUBLE BOTTOM/TOP //
///////////////////////

var double_bot_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var double_bot_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var double_bot_line_3 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var double_bot_line_4 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var double_bot_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = 'DOUBLE BOTTOM', textcolor = label_colour)

if sw.sl() and pa.double_bot(low_tol, up_tol) and barstate.isconfirmed
    if show_double_bot
        line.set_xy1(double_bot_line_1, slpbi_1, slp_1)
        line.set_xy2(double_bot_line_1, shpbi_0, shp_0)
        line.set_xy1(double_bot_line_2, shpbi_0, shp_0)
        line.set_xy2(double_bot_line_2, slpbi_0, slp_0)
        line.set_xy1(double_bot_line_3, slpbi_1, slp_1)
        line.set_xy2(double_bot_line_3, bar_index, slp_1)
        line.set_xy1(double_bot_line_4, shpbi_0, shp_0)
        line.set_xy2(double_bot_line_4, bar_index, shp_0)
        label.set_xy(double_bot_label_1, slpbi_0, slp_0)
    if double_bot_alert
        alert('Double Bottom')

var double_top_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var double_top_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var double_top_line_3 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var double_top_line_4 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var double_top_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = 'DOUBLE TOP', textcolor = label_colour)

if sw.sh() and pa.double_top(low_tol, up_tol) and barstate.isconfirmed
    if show_double_top
        line.set_xy1(double_top_line_1, shpbi_1, shp_1)
        line.set_xy2(double_top_line_1, slpbi_0, slp_0)
        line.set_xy1(double_top_line_2, slpbi_0, slp_0)
        line.set_xy2(double_top_line_2, shpbi_0, shp_0)
        line.set_xy1(double_top_line_3, shpbi_1, shp_1)
        line.set_xy2(double_top_line_3, bar_index, shp_1)
        line.set_xy1(double_top_line_4, slpbi_0, slp_0)
        line.set_xy2(double_top_line_4, bar_index, slp_0)
        label.set_xy(double_top_label_1, shpbi_0, shp_0)
    if double_top_alert
        alert('Double Top')

///////////////////////
// TRIPLE BOTTOM/TOP //
///////////////////////

var triple_bot_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var triple_bot_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var triple_bot_line_3 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var triple_bot_line_4 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var triple_bot_line_5 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var triple_bot_line_6 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var triple_bot_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = 'TRIPLE BOTTOM', textcolor = label_colour)

if sw.sl() and pa.triple_bot(low_tol, up_tol) and barstate.isconfirmed
    if show_triple_bot
        line.set_xy1(triple_bot_line_1, slpbi_2, slp_2)
        line.set_xy2(triple_bot_line_1, shpbi_1, shp_1)
        line.set_xy1(triple_bot_line_2, shpbi_1, shp_1)
        line.set_xy2(triple_bot_line_2, slpbi_1, slp_1)
        line.set_xy1(triple_bot_line_3, slpbi_1, slp_1)
        line.set_xy2(triple_bot_line_3, shpbi_0, shp_0)
        line.set_xy1(triple_bot_line_4, shpbi_0, shp_0)
        line.set_xy2(triple_bot_line_4, slpbi_0, slp_0)
        line.set_xy1(triple_bot_line_5, slpbi_2, slp_2)
        line.set_xy2(triple_bot_line_5, bar_index, slp_2)
        line.set_xy1(triple_bot_line_6, shpbi_0, shp_0)
        line.set_xy2(triple_bot_line_6, bar_index, shp_0)
        label.set_xy(triple_bot_label_1, slpbi_0, slp_0)
    if triple_bot_alert
        alert('Triple Bottom')

var triple_top_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var triple_top_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var triple_top_line_3 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var triple_top_line_4 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var triple_top_line_5 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var triple_top_line_6 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var triple_top_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = 'TRIPLE TOP', textcolor = label_colour)

if sw.sh() and pa.triple_top(low_tol, up_tol) and barstate.isconfirmed
    if show_triple_top
        line.set_xy1(triple_top_line_1, shpbi_2, shp_2)
        line.set_xy2(triple_top_line_1, slpbi_1, slp_1)
        line.set_xy1(triple_top_line_2, slpbi_1, slp_1)
        line.set_xy2(triple_top_line_2, shpbi_1, shp_1)
        line.set_xy1(triple_top_line_3, shpbi_1, shp_1)
        line.set_xy2(triple_top_line_3, slpbi_0, slp_0)
        line.set_xy1(triple_top_line_4, slpbi_0, slp_0)
        line.set_xy2(triple_top_line_4, shpbi_0, shp_0)
        line.set_xy1(triple_top_line_5, shpbi_2, shp_2)
        line.set_xy2(triple_top_line_5, bar_index, shp_2)
        line.set_xy1(triple_top_line_6, slpbi_0, slp_0)
        line.set_xy2(triple_top_line_6, bar_index, slp_0)
        label.set_xy(triple_top_label_1, shpbi_0, shp_0)
    if triple_top_alert
        alert('Triple Top')

/////////////////
// ELLIOT WAVE //
/////////////////

var bear_elliot_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_elliot_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_elliot_line_3 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_elliot_line_4 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_elliot_line_5 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_elliot_line_6 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_elliot_line_7 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_elliot_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bear_elliot_label_2 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bear_elliot_label_3 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bear_elliot_label_4 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bear_elliot_label_5 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bear_elliot_label_6 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bear_elliot_label_7 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)

if sw.sh() and pa.bear_elliot() and barstate.isconfirmed
    if show_bear_elliot
        line.set_xy1(bear_elliot_line_1, slpbi_3, slp_3)
        line.set_xy2(bear_elliot_line_1, shpbi_3, shp_3)
        line.set_xy1(bear_elliot_line_2, shpbi_3, shp_3)
        line.set_xy2(bear_elliot_line_2, slpbi_2, slp_2)
        line.set_xy1(bear_elliot_line_3, slpbi_2, slp_2)
        line.set_xy2(bear_elliot_line_3, shpbi_2, shp_2)
        line.set_xy1(bear_elliot_line_4, shpbi_2, shp_2)
        line.set_xy2(bear_elliot_line_4, slpbi_1, slp_1)
        line.set_xy1(bear_elliot_line_5, slpbi_1, slp_1)
        line.set_xy2(bear_elliot_line_5, shpbi_1, shp_1)
        line.set_xy1(bear_elliot_line_6, shpbi_1, shp_1)
        line.set_xy2(bear_elliot_line_6, slpbi_0, slp_0)
        line.set_xy1(bear_elliot_line_7, slpbi_0, slp_0)
        line.set_xy2(bear_elliot_line_7, shpbi_0, shp_0)
        label.set_xy(bear_elliot_label_1, shpbi_3, shp_3)
        label.set_xy(bear_elliot_label_2, slpbi_2, slp_2)
        label.set_xy(bear_elliot_label_3, shpbi_2, shp_2)
        label.set_xy(bear_elliot_label_4, slpbi_1, slp_1)
        label.set_xy(bear_elliot_label_5, shpbi_1, shp_1)
        label.set_xy(bear_elliot_label_6, slpbi_0, slp_0)
        label.set_xy(bear_elliot_label_7, shpbi_0, shp_0)
        label.set_text(bear_elliot_label_1, '1 (' + str.tostring(math.round(shrr_3, 2)) + ')')
        label.set_text(bear_elliot_label_2, '2 (' + str.tostring(math.round(slrr_2, 2)) + ')')
        label.set_text(bear_elliot_label_3, '3 (' + str.tostring(math.round(shrr_2, 2)) + ')')
        label.set_text(bear_elliot_label_4, '4 (' + str.tostring(math.round(slrr_1, 2)) + ')')
        label.set_text(bear_elliot_label_5, '5 (' + str.tostring(math.round(shrr_1, 2)) + ')')
        label.set_text(bear_elliot_label_6, 'A (' + str.tostring(math.round(slrr_0, 2)) + ')')
        label.set_text(bear_elliot_label_7, 'BEAR ELLIOT WAVE\nB (' + str.tostring(math.round(shrr_0, 2)) + ')')
    if bear_elliot_alert
        alert('Bearish Elliot Wave')

var bull_elliot_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_elliot_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_elliot_line_3 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_elliot_line_4 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_elliot_line_5 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_elliot_line_6 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_elliot_line_7 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_elliot_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bull_elliot_label_2 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bull_elliot_label_3 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bull_elliot_label_4 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bull_elliot_label_5 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bull_elliot_label_6 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bull_elliot_label_7 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)

if sw.sl() and pa.bull_elliot() and barstate.isconfirmed
    if show_bull_elliot
        line.set_xy1(bull_elliot_line_1, shpbi_3, shp_3)
        line.set_xy2(bull_elliot_line_1, slpbi_3, slp_3)
        line.set_xy1(bull_elliot_line_2, slpbi_3, slp_3)
        line.set_xy2(bull_elliot_line_2, shpbi_2, shp_2)
        line.set_xy1(bull_elliot_line_3, shpbi_2, shp_2)
        line.set_xy2(bull_elliot_line_3, slpbi_2, slp_2)
        line.set_xy1(bull_elliot_line_4, slpbi_2, slp_2)
        line.set_xy2(bull_elliot_line_4, shpbi_1, shp_1)
        line.set_xy1(bull_elliot_line_5, shpbi_1, shp_1)
        line.set_xy2(bull_elliot_line_5, slpbi_1, slp_1)
        line.set_xy1(bull_elliot_line_6, slpbi_1, slp_1)
        line.set_xy2(bull_elliot_line_6, shpbi_0, shp_0)
        line.set_xy1(bull_elliot_line_7, shpbi_0, shp_0)
        line.set_xy2(bull_elliot_line_7, slpbi_0, slp_0)
        label.set_xy(bull_elliot_label_1, slpbi_3, slp_3)
        label.set_xy(bull_elliot_label_2, shpbi_2, shp_2)
        label.set_xy(bull_elliot_label_3, slpbi_2, slp_2)
        label.set_xy(bull_elliot_label_4, shpbi_1, shp_1)
        label.set_xy(bull_elliot_label_5, slpbi_1, slp_1)
        label.set_xy(bull_elliot_label_6, shpbi_0, shp_0)
        label.set_xy(bull_elliot_label_7, slpbi_0, slp_0)
        label.set_text(bull_elliot_label_1, '1 (' + str.tostring(math.round(slrr_3, 2)) + ')')
        label.set_text(bull_elliot_label_2, '2 (' + str.tostring(math.round(shrr_2, 2)) + ')')
        label.set_text(bull_elliot_label_3, '3 (' + str.tostring(math.round(slrr_2, 2)) + ')')
        label.set_text(bull_elliot_label_4, '4 (' + str.tostring(math.round(shrr_1, 2)) + ')')
        label.set_text(bull_elliot_label_5, '5 (' + str.tostring(math.round(slrr_1, 2)) + ')')
        label.set_text(bull_elliot_label_6, 'A (' + str.tostring(math.round(shrr_0, 2)) + ')')
        label.set_text(bull_elliot_label_7, 'BULL ELLIOT WAVE\nB (' + str.tostring(math.round(slrr_0, 2)) + ')')
    if bull_elliot_alert
        alert('Bullish Elliot Wave')

////////////////////
// ALTERNATE FLAG //
////////////////////

var bear_alt_flag_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_alt_flag_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_alt_flag_line_3 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_alt_flag_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = 'A', textcolor = label_colour)
var bear_alt_flag_label_2 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bear_alt_flag_label_3 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)

if sw.sh() and pa.bear_alt_flag(ab_ratio, bc_ratio) and barstate.isconfirmed
    if show_bear_alt_flag
        line.set_xy1(bear_alt_flag_line_1, shpbi_1, shp_1)
        line.set_xy2(bear_alt_flag_line_1, slpbi_0, slp_0)
        line.set_xy1(bear_alt_flag_line_2, slpbi_0, slp_0)
        line.set_xy2(bear_alt_flag_line_2, shpbi_0, shp_0)
        line.set_xy1(bear_alt_flag_line_3, shpbi_0, shp_0)
        line.set_xy2(bear_alt_flag_line_3, shpbi_0 - 1, shp_0)
        label.set_xy(bear_alt_flag_label_1, shpbi_1, shp_1)
        label.set_xy(bear_alt_flag_label_2, slpbi_0, slp_0)
        label.set_xy(bear_alt_flag_label_3, shpbi_0, shp_0)
        label.set_text(bear_alt_flag_label_2, 'B (' + str.tostring(math.round(slrr_0, 2)) + ')')
        label.set_text(bear_alt_flag_label_3, 'BEAR ALT. FLAG\nC (' + str.tostring(math.round(shrr_0, 2)) + ')')
    if bear_alt_flag_alert
        alert('Bearish Alt. Flag')

var bull_alt_flag_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_alt_flag_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_alt_flag_line_3 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_alt_flag_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = 'A', textcolor = label_colour)
var bull_alt_flag_label_2 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bull_alt_flag_label_3 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)

if sw.sl() and pa.bull_alt_flag(ab_ratio, bc_ratio) and barstate.isconfirmed
    if show_bull_alt_flag
        line.set_xy1(bull_alt_flag_line_1, slpbi_1, slp_1)
        line.set_xy2(bull_alt_flag_line_1, shpbi_0, shp_0)
        line.set_xy1(bull_alt_flag_line_2, shpbi_0, shp_0)
        line.set_xy2(bull_alt_flag_line_2, slpbi_0, slp_0)
        line.set_xy1(bull_alt_flag_line_3, slpbi_0, slp_0)
        line.set_xy2(bull_alt_flag_line_3, slpbi_0 - 1, slp_0)
        label.set_xy(bull_alt_flag_label_1, slpbi_1, slp_1)
        label.set_xy(bull_alt_flag_label_2, shpbi_0, shp_0)
        label.set_xy(bull_alt_flag_label_3, slpbi_0, slp_0)
        label.set_text(bull_alt_flag_label_2, 'B (' + str.tostring(math.round(shrr_0, 2)) + ')')
        label.set_text(bull_alt_flag_label_3, 'BULL ALT. FLAG\nC (' + str.tostring(math.round(slrr_0, 2)) + ')')
    if bull_alt_flag_alert
        alert('Bullish Alt. Flag')

//////////
// FLAG //
//////////

var bear_flag_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_flag_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_flag_line_3 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_flag_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = 'A', textcolor = label_colour)
var bear_flag_label_2 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bear_flag_label_3 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bear_flag_label_4 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bear_flag_label_5 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)

if sw.sh() and pa.bear_flag(ab_ratio, bc_ratio, be_ratio) and barstate.isconfirmed
    if show_bear_flag
        berr = (shp_0 - slp_1) / (shp_2 - slp_1) * 100
        line.set_xy1(bear_flag_line_1, shpbi_2, shp_2)
        line.set_xy2(bear_flag_line_1, slpbi_1, slp_1)
        line.set_xy1(bear_flag_line_2, slpbi_1, slp_1)
        line.set_xy2(bear_flag_line_2, slpbi_0, slp_0)
        line.set_xy1(bear_flag_line_3, shpbi_1, shp_1)
        line.set_xy2(bear_flag_line_3, shpbi_0, shp_0)
        label.set_xy(bear_flag_label_1, shpbi_2, shp_2)
        label.set_xy(bear_flag_label_2, slpbi_1, slp_1)
        label.set_xy(bear_flag_label_3, shpbi_1, shp_1)
        label.set_xy(bear_flag_label_4, slpbi_0, slp_0)
        label.set_xy(bear_flag_label_5, shpbi_0, shp_0)
        label.set_text(bear_flag_label_2, 'B (' + str.tostring(math.round(slrr_1, 2)) + ')')
        label.set_text(bear_flag_label_3, 'C (' + str.tostring(math.round(shrr_1, 2)) + ')')
        label.set_text(bear_flag_label_4, 'D (' + str.tostring(math.round(slrr_0, 2)) + ')')
        label.set_text(bear_flag_label_5, 'BEAR FLAG\nE (' + str.tostring(math.round(berr, 2)) + ')')
    if bear_flag_alert
        alert('Bearish Flag')

var bull_flag_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_flag_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_flag_line_3 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_flag_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = 'A', textcolor = label_colour)
var bull_flag_label_2 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bull_flag_label_3 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bull_flag_label_4 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bull_flag_label_5 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)

if sw.sl() and pa.bull_flag(ab_ratio, bc_ratio, be_ratio) and barstate.isconfirmed
    if show_bull_flag
        berr = (shp_1 - slp_0) / (shp_1 - slp_2) * 100
        line.set_xy1(bull_flag_line_1, slpbi_2, slp_2)
        line.set_xy2(bull_flag_line_1, shpbi_1, shp_1)
        line.set_xy1(bull_flag_line_2, shpbi_1, shp_1)
        line.set_xy2(bull_flag_line_2, shpbi_0, shp_0)
        line.set_xy1(bull_flag_line_3, slpbi_1, slp_1)
        line.set_xy2(bull_flag_line_3, slpbi_0, slp_0)
        label.set_xy(bull_flag_label_1, slpbi_2, slp_2)
        label.set_xy(bull_flag_label_2, shpbi_1, shp_1)
        label.set_xy(bull_flag_label_3, slpbi_1, slp_1)
        label.set_xy(bull_flag_label_4, shpbi_0, shp_0)
        label.set_xy(bull_flag_label_5, slpbi_0, slp_0)
        label.set_text(bull_flag_label_2, 'B (' + str.tostring(math.round(shrr_1, 2)) + ')')
        label.set_text(bull_flag_label_3, 'C (' + str.tostring(math.round(slrr_1, 2)) + ')')
        label.set_text(bull_flag_label_4, 'D (' + str.tostring(math.round(shrr_0, 2)) + ')')
        label.set_text(bull_flag_label_5, 'BULL FLAG\nE (' + str.tostring(math.round(berr, 2)) + ')')    
    if bull_flag_alert
        alert('Bullish Flag')
        
//////////////////////////////////
// ASCENDING HEAD AND SHOULDERS //
//////////////////////////////////

var bear_asc_head_shoulders_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_asc_head_shoulders_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_asc_head_shoulders_line_3 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_asc_head_shoulders_line_4 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_asc_head_shoulders_line_5 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_asc_head_shoulders_line_6 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_asc_head_shoulders_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = 'BEAR ASC. HEAD AND SHOULDERS', textcolor = label_colour)

if sw.sh() and pa.bear_asc_head_shoulders() and barstate.isconfirmed
    if show_bear_asc_head_shoulders
        line.set_xy1(bear_asc_head_shoulders_line_1, shpbi_2, shp_2)
        line.set_xy2(bear_asc_head_shoulders_line_1, slpbi_1, slp_1)
        line.set_xy1(bear_asc_head_shoulders_line_2, slpbi_1, slp_1)
        line.set_xy2(bear_asc_head_shoulders_line_2, shpbi_1, shp_1)
        line.set_xy1(bear_asc_head_shoulders_line_3, shpbi_1, shp_1)
        line.set_xy2(bear_asc_head_shoulders_line_3, slpbi_0, slp_0)
        line.set_xy1(bear_asc_head_shoulders_line_4, slpbi_0, slp_0)
        line.set_xy2(bear_asc_head_shoulders_line_4, shpbi_0, shp_0)
        line.set_xy1(bear_asc_head_shoulders_line_5, shpbi_2, shp_2)
        line.set_xy2(bear_asc_head_shoulders_line_5, shpbi_1, shp_1)
        line.set_xy1(bear_asc_head_shoulders_line_6, shpbi_1, shp_1)
        line.set_xy2(bear_asc_head_shoulders_line_6, shpbi_0, shp_0)
        label.set_xy(bear_asc_head_shoulders_label_1, shpbi_1, shp_1)
    if bear_asc_head_shoulders_alert
        alert('Bearish Asc. Head and Shoulders')

var bull_asc_head_shoulders_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_asc_head_shoulders_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_asc_head_shoulders_line_3 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_asc_head_shoulders_line_4 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_asc_head_shoulders_line_5 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_asc_head_shoulders_line_6 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_asc_head_shoulders_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = 'BULL ASC. HEAD AND SHOULDERS', textcolor = label_colour)

if sw.sl() and pa.bull_asc_head_shoulders() and barstate.isconfirmed
    if show_bull_asc_head_shoulders
        line.set_xy1(bull_asc_head_shoulders_line_1, slpbi_2, slp_2)
        line.set_xy2(bull_asc_head_shoulders_line_1, shpbi_1, shp_1)
        line.set_xy1(bull_asc_head_shoulders_line_2, shpbi_1, shp_1)
        line.set_xy2(bull_asc_head_shoulders_line_2, slpbi_1, slp_1)
        line.set_xy1(bull_asc_head_shoulders_line_3, slpbi_1, slp_1)
        line.set_xy2(bull_asc_head_shoulders_line_3, shpbi_0, shp_0)
        line.set_xy1(bull_asc_head_shoulders_line_4, shpbi_0, shp_0)
        line.set_xy2(bull_asc_head_shoulders_line_4, slpbi_0, slp_0)
        line.set_xy1(bull_asc_head_shoulders_line_5, slpbi_2, slp_2)
        line.set_xy2(bull_asc_head_shoulders_line_5, slpbi_1, slp_1)
        line.set_xy1(bull_asc_head_shoulders_line_6, slpbi_1, slp_1)
        line.set_xy2(bull_asc_head_shoulders_line_6, slpbi_0, slp_0)
        label.set_xy(bull_asc_head_shoulders_label_1, slpbi_1, slp_1)
    if bull_asc_head_shoulders_alert
        alert('Bullish Asc. Head and Shoulders')

///////////////////////////////////
// DESCENDING HEAD AND SHOULDERS //
///////////////////////////////////

var bear_desc_head_shoulders_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_desc_head_shoulders_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_desc_head_shoulders_line_3 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_desc_head_shoulders_line_4 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_desc_head_shoulders_line_5 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_desc_head_shoulders_line_6 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_desc_head_shoulders_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = 'BEAR DESC. HEAD AND SHOULDERS', textcolor = label_colour)

if sw.sh() and pa.bear_desc_head_shoulders() and barstate.isconfirmed
    if show_bear_desc_head_shoulders
        line.set_xy1(bear_desc_head_shoulders_line_1, shpbi_2, shp_2)
        line.set_xy2(bear_desc_head_shoulders_line_1, slpbi_1, slp_1)
        line.set_xy1(bear_desc_head_shoulders_line_2, slpbi_1, slp_1)
        line.set_xy2(bear_desc_head_shoulders_line_2, shpbi_1, shp_1)
        line.set_xy1(bear_desc_head_shoulders_line_3, shpbi_1, shp_1)
        line.set_xy2(bear_desc_head_shoulders_line_3, slpbi_0, slp_0)
        line.set_xy1(bear_desc_head_shoulders_line_4, slpbi_0, slp_0)
        line.set_xy2(bear_desc_head_shoulders_line_4, shpbi_0, shp_0)
        line.set_xy1(bear_desc_head_shoulders_line_5, shpbi_2, shp_2)
        line.set_xy2(bear_desc_head_shoulders_line_5, shpbi_1, shp_1)
        line.set_xy1(bear_desc_head_shoulders_line_6, shpbi_1, shp_1)
        line.set_xy2(bear_desc_head_shoulders_line_6, shpbi_0, shp_0)
        label.set_xy(bear_desc_head_shoulders_label_1, shpbi_1, shp_1)
    if bear_desc_head_shoulders_alert
        alert('Bearish Desc. Head and Shoulders')

var bull_desc_head_shoulders_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_desc_head_shoulders_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_desc_head_shoulders_line_3 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_desc_head_shoulders_line_4 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_desc_head_shoulders_line_5 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_desc_head_shoulders_line_6 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_desc_head_shoulders_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = 'BULL DESC. HEAD AND SHOULDERS', textcolor = label_colour)

if sw.sl() and pa.bull_desc_head_shoulders() and barstate.isconfirmed
    if show_bull_desc_head_shoulders
        line.set_xy1(bull_desc_head_shoulders_line_1, slpbi_2, slp_2)
        line.set_xy2(bull_desc_head_shoulders_line_1, shpbi_1, shp_1)
        line.set_xy1(bull_desc_head_shoulders_line_2, shpbi_1, shp_1)
        line.set_xy2(bull_desc_head_shoulders_line_2, slpbi_1, slp_1)
        line.set_xy1(bull_desc_head_shoulders_line_3, slpbi_1, slp_1)
        line.set_xy2(bull_desc_head_shoulders_line_3, shpbi_0, shp_0)
        line.set_xy1(bull_desc_head_shoulders_line_4, shpbi_0, shp_0)
        line.set_xy2(bull_desc_head_shoulders_line_4, slpbi_0, slp_0)
        line.set_xy1(bull_desc_head_shoulders_line_5, slpbi_2, slp_2)
        line.set_xy2(bull_desc_head_shoulders_line_5, slpbi_1, slp_1)
        line.set_xy1(bull_desc_head_shoulders_line_6, slpbi_1, slp_1)
        line.set_xy2(bull_desc_head_shoulders_line_6, slpbi_0, slp_0)
        label.set_xy(bull_desc_head_shoulders_label_1, slpbi_1, slp_1)
    if bull_desc_head_shoulders_alert
        alert('Bullish Desc. Head and Shoulders')

////////////////////////
// HEAD AND SHOULDERS //
////////////////////////

var bear_head_shoulders_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_head_shoulders_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_head_shoulders_line_3 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_head_shoulders_line_4 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_head_shoulders_line_5 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_head_shoulders_line_6 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_head_shoulders_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = 'BEAR HEAD AND SHOULDERS', textcolor = label_colour)

if sw.sh() and pa.bear_head_shoulders() and barstate.isconfirmed
    if show_bear_head_shoulders
        line.set_xy1(bear_head_shoulders_line_1, shpbi_2, shp_2)
        line.set_xy2(bear_head_shoulders_line_1, slpbi_1, slp_1)
        line.set_xy1(bear_head_shoulders_line_2, slpbi_1, slp_1)
        line.set_xy2(bear_head_shoulders_line_2, shpbi_1, shp_1)
        line.set_xy1(bear_head_shoulders_line_3, shpbi_1, shp_1)
        line.set_xy2(bear_head_shoulders_line_3, slpbi_0, slp_0)
        line.set_xy1(bear_head_shoulders_line_4, slpbi_0, slp_0)
        line.set_xy2(bear_head_shoulders_line_4, shpbi_0, shp_0)
        line.set_xy1(bear_head_shoulders_line_5, shpbi_2, shp_2)
        line.set_xy2(bear_head_shoulders_line_5, shpbi_1, shp_1)
        line.set_xy1(bear_head_shoulders_line_6, shpbi_1, shp_1)
        line.set_xy2(bear_head_shoulders_line_6, shpbi_0, shp_0)
        label.set_xy(bear_head_shoulders_label_1, shpbi_1, shp_1)
    if bear_head_shoulders_alert
        alert('Bearish Head and Shoulders')

var bull_head_shoulders_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_head_shoulders_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_head_shoulders_line_3 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_head_shoulders_line_4 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_head_shoulders_line_5 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_head_shoulders_line_6 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_head_shoulders_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = 'BULL HEAD AND SHOULDERS', textcolor = label_colour)

if sw.sl() and pa.bull_head_shoulders() and barstate.isconfirmed
    if show_bull_head_shoulders
        line.set_xy1(bull_head_shoulders_line_1, slpbi_2, slp_2)
        line.set_xy2(bull_head_shoulders_line_1, shpbi_1, shp_1)
        line.set_xy1(bull_head_shoulders_line_2, shpbi_1, shp_1)
        line.set_xy2(bull_head_shoulders_line_2, slpbi_1, slp_1)
        line.set_xy1(bull_head_shoulders_line_3, slpbi_1, slp_1)
        line.set_xy2(bull_head_shoulders_line_3, shpbi_0, shp_0)
        line.set_xy1(bull_head_shoulders_line_4, shpbi_0, shp_0)
        line.set_xy2(bull_head_shoulders_line_4, slpbi_0, slp_0)
        line.set_xy1(bull_head_shoulders_line_5, slpbi_2, slp_2)
        line.set_xy2(bull_head_shoulders_line_5, slpbi_1, slp_1)
        line.set_xy1(bull_head_shoulders_line_6, slpbi_1, slp_1)
        line.set_xy2(bull_head_shoulders_line_6, slpbi_0, slp_0)
        label.set_xy(bull_head_shoulders_label_1, slpbi_1, slp_1)
    if bull_head_shoulders_alert
        alert('Bullish Head and Shoulders')

/////////////
// PENNANT //
/////////////

var bear_pennant_line_1 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_pennant_line_2 = line.new(na, na, na, na, color = bear_pattern_colour, width = 2)
var bear_pennant_line_3 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bear_pennant_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = 'A', textcolor = label_colour)
var bear_pennant_label_2 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bear_pennant_label_3 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bear_pennant_label_4 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bear_pennant_label_5 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)

if sw.sh() and pa.bear_pennant(ab_ratio, bc_ratio) and barstate.isconfirmed
    if show_bear_pennant
        line.set_xy1(bear_pennant_line_1, shpbi_2, shp_2)
        line.set_xy2(bear_pennant_line_1, slpbi_1, slp_1)
        line.set_xy1(bear_pennant_line_2, slpbi_1, slp_1)
        line.set_xy2(bear_pennant_line_2, slpbi_0, slp_0)
        line.set_xy1(bear_pennant_line_3, shpbi_1, shp_1)
        line.set_xy2(bear_pennant_line_3, shpbi_0, shp_0)
        label.set_xy(bear_pennant_label_1, shpbi_2, shp_2)
        label.set_xy(bear_pennant_label_2, slpbi_1, slp_1)
        label.set_xy(bear_pennant_label_3, shpbi_1, shp_1)
        label.set_xy(bear_pennant_label_4, slpbi_0, slp_0)
        label.set_xy(bear_pennant_label_5, shpbi_0, shp_0)
        label.set_text(bear_pennant_label_2, 'B (' + str.tostring(math.round(slrr_1, 2)) + ')')
        label.set_text(bear_pennant_label_3, 'C (' + str.tostring(math.round(shrr_1, 2)) + ')')
        label.set_text(bear_pennant_label_4, 'D (' + str.tostring(math.round(slrr_0, 2)) + ')')
        label.set_text(bear_pennant_label_5, 'BEAR PENNANT\nE (' + str.tostring(math.round(shrr_0, 2)) + ')')
    if bear_pennant_alert
        alert('Bearish Pennant')

var bull_pennant_line_1 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_pennant_line_2 = line.new(na, na, na, na, color = bull_pattern_colour, width = 2)
var bull_pennant_line_3 = line.new(na, na, na, na, color = dot_colour, style = line.style_dashed)
var bull_pennant_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = 'A', textcolor = label_colour)
var bull_pennant_label_2 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bull_pennant_label_3 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)
var bull_pennant_label_4 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_down, text = na, textcolor = label_colour)
var bull_pennant_label_5 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_label_up, text = na, textcolor = label_colour)

if sw.sl() and pa.bull_pennant(ab_ratio, bc_ratio) and barstate.isconfirmed
    if show_bull_pennant
        line.set_xy1(bull_pennant_line_1, slpbi_2, slp_2)
        line.set_xy2(bull_pennant_line_1, shpbi_1, shp_1)
        line.set_xy1(bull_pennant_line_2, shpbi_1, shp_1)
        line.set_xy2(bull_pennant_line_2, shpbi_0, shp_0)
        line.set_xy1(bull_pennant_line_3, slpbi_1, slp_1)
        line.set_xy2(bull_pennant_line_3, slpbi_0, slp_0)
        label.set_xy(bull_pennant_label_1, slpbi_2, slp_2)
        label.set_xy(bull_pennant_label_2, shpbi_1, shp_1)
        label.set_xy(bull_pennant_label_3, slpbi_1, slp_1)
        label.set_xy(bull_pennant_label_4, shpbi_0, shp_0)
        label.set_xy(bull_pennant_label_5, slpbi_0, slp_0)
        label.set_text(bull_pennant_label_2, 'B (' + str.tostring(math.round(shrr_1, 2)) + ')')
        label.set_text(bull_pennant_label_3, 'C (' + str.tostring(math.round(slrr_1, 2)) + ')')
        label.set_text(bull_pennant_label_4, 'D (' + str.tostring(math.round(shrr_0, 2)) + ')')
        label.set_text(bull_pennant_label_5, 'BULL PENNANT\nE (' + str.tostring(math.round(slrr_0, 2)) + ')')    
    if bull_pennant_alert
        alert('Bullish Pennant')
        
/////////////////////
// ASCENDING WEDGE //
/////////////////////

var asc_wedge_line_1 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var asc_wedge_line_2 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var asc_wedge_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_none, text = 'ASC. WEDGE', textcolor = label_colour)

if sw.sh() and pa.asc_wedge() and barstate.isconfirmed        
    if show_asc_wedge 
        line.set_xy1(asc_wedge_line_1, slpbi_1, slp_1)
        line.set_xy2(asc_wedge_line_1, slpbi_0, slp_0)
        line.set_xy1(asc_wedge_line_2, shpbi_1, shp_1)
        line.set_xy2(asc_wedge_line_2, shpbi_0, shp_0)
        label.set_xy(asc_wedge_label_1, shpbi_0, shp_0)
        label.set_style(asc_wedge_label_1, label.style_label_down)
    if asc_wedge_alert
        alert('Asc. Wedge')

if sw.sl() and pa.asc_wedge() and barstate.isconfirmed        
    if show_asc_wedge
        line.set_xy1(asc_wedge_line_1, slpbi_1, slp_1)
        line.set_xy2(asc_wedge_line_1, slpbi_0, slp_0)
        line.set_xy1(asc_wedge_line_2, shpbi_1, shp_1)
        line.set_xy2(asc_wedge_line_2, shpbi_0, shp_0)
        label.set_xy(asc_wedge_label_1, slpbi_0, slp_0)
        label.set_style(asc_wedge_label_1, label.style_label_up)
    if asc_wedge_alert
        alert('Asc. Wedge')

///////////////////////
// DESCENDING WEDGE  //
///////////////////////

var desc_wedge_line_1 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var desc_wedge_line_2 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var desc_wedge_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_none, text = 'DESC. WEDGE', textcolor = label_colour)

if sw.sh() and pa.desc_wedge() and barstate.isconfirmed
    if show_desc_wedge 
        line.set_xy1(desc_wedge_line_1, slpbi_1, slp_1)
        line.set_xy2(desc_wedge_line_1, slpbi_0, slp_0)
        line.set_xy1(desc_wedge_line_2, shpbi_1, shp_1)
        line.set_xy2(desc_wedge_line_2, shpbi_0, shp_0)
        label.set_xy(desc_wedge_label_1, shpbi_0, shp_0)
        label.set_style(desc_wedge_label_1, label.style_label_down)
    if desc_wedge_alert
        alert('Desc. Wedge')

if sw.sl() and pa.desc_wedge() and barstate.isconfirmed
    if show_desc_wedge
        line.set_xy1(desc_wedge_line_1, slpbi_1, slp_1)
        line.set_xy2(desc_wedge_line_1, slpbi_0, slp_0)
        line.set_xy1(desc_wedge_line_2, shpbi_1, shp_1)
        line.set_xy2(desc_wedge_line_2, shpbi_0, shp_0)
        label.set_xy(desc_wedge_label_1, slpbi_0, slp_0)
        label.set_style(desc_wedge_label_1, label.style_label_up)
    if desc_wedge_alert
        alert('Desc. Wedge')

///////////
// WEDGE //
///////////

var wedge_line_1 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var wedge_line_2 = line.new(na, na, na, na, color = neutral_pattern_colour, width = 2)
var wedge_label_1 = label.new(na, na, color = color.rgb(54, 58, 69, 100), style = label.style_none, text = 'WEDGE', textcolor = label_colour)

if sw.sh() and pa.wedge() and barstate.isconfirmed
    if show_wedge
        line.set_xy1(wedge_line_1, slpbi_1, slp_1)
        line.set_xy2(wedge_line_1, slpbi_0, slp_0)
        line.set_xy1(wedge_line_2, shpbi_1, shp_1)
        line.set_xy2(wedge_line_2, shpbi_0, shp_0)
        label.set_xy(wedge_label_1, shpbi_0, shp_0)
        label.set_style(wedge_label_1, label.style_label_down)
    if wedge_alert
        alert('Wedge')

if sw.sl() and pa.wedge() and barstate.isconfirmed
    if show_wedge 
        line.set_xy1(wedge_line_1, slpbi_1, slp_1)
        line.set_xy2(wedge_line_1, slpbi_0, slp_0)
        line.set_xy1(wedge_line_2, shpbi_1, shp_1)
        line.set_xy2(wedge_line_2, shpbi_0, shp_0)
        label.set_xy(wedge_label_1, slpbi_0, slp_0)
        label.set_style(wedge_label_1, label.style_label_up)
    if wedge_alert
        alert('Wedge')

Overview

All Chart Patterns [theEccentricTrader] automatically identifies formations such as double and triple tops or bottoms, head and shoulders, flags, pennants, wedges, Elliott waves, and broadening patterns. Users can toggle individual pattern types on or off, adjust minimum pattern ratio inputs, and customize line and label colors for bullish, bearish, and neutral setups. Because the underlying swing detection identifies high and low points after a delay, pattern overlays repaint retroactively on past bars.

Details

Published by

webcrack4 on GitHub

Code credit

theEccentricTrader, as written in the script's header

Draws

On the price chart

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

  • Signals can change on the live bar or after it closes (repainting)

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Bearish Pattern Colourcolorcolor.redbear_pattern_colour
Bullish Pattern Colourcolorcolor.greenbull_pattern_colour
Neutral Pattern Colourcolorcolor.blueneutral_pattern_colour
Dotted Line Colourcolorcolor.bluedot_colour
Label Colourcolorcolor.bluelabel_colour
Show Asc. Broadeningbooltrueshow_asc_broadening
Show Broadeningbooltrueshow_broadening
Show Desc. Broadeningbooltrueshow_desc_broadening
Show Double Bottombooltrueshow_double_bot
Show Double Topbooltrueshow_double_top
Show Triple Bottombooltrueshow_triple_bot
Show Triple Topbooltrueshow_triple_top
Show all 40 settings
SettingTypeDefaultVariable
Show Bear Elliot Wavebooltrueshow_bear_elliot
Show Bull Elliot Wavebooltrueshow_bull_elliot
Show Bear Alt. Flagbooltrueshow_bear_alt_flag
Show Bull Alt. Flagbooltrueshow_bull_alt_flag
Show Bear Flagbooltrueshow_bear_flag
Show Bull Flagbooltrueshow_bull_flag
Show Bear Asc. Head and Shouldersbooltrueshow_bear_asc_head_shoulders
Show Bull Asc. Head and Shouldersbooltrueshow_bull_asc_head_shoulders
Show Bear Desc. Head and Shouldersbooltrueshow_bear_desc_head_shoulders
Show Bull Desc. Head and Shouldersbooltrueshow_bull_desc_head_shoulders
Show Bear Head and Shouldersboolfalseshow_bear_head_shoulders
Show Bull Head and Shouldersboolfalseshow_bull_head_shoulders
Show Bear Pennantbooltrueshow_bear_pennant
Show Bull Pennantbooltrueshow_bull_pennant
Show Asc. Wedgebooltrueshow_asc_wedge
Show Desc. Wedgebooltrueshow_desc_wedge
Show Wedgebooltrueshow_wedge
AB Minimum Ratioint100ab_ratio
BC Maximum Ratioint30bc_ratio
BE Maximum Ratioint40be_ratio
Lower Tolerance (%)int10low_tol
Upper Tolerance (%)int10up_tol
Asc. Broadening Alertbooltrueasc_broadening_alert
Broadening Alertbooltruebroadening_alert
Desc. Broadening Alertbooltruedesc_broadening_alert
Double Bot Alertbooltruedouble_bot_alert
Double Top Alertbooltruedouble_top_alert
Triple Bot Alertbooltruetriple_bot_alert
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

Sideway Zones Live

by dearvn
257 stars

Sideway Zones Live is an overlay indicator that estimates inner and outer sideways bands from recent highs and lows with a rational quadratic kernel. It tracks swing pivots over a loopback period and counts bars that remain between the outer high and low. Afte

Indicator v5 TrendSupport & resistance
Updated 7 weeks ago · None stated GitHub repository of Sideway Zones Live
56 stars

This indicator calculates dynamic upper and lower trendlines from pivot highs and pivot lows across a specified bar length. Trendline slopes are derived using ATR, standard deviation, or linear regression methods. It plots trendlines and breakout signal labels

Indicator v5 TrendSupport & resistance Repaints
Updated 2 months ago · None stated GitHub repository of Trendlines With Breaks [LUX]

Reversal Breakout System

by TamaraKGreen
46 stars

This indicator detects inside candles inside larger parent candles on the price chart. It plots colored boxes around inside and parent candles, fills them with user-adjustable transparency, draws Fibonacci retracement lines and mother candle range lines, and d

Indicator v6 Candlestick patternsBreakout
Updated 8 weeks ago · None stated GitHub repository of Reversal Breakout System
24 stars

This indicator maps Smart Money Concepts (SMC) market structure directly onto the price chart. It detects internal and swing structure breaks (BOS and CHoCH), tracks bullish and bearish order blocks, identifies fair value gaps (FVG), highlights equal highs and

Indicator v5 SMC / ICT / price actionSupport & resistance Repaints
Updated 12 days ago · Custom licence GitHub repository of Smart Money Concepts [LuxAlgo] Test B

The Market Tradability Engine calculates multi-factor tradability, balance, compression, and direction scores to evaluate market regime quality. It classifies market conditions into eight distinct states, including Balance, Compression, Ready, Breakout, Trend,

Indicator v6 TrendVolatility & bands
Updated 3 days ago · MIT GitHub repository of Market Tradability Engine [WavesUnchained]

This indicator tracks swing highs and swing lows to generate trend-following trailing stop levels on the price chart. When the closing price breaks above the previous swing high, the system establishes a bullish state using the recent swing low as a trailing s

Indicator v4 TrendBreakout
Updated 4 years ago · None stated GitHub repository of Accurate Swing Trading System

More Support & resistance scripts

Related on ForexR

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers