1017 lines
58 KiB
Plaintext
1017 lines
58 KiB
Plaintext
// 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!')
|