Indicator · Pine Script v5 · On the chart

Ichimoku Kinkō Hyō

by regalouisei· code credited to RickSimpson

This indicator plots an enhanced version of the traditional Ichimoku Kinkō Hyō on the main price chart.

View on GitHub

GitHub stars2on the repository
Pine versionv5runs as is
Lines of code1,016
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update8 months ago25 Feb 2026

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

1,016 lines of Pine Script v5 from pinescript/editors_picks/ichimoku-kinkō-hyō-目均衡表.pine, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

ichimoku-kinkō-hyō-目均衡表.pine
// 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!')

Overview

Ichimoku Kinkō Hyō calculates adaptive Tenkan-Sen and Kijun-Sen lines using dynamic lookback periods adjusted by volume, ATR volatility, and Chikou trend filters. Users can customize price sources with Heikin Ashi or weighted moving average smoothing, define adaptive length limits, and toggle visual elements such as price labels, Chikou Span trends, and hidden Kijun support and resistance levels.

Details

Published by

regalouisei on GitHub

Code credit

RickSimpson, as written in the script's header

Type

Indicator, Pine Script v5

Draws

On the price chart

Category

Trend, Moving averages, Volatility & bands, Support & resistance

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Sourcesourceclosei_src
Alternative Sourcestring(close > open ? high : low)i_altsrc
Use Volume Heikin Ashi?booltruei_uha
Weighted Moving Average Smoothing?booltruei_wmas
Show Labels?booltruei_showlabels
Show Tenkan-Sen/kijun-Sen Price Labels?booltruei_showprice
Tenkan-Senbooltruei_showtenkan
i_tenkancolorcolorcolor.new(#007FFF, 0)i_tenkancolor
Tenkan Min Lengthint9i_tkminlen
Tenkan Max Lengthint30i_tkmaxlen
Tenkan Dynamic Length Adaptive Percentagefloat96.85i_tkdynperc
Volumebooltruei_tkvolsetup
Show all 40 settings
SettingTypeDefaultVariable
Volatilitybooltruei_tkatrsetup
Chikou Trend Filterbooltruei_tkchfilter
Kijun-Sen booltruei_showkijun
i_kijuncolorcolorcolor.new(#FF0016, 0)i_kijuncolor
Show Hidden Kijun-Sen Labels?booltruei_showkjhlabels
Show Hidden Kijun-Sen Supports/Resistances?boolfalsei_showkjhsr
Kijun Min Lengthint20i_kjminlen
Kijun Max Lengthint60i_kjmaxlen
Kijun Dynamic Length Adaptive Percentagefloat96.85i_kjdynperc
Kijun Divider Toolint1i_kjdivider
Volumebooltruei_kjvolsetup
Volatilitybooltruei_kjatrsetup
Chikou Trend Filterbooltruei_kjchfilter
Chikou Spanbooltruei_showchikou
Bearcolorcolor.new(#FF0016, 0)i_chbearcol
Bullcolorcolor.new(#459915, 0)i_chbullcol
Consolidationcolorcolor.new(#FF9800, 0)i_chconsocol
Chikou Min Lengthint26i_chminlen
Chikou Max Lengthint50i_chmaxlen
Chikou Dynamic Length Adaptive Percentagefloat96.85i_chdynperc
Chikou Filter Periodint25i_chfiltper
Chikou Filter Percentage Lookbackint50i_chlb
Volumebooltruei_chvolsetup
Volatilitybooltruei_chatrsetup
Chikou Trend Filterbooltruei_chtfilter
Senkou-Span AbooltrueI_ska
Senkou-Span BbooltrueI_skb
Bearcolorcolor.new(#FF0016, 0)I_skbear
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

MA Envelope (MAE)

by mihakralj
99 stars

The MA Envelope indicator calculates upper and lower channel bands shifted by a user-defined percentage around a baseline moving average. It supports Simple Moving Average, Exponential Moving Average, and Weighted Moving Average calculation types. The script p

Indicator v6 Moving averagesSupport & resistance
Updated 4 weeks ago · Apache-2.0 GitHub repository of MA Envelope (MAE)

Trend Compass 4H

by chris-c-thomas
14 stars

Trend Compass 4H plots a multi-EMA ribbon (10/21/50) along with higher-timeframe reference levels on the price chart. It classifies trend phase into six states and calculates a composite weighted trend score. The script detects RSI and MACD divergences, analyz

Indicator v6 TrendMoving averages
Updated 6 months ago · MIT GitHub repository of Trend Compass 4H
10 stars

My Macro Cycle Indicator plots daily and weekly simple and exponential moving averages on the price chart, plus Pi Cycle and Mayer Multiple levels derived from the 200-day average. Optional toggles add support-band fills, a Keltner channel, CME futures gaps, a

Indicator v4 Moving averagesVolatility & bands
Updated 5 years ago · None stated GitHub repository of My Macro Cycle Indicator

This indicator plots a double-smoothed Supertrend baseline on the price chart, combining a Supertrend midline with WMA and EMA smoothing to show trend direction. Direction uses an ATR-scaled baseline slope with hysteresis, while percentile-ranked slope magnitu

Indicator v6 TrendMoving averages
Updated yesterday · MIT GitHub repository of Smooth Trend Radar [WavesUnchained]

SRI Indicator ft. MSB

by kingmalitha
7 stars

This indicator overlays an all-in-one technical analysis toolkit on the price chart. It plots multiple moving averages, including standard EMAs, SMAs, and a Trend Regularity Adaptive Moving Average, alongside Bollinger Bands, Supertrend, Nadaraya-Watson envelo

Indicator v5 Moving averagesTrend Repaints
Updated 3 years ago · None stated GitHub repository of SRI Indicator ft. MSB

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers