DynReg EMA Levels SMART DIV - STR Alpha
DynReg EMA Levels SMART DIV - STR Alpha
DynReg EMA Levels SMART DIV - STR Alpha
//@version=5
indicator("DynReg-EMA-levels-SMART-DIV_STR-Alpha", overlay=true,
max_lines_count=500, max_boxes_count=500, max_bars_back = 500, max_labels_count =
500)
var start_index = 1
lengthInput = bar_index - start_index + 1
[s, a, i] = calcSlope(close, lengthInput)
startPrice = i + s * (lengthInput - 1)
endPrice = i
//Multiple EMA
//indicator("Multiple EMA", overlay = true)
/// PLOT
//plot(close)
// This source code is subject to the terms of the Mozilla Public License 2.0 at
https://mozilla.org/MPL/2.0/
//@version=5
//indicator("Litt Institutional Levels", overlay = true)
timeChange(period) =>
ta.change(time(period))
is_new_period = timeChange(time_period)
var first_bar_in_period = 0
first_bar_in_period := is_new_period ? time : first_bar_in_period[1]
if daily_levels
institution_function("D",daily_line_color, daily_text_color, "Y")
if weekly_levels
institution_function("W",weekly_line_color, weekly_text_color, "LW")
if monthly_levels
institution_function("M",monthly_line_color, monthly_text_color, "LM")
if qtr_levels
institution_function("3M",qtr_line_color, qtr_text_color, "LQ")
if yearly_levels
institution_function("12M",yearly_line_color, yearly_text_color, "LY")
//TABLE
show_dashboard = input.bool(title='Color Legend', defval=true, inline='1',
group='Dashboard Settings')
LabelSize = input.string(defval='Medium', options=['Small', 'Medium', 'Large'],
title='Dashboard Size', inline='2', group='Dashboard Settings')
label_size = LabelSize == 'Small' ? size.small : LabelSize == 'Medium' ?
size.normal : LabelSize == 'Large' ? size.large : size.small
positioning = position.top_right
var table t = table.new(positioning, 5, 1,frame_color=color.new(#000000, 100),
frame_width=0, border_color=color.new(#000000,100), border_width=0)
if barstate.islast and show_dashboard
//Column 1
table.cell(t, 0, 0, text='D', width=0, bgcolor=daily_line_color,
text_color=color.white, text_size=label_size, text_halign=text.align_center)
table.cell(t, 1, 0, text='W', width=0, bgcolor=weekly_line_color,
text_color=color.white, text_size=label_size, text_halign=text.align_center)
table.cell(t, 2, 0, text='M', width=0, bgcolor=monthly_line_color,
text_color=color.white, text_size=label_size, text_halign=text.align_center)
table.cell(t, 3, 0, text='Q', width=0, bgcolor=qtr_line_color,
text_color=color.white, text_size=label_size, text_halign=text.align_center)
table.cell(t, 4, 0, text='Y', width=0, bgcolor=yearly_line_color,
text_color=color.white, text_size=label_size, text_halign=text.align_center)
// This source code is subject to the terms of the Mozilla Public License 2.0 at
https://mozilla.org/MPL/2.0/
// author © KivancOzbilgic
// developer © KivancOzbilgic
//@version=5
//indicator('AlphaTrend', shorttitle='AT', overlay=true, format=format.price,
precision=2, timeframe='')
coeff = input.float(1, 'Multiplier', step=0.1)
AP = input(14, 'Common Period')
ATR = ta.sma(ta.tr, AP)
src = input(close)
showsignalsk = input(title='Show Signals?', defval=true)
novolumedata = input(title='Change calculation (no volume data)?', defval=false)
upT = low - ATR * coeff
downT = high + ATR * coeff
AlphaTrend = 0.0
AlphaTrend := (novolumedata ? ta.rsi(src, AP) >= 50 : ta.mfi(hlc3, AP) >= 50) ? upT
< nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : upT : downT > nz(AlphaTrend[1]) ?
nz(AlphaTrend[1]) : downT
K1 = ta.barssince(buySignalk)
K2 = ta.barssince(sellSignalk)
O1 = ta.barssince(buySignalk[1])
O2 = ta.barssince(sellSignalk[1])
// This source code is subject to the terms of the Mozilla Public License 2.0 at
https://mozilla.org/MPL/2.0/
// © loxx
//@version=5
//indicator("STD-Filtered, N-Pole Gaussian Filter [Loxx]",
//shorttitle="STDFNPGF [Loxx]",
//overlay = true)
import loxx/loxxexpandedsourcetypes/4
greencolor = #2DD204
redcolor = #D2042D
//factorial calc
fact(int n)=>
float a = 1
for i = 1 to n
a *= i
a
//alpha calc
_alpha(int period, int poles)=>
w = 2.0 * math.pi / period
float b = (1.0 - math.cos(w)) / (math.pow(1.414, 2.0 / poles) - 1.0)
float a = - b + math.sqrt(b * b + 2.0 * b)
a
//n-pole calc
_makeCoeffs(simple int period, simple int order)=>
coeffs = matrix.new<float>(order + 1, 3, 0.)
float a = _alpha(period, order)
for r = 0 to order
out = nz(fact(order) / (fact(order - r) * fact(r)), 1)
matrix.set(coeffs, r, 0, out)
matrix.set(coeffs, r, 1, math.pow(a, r))
matrix.set(coeffs, r, 2, math.pow(1.0 - a, r))
coeffs
//n-pole calc
_npolegf(float ssrc, simple int period, simple int order)=>
var coeffs = _makeCoeffs(period, order)
float filt = ssrc * matrix.get(coeffs, order, 1)
int sign = 1
for r = 1 to order
filt += sign * matrix.get(coeffs, r, 0) * matrix.get(coeffs, r, 2) *
nz(filt[r])
sign *= -1
filt
//std filter
_filt(float ssrc, int len, float filter)=>
float price = ssrc
float filtdev = filter * ta.stdev(ssrc, len)
price := math.abs(price - nz(price[1])) < filtdev ? nz(price[1]) : price
price
sig = nz(out[1])
state = 0
if (out > sig)
state := 1
if (out < sig)
state := -1
pregoLong = out > sig and (nz(out[1]) < nz(sig[1]) or nz(out[1]) == nz(sig[1]))
pregoShort = out < sig and (nz(out[1]) > nz(sig[1]) or nz(out[1]) == nz(sig[1]))
contsw = 0
contsw := nz(contsw[1])
contsw := pregoLong ? 1 : pregoShort ? -1 : nz(contsw[1])
//@version=5
//indicator("Smart Money Concepts [LUX]", "Smart Money Concepts [LuxAlgo]"
//, overlay = true
//, max_labels_count = 500
//, max_lines_count = 500
//, max_boxes_count = 500
//, max_bars_back = 500)
//-----------------------------------------------------------------------------{
//Constants
//-----------------------------------------------------------------------------{
color TRANSP_CSS = #ffffff00
//Tooltips
string MODE_TOOLTIP = 'Allows to display historical Structure or only the
recent ones'
string STYLE_TOOLTIP = 'Indicator color theme'
string COLOR_CANDLES_TOOLTIP = 'Display additional candles with a color reflecting
the current trend detected by structure'
string SHOW_INTERNAL = 'Display internal market structure'
string CONFLUENCE_FILTER = 'Filter non significant internal structure
breakouts'
string SHOW_SWING = 'Display swing market Structure'
string SHOW_SWING_POINTS = 'Display swing point as labels on the chart'
string SHOW_SWHL_POINTS = 'Highlight most recent strong and weak high/low
points on the chart'
string INTERNAL_OB = 'Display internal order blocks on the chart\n\
nNumber of internal order blocks to display on the chart'
string SWING_OB = 'Display swing order blocks on the chart\n\nNumber
of internal swing blocks to display on the chart'
string FILTER_OB = 'Method used to filter out volatile order blocks \n\
nIt is recommended to use the cumulative mean range method when a low amount of
data is available'
string SHOW_EQHL = 'Display equal highs and equal lows on the chart'
string EQHL_BARS = 'Number of bars used to confirm equal highs and
equal lows'
string EQHL_THRESHOLD = 'Sensitivity threshold in a range (0, 1) used for
the detection of equal highs & lows\n\nLower values will return fewer but more
pertinent results'
string SHOW_FVG = 'Display fair values gaps on the chart'
string AUTO_FVG = 'Filter out non significant fair value gaps'
string FVG_TF = 'Fair value gaps timeframe'
string EXTEND_FVG = 'Determine how many bars to extend the Fair Value
Gap boxes on chart'
string PED_ZONES = 'Display premium, discount, and equilibrium zones on
chart'
//-----------------------------------------------------------------------------{
//Settings
//-----------------------------------------------------------------------------{
//General
//----------------------------------------{
mode = input.string('Historical'
, options = ['Historical', 'Present']
, group = 'Smart Money Concepts'
, tooltip = MODE_TOOLTIP)
style = input.string('Colored'
, options = ['Colored', 'Monochrome']
, group = 'Smart Money Concepts'
, tooltip = STYLE_TOOLTIP)
//----------------------------------------}
//Internal Structure
//----------------------------------------{
show_internals = input(true, 'Show Internal Structure'
, group = 'Real Time Internal Structure'
, tooltip = SHOW_INTERNAL)
//Bear Structure
show_ibear = input.string('All', 'Bearish Structure'
, options = ['All', 'BOS', 'CHoCH']
, inline = 'ibear'
, group = 'Real Time Internal Structure')
//----------------------------------------}
//Swing Structure
//----------------------------------------{
show_Structure = input(true, 'Show Swing Structure'
, group = 'Real Time Swing Structure'
, tooltip = SHOW_SWING)
//Bull Structure
show_bull = input.string('All', 'Bullish Structure'
, options = ['All', 'BOS', 'CHoCH']
, inline = 'bull'
, group = 'Real Time Swing Structure')
//Bear Structure
show_bear = input.string('All', 'Bearish Structure'
, options = ['All', 'BOS', 'CHoCH']
, inline = 'bear'
, group = 'Real Time Swing Structure')
//Swings
show_swings = input(false, 'Show Swings Points'
, inline = 'swings'
, group = 'Real Time Swing Structure'
, tooltip = SHOW_SWING_POINTS)
//----------------------------------------}
//Order Blocks
//----------------------------------------{
show_iob = input(true, 'Internal Order Blocks'
, inline = 'iob'
, group = 'Order Blocks'
, tooltip = INTERNAL_OB)
//----------------------------------------}
//EQH/EQL
//----------------------------------------{
show_eq = input(true, 'Equal High/Low'
, group = 'EQH/EQL'
, tooltip = SHOW_EQHL)
//----------------------------------------}
//Fair Value Gaps
//----------------------------------------{
show_fvg = input(false, 'Fair Value Gaps'
, group = 'Fair Value Gaps'
, tooltip = SHOW_FVG)
//----------------------------------------}
//Previous day/week high/low
//----------------------------------------{
//Daily
show_pdhl = input(false, 'Daily'
, inline = 'daily'
, group = 'Highs & Lows MTF')
//Weekly
show_pwhl = input(false, 'Weekly'
, inline = 'weekly'
, group = 'Highs & Lows MTF')
//Monthly
show_pmhl = input(false, 'Monthly'
, inline = 'monthly'
, group = 'Highs & Lows MTF')
//----------------------------------------}
//Premium/Discount zones
//----------------------------------------{
show_sd = input(false, 'Premium/Discount Zones'
, group = 'Premium & Discount Zones'
, tooltip = PED_ZONES)
//-----------------------------------------------------------------------------}
//Functions
//-----------------------------------------------------------------------------{
n = bar_index
atr = ta.atr(200)
cmean_range = ta.cum(high - low) / n
if mode == 'Present'
line.delete(structure_line[1])
label.delete(structure_lbl[1])
//Swings detection/measurements
swings(len)=>
var os = 0
upper = ta.highest(len)
lower = ta.lowest(len)
[top, btm]
//Search for highest/lowest high within the structure interval and get range
if use_max
for i = 1 to (n - loc)-1
if (high[i] - low[i]) < ob_threshold[i] * 2
max := math.max(high[i], max)
min := max == high[i] ? low[i] : min
idx := max == high[i] ? i : idx
else
for i = 1 to (n - loc)-1
if (high[i] - low[i]) < ob_threshold[i] * 2
min := math.min(low[i], min)
max := min == low[i] ? high[i] : max
idx := min == low[i] ? i : idx
array.unshift(target_top, max)
array.unshift(target_btm, min)
array.unshift(target_left, time[idx])
array.unshift(target_type, use_max ? -1 : 1)
color css = na
if swing
if style == 'Monochrome'
css := array.get(target_type, i) == 1 ? color.new(#b2b5be, 80) :
color.new(#5d606b, 80)
border_css = array.get(target_type, i) == 1 ? #b2b5be : #5d606b
box.set_border_color(get_box, border_css)
else
css := array.get(target_type, i) == 1 ? bull_ob_css : bear_ob_css
box.set_border_color(get_box, css)
box.set_bgcolor(get_box, css)
else
if style == 'Monochrome'
css := array.get(target_type, i) == 1 ? color.new(#b2b5be, 80) :
color.new(#5d606b, 80)
else
css := array.get(target_type, i) == 1 ? ibull_ob_css : ibear_ob_css
box.set_border_color(get_box, css)
box.set_bgcolor(get_box, css)
hy = ta.valuewhen(h != h[1], h, 1)
hx = ta.valuewhen(h == high, time, 1)
ly = ta.valuewhen(l != l[1], l, 1)
lx = ta.valuewhen(l == low, time, 1)
if barstate.islast
ext = time + (time - time[1])*20
//High
line.set_xy1(high_line, hx, hy)
line.set_xy2(high_line, ext, hy)
//Low
line.set_xy1(low_line, lx, ly)
line.set_xy2(low_line, ext, ly)
//-----------------------------------------------------------------------------}
//Global variables
//-----------------------------------------------------------------------------{
var trend = 0, var itrend = 0
//Alerts
bull_choch_alert = false
bull_bos_alert = false
bear_choch_alert = false
bear_bos_alert = false
bull_ichoch_alert = false
bull_ibos_alert = false
bear_ichoch_alert = false
bear_ibos_alert = false
bull_iob_break = false
bear_iob_break = false
bull_ob_break = false
bear_ob_break = false
eqh_alert = false
eql_alert = false
//Structure colors
var bull_css = style == 'Monochrome' ? #b2b5be
: swing_bull_css
//Swings
[top, btm] = swings(length)
//-----------------------------------------------------------------------------}
//Pivot High
//-----------------------------------------------------------------------------{
var line extend_top = na
if top
top_cross := true
txt_top := top > top_y ? 'HH' : 'LH'
if show_swings
top_lbl = label.new(n-length, top, txt_top
, color = TRANSP_CSS
, textcolor = bear_css
, style = label.style_label_down
, size = size.small)
if mode == 'Present'
label.delete(top_lbl[1])
//Extend recent top to last bar
line.delete(extend_top[1])
extend_top := line.new(n-length, top, n, top
, color = bear_css)
top_y := top
top_x := n - length
trail_up := top
trail_up_x := n - length
if itop
itop_cross := true
itop_y := itop
itop_x := n - 5
//Trailing maximum
trail_up := math.max(high, trail_up)
trail_up_x := trail_up == high ? n : trail_up_x
label.set_x(extend_top_lbl, n + 20)
label.set_y(extend_top_lbl, trail_up)
label.set_text(extend_top_lbl, trend < 0 ? 'Strong High' : 'Weak High')
//-----------------------------------------------------------------------------}
//Pivot Low
//-----------------------------------------------------------------------------{
var line extend_btm = na
if btm
btm_cross := true
txt_btm := btm < btm_y ? 'LL' : 'HL'
if show_swings
btm_lbl = label.new(n - length, btm, txt_btm
, color = TRANSP_CSS
, textcolor = bull_css
, style = label.style_label_up
, size = size.small)
if mode == 'Present'
label.delete(btm_lbl[1])
btm_y := btm
btm_x := n-length
trail_dn := btm
trail_dn_x := n-length
if ibtm
ibtm_cross := true
ibtm_y := ibtm
ibtm_x := n - 5
//Trailing minimum
trail_dn := math.min(low, trail_dn)
trail_dn_x := trail_dn == low ? n : trail_dn_x
label.set_x(extend_btm_lbl, n + 20)
label.set_y(extend_btm_lbl, trail_dn)
label.set_text(extend_btm_lbl, trend > 0 ? 'Strong Low' : 'Weak Low')
//-----------------------------------------------------------------------------}
//Order Blocks Arrays
//-----------------------------------------------------------------------------{
var iob_top = array.new_float(0)
var iob_btm = array.new_float(0)
var iob_left = array.new_int(0)
var iob_type = array.new_int(0)
//-----------------------------------------------------------------------------}
//Pivot High BOS/CHoCH
//-----------------------------------------------------------------------------{
//Filtering
var bull_concordant = true
if ifilter_confluence
bull_concordant := high - math.max(close, open) > math.min(close, open - low)
if itrend < 0
choch := true
bull_ichoch_alert := true
else
bull_ibos_alert := true
txt = choch ? 'CHoCH' : 'BOS'
if show_internals
if show_ibull == 'All' or (show_ibull == 'BOS' and not choch) or
(show_ibull == 'CHoCH' and choch)
display_Structure(itop_x, itop_y, txt, ibull_css, true, true,
size.tiny)
itop_cross := false
itrend := 1
if trend < 0
choch := true
bull_choch_alert := true
else
bull_bos_alert := true
if show_Structure
if show_bull == 'All' or (show_bull == 'BOS' and not choch) or (show_bull
== 'CHoCH' and choch)
display_Structure(top_x, top_y, txt, bull_css, false, true, size.small)
//Order Block
if show_ob
ob_coord(false, top_x, ob_top, ob_btm, ob_left, ob_type)
top_cross := false
trend := 1
//-----------------------------------------------------------------------------}
//Pivot Low BOS/CHoCH
//-----------------------------------------------------------------------------{
var bear_concordant = true
if ifilter_confluence
bear_concordant := high - math.max(close, open) < math.min(close, open - low)
if itrend > 0
choch := true
bear_ichoch_alert := true
else
bear_ibos_alert := true
txt = choch ? 'CHoCH' : 'BOS'
if show_internals
if show_ibear == 'All' or (show_ibear == 'BOS' and not choch) or
(show_ibear == 'CHoCH' and choch)
display_Structure(ibtm_x, ibtm_y, txt, ibear_css, true, false,
size.tiny)
ibtm_cross := false
itrend := -1
if trend > 0
choch := true
bear_choch_alert := true
else
bear_bos_alert := true
if show_Structure
if show_bear == 'All' or (show_bear == 'BOS' and not choch) or (show_bear
== 'CHoCH' and choch)
display_Structure(btm_x, btm_y, txt, bear_css, false, false,
size.small)
//Order Block
if show_ob
ob_coord(true, btm_x, ob_top, ob_btm, ob_left, ob_type)
btm_cross := false
trend := -1
//-----------------------------------------------------------------------------}
//Order Blocks
//-----------------------------------------------------------------------------{
//Set order blocks
var iob_boxes = array.new_box(0)
var ob_boxes = array.new_box(0)
iob_size = array.size(iob_type)
ob_size = array.size(ob_type)
if barstate.isfirst
if show_iob
for i = 0 to iob_showlast-1
array.push(iob_boxes, box.new(na,na,na,na, xloc = xloc.bar_time))
if show_ob
for i = 0 to ob_showlast-1
array.push(ob_boxes, box.new(na,na,na,na, xloc = xloc.bar_time))
if iob_size > 0
if barstate.islast
display_ob(iob_boxes, iob_top, iob_btm, iob_left, iob_type, iob_showlast,
false, iob_size)
if ob_size > 0
if barstate.islast
display_ob(ob_boxes, ob_top, ob_btm, ob_left, ob_type, ob_showlast, true,
ob_size)
//-----------------------------------------------------------------------------}
//EQH/EQL
//-----------------------------------------------------------------------------{
var eq_prev_top = 0.
var eq_top_x = 0
var eq_prev_btm = 0.
var eq_btm_x = 0
if show_eq
eq_top = ta.pivothigh(eq_len, eq_len)
eq_btm = ta.pivotlow(eq_len, eq_len)
if eq_top
max = math.max(eq_top, eq_prev_top)
min = math.min(eq_top, eq_prev_top)
if mode == 'Present'
line.delete(eqh_line[1])
label.delete(eqh_lbl[1])
eqh_alert := true
eq_prev_top := eq_top
eq_top_x := n-eq_len
if eq_btm
max = math.max(eq_btm, eq_prev_btm)
min = math.min(eq_btm, eq_prev_btm)
eql_alert := true
if mode == 'Present'
line.delete(eql_line[1])
label.delete(eql_lbl[1])
eq_prev_btm := eq_btm
eq_btm_x := n-eq_len
//-----------------------------------------------------------------------------}
//Fair Value Gaps
//-----------------------------------------------------------------------------{
var bullish_fvg_max = array.new_box(0)
var bullish_fvg_min = array.new_box(0)
float bullish_fvg_avg = na
float bearish_fvg_avg = na
bullish_fvg_cnd = false
bearish_fvg_cnd = false
if show_fvg
delta_per = (src_c1 - src_o1) / src_o1 * 100
change_tf = timeframe.change(fvg_tf)
//FVG conditions
bullish_fvg_cnd := src_l > src_h2
and src_c1 > src_h2
and delta_per > threshold
and change_tf
//FVG Areas
if bullish_fvg_cnd
array.unshift(bullish_fvg_max, box.new(n-1, src_l, n + fvg_extend,
math.avg(src_l, src_h2)
, border_color = bull_fvg_css
, bgcolor = bull_fvg_css))
if bearish_fvg_cnd
array.unshift(bearish_fvg_max, box.new(n-1, src_h, n + fvg_extend,
math.avg(src_h, src_l2)
, border_color = bear_fvg_css
, bgcolor = bear_fvg_css))
for bx in bullish_fvg_min
if low < box.get_bottom(bx)
box.delete(bx)
box.delete(array.get(bullish_fvg_max, array.indexof(bullish_fvg_min,
bx)))
for bx in bearish_fvg_max
if high > box.get_top(bx)
box.delete(bx)
box.delete(array.get(bearish_fvg_min, array.indexof(bearish_fvg_max,
bx)))
//-----------------------------------------------------------------------------}
//Previous day/week high/lows
//-----------------------------------------------------------------------------{
//Daily high/low
[pdh, pdl] = request.security(syminfo.tickerid, 'D', hl()
, lookahead = barmerge.lookahead_on)
//Weekly high/low
[pwh, pwl] = request.security(syminfo.tickerid, 'W', hl()
, lookahead = barmerge.lookahead_on)
//Monthly high/low
[pmh, pml] = request.security(syminfo.tickerid, 'M', hl()
, lookahead = barmerge.lookahead_on)
//Display Daily
if show_pdhl
phl(pdh, pdl, 'D', pdhl_css)
//Display Weekly
if show_pwhl
phl(pwh, pwl, 'W', pwhl_css)
//Display Monthly
if show_pmhl
phl(pmh, pml, 'M', pmhl_css)
//-----------------------------------------------------------------------------}
//Premium/Discount/Equilibrium zones
//-----------------------------------------------------------------------------{
var premium = box.new(na, na, na, na
, bgcolor = color.new(premium_css, 80)
, border_color = na)
label.set_xy(eq_lbl, n, avg)
//-----------------------------------------------------------------------------}
//Trend
//-----------------------------------------------------------------------------{
var color trend_css = na
if show_trend
if style == 'Colored'
trend_css := itrend == 1 ? bull_css : bear_css
else if style == 'Monochrome'
trend_css := itrend == 1 ? #b2b5be : #5d606b
//-----------------------------------------------------------------------------}
//Alerts
//-----------------------------------------------------------------------------{
//Internal Structure
alertcondition(bull_ibos_alert, 'Internal Bullish BOS', 'Internal Bullish BOS
formed')
alertcondition(bull_ichoch_alert, 'Internal Bullish CHoCH', 'Internal Bullish CHoCH
formed')
//Swing Structure
alertcondition(bull_bos_alert, 'Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(bull_choch_alert, 'Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(bear_bos_alert, 'Bearish BOS', 'Bearish BOS formed')
alertcondition(bear_choch_alert, 'Bearish CHoCH', 'Bearish CHoCH formed')
//order Blocks
alertcondition(bull_iob_break, 'Bullish Internal OB Breakout', 'Price broke bullish
iternal OB')
alertcondition(bear_iob_break, 'Bearish Internal OB Breakout', 'Price broke bearish
iternal OB')
//EQH/EQL
alertcondition(eqh_alert, 'Equal Highs', 'Equal highs detected')
alertcondition(eql_alert, 'Equal Lows', 'Equal lows detected')
//FVG
alertcondition(bullish_fvg_cnd, 'Bullish FVG', 'Bullish FVG formed')
alertcondition(bearish_fvg_cnd, 'Bearish FVG', 'Bearish FVG formed')
//-----------------------------------------------------------------------------}
// This source code is subject to the terms of the Mozilla Public License 2.0 at
https://mozilla.org/MPL/2.0/
// © reees
//@version=5
//inds
// Ultimate indicator and Constance brown composite index
//
// color and shape of labels, lines
import reees/TA/11 as t
import reees/Algebra/3 as alg
//import reees/Trig/2 as trig
//import reees/Utilities/2 as u
//-----------------------------------------
// inputs
//-----------------------------------------
//-----------------------------------------
// functions
//-----------------------------------------
strengthMap(d,e) =>
if d >= e
5
else if d > e*.8
4
else if d > e*.6
3
else if d > e*.4
2
else if d > e*.2
1
else
0
strengthMapI(d,i="") =>
e = if i=="RSI"
e_rsi
else if i=="OBV"
e_obv
else if i=="MACD"
e_macd
else if i=="STOCH"
e_stoch
else if i=="CCI"
e_cci
else if i=="MFI"
e_mfi
else if i=="AO"
e_ao
else
0
strengthMap(d,e)
strengthDesc(d,i="") =>
s = i!= "" ? strengthMapI(d,i) : strengthMap(d,extrDiv)
if s == 5
"Extreme"
else if s == 4
"Very strong"
else if s == 3
"Strong"
else if s == 2
"Moderate"
else if s == 1
"Weak"
else
"Very weak"
drawLine(x1,y1,x2,y2,dt,h) =>
c = dt==true?color.new(color.red,lTransp):color.new(color.green,lTransp)
if noLine==false and (h==false or showHidden==true)
line.new(x1,y1,x2,y2,color=c,width=1,style=h==true?
line.style_dashed:line.style_solid)
drawLabel(bear,c,d,l) =>
if c > 0 and d >= noLabB and noLab==false
labX = bar_index-cpLengthAfter
labY = bear == true ? bearPsource[cpLengthAfter] :
bullPsource[cpLengthAfter]
s = strengthMap(d,extrDiv)
dtxt = strengthDesc(d) + " divergence (" + str.tostring(math.round(d,3)) +
")\n"
ttxt = dtxt + " Indicator breakdown (" + str.tostring(c) + "):\n" + l
txt = if s < 3
""
else
str.tostring(math.round(d,2)) + " (" + str.tostring(c) + ")"
transp = s < 4 ? 50 : 10
size = if s == 5
size.normal
else if s == 4
size.small
else
size.tiny
clr = bear == true ? color.new(color.red,transp) :
color.new(color.green,transp)
style = bear == true ? label.style_label_down : label.style_label_up
label.new(labX,labY,text=txt,tooltip=ttxt,textalign=text.align_center,style=style,s
ize=size,color=clr,textcolor=color.white)
detail(t,d) =>
" " + t +": " + strengthDesc(d,t) + " (" + str.tostring(math.round(d,3)) +
")\n"
//-----------------------------------------
// test for divergence
//-----------------------------------------
// RSI
bearRsi = false
bullRsi = false
bearRsiDeg = 0.0
bullRsiDeg = 0.0
if iRsi==true
if bearSwitch==true
i_bear = ta.rsi(bearPsource, 14)
[f,d,t,x1,y1,x2,y2] =
t.div_bear(bearPsource,i_bear,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_rsi
if f==true
bearRsi := t==1 or showHidden==true ? true : false
bearRsiDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,true,t==2)
if bullSwitch==true
i_bull = ta.rsi(bullPsource, 14)
[f,d,t,x1,y1,x2,y2] =
t.div_bull(bullPsource,i_bull,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_rsi
if f==true
bullRsi := t==1 or showHidden==true ? true : false
bullRsiDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,false,t==2)
// OBV
bearObv = false
bullObv = false
bearObvDeg = 0.0
bullObvDeg = 0.0
if iObv==true
if bearSwitch==true
i_bear = ta.obv
[f,d,t,x1,y1,x2,y2] =
t.div_bear(bearPsource,i_bear,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_obv
if f==true
bearObv := t==1 or showHidden==true ? true : false
bearObvDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,true,t==2)
if bullSwitch==true
i_bull = ta.obv
[f,d,t,x1,y1,x2,y2] =
t.div_bull(bullPsource,i_bull,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_obv
if f==true
bullObv := t==1 or showHidden==true ? true : false
bullObvDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,false,t==2)
// MACD
bearMacd = false
bullMacd = false
bearMacdDeg = 0.0
bullMacdDeg = 0.0
if iMacd==true
if bearSwitch==true
[_,_,i_bear] = ta.macd(bearPsource,12,26,9)
[f,d,t,x1,y1,x2,y2] =
t.div_bear(bearPsource,i_bear,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_macd
if f==true
bearMacd := t==1 or showHidden==true ? true : false
bearMacdDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,true,t==2)
if bullSwitch==true
[_,_,i_bull] = ta.macd(bullPsource,12,26,9)
[f,d,t,x1,y1,x2,y2] =
t.div_bull(bullPsource,i_bull,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_macd
if f==true
bullMacd := t==1 or showHidden==true ? true : false
bullMacdDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,false,t==2)
// STOCH
bearStoch = false
bullStoch = false
bearStochDeg = 0.0
bullStochDeg = 0.0
if iStoch==true
if bearSwitch==true
i_bear = ta.stoch(close, high, low, 14)
[f,d,t,x1,y1,x2,y2] =
t.div_bear(bearPsource,i_bear,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_stoch
if f==true
bearStoch := t==1 or showHidden==true ? true : false
bearStochDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,true,t==2)
if bullSwitch==true
i_bull = ta.stoch(close, high, low, 14)
[f,d,t,x1,y1,x2,y2] =
t.div_bull(bullPsource,i_bull,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_stoch
if f==true
bullStoch := t==1 or showHidden==true ? true : false
bullStochDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,false,t==2)
// CCI
bearCci = false
bullCci = false
bearCciDeg = 0.0
bullCciDeg = 0.0
if iCci==true
if bearSwitch==true
i_bear = ta.cci(bearPsource,20)
[f,d,t,x1,y1,x2,y2] =
t.div_bear(bearPsource,i_bear,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_cci
if f==true
bearCci := t==1 or showHidden==true ? true : false
bearCciDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,true,t==2)
if bullSwitch==true
i_bull = ta.cci(bullPsource,20)
[f,d,t,x1,y1,x2,y2] =
t.div_bull(bullPsource,i_bull,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_cci
if f==true
bullCci := t==1 or showHidden==true ? true : false
bullCciDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,false,t==2)
// MFI
bearMfi = false
bullMfi = false
bearMfiDeg = 0.0
bullMfiDeg = 0.0
if iMfi==true
if bearSwitch==true
i_bear = ta.mfi(bearPsource,14)
[f,d,t,x1,y1,x2,y2] =
t.div_bear(bearPsource,i_bear,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_mfi
if f==true
bearMfi := t==1 or showHidden==true ? true : false
bearMfiDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,true,t==2)
if bullSwitch==true
i_bull = ta.mfi(bullPsource,14)
[f,d,t,x1,y1,x2,y2] =
t.div_bull(bullPsource,i_bull,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_mfi
if f==true
bullMfi := t==1 or showHidden==true ? true : false
bullMfiDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,false,t==2)
// AO
bearAo = false
bullAo = false
bearAoDeg = 0.0
bullAoDeg = 0.0
if iAo==true
if bearSwitch==true
i_bear = ta.sma(hl2,5) - ta.sma(hl2,34)
[f,d,t,x1,y1,x2,y2] =
t.div_bear(bearPsource,i_bear,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_ao
if f==true
bearAo := t==1 or showHidden==true ? true : false
bearAoDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,true,t==2)
if bullSwitch==true
i_bull = ta.sma(hl2,5) - ta.sma(hl2,34)
[f,d,t,x1,y1,x2,y2] =
t.div_bull(bullPsource,i_bull,cpLengthAfter,cpLengthBefore,ppLength,lbBars,lbPivs,n
oBroken,w_p,w_i,w_hid,w_reg)
d := d*w_ao
if f==true
bullAo := t==1 or showHidden==true ? true : false
bullAoDeg := t==1 or showHidden==true ? d : 0.0
drawLine(x1,y1,x2,y2,false,t==2)
// RSI
if bearRsi==true
bearIndList := bearIndList + detail("RSI",bearRsiDeg)
bearCount+=1
bearTotalDeg += bearRsiDeg
if bullRsi==true
bullIndList := bullIndList + detail("RSI",bullRsiDeg)
bullCount+=1
bullTotalDeg += bullRsiDeg
// OBV
if bearObv==true
bearIndList := bearIndList + detail("OBV",bearObvDeg)
bearCount+=1
bearTotalDeg += bearObvDeg
if bullObv==true
bullIndList := bullIndList + detail("OBV",bullObvDeg)
bullCount+=1
bullTotalDeg += bullObvDeg
// MACD
if bearMacd==true
bearIndList := bearIndList + detail("MACD",bearMacdDeg)
bearCount+=1
bearTotalDeg += bearMacdDeg
if bullMacd==true
bullIndList := bullIndList + detail("MACD",bullMacdDeg)
bullCount+=1
bullTotalDeg += bullMacdDeg
// STOCH
if bearStoch==true
bearIndList := bearIndList + detail("STOCH",bearStochDeg)
bearCount+=1
bearTotalDeg += bearStochDeg
if bullStoch==true
bullIndList := bullIndList + detail("STOCH",bullStochDeg)
bullCount+=1
bullTotalDeg += bullStochDeg
// CCI
if bearCci==true
bearIndList := bearIndList + detail("CCI",bearCciDeg)
bearCount+=1
bearTotalDeg += bearCciDeg
if bullCci==true
bullIndList := bullIndList + detail("CCI",bullCciDeg)
bullCount+=1
bullTotalDeg += bullCciDeg
// MFI
if bearMfi==true
bearIndList := bearIndList + detail("MFI",bearMfiDeg)
bearCount+=1
bearTotalDeg += bearMfiDeg
if bullMfi==true
bullIndList := bullIndList + detail("MFI",bullMfiDeg)
bullCount+=1
bullTotalDeg += bullMfiDeg
// AO
if bearAo==true
bearIndList := bearIndList + detail("AO",bearAoDeg)
bearCount+=1
bearTotalDeg += bearAoDeg
if bullAo==true
bullIndList := bullIndList + detail("AO",bullAoDeg)
bullCount+=1
bullTotalDeg += bullAoDeg
// Draw label(s)
drawLabel(true,bearCount,bearTotalDeg,bearIndList)
drawLabel(false,bullCount,bullTotalDeg,bullIndList)
// Alerts
if a_on and (bullTotalDeg > a_above or bearTotalDeg > a_above)
alert("Divergence strength of "
+str.tostring(math.max(bullTotalDeg,bearTotalDeg),"#.##") + " has formed.")