ichimoku-kinkō-hyō-目均衡表.pine
Copy
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © RickSimpson
//@version=5
indicator('Ichimoku Kinkō hyō 目均衡表', 'Ichimoku Kinkō hyō 目均衡表', overlay=true, max_bars_back=2000, max_lines_count=500, max_labels_count=500)
///////////////////////////////////
// Ichimoku Kinkō hyō 目均衡表 // Original Work by Goichi Hosoda - More information on : https://en.wikipedia.org/wiki/Ichimoku_Kinkō_Hyō
//////////////////////////////////
//◀─── Groups Setup ───►
gsrc = 'SOURCE SETUP'
gichi = 'ICHIMOKU SETTINGS'
gsr = 'SUPPORTS/RESISTANCES SETTINGS'
gpsylvl = 'PSYCHOLOGICAL LEVELS'
gadvset = 'ADVANCED SETTINGS'
gvosc = 'VOLUME OSCILLATOR SETTINGS'
gvrindex = 'RELATIVE VOLUME STRENGTH INDEX SETTINGS'
gatr = 'VOLATILITY SETTINGS'
gbarcol = 'BAR COLOR SETTINGS'
gtable = 'PANEL SETTINGS'
//◀─── Constant String Declaration ───►
string obvstr = 'On Balance Volume'
string cvdstr = 'Cumulative Volume Delta'
string pvtstr = 'Price Volume Trend'
//◀─── Inputs ───►
i_src = input.source(close, 'Source', group=gsrc)
i_altsrc = input.string('(close > open ? high : low)', 'Alternative Source', options=['Default Source', '(open + close +3 * (high + low)) / 8', 'close + high + low -2 * open', '(close +5 * (high + low) -7 * (open)) / 4', '(open + close +5 * (high + low)) / 12', '(close > open ? high : low)', 'Heiken-Ashi'], group=gsrc)
i_uha = input(true, 'Use Volume Heikin Ashi?', group=gsrc)
i_wmas = input.bool(true, 'Weighted Moving Average Smoothing?', group=gsrc)
i_showlabels = input.bool(true, 'Show Labels?', group=gichi)
i_showprice = input.bool(true, 'Show Tenkan-Sen/kijun-Sen Price Labels?', group=gichi)
i_showtenkan = input.bool(true, 'Tenkan-Sen', group=gichi, inline='tenkan')
i_tenkancolor = input.color(color.new(#007FFF, 0), '', group=gichi, inline='tenkan')
i_tkminlen = input.int(9, 'Tenkan Min Length', minval=1, group=gichi, inline='tenkanlength')
i_tkmaxlen = input.int(30, 'Tenkan Max Length', minval=1, group=gichi, inline='tenkanlength')
i_tkdynperc = input.float(96.85, 'Tenkan Dynamic Length Adaptive Percentage', minval=0, maxval=100, group=gichi) / 100.0
i_tkvolsetup = input.bool(true, 'Volume', group=gichi, inline='tenkanfilter')
i_tkatrsetup = input.bool(true, 'Volatility', group=gichi, inline='tenkanfilter')
i_tkchfilter = input.bool(true, 'Chikou Trend Filter', group=gichi, inline='tenkanfilter')
i_showkijun = input.bool(true, 'Kijun-Sen ', group=gichi, inline='kijun')
i_kijuncolor = input.color(color.new(#FF0016, 0), '', group=gichi, inline='kijun')
i_showkjhlabels = input.bool(true, 'Show Hidden Kijun-Sen Labels?', group=gichi)
i_showkjhsr = input.bool(false, 'Show Hidden Kijun-Sen Supports/Resistances?', group=gichi)
i_kjminlen = input.int(20, 'Kijun Min Length', minval=1, group=gichi, inline='kijunlength')
i_kjmaxlen = input.int(60, 'Kijun Max Length', minval=1, group=gichi, inline='kijunlength')
i_kjdynperc = input.float(96.85, 'Kijun Dynamic Length Adaptive Percentage', minval=0, maxval=100, group=gichi) / 100.0
i_kjdivider = input.int(1, 'Kijun Divider Tool', minval=1, maxval=4, group=gichi)
i_kjvolsetup = input.bool(true, 'Volume', group=gichi, inline='kijunfilter')
i_kjatrsetup = input.bool(true, 'Volatility', group=gichi, inline='kijunfilter')
i_kjchfilter = input.bool(true, 'Chikou Trend Filter', group=gichi, inline='kijunfilter')
i_showchikou = input.bool(true, 'Chikou Span', group=gichi)
i_chbearcol = input.color(color.new(#FF0016, 0), 'Bear', group=gichi, inline='chikoucolor')
i_chbullcol = input.color(color.new(#459915, 0), 'Bull', group=gichi, inline='chikoucolor')
i_chconsocol = input.color(color.new(#FF9800, 0), 'Consolidation', group=gichi, inline='chikoucolor')
i_chminlen = input.int(26, 'Chikou Min Length', minval=1, group=gichi, inline='chikoulength')
i_chmaxlen = input.int(50, 'Chikou Max Length', minval=1, group=gichi, inline='chikoulength')
i_chdynperc = input.float(96.85, 'Chikou Dynamic Length Adaptive Percentage', minval=0, maxval=100, group=gichi) / 100.0
i_chfiltper = input.int(25, 'Chikou Filter Period', minval=1, group=gichi)
i_chlb = input.int(50, 'Chikou Filter Percentage Lookback', minval=1, maxval=89, group=gichi)
i_chvolsetup = input.bool(true, 'Volume', group=gichi, inline='chikoufilter')
i_chatrsetup = input.bool(true, 'Volatility', group=gichi, inline='chikoufilter')
i_chtfilter = input.bool(true, 'Chikou Trend Filter', group=gichi, inline='chikoufilter')
I_ska = input.bool(true, 'Senkou-Span A', group=gichi, inline='senkou')
I_skb = input.bool(true, 'Senkou-Span B', group=gichi, inline='senkou')
I_skbear = input.color(color.new(#FF0016, 0), 'Bear', group=gichi, inline='senkoucolor')
I_skbull = input.color(color.new(#459915, 0), 'Bull', group=gichi, inline='senkoucolor')
I_skconso = input.color(color.new(#CED7DF, 0), 'Consolidation', group=gichi, inline='senkoucolor')
I_skminlen = input.int(50, 'Senkou-Span Min Length', minval=1, group=gichi, inline='senkoulength')
I_skmaxlen = input.int(120, 'Senkou-Span Max Length', minval=1, group=gichi, inline='senkoulength')
I_skperc = input.float(96.85, 'Senkou Dynamic Length Adaptive Percentage', minval=0, maxval=100, group=gichi) / 100.0
I_skoffset = input.int(26, 'Senkou-Span Offset', minval=1, group=gichi)
I_skvolsetup = input.bool(true, 'Volume', group=gichi, inline='sn_chks')
I_atrsetup = input.bool(true, 'Volatility', group=gichi, inline='sn_chks')
I_skchfilter = input.bool(true, 'Chikou Trend Filter', group=gichi, inline='sn_chks')
I_kumofill = input.bool(true, 'Kumo Fill', group=gichi, inline='kumo')
I_kumofillt = input.int(65, 'Transparency', minval=1, group=gichi, inline='kumo')
I_volsetup = input.bool(true, 'Volume?', group=gadvset)
I_tkkjcross = input.bool(true, 'Tenkan-Sen/Kijun-Sen Cross?', group=gadvset)
I_atrvolatility = input.bool(true, 'Volatility?', group=gadvset)
I_tkeqkj = input.bool(true, 'Tenkan-Sen Equal Kijun-Sen?', group=gadvset)
I_chgtp = input.bool(true, 'Chikou Greater Than Price?', group=gadvset)
I_chmom = input.bool(true, 'Chikou Momentum?', group=gadvset)
I_pgtk = input.bool(true, 'Price Greater Than Kumo?', group=gadvset)
I_pgttk = input.bool(true, 'Price Greater Than Tenkan-Sen?', group=gadvset)
I_pgtchf = input.bool(true, 'Chikou Trend Filter?', group=gadvset)
I_volosctype = input.string('On Balance Volume', 'Volume Oscillator Type', options=['TFS Volume Oscillator', 'On Balance Volume', 'Klinger Volume Oscillator', 'Cumulative Volume Oscillator', 'Volume Zone Oscillator'], group=gvosc)
I_volosctypetk = input.string('On Balance Volume', 'Volume Oscillator Type for Tenkan-Sen', options=['TFS Volume Oscillator', 'On Balance Volume', 'Klinger Volume Oscillator', 'Cumulative Volume Oscillator', 'Volume Zone Oscillator'], group=gvosc)
I_volosctypekj = input.string('On Balance Volume', 'Volume Oscillator Type for Kijun-Sen', options=['TFS Volume Oscillator', 'On Balance Volume', 'Klinger Volume Oscillator', 'Cumulative Volume Oscillator', 'Volume Zone Oscillator'], group=gvosc)
I_volosctypesk = input.string('On Balance Volume', 'Volume Oscillator Type for Senkou', options=['TFS Volume Oscillator', 'On Balance Volume', 'Klinger Volume Oscillator', 'Cumulative Volume Oscillator', 'Volume Zone Oscillator'], group=gvosc)
I_volosctypech = input.string('On Balance Volume', 'Volume Oscillator Type for Chikou', options=['TFS Volume Oscillator', 'On Balance Volume', 'Klinger Volume Oscillator', 'Cumulative Volume Oscillator', 'Volume Zone Oscillator'], group=gvosc)
I_volumelen = input.int(30, 'Volume Length', minval=1, group=gvosc)
I_volzonelen = input.int(21, 'Volume Zone Length', minval=1, group=gvosc)
I_volfastlen = input.int(34, 'Volume Fast Length', minval=1, group=gvosc)
I_volslowlen = input.int(55, 'Volume Slow Length', minval=1, group=gvosc)
I_rvolumetype = input.string(pvtstr, 'Relative Volume Strength Index Type', options=[obvstr, cvdstr, pvtstr], group=gvrindex)
I_rvolumelen = input.int(14, 'Relative Volume Strength Index Length', minval=1, group=gvrindex)
I_volpeak = input.int(50, 'Relative Volume Strength Index Peak', minval=1, group=gvrindex)
i_emalen1 = input.int(8, 'EMA 1 Length', minval=1, group=gvrindex)
i_emalen2 = input.int(21, 'EMA 2 Length', minval=1, group=gvrindex)
i_atrfastlen = input.int(14, 'Average True Range Fast Length', group=gatr)
i_atrslowlen = input.int(46, 'Average True Range Slow Length', group=gatr)
i_showsr = input.bool(true, 'Show Supports/Resistances?', group=gsr)
i_rescol = input.color(color.new(color.red, 0), 'Resistance Color', group=gsr, inline='srcol')
i_supcol = input.color(color.new(color.green, 0), 'Support Color', group=gsr, inline='srcol')
i_maxline = input.int(2, 'Maximum Lines', minval=1, maxval=500, group=gsr, inline='lines')
i_layout = input.string('Wick', 'Lines Type', options=['Wick', 'Zone'], group=gsr, inline='lines')
i_linewidth = input.int(1, 'Lines Width ', minval=1, maxval=3, group=gsr, inline='lines style')
i_linestyle = input.string('Solid', 'Lines Style', options=['Solid', 'Dotted', 'Dashed'], group=gsr, inline='lines style')
i_extend = input.bool(true, 'Extend Lines', group=gsr, inline='lines style')
i_psylevels = input(false, 'Display Psychological Levels?', group=gpsylvl)
i_linescounter = input(4, 'Lines Above/Below', group=gpsylvl)
i_psylinescol = input.color(color.new(color.gray, 0), 'Lines Color', group=gpsylvl)
i_showbc = input.bool(true, 'Use Bar Color?', group=gbarcol)
i_bearbarcol = input.color(color.new(#910000, 0), 'Bear', group=gbarcol, inline='barcolor')
i_bullbarcol = input.color(color.new(#006400, 0), 'Bull', group=gbarcol, inline='barcolor')
i_consobarcol = input.color(color.new(#FF9800, 0), 'Consolidation', group=gbarcol, inline='barcolor')
i_neutralbarcol = input.color(color.new(#000000, 100), 'Neutral', group=gbarcol, inline='barcolor')
i_showtable = input(true, 'Show Panel?', group=gtable)
i_tablepresets = input.string('Custom', 'Presets', options=['Custom', '9/26/52/26 - 6D Markets (Default)', '8/22/44/22 - 5D Markets', '9/30/60/30 - 24h/7D Markets (Crypto)', '20/60/120/60 - 24h/7D Markets (Slow Version)'], group=gtable)
i_tableloc = input.string('Bottom Right', 'Position', options=['Bottom Right', 'Top Right', 'Bottom Left', 'Top Left', 'Top', 'Right', 'Bottom', 'Left'], group=gtable)
i_tabletxtsize = input.string('Small', 'Text Size', options=['Tiny', 'Small', 'Normal', 'Large'], group=gtable)
i_tabletxtcol = input.color(color.new(color.white, 0), 'Text Color', group=gtable)
i_tablebgcol = input.color(color.new(#696969, 80), 'Background Color', group=gtable)
i_tabletkpc = input.bool(true, 'Display Tenkan-Sen Price Cross?', group=gtable)
i_tablekjpc = input.bool(true, 'Display Kijun-Sen Price Cross?', group=gtable)
i_tablechpc = input.bool(true, 'Display Chikou Span Price Cross?', group=gtable)
i_tablekumobr = input.bool(true, 'Display Kumo Breakout?', group=gtable)
i_tablekumotw = input.bool(true, 'Display Kumo Twist?', group=gtable)
//◀─── Volume Heikin Ashi Calculation ───►
//Constant Price Variables
haclose = i_uha ? ohlc4 : close
vol = volume
//Heikin Ashi Function
f_openha() =>
haopen = float(na)
haopen := na(haopen[1]) ? (open + close) / 2 : (nz(haopen[1]) + nz(haclose[1])) / 2
haopen
//Conditions
haopen = i_uha ? f_openha() : open
haboolean = f_openha()
//◀─── Price Variables Declaration ───►
open_ = open
high_ = high
low_ = low
close_ = close
bar_index_ = bar_index
//Alternative Price Variables Declaration
alternativesrc = i_altsrc == '(open + close +3 * (high + low)) / 8' ? (open + close +3 * (high + low)) / 8 :
i_altsrc == 'close + high + low -2 * open' ? close + high + low -2 * open :
i_altsrc == '(close +5 * (high + low) -7 * (open)) / 4' ? (close +5 * (high + low) -7 * (open)) / 4 :
i_altsrc == '(open + close +5 * (high + low)) / 12' ? (open + close +5 * (high + low)) / 12 :
i_altsrc == '(close > open ? high : low)' ? (close > open ? high : low) :
i_altsrc == 'Heiken-Ashi' ? (ohlc4 > haboolean ? high : low) :
i_src
altsrcres = i_wmas ? ta.swma(alternativesrc) : alternativesrc
//◀─── Global Functions ───►
//Color Call Function
fzonecolor(srcolor, _call) =>
c1 = color.r(srcolor)
c2 = color.g(srcolor)
c3 = color.b(srcolor)
color.rgb(c1, c2, c3, _call)
//Lines Styles String Function
f_i_linestyle(_style) =>
_style == 'Solid' ? line.style_solid : _style == 'Dotted' ? line.style_dotted : line.style_dashed
//Volume Oscillator Functions
f_patternrate(cond, tw, bw, body) =>
ret = 0.5 * (tw + bw + (cond ? 2 * body : 0)) / (tw + bw + body)
ret := nz(ret) == 0 ? 0.5 : ret
ret
f_volcalc(vol_src, _open, _high, _low, _close) =>
float result = 0
tw = _high - math.max(_open, _close)
bw = math.min(_open, _close) - _low
body = math.abs(_close - _open)
deltaup = vol_src * f_patternrate(_open <= _close, tw, bw, body)
deltadown = vol_src * f_patternrate(_open > _close, tw, bw, body)
delta = _close >= _open ? deltaup : -deltadown
cumdelta = ta.cum(delta)
float ctl = na
ctl := cumdelta
cv = I_rvolumetype == obvstr ? ta.obv : I_rvolumetype == cvdstr ? ctl : ta.pvt
ema1 = ta.ema(cv, i_emalen1)
ema2 = ta.ema(cv, i_emalen2)
result := ema1 - ema2
result
f_zone(_src, _type, _len) =>
vp = _src > _src[1] ? _type : _src < _src[1] ? -_type : _src == _src[1] ? 0 : 0
z = 100 * (ta.ema(vp, _len) / ta.ema(_type, _len))
z
f_volzosc(vol_src, _close) =>
float result = 0
zLen = I_volzonelen
result := f_zone(_close, vol_src, zLen)
result
f_volosc(type, vol_src, vol_len, _open, _high, _low, _close) =>
float result = 0
if type == 'TFS Volume Oscillator'
iff_1 = _close < _open ? -vol_src : 0
naccvol = math.sum(_close > _open ? vol_src : iff_1, vol_len)
result := naccvol / vol_len
result
if type == 'On Balance Volume'
result := ta.cum(math.sign(ta.change(_close)) * vol_src)
result
if type == 'Klinger Volume Oscillator'
fastx = I_volfastlen
slowx = I_volslowlen
xtrend = _close > _close[1] ? vol * 100 : -vol * 100
xfast = ta.ema(xtrend, fastx)
xslow = ta.ema(xtrend, slowx)
result := xfast - xslow
result
if type == 'Cumulative Volume Oscillator'
result := f_volcalc(vol_src, _open, _high, _low, _close)
result
if type == 'Volume Zone Oscillator'
result := f_volzosc(vol_src, _close)
result
result
//Kijun V2 Function
f_kjv2(src, len) =>
var float result = 0.0
kijun = math.avg(ta.lowest(len), ta.highest(len))
conversionLine = math.avg(ta.lowest(len / i_kjdivider), ta.highest(len / i_kjdivider))
delta = (kijun + conversionLine) / 2
result := delta
result
//◀─── Relative Volume Strength Index calculation ───►
tksignal = f_volosc(I_volosctypetk, vol, I_rvolumelen, haopen, high, low, haclose)
kjsignal = f_volosc(I_volosctypekj, vol, I_rvolumelen, haopen, high, low, haclose)
sksignal = f_volosc(I_volosctypesk, vol, I_rvolumelen, haopen, high, low, haclose)
chsignal = f_volosc(I_volosctypech, vol, I_rvolumelen, haopen, high, low, haclose)
sumsignal = f_volosc(I_volosctype, vol, I_rvolumelen, haopen, high, low, haclose)
//◀─── Volume Breakout Calculation ───►
tkbrvoldn = tksignal < I_volpeak
tkbrvolup = tksignal > I_volpeak
kjbrvoldn = kjsignal < I_volpeak
kjbrvolup = kjsignal > I_volpeak
skbrvoldn = sksignal < I_volpeak
skbrvolup = sksignal > I_volpeak
chbrvoldn = chsignal < I_volpeak
chbrvolup = chsignal > I_volpeak
//Conditions
signalbrvoldn = sumsignal < I_volpeak
signalbrvolup = sumsignal > I_volpeak
//◀─── Volatility Strength ───►
atrvolmeter = ta.atr(i_atrfastlen) > ta.atr(i_atrslowlen)
//Adaptive Chikou Function
f_chikou(float src, simple int len, float _high, float _low, color bull_col, color bear_col, color r_col) =>
var isup = bool(na)
var isdown = bool(na)
var _re = bool(na)
var sig = int(na)
var color _clr = color.new(na, 0)
isup := src > ta.highest(_high, len)[len]
isdown := src < ta.lowest(_low, len)[len]
_re := src < ta.highest(_high, len)[len] and src > ta.lowest(_low, len)[len]
_clr := isdown ? bear_col : isup ? bull_col : r_col
sig := isup ? 1 : isdown ? -1 : 0
[_clr, sig]
[chikou_clr, chikoufiltersig] = f_chikou(altsrcres, i_chfiltper, high, low, i_chbullcol, i_chbearcol, i_chconsocol)
//Arrays Index Functions
f_boolean(chka, reference_a) =>
var result_bool = bool(na)
for i = 0 to array.size(chka) -1
if array.get(chka, i) == true
result_bool := array.get(reference_a, i)
break
for i = 0 to array.size(chka) -1
result_bool := array.get(chka, i) ? array.get(reference_a, i) and result_bool : result_bool
result_bool
//Boolean Calculation
bool[] tkarray = array.from(i_tkvolsetup,
i_tkatrsetup,
i_tkchfilter)
bool[] kjarray = array.from(i_kjvolsetup,
i_kjatrsetup,
i_kjchfilter)
bool[] skarray = array.from(I_skvolsetup,
I_atrsetup,
I_skchfilter)
bool[] charray = array.from(i_chvolsetup,
i_chatrsetup,
i_chtfilter)
bool[] tkvolarray = array.from(tkbrvolup,
atrvolmeter,
chikoufiltersig == 1)
bool[] kjvolarray = array.from(kjbrvolup,
atrvolmeter,
chikoufiltersig == 1)
bool[] skvolarray = array.from(skbrvolup,
atrvolmeter,
chikoufiltersig == 1)
bool[] chvolarray = array.from(chbrvolup,
atrvolmeter,
chikoufiltersig == 1)
//Boolean to Conditions
booltkup = f_boolean(tkarray, tkvolarray)
boolkjup = f_boolean(kjarray, kjvolarray)
boolchup = f_boolean(charray, chvolarray)
boolskup = f_boolean(skarray, skvolarray)
//Dynamic Length Function
f_dyn(bool para, float adapt_Pct, simple int minLength, simple int maxLength) =>
var dyna_len = int(na)
var float i_len = math.avg(minLength, maxLength)
i_len := para ? math.max(minLength, i_len * adapt_Pct) : math.min(maxLength, i_len * (2-adapt_Pct))
dyna_len := int(i_len)
dyna_len
//Dynamic Length Conditions
dyntk = f_dyn(booltkup, i_tkdynperc, i_tkminlen, i_tkmaxlen)
dynkj = f_dyn(boolkjup , i_kjdynperc, i_kjminlen, i_kjmaxlen)
dynsk = f_dyn(boolskup , I_skperc, I_skminlen, I_skmaxlen)
dynch = f_dyn(boolchup , i_chdynperc, i_chminlen, i_chmaxlen)
//◀─── Index Calculation ───►
tenkansen = f_kjv2(altsrcres, dyntk)
kijunsen = f_kjv2(altsrcres, dynkj)
senkoua = math.avg(tenkansen, kijunsen)
senkoub = math.avg(ta.highest(high, dynsk), ta.lowest(low, dynsk))
chikouspan = altsrcres
//Tenkan-Sen/kijun-Sen Boolean Conditions to Float
var float tkbool = na
if tenkansen
tkbool := tenkansen
tkbool
var float kjbool = na
if kijunsen
kjbool := kijunsen
kjbool
//◀─── Dynamic Type Calculation ───►
bearmomentum = ta.mom(altsrcres, dynch - 1) < 0
bullmomentum = ta.mom(altsrcres, dynch - 1) > 0
cloudhigh = math.max(senkoua[I_skoffset - 1], senkoub[I_skoffset - 1])
cloudlow = math.min(senkoua[I_skoffset - 1], senkoub[I_skoffset - 1])
pbk = altsrcres < cloudhigh
pak = altsrcres > cloudhigh
//Boolean Arrays Variables
bool[] indexarray = array.from(I_volsetup,
I_atrvolatility,
I_tkkjcross,
I_chmom,
I_chgtp,
I_pgtk,
I_pgttk,
I_pgtchf)
bool[] downvolumearray = array.from(signalbrvoldn,
atrvolmeter,
tenkansen < kijunsen,
bearmomentum,
chikouspan < altsrcres[int(dynch)],
pbk,
altsrcres < tenkansen,
chikoufiltersig == -1)
bool[] uppervolumearray = array.from(signalbrvolup,
atrvolmeter,
tenkansen > kijunsen,
bullmomentum,
chikouspan > altsrcres[int(dynch)],
pak,
tenkansen,
chikoufiltersig == 1)
//Conditions Calculation
bearfilterdn = f_boolean(indexarray, downvolumearray)
bullfilterup = f_boolean(indexarray, uppervolumearray)
bearcondition = I_tkeqkj ? tenkansen == kijunsen and tenkansen[1] > kijunsen[1] or bearfilterdn : bearfilterdn
bullcondition = I_tkeqkj ? tenkansen == kijunsen and tenkansen[1] < kijunsen[1] or bullfilterup : bullfilterup
isdown = bearcondition
isup = bullcondition
//Conditions
sell = isdown and not isdown[1]
buy = isup and not isup[1]
//Sig Calculation
var sig = 0
if sell and sig >= 0
sig := -1
if buy and sig <= 0
sig := 1
//Sig Conditions
shortcr = sig == -1 and sig[1] != -1
longcr = sig == 1 and sig[1] != 1
//Boolean Conditions to Float
var float ichibearprice = na
if shortcr
ichibearprice := bar_index
ichibearprice
var float ichibullprice = na
if longcr
ichibullprice := bar_index
ichibullprice
//Labels Calculation
if i_showlabels
l = ta.change(ichibearprice) ? label.new(bar_index, ichibearprice[1] + 0.01, str.tostring(math.round_to_mintick(high)), color=color.new(color.black, 0), textcolor=color.new(color.white, 0), style=label.style_label_down, yloc=yloc.abovebar, size=size.small) : ta.change(ichibullprice) ? label.new(bar_index, ichibullprice[1] - 0.01, str.tostring(math.round_to_mintick(low)), color=color.new(color.black, 0), textcolor=color.new(color.white, 0), style=label.style_label_up, yloc=yloc.belowbar, size=size.small) : na
l
//Volatility Coordination Constant Variable
atrxy = 0.85 * ta.atr(5)
//◀─── Plotting ───►
plotshape(i_showlabels and shortcr ? (high) + atrxy : na, style=shape.triangledown, color=i_rescol, location=location.absolute, size=size.small)
plotshape(i_showlabels and longcr ? (low) - atrxy : na, style=shape.triangleup, color=i_supcol, location=location.absolute, size=size.small)
plotshape(i_showlabels and sell ? high + atrxy : na, style=shape.circle, color=i_rescol, location=location.absolute, size=size.tiny)
plotshape(i_showlabels and buy ? low - atrxy : na, style=shape.circle, color=i_supcol, location=location.absolute, size=size.tiny)
plotchikouspan = plot(chikouspan, title='Chikou', color=not i_showchikou ? na : chikou_clr, linewidth=1, offset=-dynch)
f_colorgradient(_source, _min, _max, _cbear, _cbull) =>
var float _center = _min + (_max - _min) / 2
color _return = _source >= _center ?
color.from_gradient(_source, _min, _center, color.new(_cbear, 0), color.new(_cbear, 100)) :
color.from_gradient(_source, _center, _max, color.new(_cbull, 100), color.new(_cbull, 0))
skclr = (senkoua - senkoub) / altsrcres * 100
skfill = senkoua > senkoub ? color.from_gradient(ta.rsi(math.avg(senkoua , senkoub), 14) , 0, 100, I_skconso, I_skbull) :
senkoua < senkoub ? color.from_gradient(ta.rsi(math.avg(senkoua , senkoub), 14) , 0, 100, I_skconso, I_skbear) : I_skconso
plottenkansen = plot(tenkansen, title='Tenkan-Sen', color=not i_showtenkan ? na : i_tenkancolor, linewidth=1, offset=0)
plotkijunsen = plot(kijunsen, title='Kijun-Sen', color=not i_showkijun ? na : i_kijuncolor, linewidth=1, offset=0)
plotsenkoua = plot(senkoua, title='Senkou-Span A', color=not I_ska ? na : I_skbull, linewidth=1, offset=I_skoffset-1)
plotsenkoub = plot(senkoub, title='Senkou-Span B', color=not I_skb ? na : I_skbear, linewidth=1, offset=I_skoffset-1)
fill(plotsenkoua, plotsenkoub, color=not I_kumofill ? na : color.new(skfill, I_kumofillt))
//Tenkan-Sen/kijun-Sen Price Plotting
if i_showtenkan and i_showprice
l1 = label.new(bar_index, tkbool, 'Tenkan-Sen - ' + str.tostring(math.round_to_mintick(tkbool)), color=color.new(i_tenkancolor, 100), textcolor=color.new(i_tenkancolor, 0), style=label.style_label_left, yloc=yloc.price, size=size.small)
l1
label.delete(l1[1])
if i_showkijun and i_showprice
l1 = label.new(bar_index, kjbool, 'Kijun-Sen - ' + str.tostring(math.round_to_mintick(kjbool)), color=color.new(i_kijuncolor, 100), textcolor=color.new(i_kijuncolor, 0), style=label.style_label_left, yloc=yloc.price, size=size.small)
l1
label.delete(l1[1])
//Bar Color Plotting
colbar(src, tenkansen, kijunsen) =>
vbarcolor = color.new(na, 0)
vbarcolor := src > tenkansen and src > kijunsen? i_bullbarcol :
src < tenkansen and src < kijunsen ? i_bearbarcol :
src > tenkansen and src < kijunsen ? i_consobarcol :
src < tenkansen and src > kijunsen ? i_neutralbarcol : na
vbarcolor
bc = colbar(close, tenkansen, kijunsen)
barcolor(i_showbc ? bc : na)
//◀─── Kijun-Sen Hidden Supports/Resistances ───►
//Smoothed MA Calculation
smma1 = 0.0
smma2 = 0.0
smakj1 = ta.sma(close, i_kjminlen)
smakj2 = ta.sma(close, i_kjmaxlen)
smma1 := na(smma1[1]) ? smakj1 : (smma1[1] * (20 - 1) + close) / 20
smma2 := na(smma2[1]) ? smakj2 : (smma2[1] * (60 - 1) + close) / 60
//Kijun-Sen Calculation
kjsmma = math.avg(ta.lowest(26), ta.highest(26))
//Conditions
hiddenbearkj = ta.crossunder(smma1, kjsmma) and kjsmma < smma2 and close < smma1
hiddenbullkj = ta.crossover(smma1, kjsmma) and kjsmma > smma2 and close > smma1
//Boolean Conditions to Float
var float bearhkj = na
if hiddenbearkj
bearhkj := high
bearhkj
var float bullhkj = na
if hiddenbullkj
bullhkj := low
bullhkj
//Labels Calculation
if i_showkjhlabels
l = ta.change(bearhkj) ? label.new(bar_index, bearhkj[1] + 0.01, str.tostring(math.round_to_mintick(bearhkj)), color=color.new(color.black, 0), textcolor=color.new(color.white, 0), style=label.style_label_down, yloc=yloc.abovebar, size=size.small) : ta.change(bullhkj) ? label.new(bar_index, bullhkj[1] - 0.01, str.tostring(math.round_to_mintick(bullhkj)), color=color.new(color.black, 0), textcolor=color.new(color.white, 0), style=label.style_label_up, yloc=yloc.belowbar, size=size.small) : na
l
//Plotting
plotshape(i_showkjhlabels ? hiddenbearkj : na, title='Bearish Hidden Kijun-Sen', style=shape.triangledown, location=location.abovebar, color=i_rescol, size=size.tiny)
plotshape(i_showkjhlabels ? hiddenbullkj : na, title='Bullish Hidden Kijun-Sen', style=shape.triangleup, location=location.belowbar, color=i_supcol, size=size.tiny)
//Hidden Kijun S/R Variables Declaration
var int numberofline2 = i_maxline
var float upperphzone2 = na
var float upperplzone2 = na
var float lowerphzone2 = na
var float lowerplzone2 = na
var line[] upperphzonearr2 = array.new_line(0, na)
var line[] upperplzonearr2 = array.new_line(0, na)
var line[] lowerphzonearr2 = array.new_line(0, na)
var line[] lowerplzonearr2 = array.new_line(0, na)
var line upperphzoneline2 = na
var line upperplzoneline2 = na
var line lowerphzoneline2 = na
var line lowerplzoneline2 = na
var bool[] upperzonetestedarr2 = array.new_bool(0, false)
var bool[] lowerzonetestedarr2 = array.new_bool(0, false)
var bool upperzonetested2 = false
var bool lowerzonetested2 = false
var bool nobool2 = true
var color upperzonecolor2 = color.red
var color lowerzonecolor2 = color.green
var label[] labelpharr2 = array.new_label(0, na)
var label[] labelplarr2 = array.new_label(0, na)
var label labelph2 = na
var label labelpl2 = na
//Hidden Kijun Resistances Calculation
if i_showsr and i_showkjhsr and hiddenbearkj
upperphzone2 := high_
upperplzone2 := close_ < open_ ? close_ : open_
upperplzoneline2 := i_layout == 'Zone' ? line.new(bar_index_, upperplzone2, bar_index, upperplzone2, width=i_linewidth) : na
upperphzoneline2 := nobool2 ? line.new(bar_index_, upperphzone2, bar_index, upperphzone2, width=i_linewidth) : line.new(bar_index_, (upperphzone2 + upperplzone2) / 2, bar_index, (upperphzone2 + upperplzone2) / 2, width=i_linewidth)
labelph2 := i_showsr ? label.new(bar_index_, nobool2 ? upperphzone2 : (upperphzone2 + upperplzone2) / 2, text=str.tostring(bar_index - bar_index_), textcolor=upperzonecolor2, style=label.style_none) : na
if array.size(upperphzonearr2) > numberofline2
line.delete(array.shift(upperphzonearr2))
line.delete(array.shift(upperplzonearr2))
array.shift(upperzonetestedarr2)
label.delete(array.shift(labelpharr2))
array.push(upperphzonearr2, upperphzoneline2)
array.push(upperplzonearr2, upperplzoneline2)
array.push(upperzonetestedarr2, i_extend ? true : false)
array.push(labelpharr2, labelph2)
if array.size(upperplzonearr2) > 0
for i = 0 to array.size(upperplzonearr2) - 1 by 1
line tempupperline2 = array.get(upperphzonearr2, i)
line templowerline2 = array.get(upperplzonearr2, i)
label linepricelabel2 = array.get(labelpharr2, i)
bool tested2 = array.get(upperzonetestedarr2, i)
line.set_style(tempupperline2, f_i_linestyle(i_linestyle))
line.set_style(templowerline2, f_i_linestyle(i_linestyle))
line.set_color(tempupperline2, color.from_gradient(i, 1, numberofline2, fzonecolor(upperzonecolor2, 00), fzonecolor(upperzonecolor2, 00)))
line.set_color(templowerline2, color.from_gradient(i, 1, numberofline2, fzonecolor(upperzonecolor2, 00), fzonecolor(upperzonecolor2, 00)))
label.set_textcolor(linepricelabel2, color.from_gradient(i, 1, numberofline2, fzonecolor(upperzonecolor2, 00), upperzonecolor2))
label.set_text(linepricelabel2, str.tostring(math.round_to_mintick(line.get_y1(tempupperline2))))
label.set_text(linepricelabel2, ' Hidden Kijun Resistance - ' + str.tostring(math.round_to_mintick(line.get_y1(tempupperline2))))
label.set_x(linepricelabel2, bar_index)
crossed = high > line.get_y1(tempupperline2)
if crossed and not tested2
array.set(upperzonetestedarr2, i, true)
label.delete(linepricelabel2)
else if i_extend ? tested2 : not tested2
line.set_x2(tempupperline2, bar_index)
array.set(upperphzonearr2, i, tempupperline2)
line.set_x2(templowerline2, bar_index)
array.set(upperplzonearr2, i, templowerline2)
//Hidden Kijun Supports Calculation
if i_showsr and i_showkjhsr and hiddenbullkj
lowerplzone2 := low_
lowerphzone2 := close_ > open_ ? open_ : close_
lowerphzoneline2 := i_layout == 'Zone' ? line.new(bar_index_, lowerphzone2, bar_index, lowerphzone2, width=i_linewidth) : na
lowerplzoneline2 := nobool2 ? line.new(bar_index_, lowerplzone2, bar_index, lowerplzone2, width=i_linewidth) : line.new(bar_index_, (lowerphzone2 + lowerplzone2) / 2, bar_index, (lowerphzone2 + lowerplzone2) / 2, width=i_linewidth)
labelpl2 := i_showsr ? label.new(bar_index_, nobool2 ? lowerplzone2 : (lowerphzone2 + lowerplzone2) / 2, text=str.tostring(bar_index - bar_index_), textcolor=lowerzonecolor2, style=label.style_none) : na
if array.size(lowerphzonearr2) > numberofline2
line.delete(array.shift(lowerphzonearr2))
line.delete(array.shift(lowerplzonearr2))
array.shift(lowerzonetestedarr2)
label.delete(array.shift(labelplarr2))
array.push(lowerphzonearr2, lowerphzoneline2)
array.push(lowerplzonearr2, lowerplzoneline2)
array.push(lowerzonetestedarr2, i_extend ? true : false)
array.push(labelplarr2, labelpl2)
if array.size(lowerplzonearr2) > 0
for i = 0 to array.size(lowerplzonearr2) - 1 by 1
line tempupperline2 = array.get(lowerphzonearr2, i)
line templowerline2 = array.get(lowerplzonearr2, i)
label linepricelabel2 = array.get(labelplarr2, i)
bool tested2 = array.get(lowerzonetestedarr2, i)
line.set_style(tempupperline2, f_i_linestyle(i_linestyle))
line.set_style(templowerline2, f_i_linestyle(i_linestyle))
line.set_color(tempupperline2, color.from_gradient(i, 1, numberofline2, fzonecolor(lowerzonecolor2, 00), fzonecolor(lowerzonecolor2, 00)))
line.set_color(templowerline2, color.from_gradient(i, 1, numberofline2, fzonecolor(lowerzonecolor2, 00), fzonecolor(lowerzonecolor2, 00)))
label.set_textcolor(linepricelabel2, color.from_gradient(i, 1, numberofline2, fzonecolor(lowerzonecolor2, 00), lowerzonecolor2))
label.set_text(linepricelabel2, str.tostring(math.round_to_mintick(line.get_y1(templowerline2))))
label.set_text(linepricelabel2, ' Hidden Kijun Support - ' + str.tostring(math.round_to_mintick(line.get_y1(templowerline2))))
label.set_x(linepricelabel2, bar_index)
crossed = low < line.get_y1(templowerline2)
if crossed and not tested2
array.set(lowerzonetestedarr2, i, true)
label.delete(linepricelabel2)
else if i_extend ? tested2 : not tested2
line.set_x2(tempupperline2, bar_index)
array.set(lowerphzonearr2, i, tempupperline2)
line.set_x2(templowerline2, bar_index)
array.set(lowerplzonearr2, i, templowerline2)
//◀─── Table Calculation ───►
//Constant Colors Variables
itablestrongbearcol = color.new(color.red, 0)
itablebearcol = color.new(color.maroon, 0)
itableneutralbearcol = color.new(color.silver, 0)
itablestrongbullcol = color.new(color.lime, 0)
itablebullcol = color.new(color.green, 0)
itableneutralbullcol = color.new(color.silver, 0)
itableconsocol = color.new(color.orange, 0)
//Boolean Dynamic Settings To Integer Conditions
var int dyntkint = 0
if dyntk
dyntkint := dyntk
dyntkint
var int dynkjint = 0
if dynkj
dynkjint := dynkj
dynkjint
var int dynskint = 0
if dynsk
dynskint := dynsk
dynskint
var int dynchint = 0
if dynch
dynchint := dynch
dynchint
//Global Functions
donchian(len) =>
math.avg(ta.lowest(len), ta.highest(len))
f_presets(p) =>
if p == 'Custom'
[dyntkint, dynkjint, dynskint, dynch]
else if p == '9/26/52/26 - 6D Markets (Default)'
[9, 26, 52, 26]
else if p == '8/22/44/22 - 5D Markets'
[8, 22, 44, 22]
else if p == '9/30/60/30 - 24h/7D Markets (Crypto)'
[10, 30, 60, 30]
else if p == '20/60/120/60 - 24h/7D Markets (Slow Version)'
[20, 60, 120, 60]
else
[0, 0, 0, 0]
f_tablestringpos(p) =>
p == 'Bottom Right' ? position.bottom_right : p == 'Top Right' ? position.top_right : p == 'Bottom Left' ? position.bottom_left : p == 'Top Left' ? position.top_left : p == 'Top' ? position.top_center : p == 'Right' ? position.middle_right : p == 'Bottom' ? position.bottom_center : p == 'Left' ? position.middle_left : na
f_tablestringdirsym(trend) =>
trend == 1 ? '▲ Strong' : trend == 2 ? '▲ Neutral' : trend == 3 ? '▲ Weak' : trend == -1 ? '▼ Strong' : trend == -2 ? '▼ Neutral' : trend == -3 ? '▼ Weak' : '■ Consolidation'
f_tablestringcolor(trend, c_up, c_down, c_consolidation) =>
trend > 0 ? c_up : trend < 0 ? c_down : c_consolidation
f_tablestringcolordir(trend, c_up, c_down) =>
trend > 0 ? c_up : c_down
f_tablecloudtrend(l1, l2) =>
l1 > l2 ? 1 : -1
f_tabletrendsum(sum, count) =>
sum == count ? 1 : sum == -count ? -1 : 0
f_tablestrengthconditions(pos, uptrend) =>
uptrend ? pos == 1 ? 1 : pos == 0 ? 2 : 3 : pos == -1 ? -1 : pos == 0 ? -2 : -3
//Presets Calculation
[i_conversion_len, i_base_len, i_lagging_len, i_offset] = f_presets(i_tablepresets)
//Presets Conditions
i_conversion = donchian(i_conversion_len)
i_base = donchian(i_base_len)
i_lead1 = math.avg(i_conversion, i_base)
i_lead2 = donchian(i_lagging_len)
i_cloud_top2 = math.max(i_lead1, i_lead2)
i_cloud_bot2 = math.min(i_lead1, i_lead2)
//Constant Array Variable
tablearrindex = array.new_int(0)
//Signals Conditions Function
f_tableconditions(enabled, signal) =>
if enabled
array.push(tablearrindex, signal)
//Calculation
i_lead1_current = i_lead1[i_offset - 1]
i_lead2_current = i_lead2[i_offset - 1]
i_cloud_top = math.max(i_lead1_current, i_lead2_current)
i_cloud_bot = math.min(i_lead1_current, i_lead2_current)
table_base_position = i_base > i_cloud_top ? 1 : i_base < i_cloud_bot ? -1 : 0
table_base_breakout = close > i_base ? f_tablestrengthconditions(table_base_position, true) : f_tablestrengthconditions(table_base_position, false)
table_cloud2_trend = f_tablecloudtrend(i_conversion, i_base)
table_cloud2_top = math.max(i_base, i_conversion)
table_cloud2_bot = math.min(i_base, i_conversion)
table_cloud2_position = table_cloud2_bot > i_cloud_top ? 1 : table_cloud2_top < i_cloud_bot ? -1 : 0
table_cloud2_cross = table_cloud2_trend == 1 ? f_tablestrengthconditions(table_cloud2_position, true) : f_tablestrengthconditions(table_cloud2_position, false)
table_lagging_lead1 = i_lead1_current[i_offset - 1]
table_lagging_lead2 = i_lead2_current[i_offset - 1]
table_lagging_cloud_top = math.max(table_lagging_lead1, table_lagging_lead2)
table_lagging_cloud_bot = math.min(table_lagging_lead1, table_lagging_lead2)
table_lagging_high = high[i_offset - 1]
table_lagging_low = low[i_offset - 1]
table_lagging_trend = close > table_lagging_high ? 1 : close < table_lagging_low ? -1 : 0
table_lagging_position = close > i_cloud_top ? 1 : close < i_cloud_bot ? -1 : 0
table_lagging_cross = table_lagging_trend == 1 ? f_tablestrengthconditions(table_lagging_position, true) : table_lagging_trend == -1 ? f_tablestrengthconditions(table_lagging_position, false) : 0
table_cloud_breakout = close > i_cloud_top ? 1 : close < i_cloud_bot ? -1 : 0
table_cloud_trend = f_tablecloudtrend(i_lead1, i_lead2)
table_lead_cross = table_cloud_trend == 1 ? f_tablestrengthconditions(table_cloud_breakout, true) : f_tablestrengthconditions(table_cloud_breakout, false)
//Conditions Functions
f_tableconditions(i_tablekjpc, table_base_breakout)
f_tableconditions(i_tabletkpc, table_cloud2_cross)
f_tableconditions(i_tablechpc, table_lagging_cross)
f_tableconditions(i_tablekumobr, table_cloud_breakout)
f_tableconditions(i_tablekumotw, table_lead_cross)
//Conditions
table_signal_max = array.max(tablearrindex)
table_signal_min = array.min(tablearrindex)
table_signal = table_signal_min > 0 ? table_signal_max : table_signal_max < 0 ? table_signal_min : 0
table_changed = table_signal != table_signal[1]
table_downtrend = table_changed and table_signal == -1
table_uptrend = table_changed and table_signal == 1
table_consolidation = table_changed and table_signal == 0
table_consolidation_downtrend = table_consolidation and table_signal[1] == -1
table_consolidation_uptrend = table_consolidation and table_signal[1] == 1
//Colors String Function
f_tablecolors(t) =>
t == 1 ? itablestrongbullcol : t == 2 ? itableneutralbullcol : t == 3 ? itablebullcol : t == -1 ? itablestrongbearcol : t == -2 ? itableneutralbearcol : t == -3 ? itablebearcol : itableconsocol
//String to Variable
i_panel_c_signal_text = f_tablecolors(table_signal)
//Table Text Size String Function
tabletxtwi = i_tabletxtsize == 'Tiny' ? size.tiny : i_tabletxtsize == 'Small' ? size.small : i_tabletxtsize == 'Normal' ? size.normal : i_tabletxtsize == 'Large' ? size.large : size.normal
//Plotting
var table i_panel = na
insertRow(i, text_1, trend, col) =>
table.cell(i_panel, 0, i, text_1, text_color=col, text_halign=text.align_right, text_size=tabletxtwi)
table.cell(i_panel, 1, i, f_tablestringdirsym(trend), text_color=f_tablecolors(trend), text_halign=text.align_left, text_size=tabletxtwi)
i + 1
if i_showtable and array.size(tablearrindex) > 0
i_panel := table.new(position=f_tablestringpos(i_tableloc), columns=2, rows=20, bgcolor=i_tablebgcol, border_width=0)
i = 0
if i_tabletkpc
i := insertRow(i, 'Tenkan-Sen Price Cross', table_cloud2_cross, i_tabletxtcol)
i
if i_tablekjpc
i := insertRow(i, 'Kijun-Sen Price Cross', table_base_breakout, i_tabletxtcol)
i
if i_tablechpc
i := insertRow(i, 'Chikou Span Price Cross', table_lagging_cross, i_tabletxtcol)
i
if i_tablekumobr
i := insertRow(i, 'Kumo Breakout', table_cloud_breakout, i_tabletxtcol)
i
if i_tablekumotw
i := insertRow(i, 'Kumo Twist', table_lead_cross, i_tabletxtcol)
i
table.cell(i_panel, 0, i, 'Status', bgcolor=i_tablebgcol, text_color=i_panel_c_signal_text, text_halign=text.align_right, text_size=tabletxtwi)
table.cell(i_panel, 1, i, f_tablestringdirsym(table_signal), bgcolor=i_tablebgcol, text_color=i_panel_c_signal_text, text_halign=text.align_left, text_size=tabletxtwi)
//◀─── Support/Resistance Lines Variables Declaration ───►
var int numberofline = i_maxline
var float upperphzone = na
var float upperplzone = na
var float lowerphzone = na
var float lowerplzone = na
var line[] upperphzonearr = array.new_line(0, na)
var line[] upperplzonearr = array.new_line(0, na)
var line[] lowerphzonearr = array.new_line(0, na)
var line[] lowerplzonearr = array.new_line(0, na)
var line upperphzoneline = na
var line upperplzoneline = na
var line lowerphzoneline = na
var line lowerplzoneline = na
var bool[] upperzonetestedarr = array.new_bool(0, false)
var bool[] lowerzonetestedarr = array.new_bool(0, false)
var bool upperzonetested = false
var bool lowerzonetested = false
var bool nobool = true
var bool showprice = true
var color upperzonecolor = i_rescol
var color lowerzonecolor = i_supcol
var label[] labelpharr = array.new_label(0, na)
var label[] labelplarr = array.new_label(0, na)
var label labelph = na
var label labelpl = na
//Resistance Lines Calculation
if i_showsr and shortcr
upperphzone := high_
upperplzone := close_ < open_ ? close_ : open_
upperplzoneline := i_layout == 'Zone' ? line.new(bar_index_, upperplzone, bar_index, upperplzone, width=i_linewidth) : na
upperphzoneline := nobool ? line.new(bar_index_, upperphzone, bar_index, upperphzone, width=i_linewidth) : line.new(bar_index_, (upperphzone + upperplzone) / 2, bar_index, (upperphzone + upperplzone) / 2, width=i_linewidth)
labelph := showprice ? label.new(bar_index_, nobool ? upperphzone : (upperphzone + upperplzone) / 2, text=str.tostring(math.round_to_mintick(bar_index - bar_index_)), textcolor=upperzonecolor, style=label.style_none) : na
if array.size(upperphzonearr) > numberofline
line.delete(array.shift(upperphzonearr))
line.delete(array.shift(upperplzonearr))
array.shift(upperzonetestedarr)
label.delete(array.shift(labelpharr))
array.push(upperphzonearr, upperphzoneline)
array.push(upperplzonearr, upperplzoneline)
array.push(upperzonetestedarr, i_extend ? true : false)
array.push(labelpharr, labelph)
if array.size(upperplzonearr) > 0
for i = 0 to array.size(upperplzonearr) - 1 by 1
line tempupperline = array.get(upperphzonearr, i)
line templowerline = array.get(upperplzonearr, i)
label linepricelabel = array.get(labelpharr, i)
bool tested = array.get(upperzonetestedarr, i)
line.set_style(tempupperline, f_i_linestyle(i_linestyle))
line.set_style(templowerline, f_i_linestyle(i_linestyle))
line.set_color(tempupperline, color.from_gradient(i, 1, numberofline, fzonecolor(upperzonecolor, 00), fzonecolor(upperzonecolor, 00)))
line.set_color(templowerline, color.from_gradient(i, 1, numberofline, fzonecolor(upperzonecolor, 00), fzonecolor(upperzonecolor, 00)))
label.set_textcolor(linepricelabel, color.from_gradient(i, 1, numberofline, fzonecolor(upperzonecolor, 00), upperzonecolor))
label.set_text(linepricelabel, str.tostring(math.round_to_mintick(line.get_y1(tempupperline))))
label.set_text(linepricelabel, ' Resistance - ' + str.tostring(math.round_to_mintick(line.get_y1(tempupperline))))
label.set_x(linepricelabel, bar_index)
crossed = high > line.get_y1(tempupperline)
if crossed and not tested
array.set(upperzonetestedarr, i, true)
label.delete(linepricelabel)
else if i_extend ? tested : not tested
line.set_x2(tempupperline, bar_index)
array.set(upperphzonearr, i, tempupperline)
line.set_x2(templowerline, bar_index)
array.set(upperplzonearr, i, templowerline)
//Support Lines Calculation
if i_showsr and longcr
lowerplzone := low_
lowerphzone := close_ > open_ ? open_ : close_
lowerphzoneline := i_layout == 'Zone' ? line.new(bar_index_, lowerphzone, bar_index, lowerphzone, width=i_linewidth) : na
lowerplzoneline := nobool ? line.new(bar_index_, lowerplzone, bar_index, lowerplzone, width=i_linewidth) : line.new(bar_index_, (lowerphzone + lowerplzone) / 2, bar_index, (lowerphzone + lowerplzone) / 2, width=i_linewidth)
labelpl := showprice ? label.new(bar_index_, nobool ? lowerplzone : (lowerphzone + lowerplzone) / 2, text=str.tostring(math.round_to_mintick(bar_index - bar_index_)), textcolor=lowerzonecolor, style=label.style_none) : na
if array.size(lowerphzonearr) > numberofline
line.delete(array.shift(lowerphzonearr))
line.delete(array.shift(lowerplzonearr))
array.shift(lowerzonetestedarr)
label.delete(array.shift(labelplarr))
array.push(lowerphzonearr, lowerphzoneline)
array.push(lowerplzonearr, lowerplzoneline)
array.push(lowerzonetestedarr, i_extend ? true : false)
array.push(labelplarr, labelpl)
if array.size(lowerplzonearr) > 0
for i = 0 to array.size(lowerplzonearr) - 1 by 1
line tempupperline = array.get(lowerphzonearr, i)
line templowerline = array.get(lowerplzonearr, i)
label linepricelabel = array.get(labelplarr, i)
bool tested = array.get(lowerzonetestedarr, i)
line.set_style(tempupperline, f_i_linestyle(i_linestyle))
line.set_style(templowerline, f_i_linestyle(i_linestyle))
line.set_color(tempupperline, color.from_gradient(i, 1, numberofline, fzonecolor(lowerzonecolor, 00), fzonecolor(lowerzonecolor, 00)))
line.set_color(templowerline, color.from_gradient(i, 1, numberofline, fzonecolor(lowerzonecolor, 00), fzonecolor(lowerzonecolor, 00)))
label.set_textcolor(linepricelabel, color.from_gradient(i, 1, numberofline, fzonecolor(lowerzonecolor, 00), lowerzonecolor))
label.set_text(linepricelabel, str.tostring(math.round_to_mintick(line.get_y1(templowerline))))
label.set_text(linepricelabel, ' Support - ' + str.tostring(math.round_to_mintick(line.get_y1(templowerline))))
label.set_x(linepricelabel, bar_index)
crossed = low < line.get_y1(templowerline)
if crossed and not tested
array.set(lowerzonetestedarr, i, true)
label.delete(linepricelabel)
else if i_extend ? tested : not tested
line.set_x2(tempupperline, bar_index)
array.set(lowerphzonearr, i, tempupperline)
line.set_x2(templowerline, bar_index)
array.set(lowerplzonearr, i, templowerline)
//◀─── Psychological Levels ───►
//Constant Variable
var incr = syminfo.type == 'cfd' ? syminfo.mintick * 5000 : syminfo.type == 'crypto' ? syminfo.mintick * 5000 : syminfo.mintick * 500
//Calculation
if i_psylevels and barstate.islast
for counter = 0 to i_linescounter - 1 by 1
incrup = math.ceil(close / incr) * incr + counter * incr
incrdown = math.floor(close / incr) * incr - counter * incr
//Plotting
line.new(bar_index, incrup, bar_index - 1, incrup, xloc=xloc.bar_index, extend=extend.both, color=i_psylinescol, width=1, style=line.style_solid)
line.new(bar_index, incrdown, bar_index - 1, incrdown, xloc=xloc.bar_index, extend=extend.both, color=i_psylinescol, width=1, style=line.style_solid)
//◀─── Alerts ───►
if sell ? high + atrxy : na
alert('Sell Condition! At ' + str.tostring(math.round_to_mintick(close)), alert.freq_once_per_bar)
alertcondition(sell ? high + atrxy : na, 'Sell Condition!', 'Sell Condition!')
if buy ? low - atrxy : na
alert('Buy Condition! At ' + str.tostring(math.round_to_mintick(close)), alert.freq_once_per_bar)
alertcondition(buy ? low - atrxy : na, 'Buy Condition!', 'Buy Condition!')
if shortcr ? (high) + atrxy : na
alert('Sell Continuity/Reversal! At ' + str.tostring(math.round_to_mintick(close)), alert.freq_once_per_bar)
alertcondition(shortcr ? (high) + atrxy : na, 'Sell Continuity/Reversal!', 'Sell Continuity/Reversal!')
if longcr ? (low) - atrxy : na
alert('Buy Continuity/Reversal! At ' + str.tostring(math.round_to_mintick(close)), alert.freq_once_per_bar)
alertcondition(longcr ? (high) + atrxy : na, 'Buy Continuity/Reversal!', 'Buy Continuity/Reversal!')
if i_showtable and table_downtrend
alert('Panel : Bearish Trend! At ' + str.tostring(math.round_to_mintick(close)), alert.freq_once_per_bar)
alertcondition(i_showtable and table_downtrend, 'Panel : Bearish Trend!', 'Panel : Bearish Trend!')
if i_showtable and table_uptrend
alert('Panel : Bullish Trend! At ' + str.tostring(math.round_to_mintick(close)), alert.freq_once_per_bar)
alertcondition(i_showtable and table_uptrend, 'Panel : Bullish Trend!', 'Panel : Bullish Trend!')
if i_showtable and table_consolidation
alert('Panel : Trend Consolidation! At ' + str.tostring(math.round_to_mintick(close)), alert.freq_once_per_bar)
alertcondition(i_showtable and table_consolidation, 'Panel : Trend Consolidation!', 'Panel : Trend Consolidation!')
Show all 1,016 lines