// This source code is subject to the terms of the Mozilla Public License 2.
0 at
[Link]
// © fikira
//@version=5
indicator('Canh Long/Short v3', shorttitle='Canh L/S v3', max_lines_count=500,
max_labels_count=500, overlay=true)
hi = high // input(high, title='source high')
lo = low // input(low , title='source low')
step = [Link](45, title='use x steps' , minval=1, maxval=45)
left = [Link](3 , minval= 1, title='L', inline='1', group='left, + x for every
next \'left\', right = % of left')
lPlus = [Link](2 , minval= 1, title='+', inline='1', group='left, + x for every
next \'left\', right = % of left')
perc = [Link](10, title='R = % of L' , inline='1', group='left, + x for every
next \'left\', right = % of left')
//right = input(1., title="right", inline="2")
minAC = [Link](0.000, title='min AB -> C')
maxAC = [Link](1.000, title='max AB -> C')
minBD = [Link](1.000, title='min BC -> D')
maxBD = [Link](5.000, title='max BC -> D')
bull = input(true, title='step bullish patterns')
bear = input(true, title='step bearish patterns')
c_labelBull = [Link]([Link]([Link], 100), title='Bullish label' ,
group='colors')
c_lbTxtBull = [Link]([Link]([Link], 20), title='Bullish label text',
group='colors')
c_linesBull = [Link]([Link]([Link], 0), title='Bullish lines' ,
group='colors')
c_labelBear = [Link]([Link]([Link] , 100), title='Bearish label' ,
group='colors')
c_lbTxtBear = [Link]([Link]([Link] , 20), title='Bearish label text',
group='colors')
c_linesBear = [Link]([Link]([Link] , 0), title='Bearish lines' ,
group='colors')
canh = true // [Link](true, title='Canh', group='Patterns', inline='Canh')
var alertBull = array.new_int(0), [Link](alertBull, 0)
var alertBear = array.new_int(0), [Link](alertBear, 0)
if [Link](alertBull) > 10
[Link](alertBull)
if [Link](alertBear) > 10
[Link](alertBear)
var a_HP = array.new_line()
var a_lb = array.new_label()
var a_ZZ1 = array.new_line()
var a_ZZ2 = array.new_line()
var a_ZZ3 = array.new_line()
var a_ZZ4 = array.new_line()
var a_ZZ5 = array.new_line()
var a_pv1 = array.new_int()
var a_pv2 = array.new_int()
var a_pv3 = array.new_int()
var a_pv4 = array.new_int()
var a_pv5 = array.new_int()
var a_ZZ6 = array.new_line()
var a_ZZ7 = array.new_line()
var a_ZZ8 = array.new_line()
var a_ZZ9 = array.new_line()
var a_ZZ10 = array.new_line()
var a_pv6 = array.new_int()
var a_pv7 = array.new_int()
var a_pv8 = array.new_int()
var a_pv9 = array.new_int()
var a_pv10 = array.new_int()
var a_ZZ11 = array.new_line()
var a_ZZ12 = array.new_line()
var a_ZZ13 = array.new_line()
var a_ZZ14 = array.new_line()
var a_ZZ15 = array.new_line()
var a_pv11 = array.new_int()
var a_pv12 = array.new_int()
var a_pv13 = array.new_int()
var a_pv14 = array.new_int()
var a_pv15 = array.new_int()
var a_ZZ16 = array.new_line()
var a_ZZ17 = array.new_line()
var a_ZZ18 = array.new_line()
var a_ZZ19 = array.new_line()
var a_ZZ20 = array.new_line()
var a_pv16 = array.new_int()
var a_pv17 = array.new_int()
var a_pv18 = array.new_int()
var a_pv19 = array.new_int()
var a_pv20 = array.new_int()
var a_ZZ21 = array.new_line()
var a_ZZ22 = array.new_line()
var a_ZZ23 = array.new_line()
var a_ZZ24 = array.new_line()
var a_ZZ25 = array.new_line()
var a_pv21 = array.new_int()
var a_pv22 = array.new_int()
var a_pv23 = array.new_int()
var a_pv24 = array.new_int()
var a_pv25 = array.new_int()
var a_ZZ26 = array.new_line()
var a_ZZ27 = array.new_line()
var a_ZZ28 = array.new_line()
var a_ZZ29 = array.new_line()
var a_ZZ30 = array.new_line()
var a_pv26 = array.new_int()
var a_pv27 = array.new_int()
var a_pv28 = array.new_int()
var a_pv29 = array.new_int()
var a_pv30 = array.new_int()
var a_ZZ31 = array.new_line()
var a_ZZ32 = array.new_line()
var a_ZZ33 = array.new_line()
var a_ZZ34 = array.new_line()
var a_ZZ35 = array.new_line()
var a_pv31 = array.new_int()
var a_pv32 = array.new_int()
var a_pv33 = array.new_int()
var a_pv34 = array.new_int()
var a_pv35 = array.new_int()
var a_ZZ36 = array.new_line()
var a_ZZ37 = array.new_line()
var a_ZZ38 = array.new_line()
var a_ZZ39 = array.new_line()
var a_ZZ40 = array.new_line()
var a_pv36 = array.new_int()
var a_pv37 = array.new_int()
var a_pv38 = array.new_int()
var a_pv39 = array.new_int()
var a_pv40 = array.new_int()
var a_ZZ41 = array.new_line()
var a_ZZ42 = array.new_line()
var a_ZZ43 = array.new_line()
var a_ZZ44 = array.new_line()
var a_ZZ45 = array.new_line()
var a_pv41 = array.new_int()
var a_pv42 = array.new_int()
var a_pv43 = array.new_int()
var a_pv44 = array.new_int()
var a_pv45 = array.new_int()
// var a_colZZ = [Link]([Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link], [Link], [Link],
[Link], [Link], [Link], [Link])
f_isTrueBull(_xy, _ay, _by, _cy, _dy) =>
_cy <= _by + (_ay - _by) * maxAC and
_cy >= _by + (_ay - _by) * minAC and
_dy <= _cy - (_cy - _by) * minBD and
_dy >= _cy - (_cy - _by) * maxBD
f_isTrueBear(_xy, _ay, _by, _cy, _dy) =>
_cy >= _by - (_by - _ay) * maxAC and
_cy <= _by - (_by - _ay) * minAC and
_dy >= _cy + (_by - _cy) * minBD and
_dy <= _cy + (_by - _cy) * maxBD
// bearish
f_draw(a, a_ZZ, a_pv, left) =>
if a < step
right = [Link]([Link](1, left * (perc / 100)))
//
x1 = 0
x2 = 0
y1 = 0.
y2 = 0.
//
var _dx = 0
var _dy = 0.
var _cx = 0
var _cy = 0.
var _bx = 0
var _by = 0.
var _ax = 0
var _ay = 0.
var _xx = 0
var _xy = 0.
//
ph = [Link](hi, left, right)
pl = [Link](lo , left, right)
//
if [Link]
[Link](a_ZZ, [Link](bar_index, close, bar_index, close,
color=[Link]([Link], 100)))
[Link](a_pv, -1)
//
if [Link](a_ZZ) > 10
[Link]([Link](a_ZZ))
[Link](a_pv)
//
if ph
x1 := line.get_x2([Link](a_ZZ, 0))
y1 := line.get_y2([Link](a_ZZ, 0))
x2 := bar_index - right
y2 := high [right]
if [Link](a_pv, 0) == -1 // if previous point was a pl, add, and
change direction (1)
[Link](a_ZZ, [Link](x1, y1, x2, y2,
color=[Link]([Link], 100))) //, color=[Link](a_colZZ, a)))
[Link](a_pv, 1)
else
if [Link](a_pv, 0) == 1 and ph > line.get_y2([Link](a_ZZ, 0))
line.set_xy2([Link](a_ZZ, 0), x2, y2) // if previous point
was ph, check if it is higher
//
if pl
x1 := line.get_x2([Link](a_ZZ, 0))
y1 := line.get_y2([Link](a_ZZ, 0))
//
x2 := bar_index - right
y2 := low [right]
//
if [Link](a_pv, 0) == 1
[Link](a_ZZ, [Link](x1, y1, x2, y2,
color=[Link]([Link], 100))) //, color=[Link](a_colZZ, a)))
[Link](a_pv, -1)
else
if [Link](a_pv, 0) == -1 and pl < line.get_y2([Link](a_ZZ,
0))
line.set_xy2([Link](a_ZZ, 0), x2, y2)
//
if [Link](a_ZZ) > 4
_dx := line.get_x2([Link](a_ZZ, 0))
_dy := line.get_y2([Link](a_ZZ, 0))
_cx := line.get_x2([Link](a_ZZ, 1))
_cy := line.get_y2([Link](a_ZZ, 1))
_bx := line.get_x2([Link](a_ZZ, 2))
_by := line.get_y2([Link](a_ZZ, 2))
_ax := line.get_x2([Link](a_ZZ, 3))
_ay := line.get_y2([Link](a_ZZ, 3))
_xx := line.get_x2([Link](a_ZZ, 4))
_xy := line.get_y2([Link](a_ZZ, 4))
//
if f_isTrueBear(_xy, _ay, _by, _cy, _dy) and bear and close <= _cy
//
if [Link](a_HP) > 12 // if more than 2 patterns in array c must
be different than c[1] or c[2] (if 2 pat are very close to each other)
if _cx != line.get_x1([Link](a_HP, 1)) and
_cy != line.get_y1([Link](a_HP, 1)) and
_cx != line.get_x1([Link](a_HP, 7)) and
_cy != line.get_y1([Link](a_HP, 7))
[Link](a_HP, [Link] (bar_index, low, _dx, _dy,
width=1, color=c_linesBear, style=line.style_arrow_left))
[Link](a_HP, [Link] (bar_index, _cy, _cx, _cy,
width=1, color=c_linesBear, style=line.style_dotted))
[Link](a_HP, [Link] (_bx , _by, _dx, _by,
width=1, color=c_linesBear, style=line.style_dotted))
[Link](a_HP, [Link] (_dx , _dy, _cx, _cy,
width=2, color=c_linesBear))
[Link](a_HP, [Link] (_cx , _cy, _bx, _by,
width=2, color=c_linesBear))
[Link](a_HP, [Link] (_bx , _by, _ax, _ay,
width=2, color=c_linesBear))
[Link](a_lb, [Link](_dx , _dy, text='Canv
Short', style=label.style_label_down, color=c_labelBear, textcolor=c_lbTxtBear,
size=[Link]))
[Link](alertBear, 0, [Link](alertBear, 0) + 1)
//
else if [Link](a_HP) > 6
if _cx != line.get_x1([Link](a_HP, 1)) and
_cy != line.get_y1([Link](a_HP, 1)) // if more then 2
lines in array (= 2 patterns)
[Link](a_HP, [Link] (bar_index, low, _dx, _dy,
width=1, color=c_linesBear, style=line.style_arrow_left))
[Link](a_HP, [Link] (bar_index, _cy, _cx, _cy,
width=1, color=c_linesBear, style=line.style_dotted))
[Link](a_HP, [Link] (_bx , _by, _dx, _by,
width=1, color=c_linesBear, style=line.style_dotted))
[Link](a_HP, [Link] (_dx , _dy, _cx, _cy,
width=2, color=c_linesBear))
[Link](a_HP, [Link] (_cx , _cy, _bx, _by,
width=2, color=c_linesBear))
[Link](a_HP, [Link] (_bx , _by, _ax, _ay,
width=2, color=c_linesBear))
[Link](a_lb, [Link](_dx , _dy, text='Canv
Short', style=label.style_label_down, color=c_labelBear, textcolor=c_lbTxtBear,
size=[Link]))
[Link](alertBear, 0, [Link](alertBear, 0) + 1)
else
[Link] (a_HP, [Link] (bar_index, low, _dx, _dy,
width=1, color=c_linesBear, style=line.style_arrow_left))
[Link] (a_HP, [Link] (bar_index, _cy, _cx, _cy,
width=1, color=c_linesBear, style=line.style_dotted))
[Link] (a_HP, [Link] (_bx , _by, _dx, _by,
width=1, color=c_linesBear, style=line.style_dotted))
[Link] (a_HP, [Link] (_dx , _dy, _cx, _cy,
width=2, color=c_linesBear))
[Link] (a_HP, [Link] (_cx , _cy, _bx, _by,
width=2, color=c_linesBear))
[Link] (a_HP, [Link] (_bx , _by, _ax, _ay,
width=2, color=c_linesBear))
[Link] (a_lb, [Link](_dx , _dy, text='Canv
Short', style=label.style_label_down, color=c_labelBear, textcolor=c_lbTxtBear,
size=[Link]))
[Link](alertBear, 0, [Link](alertBear, 0) + 1)
//
if f_isTrueBull(_xy, _ay, _by, _cy, _dy) and bull and close >= _cy
//
if [Link](a_HP) > 12 // if more than 2 patterns in array c must
be different than c[1] or c[2] (if 2 pat are very close to each other)
if _cx != line.get_x1([Link](a_HP, 1)) and
_cy != line.get_y1([Link](a_HP, 1)) and
_cx != line.get_x1([Link](a_HP, 7)) and
_cy != line.get_y1([Link](a_HP, 7))
[Link](a_HP, [Link] (bar_index, high, _dx, _dy,
width=1, color=c_linesBull, style=line.style_arrow_left))
[Link](a_HP, [Link] (bar_index, _cy , _cx, _cy,
width=1, color=c_linesBull, style=line.style_dotted))
[Link](a_HP, [Link] (_bx , _by , _dx, _by,
width=1, color=c_linesBull, style=line.style_dotted))
[Link](a_HP, [Link] (_dx , _dy , _cx, _cy,
width=2, color=c_linesBull))
[Link](a_HP, [Link] (_cx , _cy , _bx, _by,
width=2, color=c_linesBull))
[Link](a_HP, [Link] (_bx , _by , _ax, _ay,
width=2, color=c_linesBull))
[Link](a_lb, [Link](_dx , _dy , text='Canv
Long', style=label.style_label_up, color=c_labelBull, textcolor=c_lbTxtBull,
size=[Link]))
[Link](alertBull, 0, [Link](alertBull, 0) + 1)
//
else if [Link](a_HP) > 6
if _cx != line.get_x1([Link](a_HP, 1)) and
_cy != line.get_y1([Link](a_HP, 1))
[Link](a_HP, [Link] (bar_index, high, _dx, _dy,
width=1, color=c_linesBull, style=line.style_arrow_left))
[Link](a_HP, [Link] (bar_index, _cy , _cx, _cy,
width=1, color=c_linesBull, style=line.style_dotted))
[Link](a_HP, [Link] (_bx , _by , _dx, _by,
width=1, color=c_linesBull, style=line.style_dotted))
[Link](a_HP, [Link] (_dx , _dy , _cx, _cy,
width=2, color=c_linesBull))
[Link](a_HP, [Link] (_cx , _cy , _bx, _by,
width=2, color=c_linesBull))
[Link](a_HP, [Link] (_bx , _by , _ax, _ay,
width=2, color=c_linesBull))
[Link](a_lb, [Link](_dx , _dy , text='Canv
Long', style=label.style_label_up, color=c_labelBull, textcolor=c_lbTxtBull,
size=[Link]))
[Link](alertBull, 0, [Link](alertBull, 0) + 1)
else
[Link] (a_HP, [Link] (bar_index, high, _dx, _dy,
width=1, color=c_linesBull, style=line.style_arrow_left))
[Link] (a_HP, [Link] (bar_index, _cy , _cx, _cy,
width=1, color=c_linesBull, style=line.style_dotted))
[Link] (a_HP, [Link] (_bx , _by , _dx, _by,
width=1, color=c_linesBull, style=line.style_dotted))
[Link] (a_HP, [Link] (_dx , _dy , _cx, _cy,
width=2, color=c_linesBull))
[Link] (a_HP, [Link] (_cx , _cy , _bx, _by,
width=2, color=c_linesBull))
[Link] (a_HP, [Link] (_bx , _by , _ax, _ay,
width=2, color=c_linesBull))
[Link] (a_lb, [Link](_dx , _dy , text='Canv
Long', style=label.style_label_up, color=c_labelBull, textcolor=c_lbTxtBull,
size=[Link]))
[Link](alertBull, 0, [Link](alertBull, 0) + 1)
num = 0
f_draw(num, a_ZZ1, a_pv1, left=left) //, plot(left), plot(round(max(1, left *
(perc / 100))))
num += 1, left += lPlus
f_draw(num, a_ZZ2, a_pv2, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ3, a_pv3, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ4, a_pv4, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ5, a_pv5, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ6, a_pv6, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ7, a_pv7, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ8, a_pv8, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ9, a_pv9, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ10, a_pv10, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ11, a_pv11, left=left) //, plot(left), plot(round(max(1, left *
(perc / 100))))
num += 1, left += lPlus
f_draw(num, a_ZZ12, a_pv12, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ13, a_pv13, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ14, a_pv14, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ15, a_pv15, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ16, a_pv16, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ17, a_pv17, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ18, a_pv18, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ19, a_pv19, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ20, a_pv20, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ21, a_pv21, left=left) //, plot(left), plot(round(max(1, left *
(perc / 100))))
num += 1, left += lPlus
f_draw(num, a_ZZ22, a_pv22, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ23, a_pv23, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ24, a_pv24, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ25, a_pv25, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ26, a_pv26, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ27, a_pv27, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ28, a_pv28, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ29, a_pv29, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ30, a_pv30, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ31, a_pv31, left=left) //, plot(left), plot(round(max(1, left *
(perc / 100))))
num += 1, left += lPlus
f_draw(num, a_ZZ32, a_pv32, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ33, a_pv33, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ34, a_pv34, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ35, a_pv35, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ36, a_pv36, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ37, a_pv37, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ38, a_pv38, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ39, a_pv39, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ40, a_pv40, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ41, a_pv41, left=left) //, plot(left), plot(round(max(1, left *
(perc / 100))))
num += 1, left += lPlus
f_draw(num, a_ZZ42, a_pv42, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ43, a_pv43, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ44, a_pv44, left=left)
num += 1, left += lPlus
f_draw(num, a_ZZ45, a_pv45, left=left)
num += 1, left += lPlus
alertcondition([Link](alertBull, 0) > 0, 'Bullish Canvh', 'Bullish Canvh')
alertcondition([Link](alertBear, 0) > 0, 'Bearish Canvh', 'Bearish Canvh')
//plot([Link](alertBear, 0))
//plot([Link](alertBull, 0))