From c8ccf89ddd096d2a0244f028dbd32eab268673d2 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Thu, 4 Apr 2024 18:28:01 +0330 Subject: [PATCH] last ... --- .../indicators/ichimoku.buy.sell.signals.pine | 42 + .../ichimoku.support and resistance.pine | 1016 +++++++++++++++++ 2 files changed, 1058 insertions(+) create mode 100644 xSamples/indicators/ichimoku.buy.sell.signals.pine create mode 100644 xSamples/indicators/ichimoku.support and resistance.pine diff --git a/xSamples/indicators/ichimoku.buy.sell.signals.pine b/xSamples/indicators/ichimoku.buy.sell.signals.pine new file mode 100644 index 0000000..361b0d7 --- /dev/null +++ b/xSamples/indicators/ichimoku.buy.sell.signals.pine @@ -0,0 +1,42 @@ +// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ +// © ozzy_livin + +//@version=4 + +study(title="Ichimoku Buy & Sell Signals", shorttitle="Ichimoku", overlay=true) + +// Periods +conversionPeriods = input(20, minval=1, title="Conversion Line Length") +basePeriods = input(60, minval=1, title="Base Line Length") +laggingSpan2Periods = input(120, minval=1, title="Lagging Span 2 Length") +displacement = input(30, minval=1, title="Displacement") + +donchian(len) => avg(lowest(len), highest(len)) + + +// Build MA and Ichimoku +conversionLine = donchian(conversionPeriods) +baseLine = donchian(basePeriods) +leadLine1 = avg(conversionLine, baseLine) +leadLine2 = donchian(laggingSpan2Periods) + + + +// Plot MA +plot(conversionLine, color=#00BCD4, transp=25, title="Tenkan") +plot(baseLine, color=#F44336, transp=25, title="Kijun") + +// Plot Cloud +p1 = plot(leadLine1, offset = displacement - 1, color=#4CAF50, transp=25, title="Lead 1") +p2 = plot(leadLine2, offset = displacement - 1, color=#FF5252, transp=25, title="Lead 2") + +// Color Fill Cloud +fill(p1, p2, color = leadLine1 > leadLine2 ? #4CAF50 : #FF5252, transp=75) + + + +// Plot CROSS at MA Cross Over +plot(crossover(conversionLine, baseLine) ? conversionLine : na, style = plot.style_circles, color=#00FF00, transp=25, linewidth = 8, title="Cross Long") + +// Plot CROSS at MA Cross Under +plot(crossover(baseLine, conversionLine) ? baseLine : na, style = plot.style_circles, color=#FF9800, transp=25, linewidth = 8, title="Cross Short") \ No newline at end of file diff --git a/xSamples/indicators/ichimoku.support and resistance.pine b/xSamples/indicators/ichimoku.support and resistance.pine new file mode 100644 index 0000000..20d3a61 --- /dev/null +++ b/xSamples/indicators/ichimoku.support and resistance.pine @@ -0,0 +1,1016 @@ +// 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=500, 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!')