0% found this document useful (0 votes)
787 views18 pages

EarnWithKoKo 1.1

Uploaded by

h76bfj6yrq
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
787 views18 pages

EarnWithKoKo 1.1

Uploaded by

h76bfj6yrq
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
  • Linear Regression Channel: Contains a script for setting up and plotting a linear regression channel using Pine Script.
  • Order Blocks Detection: Describes the detection and plotting of bullish and bearish order blocks for trading.
  • Bull Bear Finder and Pivot Connector: Includes scripts for finding bull/bear trends and implementing a pivot connector strategy in trading charts.
  • User Input and Tips: Provides user input configurations and tips for using the trading script effectively.
  • Functional Declarations and Variable Calculations: Contains the functional declarations and variable calculations needed for the trading script logic.
  • Conditional Parameters and Graphical Output: Details the conditional checks and graphical output settings for the trading indicators.
  • Alert Functionality: Explains the alert functionality for different trading conditions and actions within the script.

// @EarnWithKoKo, KamranKhoxa

//@version=5
indicator(title='EarnWithKoKo_1.1', shorttitle='EWK_1', overlay=true,
format=format.inherit , max_bars_back=5000)
input_diagonal = input.bool(false, "Diagonal Support", group="Support",
confirm=true)
input_horizontal = input.bool(false, "Horizontal Support", group="Support",
confirm=true)

//START LINEAR REGRESSION CHANNEL


src_lrgc = input(defval=close, title='Source')
len_lrgc = input.int(defval=100, title='Length', minval=10)
devlen_lrgc = input.float(defval=2., title='Deviation', minval=0.1, step=0.1)
extendit_lrgc = input(defval=true, title='Extend Lines')
showfibo_lrgc = input(defval=false, title='Show Fibonacci Levels')
showbroken_lrgc = input.bool(defval=false, title='Show Broken Channel',
inline='brk')
brokencol_lrgc = input.color(defval=color.blue, title='', inline='brk')
upcol_lrgc = input.color(defval=color.lime, title='Up/Down Trend Colors',
inline='trcols')
dncol_lrgc = input.color(defval=color.red, title='', inline='trcols')
widt_lrgc = input(defval=2, title='Line Width')

var fibo_ratios_lrgc = array.new_float(0)


var colors_lrgc = array.new_color(2)
if barstate.isfirst and input_diagonal
array.unshift(colors_lrgc, upcol_lrgc)
array.unshift(colors_lrgc, dncol_lrgc)
array.push(fibo_ratios_lrgc, 0.236)
array.push(fibo_ratios_lrgc, 0.382)
array.push(fibo_ratios_lrgc, 0.618)
array.push(fibo_ratios_lrgc, 0.786)

get_channel_lrgc(src, len) =>


mid = math.sum(src, len) / len
slope = ta.linreg(src, len, 0) - ta.linreg(src, len, 1)
intercept = mid - slope * math.floor(len / 2) + (1 - len % 2) / 2 * slope
endy = intercept + slope * (len - 1)
dev = 0.0
for x = 0 to len - 1 by 1
dev := dev + math.pow(src[x] - (slope * (len - x) + intercept), 2)
dev
dev := math.sqrt(dev / len)
[intercept, endy, dev, slope]

[y1_, y2_, dev, slope] = get_channel_lrgc(src_lrgc, len_lrgc)

outofchannel_lrgc = slope > 0 and close < y2_ - dev * devlen_lrgc ? 0 : slope < 0
and close > y2_ + dev * devlen_lrgc ? 2 : -1

var reglines_lrgc = array.new_line(3)


var fibolines_lrgc = array.new_line(4)
for x = 0 to 2 by 1
if not showbroken_lrgc or outofchannel_lrgc != x or nz(outofchannel_lrgc[1], -
1) != -1
line.delete(array.get(reglines_lrgc, x))
else
line.set_color(array.get(reglines_lrgc, x), color=brokencol_lrgc)
line.set_width(array.get(reglines_lrgc, x), width=2)
line.set_style(array.get(reglines_lrgc, x), style=line.style_dotted)
line.set_extend(array.get(reglines_lrgc, x), extend=extend.none)

array.set(reglines_lrgc, x, line.new(x1=bar_index - (len_lrgc - 1), y1=y1_ +


dev * devlen_lrgc * (x - 1), x2=bar_index, y2=y2_ + dev * devlen_lrgc * (x - 1),
color=array.get(colors_lrgc, math.round(math.max(math.sign(slope), 0))), style=x %
2 == 1 ? line.style_solid : line.style_dashed, width=widt_lrgc,
extend=extendit_lrgc ? extend.right : extend.none))
if showfibo_lrgc
for x = 0 to 3 by 1
line.delete(array.get(fibolines_lrgc, x))
array.set(fibolines_lrgc, x, line.new(x1=bar_index - (len_lrgc - 1), y1=y1_
- dev * devlen_lrgc + dev * devlen_lrgc * 2 * array.get(fibo_ratios_lrgc, x),
x2=bar_index, y2=y2_ - dev * devlen_lrgc + dev * devlen_lrgc * 2 *
array.get(fibo_ratios_lrgc, x), color=array.get(colors_lrgc,
math.round(math.max(math.sign(slope), 0))), style=line.style_dotted,
width=widt_lrgc, extend=extendit_lrgc ? extend.right : extend.none))

var label sidelab_lrgc = label.new(x=bar_index - (len_lrgc - 1), y=y1_, text='S',


size=size.large)
txt_lrgc = slope > 0 ? slope > slope[1] ? '⇑' : '⇗' : slope < 0 ? slope <
slope[1] ? '⇓' : '⇘' : '⇒'
stl_lrgc = slope > 0 ? slope > slope[1] ? label.style_label_up :
label.style_label_upper_right : slope < 0 ? slope < slope[1] ?
label.style_label_down : label.style_label_lower_right : label.style_label_right
label.set_style(sidelab_lrgc, stl_lrgc)
label.set_text(sidelab_lrgc, txt_lrgc)
label.set_x(sidelab_lrgc, bar_index - (len_lrgc - 1))
label.set_y(sidelab_lrgc, slope > 0 ? y1_ - dev * devlen_lrgc : slope < 0 ? y1_ +
dev * devlen_lrgc : y1_)
label.set_color(sidelab_lrgc, slope > 0 ? upcol_lrgc : slope < 0 ? dncol_lrgc :
color.blue)

alertcondition(outofchannel_lrgc, title='Channel Broken', message='Channel Broken')

// direction
trendisup_lrgc = math.sign(slope) != math.sign(slope[1]) and slope > 0
trendisdown_lrgc = math.sign(slope) != math.sign(slope[1]) and slope < 0
alertcondition(trendisup_lrgc, title='Up trend', message='Up trend')
alertcondition(trendisdown_lrgc, title='Down trend', message='Down trend')

//END LINEAR REGRESSION CHANNEL


//*******************************************************

//BEAr and bull findeR


colors_obf = input.string(title='Color Scheme', defval='BRIGHT', options=['DARK',
'BRIGHT'])
periods_obf = input(5, 'Relevant Periods to identify OB') // Required number of
subsequent candles in the same direction to identify Order Block
threshold_obf = input.float(0.0, 'Min. Percent move to identify OB', step=0.1) //
Required minimum % move (from potential OB close to last subsequent candle to
identify Order Block)
usewicks_obf = input(false, 'Use whole range [High/Low] for OB marking?') //
Display High/Low range for each OB instead of Open/Low for Bullish / Open/High for
Bearish
showbull_obf = input(true, 'Show latest Bullish Channel?') // Show Channel for
latest Bullish OB?
showbear_obf = input(true, 'Show latest Bearish Channel?') // Show Channel for
latest Bearish OB?
showdocu_obf = input(false, 'Show Label for documentation tooltip?') // Show Label
which shows documentation as tooltip?
info_pan_obf = input(false, 'Show Latest OB Panel?') // Show Info Panel with
latest OB Stats

ob_period_obf = periods_obf + 1 // Identify location of relevant Order Block


candle
absmove_obf = math.abs(close[ob_period_obf] - close[1]) / close[ob_period_obf] *
100 // Calculate absolute percent move from potential OB to last candle of
subsequent candles
relmove_obf = absmove_obf >= threshold_obf // Identify "Relevant move" by
comparing the absolute move to the threshold

// Color Scheme
bullcolor_obf = colors_obf == 'DARK' ? color.white : color.green
bearcolor_obf = colors_obf == 'DARK' ? color.blue : color.red

// Bullish Order Block Identification


bullishOB_obf = close[ob_period_obf] < open[ob_period_obf] // Determine potential
Bullish OB candle (red candle)

int upcandles_obf = 0
for i = 1 to periods_obf by 1
upcandles_obf := upcandles_obf + (close[i] > open[i] ? 1 : 0) // Determine
color of subsequent candles (must all be green to identify a valid Bearish OB)
upcandles_obf

OB_bull_obf = bullishOB_obf and upcandles_obf == periods_obf and relmove_obf //


Identification logic (red OB candle & subsequent green candles)
OB_bull_high_obf = OB_bull_obf ? usewicks_obf ? high[ob_period_obf] :
open[ob_period_obf] : na // Determine OB upper limit (Open or High depending on
input)
OB_bull_low_obf = OB_bull_obf ? low[ob_period_obf] : na // Determine OB lower
limit (Low)
OB_bull_avg_obf = (OB_bull_high_obf + OB_bull_low_obf) / 2 // Determine OB middle
line

// Bearish Order Block Identification


bearishOB_obf = close[ob_period_obf] > open[ob_period_obf] // Determine potential
Bearish OB candle (green candle)

int downcandles_obf = 0
for i = 1 to periods_obf by 1
downcandles_obf := downcandles_obf + (close[i] < open[i] ? 1 : 0) // Determine
color of subsequent candles (must all be red to identify a valid Bearish OB)
downcandles_obf

OB_Bear_obf = bearishOB_obf and downcandles_obf == periods_obf and relmove_obf //


Identification logic (green OB candle & subsequent green candles)
OB_Bear_high_obf = OB_Bear_obf ? high[ob_period_obf] : na // Determine OB upper
limit (High)
OB_Bear_low_obf = OB_Bear_obf ? usewicks_obf ? low[ob_period_obf] :
open[ob_period_obf] : na // Determine OB lower limit (Open or Low depending on
input)
OB_Bear_avg_obf = (OB_Bear_low_obf + OB_Bear_high_obf) / 2 // Determine OB middle
line

// Plotting

plotshape(OB_bull_obf, title='Bullish OB', style=shape.triangleup,


color=bullcolor_obf, textcolor=bullcolor_obf, size=size.tiny,
location=location.belowbar, offset=-ob_period_obf, text='Bullish OB') // Bullish
OB Indicator
bull1_obf = plot(OB_bull_high_obf, title='Bullish OB High',
style=plot.style_linebr, color=bullcolor_obf, offset=-ob_period_obf,
linewidth=3) // Bullish OB Upper Limit
bull2_obf = plot(OB_bull_low_obf, title='Bullish OB Low', style=plot.style_linebr,
color=bullcolor_obf, offset=-ob_period_obf, linewidth=3) // Bullish OB Lower Limit
fill(bull1_obf, bull2_obf, color=bullcolor_obf, title='Bullish OB fill', transp=0)
// Fill Bullish OB
plotshape(OB_bull_avg_obf, title='Bullish OB Average', style=shape.cross,
color=bullcolor_obf, size=size.normal, location=location.absolute, offset=-
ob_period_obf) // Bullish OB Average

plotshape(OB_Bear_obf, title='Bearish OB', style=shape.triangledown,


color=bearcolor_obf, textcolor=bearcolor_obf, size=size.tiny,
location=location.abovebar, offset=-ob_period_obf, text='Bearish OB') // Bearish
OB Indicator
bear1_obf = plot(OB_Bear_low_obf, title='Bearish OB Low', style=plot.style_linebr,
color=bearcolor_obf, offset=-ob_period_obf, linewidth=3) // Bearish OB Lower Limit
bear2_obf = plot(OB_Bear_high_obf, title='Bearish OB High',
style=plot.style_linebr, color=bearcolor_obf, offset=-ob_period_obf,
linewidth=3) // Bearish OB Upper Limit
fill(bear1_obf, bear2_obf, color=bearcolor_obf, title='Bearish OB fill', transp=0)
// Fill Bearish OB
plotshape(OB_Bear_avg_obf, title='Bearish OB Average', style=shape.cross,
color=bearcolor_obf, size=size.normal, location=location.absolute, offset=-
ob_period_obf) // Bullish OB Average

var line linebull1_obf = na // Bullish OB average


var line linebull2_obf = na // Bullish OB open
var line linebull3_obf = na // Bullish OB low
var line linebear1_obf = na // Bearish OB average
var line linebear2_obf = na // Bearish OB high
var line linebear3_obf = na // Bearish OB open

if OB_bull_obf and showbull_obf


line.delete(linebull1_obf)
linebull1_obf := line.new(x1=bar_index, y1=OB_bull_avg_obf, x2=bar_index - 1,
y2=OB_bull_avg_obf, extend=extend.left, color=bullcolor_obf,
style=line.style_solid, width=1)

line.delete(linebull2_obf)
linebull2_obf := line.new(x1=bar_index, y1=OB_bull_high_obf, x2=bar_index - 1,
y2=OB_bull_high_obf, extend=extend.left, color=bullcolor_obf,
style=line.style_dashed, width=1)

line.delete(linebull3_obf)
linebull3_obf := line.new(x1=bar_index, y1=OB_bull_low_obf, x2=bar_index - 1,
y2=OB_bull_low_obf, extend=extend.left, color=bullcolor_obf,
style=line.style_dashed, width=1)
linebull3_obf

if OB_Bear_obf and showbear_obf


line.delete(linebear1_obf)
linebear1_obf := line.new(x1=bar_index, y1=OB_Bear_avg_obf, x2=bar_index - 1,
y2=OB_Bear_avg_obf, extend=extend.left, color=bearcolor_obf,
style=line.style_solid, width=1)

line.delete(linebear2_obf)
linebear2_obf := line.new(x1=bar_index, y1=OB_Bear_high_obf, x2=bar_index - 1,
y2=OB_Bear_high_obf, extend=extend.left, color=bearcolor_obf,
style=line.style_dashed, width=1)

line.delete(linebear3_obf)
linebear3_obf := line.new(x1=bar_index, y1=OB_Bear_low_obf, x2=bar_index - 1,
y2=OB_Bear_low_obf, extend=extend.left, color=bearcolor_obf,
style=line.style_dashed, width=1)
linebear3_obf

// Alerts for Order Blocks Detection

alertcondition(OB_bull_obf, title='New Bullish OB detected', message='New Bullish


OB detected - This is NOT a BUY signal!')
alertcondition(OB_Bear_obf, title='New Bearish OB detected', message='New Bearish
OB detected - This is NOT a SELL signal!')

// Print latest Order Blocks in Data Window

var latest_bull_high_obf = 0.0 // Variable to keep latest Bull OB high


var latest_bull_avg_obf = 0.0 // Variable to keep latest Bull OB average
var latest_bull_low_obf = 0.0 // Variable to keep latest Bull OB low
var latest_bear_high_obf = 0.0 // Variable to keep latest Bear OB high
var latest_bear_avg_obf = 0.0 // Variable to keep latest Bear OB average
var latest_bear_low_obf = 0.0 // Variable to keep latest Bear OB low

// Assign latest values to variables


if OB_bull_high_obf > 0
latest_bull_high_obf := OB_bull_high_obf
latest_bull_high_obf

if OB_bull_avg_obf > 0
latest_bull_avg_obf := OB_bull_avg_obf
latest_bull_avg_obf

if OB_bull_low_obf > 0
latest_bull_low_obf := OB_bull_low_obf
latest_bull_low_obf

if OB_Bear_high_obf > 0
latest_bear_high_obf := OB_Bear_high_obf
latest_bear_high_obf

if OB_Bear_avg_obf > 0
latest_bear_avg_obf := OB_Bear_avg_obf
latest_bear_avg_obf
if OB_Bear_low_obf > 0
latest_bear_low_obf := OB_Bear_low_obf
latest_bear_low_obf

// Plot invisible characters to be able to show the values in the Data Window
plotchar(latest_bull_high_obf, char=' ', location=location.abovebar,
color=color.new(#777777, 100), size=size.tiny, title='Latest Bull High')
plotchar(latest_bull_avg_obf, char=' ', location=location.abovebar,
color=color.new(#777777, 100), size=size.tiny, title='Latest Bull Avg')
plotchar(latest_bull_low_obf, char=' ', location=location.abovebar,
color=color.new(#777777, 100), size=size.tiny, title='Latest Bull Low')
plotchar(latest_bear_high_obf, char=' ', location=location.abovebar,
color=color.new(#777777, 100), size=size.tiny, title='Latest Bear High')
plotchar(latest_bear_avg_obf, char=' ', location=location.abovebar,
color=color.new(#777777, 100), size=size.tiny, title='Latest Bear Avg')
plotchar(latest_bear_low_obf, char=' ', location=location.abovebar,
color=color.new(#777777, 100), size=size.tiny, title='Latest Bear Low')

//InfoPanel for latest Order Blocks

draw_InfoPanel(_text, _x, _y, font_size) =>


var label la_panel = na
label.delete(la_panel)
la_panel := label.new(x=_x, y=_y, text=_text, xloc=xloc.bar_time,
yloc=yloc.price, color=color.new(#383838, 5), style=label.style_label_left,
textcolor=color.white, size=font_size)
la_panel

info_panel_x_obf = time_close + math.round(ta.change(time) * 100)


info_panel_y_obf = close

title_obf = 'LATEST ORDER BLOCKS'


row0_obf = '-----------------------------------------------------'
row1_obf = ' Bullish - High: ' + str.tostring(latest_bull_high_obf, '#.##')
row2_obf = ' Bullish - Avg: ' + str.tostring(latest_bull_avg_obf, '#.##')
row3_obf = ' Bullish - Low: ' + str.tostring(latest_bull_low_obf, '#.##')
row4_obf = '-----------------------------------------------------'
row5_obf = ' Bearish - High: ' + str.tostring(latest_bear_high_obf, '#.##')
row6_obf = ' Bearish - Avg: ' + str.tostring(latest_bear_avg_obf, '#.##')
row7_obf = ' Bearish - Low: ' + str.tostring(latest_bear_low_obf, '#.##')

panel_text_obf = '\n' + title_obf + '\n' + row0_obf + '\n' + row1_obf + '\n' +


row2_obf + '\n' + row3_obf + '\n' + row4_obf + '\n\n' + row5_obf + '\n' + row6_obf
+ '\n' + row7_obf + '\n'

if info_pan_obf
draw_InfoPanel(panel_text_obf, info_panel_x_obf, info_panel_y_obf, size.normal)

// === Label for Documentation/Tooltip ===


chper_obf = time - time[1]
chper_obf := ta.change(chper_obf) > 0 ? chper_obf[1] : chper_obf

// === Tooltip text ===

var vartooltip_obf = 'Indicator to help identifying instituational Order Blocks.


Often these blocks signal the beginning of a strong move, but there is a high
probability, that these prices will be revisited at a later point in time again and
therefore are interesting levels to place limit orders. \nBullish Order block is
the last down candle before a sequence of up candles. \nBearish Order Block is the
last up candle before a sequence of down candles. \nIn the settings the number of
required sequential candles can be adjusted. \nFurthermore a %-threshold can be
entered which the sequential move needs to achieve in order to validate a relevant
Order Block. \nChannels for the last Bullish/Bearish Block can be shown/hidden.'

// === Print Label ===


var label l_docu = na
label.delete(l_docu)

if showdocu_obf
l_docu := label.new(x=time + chper_obf * 35, y=close, text='DOCU OB',
color=color.gray, textcolor=color.white, style=label.style_label_center,
xloc=xloc.bar_time, yloc=yloc.price, size=size.tiny, textalign=text.align_left,
tooltip=vartooltip_obf)
l_docu

//AND BULL BEAr findeR


//**************************************
//START EXTRAPOLATED PIVOTE CONNECTOR

//----
length_ex_p_conn = input(100)
astart_ex_p_conn = input(1, 'A-High Position')
aend_ex_p_conn = input(0, 'B-High Position')
bstart_ex_p_conn = input(1, 'A-Low Position')
bend_ex_p_conn = input(0, 'B-Low Position')
csrc_ex_p_conn = input(false, 'Use Custom Source ?')
src_ex_p_conn = input(close, 'Custom Source')
//----
up_ex_p_conn = ta.pivothigh(csrc_ex_p_conn ? src_ex_p_conn : high,
length_ex_p_conn, length_ex_p_conn)
dn_ex_p_conn = ta.pivotlow(csrc_ex_p_conn ? src_ex_p_conn : low, length_ex_p_conn,
length_ex_p_conn)
//----
n_ex_p_conn = bar_index
a1_ex_p_conn = ta.valuewhen(not na(up_ex_p_conn), n_ex_p_conn, astart_ex_p_conn)
b1_ex_p_conn = ta.valuewhen(not na(dn_ex_p_conn), n_ex_p_conn, bstart_ex_p_conn)
a2_ex_p_conn = ta.valuewhen(not na(up_ex_p_conn), n_ex_p_conn, aend_ex_p_conn)
b2_ex_p_conn = ta.valuewhen(not na(dn_ex_p_conn), n_ex_p_conn, bend_ex_p_conn)
//----
line upper_ex_p_conn = line.new(n_ex_p_conn[n_ex_p_conn - a1_ex_p_conn +
length_ex_p_conn], up_ex_p_conn[n_ex_p_conn - a1_ex_p_conn],
n_ex_p_conn[n_ex_p_conn - a2_ex_p_conn + length_ex_p_conn],
up_ex_p_conn[n_ex_p_conn - a2_ex_p_conn], extend=extend.right, color=color.blue,
width=2)
line lower_ex_p_conn = line.new(n_ex_p_conn[n_ex_p_conn - b1_ex_p_conn +
length_ex_p_conn], dn_ex_p_conn[n_ex_p_conn - b1_ex_p_conn],
n_ex_p_conn[n_ex_p_conn - b2_ex_p_conn + length_ex_p_conn],
dn_ex_p_conn[n_ex_p_conn - b2_ex_p_conn], extend=extend.right, color=color.orange,
width=2)
line.delete(upper_ex_p_conn[1])
line.delete(lower_ex_p_conn[1])
//----
label ahigh_ex_p_conn = label.new(n_ex_p_conn[n_ex_p_conn - a1_ex_p_conn +
length_ex_p_conn], up_ex_p_conn[n_ex_p_conn - a1_ex_p_conn], 'A-High',
color=color.blue, style=label.style_label_down, textcolor=color.white,
size=size.small)
label bhigh_ex_p_conn = label.new(n_ex_p_conn[n_ex_p_conn - a2_ex_p_conn +
length_ex_p_conn], up_ex_p_conn[n_ex_p_conn - a2_ex_p_conn], 'B-High',
color=color.blue, style=label.style_label_down, textcolor=color.white,
size=size.small)
label alow_ex_p_conn = label.new(n_ex_p_conn[n_ex_p_conn - b1_ex_p_conn +
length_ex_p_conn], dn_ex_p_conn[n_ex_p_conn - b1_ex_p_conn], 'A-Low',
color=color.orange, style=label.style_label_up, textcolor=color.white,
size=size.small)
label blow_ex_p_conn = label.new(n_ex_p_conn[n_ex_p_conn - b2_ex_p_conn +
length_ex_p_conn], dn_ex_p_conn[n_ex_p_conn - b2_ex_p_conn], 'B-Low',
color=color.orange, style=label.style_label_up, textcolor=color.white,
size=size.small)
label.delete(ahigh_ex_p_conn[1])
label.delete(bhigh_ex_p_conn[1])
label.delete(alow_ex_p_conn[1])
label.delete(blow_ex_p_conn[1])
//----
plot(up_ex_p_conn, 'Pivot High\'s', color.new(color.blue, 0), 4,
style=plot.style_circles, offset=-length_ex_p_conn, join=true)
plot(dn_ex_p_conn, 'Pivot Low\'s', color.new(color.orange, 0), 4,
style=plot.style_circles, offset=-length_ex_p_conn, join=true)

//END OF PICK GOLDEN CROSS STRATEGY


//********************************************************
watermarki_supp = input.bool(true, "Watermark", group="Author Sign")
//confirm=true)

string i_tableYpos_oto_supp = input.string("top", "Position", inline = "12",


options = ["top", "middle", "bottom"])
string i_tableXpos_oto_supp = input.string("right", "", inline = "12", options =
["left", "center", "right"])
int i_height_oto_supp = input.int(7, "Height", minval = 1, maxval = 100,
inline = "13")
int i_width_oto_supp = input.int(30, "Width", minval = 1, maxval = 100,
inline = "13a")
color i_c_text_oto_supp = input.color(color.new(color.white, 0), "", inline =
"14")
color _bg_oto_supp = input.color(color.new(color.blue, 70), "", inline = "14")
string i_textSize = input.string("normal", "Size", inline = "14", options =
["tiny", "small", "normal", "large", "huge", "auto"])
i_text2_supp = "EarnWithKoKo"
i_text1_supp = "When using the indicator EarnWithKoKo thank you"
var table watermark_supp = table.new(i_tableYpos_oto_supp + "_" +
i_tableXpos_oto_supp, 1, 1)
if barstate.islast and watermarki_supp
varip bool _changeText_supp = true
_changeText_supp := not _changeText_supp
string _txt_supp = _changeText_supp ? i_text2_supp : i_text1_supp
table.cell(watermark_supp, 0, 0, i_text2_supp, i_width_oto_supp,
i_height_oto_supp, i_c_text_oto_supp, text_size = i_textSize, bgcolor =
_bg_oto_supp)
//#!
showTF = input.bool(true, "show time frame", inline = "24")
showpf = input.bool(true, "show prefix title", inline = "24")
string i_tableYpos = input.string("bottom", "Position", inline = "12", options =
["top", "middle", "bottom"])
string i_tableXpos = input.string("center", "", inline = "12", options = ["left",
"center", "right"])
size1 = input.string("huge", "title", inline = "14", options = ["tiny", "small",
"normal", "large", "huge", "auto"])
size2 = input.string("auto", "extra", inline = "14", options = ["tiny", "small",
"normal", "large", "huge", "auto"])
color = input.color(#999999, "color")
string = input.string("by EarnWithKoKo", "your signature")
seperator = input.string("/", "seperator")

cur = syminfo.currency
base = syminfo.basecurrency
exchange = syminfo.prefix

getTimeFrame() =>
tf = timeframe.multiplier
tfstr = ""
if timeframe.isseconds
tfstr := "s"
if timeframe.isminutes
if tf >= 60
tf := tf / 60
tfstr := "h"
else
tfstr := "m"
if timeframe.isdaily
tfstr := "D"
if timeframe.isweekly
tfstr := "W"
if timeframe.ismonthly
tfstr := "M"

[tfstr, str.tostring(tf)]

var table table1 = table.new(i_tableYpos + "_" + i_tableXpos , 3, 1)

if barstate.islast

str1 = base + seperator + cur


[tf, period] = getTimeFrame()

table.cell(table1, 0, 0, showpf ? exchange : "", text_color = color,


text_size=size2)

table.cell(table1, 1, 0, str1 + (showTF ? (" " + period + tf) : ""), text_color


= color, text_size=size1)

table.cell(table1, 2, 0, string, text_color = color, text_size=size2)


// ================================== //
// ------------> Tips <-------------- //
// ================================== //

leftTip = "Look left for swing high/low in x number of bars to form


pivot"
rightTip = "Look right for swing high/low in x number of bars to form
pivot"
nPivTip = "This sets the array size, or the number of pivots to track at
a time (x highs, and x number of lows)"
atrLenTip = "Number of bars to average. ATR is used to standardize zone
width between assets and timeframes"
multTip = "ATR multiplier to set zone width. Default is half of one ATR
from box bottom to box top"
perTip = "Max zone size as a percent of price. Some assets can be too
volatile at low prices creating an unreasonably sized zone"
srcTip = "Source input for pivots. Default tracks the highest and lowest
bodies of HA candles to average price action, whcih can result in a level that sits
in the overlap of support and resistance"
alignZonesTip = "Alligns recurring zones whos edges overlap an existing zone
creating a zone that ages in time and intensifies visually"

dhighsTip = "Disabling will prevent highs from being tracked"


dlowsTip = "Disabling will prevent lows from being tracked"
detectBOTip = "Show points that price action breaks above all pivots. An
arrow from below is displayed"
detectBDTip = "Show points that price action breaks below all pivots. An
arrow from above is displayed"
breakUpTip = "Show points that price action breaks above resistance. An
arrow from below is displayed"
breakDnTip = "Show points that price action breaks below support. An arrow
from above is displayed"
falseBullTip = "Show points that price action initially breaks below support
before reversing. False moves can lead to fast moves in the opposite direction
(bear trap). A large arrow from below is displayed"
falseBearTip = "Show points that price action initially breaks above
resistance before reversing. False moves can lead to fast moves in the opposite
direction (bull trap). A large arrow from above is displayed"
supPushTip = "Show up candles that are detected within a support zone. Can
show points support is being respected. A triangle from below is displayed"
resPushTip = "Show down candles that are detected within a resistance zone.
Can show points resistance is being respected. A triangle from above is displayed"

lookbackTip = "Number of candles that can be included in a false break


signal"
swingTip = "Swing detection is used to filter signals on breakout type
signals. A higher number will mean more significant points, but less of them"
pivotColorTip = "Color of key levels --> (bull color, bear color, transparency
of box background, transparency of box borders)"
breakoutTip = "Color of breakout arrows --> (bull, bear, transp., transp.)"
SnRTip = "Color of triangles for broken support or resistance --> (bull,
bear, transp., transp.)"
falseBreakTip = "Color of arrows for false breaks --> (bull, bear, transp.,
transp., arrow max height in pixels)"
moveTip = "Color of triangles for candles that are detected within zones
--> (bull, bear, transp., transp.)"

// ================================== //
// ---------> User Input <----------- //
// ================================== //

left = input.int (20 , "Look Left" ,


group= "Zones" , tooltip= leftTip)
right = input.int (15 , "Look Right" ,
group= "Zones" , tooltip= rightTip)
nPiv = input.int (4 , "Number of Pivots" ,
group= "Zones" , tooltip= nPivTip)
atrLen = input.int (30 , "ATR Length" ,
group= "Zones" , tooltip= atrLenTip)
mult = input.float (0.5 , "Zone Width (ATR)" ,
group= "Zones" , tooltip= multTip, step = 0.1)
per = input.float (5, "Max Zone Percent" ,
group= "Zones" , tooltip= perTip)
src = input.string ("HA" , "Source For Pivots" ,
group= "Zones" , tooltip= srcTip, options= ["HA",
"High/Low Body", "High/Low"])
alignZones = input.bool (true , "Align Zones" ,
group= "Zones" , tooltip= alignZonesTip)

dhighs = input.bool (true , "Detect Pivot Highs" ,


group= "Detection" , tooltip= dhighsTip)
dlows = input.bool (true , "Detect Pivot Lows" ,
group= "Detection" , tooltip= dlowsTip)
detectBO = input.bool (false , "Detect Breakout" ,
group= "Detection" , tooltip= detectBOTip)
detectBD = input.bool (false , "Detect Breakdown" ,
group= "Detection" , tooltip= detectBDTip)
breakUp = input.bool (false , "Detect Resistance Break" ,
group= "Detection" , tooltip= breakUpTip)
breakDn = input.bool (false , "Detect Support Break" ,
group= "Detection" , tooltip= breakDnTip)
falseBull = input.bool (false , "Detect False Breakdown" ,
group= "Detection" , tooltip= falseBullTip)
falseBear = input.bool (false , "Detect False Breakup" ,
group= "Detection" , tooltip= falseBearTip)
supPush = input.bool (false , "Detect Moves Off Support" ,
group= "Detection" , tooltip= supPushTip)
resPush = input.bool (false , "Detect Moves Off Resistance" ,
group= "Detection" , tooltip= resPushTip)

lookback = input.int (2 , "Lookback For Breaks" ,


group= "Lookback" , tooltip= lookbackTip)
swing = input.int (5 , "swing High/Low" ,
group= "Lookback" , tooltip= swingTip)

bullCol = input.color (#64b5f6, "" , inline="1" ,


group= "Pivot Color")
bearCol = input.color (#ffeb3b, "" , inline="1" ,
group= "Pivot Color")
bgTransp = input.int (75 , "" , inline="1" ,
group= "Pivot Color")
bordTransp = input.int (100 , "" , inline="1" ,
group= "Pivot Color" , tooltip= pivotColorTip)

bullBreak = input.color (#0000ff, "" , inline="2" ,


group= "Breakout Color")
bearBreak = input.color (#ff00ff, "" , inline="2" ,
group= "Breakout Color")
bullTransp = input.int (40 , "" , inline="2" ,
group= "Breakout Color")
bearTransp = input.int (40 , "" , inline="2" ,
group= "Breakout Color" , tooltip= breakoutTip)

resBreakCol = input.color (#17ff00, "" , inline="3" ,


group= "S&R Break Color")
supBreakCol = input.color (#ff0000, "" , inline="3" ,
group= "S&R Break Color")
resBreakTransp = input.int (40 , "" , inline="3" ,
group= "S&R Break Color")
supBreakTransp = input.int (40 , "" , inline="3" ,
group= "S&R Break Color" , tooltip= SnRTip)

falseBullCol = input.color (#17ff00, "" , inline="4" ,


group= "False Break Color")
falseBearCol = input.color (#ff0000, "" , inline="4" ,
group= "False Break Color")
falseBullTransp = input.int (40 , "" , inline="4" ,
group= "False Break Color")
falseBearTransp = input.int (40 , "" , inline="4" ,
group= "False Break Color")
arrowMax = input.int (75 , "" , inline="4" ,
group= "False Break Color" , tooltip= falseBreakTip)

moveBull = input.color (#64b5f6, "" , inline="5" ,


group= "Moves From S&R Color")
moveBear = input.color (#ffeb3b, "" , inline="5" ,
group= "Moves From S&R Color")
moveBullTransp = input.int (40 , "" , inline="5" ,
group= "Moves From S&R Color")
moveBearTransp = input.int (40 , "" , inline="5" ,
group= "Moves From S&R Color" , tooltip= moveTip)

alertMode = input.string (alert.freq_once_per_bar_close ,


"Alerts Mode" , group = "Alert Frequency", options=
[alert.freq_once_per_bar, alert.freq_once_per_bar_close])

// ================================== //
// -----> Immutable Constants <------ //
// ================================== //

sync = bar_index
confirmed = barstate.isconfirmed
var pivotHigh = array.new_box (nPiv)
var pivotLows = array.new_box (nPiv)
var highBull = array.new_bool (nPiv)
var lowsBull = array.new_bool (nPiv)
var bullBorder = color.new (bullCol, bordTransp)
var bullBgCol = color.new (bullCol, bgTransp)
var bearBorder = color.new (bearCol, bordTransp)
var bearBgCol = color.new (bearCol, bgTransp)
var upCol = color.new (bullBreak, bullTransp)
var dnCol = color.new (bearBreak, bearTransp)
var supCol = color.new (resBreakCol, resBreakTransp)
var resCol = color.new (supBreakCol, supBreakTransp)
var fBull = color.new (falseBullCol, falseBullTransp)
var fBear = color.new (falseBearCol, falseBearTransp)
var moveBullCol = color.new (moveBull, moveBullTransp)
var moveBearCol = color.new (moveBear, moveBearTransp)

haSrc = src == "HA"


hiLoSrc = src == "High/Low"

// ================================== //
// ---> Functional Declarations <---- //
// ================================== //

_haBody() =>
haClose = (open + high + low + close) / 4
haOpen = float(na)
haOpen := na(haOpen[1]) ? (open + close) / 2 :
(nz(haOpen[1]) + nz(haClose[1])) / 2

[haOpen, haClose]

_arrayLoad(_x, _max, _val) =>


array.unshift (_x, _val)
if array.size (_x) > _max
array.pop (_x)

_getBox(_x,_i) =>
_box = array.get (_x,_i)
_t = box.get_top (_box)
_b = box.get_bottom (_box)
[_t, _b]

_align(_x,_y) =>
for i = 0 to array.size (_x) -1
[_T, _B] = _getBox (_y, 0)
[_t, _b] = _getBox (_x, i)
if _T > _b and _T < _t or
_B < _t and _B > _b or
_T > _t and _B < _b or
_B > _b and _T < _t
box.set_top (array.get (_y, 0), _t)
box.set_bottom (array.get (_y, 0), _b)

_extend(_x) =>
for i = 0 to array.size (_x)-1
box.set_right (array.get (_x, i), sync)

_color(_x, _y) =>


var int _track = nPiv
for i = 0 to array.size (_x) -1
[t_, b_] = _getBox (_x, i)
_isBull = array.get (_y, i)
if close > t_ and not _isBull
array.set(_x, i,
box.new( sync, t_, sync, b_,
xloc = xloc.bar_index,
border_color = bullBorder,
bgcolor = bullBgCol))
array.set(_y, i, true)
_track += 1
if close < b_ and _isBull
array.set(_x, i,
box.new( sync, t_, sync, b_,
xloc = xloc.bar_index,
border_color = bearBorder,
bgcolor = bearBgCol))
array.set(_y, i, false)
_track -= 1
_track

_detect(_x,_y) =>
int _i = 0
bool _found = false
bool _isBull = na
while (not _found and _i < array.size (_x) )
[t_, b_] = _getBox (_x,_i)
if low < t_ and high > b_
_isBull := array.get (_y,_i)
_found := true
_i += 1
[_found, _isBull]

falseBreak(_l) =>
bool _d = false
bool _u = false
for i = 1 to lookback
if _l[i] < _l and _l[i+1] >= _l and _l[1] < _l
_d := true
if _l[i] > _l and _l[i+1] <= _l and _l[1] > _l
_u := true
[_d, _u]

_numLevel(_x,_y) =>
int _above = 0
int _fill = 0
for i = 0 to array.size (_x)-1
_isBull = array.get (_x,i)
if _isBull
_above += 1
if not na(_isBull)
_fill += 1
for i = 0 to array.size (_y)-1
_isBull = array.get (_y,i)
if _isBull
_above += 1
if not na(_isBull)
_fill += 1
[_above, _fill]

_check(_src,_l) =>
bool _check = false
for i = 0 to _l
if _src[i]
_check := true
_check

// ================================== //
// ----> Variable Calculations <----- //
// ================================== //

highest = close == ta.highest (close, right)


lowest = close == ta.lowest (close, right)
closeLows = ta.lowest (close, swing)
closeHigh = ta.highest (close, swing)

[open_, close_] = _haBody ()

hiHaBod = math.max (close_, open_)


loHaBod = math.min (close_, open_)

hiBod = math.max (close, open)


loBod = math.min (close, open)

srcHigh = haSrc ? hiHaBod : hiLoSrc ? high :


hiBod
srcLow = haSrc ? loHaBod : hiLoSrc ? low :
loBod

pivot_high = ta.pivothigh (srcHigh, left, right)


pivot_low = ta.pivotlow (srcLow, left, right)

perc = close* (per/100)


atr = ta.atr (atrLen)* mult

band = math.min (atr, perc) [right] /2

HH = pivot_high+ band
HL = pivot_high- band

LH = pivot_low+ band
LL = pivot_low- band

coDiff = close - open

// ================================== //
// --------> Logical Order <--------- //
// ================================== //

if pivot_high and dhighs and confirmed and input_horizontal


_arrayLoad (highBull, nPiv, false)
_arrayLoad (pivotHigh, nPiv, box.new( sync[right], HH, sync, HL,
xloc = xloc.bar_index,
border_color = bearBorder,
bgcolor = bearBgCol))

if pivot_low and dlows and confirmed and input_horizontal


_arrayLoad (lowsBull, nPiv, true)
_arrayLoad (pivotLows, nPiv, box.new( sync[right], LH, sync, LL,
xloc = xloc.bar_index,
border_color = bullBorder,
bgcolor = bullBgCol))

if alignZones and input_horizontal


_align (pivotHigh, pivotHigh)
_align (pivotHigh, pivotLows)
_align (pivotLows, pivotLows)
_align (pivotLows, pivotHigh)

_extend (pivotHigh)
_extend (pivotLows)
trackHigh = _color (pivotHigh, highBull)
trackLows = _color (pivotLows, lowsBull)

// ================================== //
// ----> Conditional Parameters <---- //
// ================================== //

isLows = closeLows == close


isHigh = closeHigh == close

wasLows = _check (isLows, lookback)


wasHigh = _check (isHigh, lookback)

[above, total] = _numLevel (highBull, lowsBull)

moveAbove = trackHigh > trackHigh[1]


moveBelow = trackLows < trackLows[1]

resBreak = (trackLows > trackLows[1] or moveAbove)


supBreak = (trackHigh < trackHigh[1] or moveBelow)

breakOut = moveAbove and highest and above == total


breakDwn = moveBelow and lowest and above == 0

[dh, uh] = falseBreak (trackHigh)


[dl, ul] = falseBreak (trackLows)

falseBreakBull = wasLows and (dh or dl)


falseBreakBear = wasHigh and (uh or ul)

[fh,hb] = _detect (pivotHigh, highBull)


[fl,lb] = _detect (pivotLows, lowsBull)

bullCheck = not resBreak and not resBreak[1] and (fh or fl) and close >
open and (hb or lb)
bearCheck = not supBreak and not supBreak[1] and (fh or fl) and close <
open and not (hb or lb)

// ================================== //
// ------> Graphical Display <------- //
// ================================== //

plotFalseDn = falseBull and falseBreakBull


plotFalseUp = falseBear and falseBreakBear

falseUpCol = plotFalseUp ? upCol : na


falseDnCol = plotFalseDn ? dnCol : na

plotBreakOut = breakOut and detectBO and not plotFalseDn


plotBreakDn = breakDwn and detectBD and not plotFalseUp

plotResBreak = resBreak and breakUp and not (plotBreakOut


or plotFalseDn)
plotSupBreak = supBreak and breakDn and not (plotBreakDn
or plotFalseUp)

plotBullCheck = bullCheck and supPush


plotBearCheck = bearCheck and resPush
plotarrow (plotFalseUp ? coDiff : na , colorup =
fBull, colordown= fBear, maxheight= arrowMax)
plotarrow (plotFalseDn ? coDiff : na , colorup =
fBull, colordown= fBear, maxheight= arrowMax)

plotshape (plotBreakOut , style=shape.arrowup ,


location=location.belowbar, color= upCol)
plotshape (plotBreakDn , style=shape.arrowdown ,
location=location.abovebar, color= dnCol)

plotshape (plotResBreak , style=shape.arrowup ,


location=location.belowbar, color= supCol)
plotshape (plotSupBreak , style=shape.arrowdown ,
location=location.abovebar, color= resCol)

plotshape (plotBullCheck , style=shape.triangleup ,


location=location.belowbar, color= moveBullCol)
plotshape (plotBearCheck , style=shape.triangledown,
location=location.abovebar, color= moveBearCol)

// ================================== //
// -----> Alert Functionality <------ //
// ================================== //

alertcondition (resBreak , 'Resistance break' , 'Resistance


broke on {{interval}} chart. Price is {{close}}')
alertcondition (supBreak , 'Support break' , 'Support broke
on {{interval}} chart. Price is {{close}}')

alertcondition (bullCheck , 'Found Support' , 'Pushing Off


Key Level Support on {{interval}} chart. Price is {{close}}')
alertcondition (bearCheck , 'Found Resistance' , 'Pushing Off
Key Level Resistance on {{interval}} chart. Price is {{close}}')

alertcondition (falseBreakBull , 'False Break Down' , 'False Break


Down on {{interval}} chart. Price is {{close}}')
alertcondition (falseBreakBear , 'False Break Up' , 'False Break Up
on {{interval}} chart. Price is {{close}}')

alertcondition (breakOut , 'Breakout' , 'Breakout on


{{interval}} chart. Price is {{close}}')
alertcondition (breakDwn , 'Breakdown' , 'Breakdown on
{{interval}} chart. Price is {{close}}')

if plotResBreak
alert ('Resistance broke on ' +
timeframe.period + ' chart. Price is ' + str.tostring(close), alertMode)

if plotSupBreak
alert ('Resistance broke on ' +
timeframe.period + ' chart. Price is ' + str.tostring(close), alertMode)

if plotBullCheck
alert ('Pushing Off Key Level Support on ' +
timeframe.period + ' chart. Price is ' + str.tostring(close), alertMode)

if plotBearCheck
alert ('Pushing Off Key Level Resistance on ' +
timeframe.period + ' chart. Price is ' + str.tostring(close), alertMode)

if plotFalseDn
alert ('False Break Down on ' +
timeframe.period + ' chart. Price is ' + str.tostring(close), alertMode)

if plotFalseUp
alert ('False Break Up on ' +
timeframe.period + ' chart. Price is ' + str.tostring(close), alertMode)

if plotBreakOut
alert ('Breakout on ' +
timeframe.period + ' chart. Price is ' + str.tostring(close), alertMode)

if plotBreakDn
alert ('Breakdown on ' +
timeframe.period + ' chart. Price is ' + str.tostring(close), alertMode)

// END

You might also like