Package: ta-py
Technical Analysis (ta.py)ta.py is a Python package for dealing with financial technical analysis.InstallationpipUse the package manager pip to install ta.py.pipinstallta_pyUsageimportta_pyasta;ExamplesMoving AveragesSimple Moving AverageSmoothed Moving AverageWeighted Moving AverageExponential Moving AverageHull Moving AverageLeast Squares Moving AverageVolume Weighted Moving AverageVolume Weighted Weighted Moving AverageWilder's Smoothing Moving AverageParabolic Weighted Moving AverageHyperbolic Weighted Moving AverageKaufman Adaptive Moving AverageCustom Weighted Moving AverageIndicatorsMoving Average Convergence / DivergenceRelative Strength IndexWilder's Relative Strength IndexTrue Strength IndexBalance Of PowerForce IndexAccumulative Swing IndexAlligator IndicatorWilliams %RStochasticsFibonacci RetracementBollinger BandwidthIchimoku CloudAverage True RangeAroon UpAroon DownMoney Flow IndexRate Of ChangeCoppock CurveKnow Sure ThingOn-Balance VolumeVolume-Weighted Average PriceFractalsCrossoverMomentumHalfTrendZigZagParabolic SARSuperTrendElder Ray IndexHistorical VolatilityRelative Vigor IndexRelative Vigor Index SignalRSI DivergenceDivergenceOscillatorsAlligator OscillatorChande Momentum OscillatorChaikin OscillatorAroon OscillatorAwesome OscillatorAccelerator OscillatorFisher TransformBandsBollinger BandsKeltner ChannelsDonchian ChannelsFibonacci Bollinger BandsEnvelopeStatisticsStandard DeviationVarianceNormal CDFInverse Normal DistributionMonte Carlo SimulationPercentileCorrelationCovariancePercentage DifferenceExpected ReturnAbnormal ReturnKelly CriterionPermutationsWinratioAverage WinAverage LossDrawdownMedianRecent HighRecent LowMedian Absolute DeviationAverage Absolute DeviationStandard ErrorSum Squared DifferencesLogarithmExponentNormalizeDenormalizeNormalize PairNormalize FromStandardizeZ-ScoreK-means ClusteringMean Squared ErrorCumulativeChart TypesHeikin AshiRenkoMiscellaneousTimes UpTimes DownExperimentalSupport LineResistance LineMoving AveragesSimple Moving Average (SMA)data=[1,2,3,4,5,6,10];length=6;# default = 14ta.sma(data,length);# output (array)# [3.5, 5]Smoothed Moving Average (SMMA)data=[1,2,3,4,5,6,10];length=5;# default = 14ta.smma(data,length);# output (array)# [3.4, 4.92]Weighted Moving Average (WMA)data=[69,68,66,70,68];length=4;# default = 14ta.wma(data,length);# output (array)# [68.3, 68.2]Exponential Moving Average (EMA)data=[1,2,3,4,5,6,10];length=6;# default = 12ta.ema(data,length);# output (array)# [3.5, 5.357]Hull Moving Averagedata=[6,7,5,6,7,4,5,7];length=6;# default = 14ta.hull(data,length);# output (array)# [4.76, 5.48]Least Squares Moving Average (LSMA)data=[5,6,6,3,4,6,7];length=6;# default = 25ta.lsma(data,length);# output (array)# [4.714, 5.761]Volume Weighted Moving Average (VWMA)data=[[1,59],[1.1,82],[1.21,27],[1.42,73],[1.32,42]];# [price, volume (quantity)]length=4;# default = 20ta.vwma(data,length);# output (array)# [1.185, 1.259]Volume Weighted Weighted Moving Average (VWWMA)data=[[1,59],[1.1,82],[1.21,27],[1.42,73],[1.32,42]];length=4;ta.vwwma(data,length);# output (array)# [1.262, 1.316]Wilder's Smoothing Moving Averagedata=[1,2,3,4,5,6,10];length=6;# default = 14ta.wsma(data,length);# output (array)# [3.5, 4.58]Parabolic Weighted Moving Averagedata=[17,26,23,29,20];length=4;# default = 14ta.pwma(data,length);# output (array)# [24.09, 25.18]Hyperbolic Weighted Moving Averagedata=[54,51,86,42,47];length=4;# default = 14ta.hwma(data,length);# output (array)# [56.2, 55.0]Kaufman Adaptive Moving Average (KAMA)data=[8,7,8,9,7,9];length1=2;# default = 10length2=4;# default = 2length3=8;# default = 30ta.kama(data,length1,length2,length3);# output (array)# [8, 8.64, 8.57, 8.57]Custom Weighted Moving Averagedata=[69,68,66,70,68,69];weights=[1,2,3,5,8];ta.cwma(data,weights);# output (array)# [68.26315789473684, 68.52631578947368]IndicatorsMoving Average Convergence / Divergence (MACD)data=[1,2,3,4,5,6,14];length1=3;# default = 12length2=6;# default = 26ta.macd(data,length1,length2);# output (array)# [1.5, 3]Relative Strength Index (RSI)data=[1,2,3,4,5,6,7,5];length=6;# default = 14ta.rsi(data,length);# output (array)# [100, 100, 66.667]Wilder's Relative Strength Indexdata=[1,2,3,4,5,6,7,5,6];length=6;# default = 14ta.wrsi(data,length);# output (array)# [100, 71.43, 75.61]True Strength Index (TSI)data=[1.32,1.27,1.42,1.47,1.42,1.45,1.59];longlength=3;# default = 25shortlength=2;# default = 13signallength=2;# default = 13ta.tsi(data,longlength,shortlength,signallength);# output (array)# [[0.327, 0.320], [0.579, 0.706]]# [strength line, signal line]Balance Of Powerdata=[[4,5,4,5],[5,6,5,6],[6,8,5,6]];# [open, high, low, close]length=2;# default = 14ta.bop(data,length);# output (array)# [1, 0.5]Force Indexdata=[[1.4,200],[1.5,240],[1.1,300],[1.2,240],[1.5,400]];# [close, volume]length=4;# default = 13ta.fi(data,length);# output (array)# [0.0075]Accumulative Swing Indexdata=[[7,6,4],[9,7,5],[9,8,6]];# [high, close, low]ta.asi(data);# output (array)# [0, -12.5]Alligator Indicatordata=[8,7,8,9,7,8,9,6,7,8,6,8,10,8,7,9,8,7,9,6,7,9];# defaults shownjawlength=13;teethlength=8;liplength=5;jawshift=8;teethshift=5;lipshift=3;ta.alligator(data,jawlength,teethlength,liplength,jawshift,teethshift,lipshift);# output (array)# [jaw, teeth, lips]Williams %Rdata=[2,1,3,1,2];length=3;# default = 14ta.pr(data,length);# output (array)# [-0, -100, -50]Stochasticsdata=[[3,2,1],[2,2,1],[4,3,1],[2,2,1]];# [high, close, low]length=2;# default = 14smoothd=1;# default = 3smoothk=1;# default = 3ta.stoch(data,length,smoothd,smoothk);# output (array)# [[66.667, 66.667], [33.336, 33.336]]# [kline, dline]Fibonacci Retracementstart=1;end=2;ta.fib(start,end);# output (array)# [1, 1.236, 1.382, 1.5, 1.618, 1.786, 2, 2.618, 3.618, 4.618, 5.236]Bollinger Bandwidthdata=[1,2,3,4,5,6];length=5;# default = 14deviations=2;# default = 1ta.bandwidth(data,length,deviations);# output (array)# [1.886, 1.344]Ichimoku Clouddata=[[6,3,2],[5,4,2],[5,4,3],[6,4,3],[7,6,4],[6,5,3]];# [high, close, low]length1=9;# default = 9length2=26;# default = 26length3=52;# default = 52displacement=26;# default = 26ta.ichimoku(data,length1,length2,length3,displacement);# output (array)# [conversion line, base line, leading span A, leading span B, lagging span]Average True Range (ATR)data=[[3,2,1],[2,2,1],[4,3,1],[2,2,1]];# [high, close, low]length=3;# default = 14ta.atr(data,length);# output (array)# [2, 1.667, 2.111, 1.741]Aroon Updata=[5,4,5,2];length=3;# default = 10ta.aroon_up(data,length);# output (array)# [100.0, 50.0]Aroon Downdata=[2,5,4,5];length=3;# default = 10ta.aroon_down(data,length);# output (array)# [0.0, 50.0]Money Flow Indexdata=[[19,13],[14,38],[21,25],[32,17]];# [buy volume, sell volume]length=3;# default = 14ta.mfi(data,length);# output (array)# [41.54, 45.58]Rate Of Changedata=[1,2,3,4];length=3;# default = 14ta.roc(data,length);# output (array)# [2, 1]Coppock Curvedata=[3,4,5,3,4,5,6,4,7,5,4,7,5];length1=4;# (ROC period 1) default = 11length2=6;# (ROC period 2) default = 14length3=5;# (WMA smoothing period) default = 10ta.cop(data,length1,length2,length3);# output (array)# [0.376, 0.237]Know Sure Thingdata=[8,6,7,6,8,9,7,5,6,7,6,8,6,7,6,8,9,9,8,6,4,6,5,6,7,8,9];# roc sma #1r1=5;# default = 10s1=5;# default = 10# roc sma #2r2=7;# default = 15s2=5;# default = 10# roc sma #3r3=10;# default = 20s3=5;# default = 10# roc sma #4r4=15;# default = 30s4=7;# default = 15# signal linesig=4;# default = 9ta.kst(data,r1,s1,r2,s2,r3,s3,r4,s4,sig);# output (array)# [[-0.68, -0.52], [-0.29, -0.58], [0.35, -0.36]]# [kst line, signal line]On-Balance Volumedata=[[25200,10],[30000,10.15],[25600,10.17],[32000,10.13]];# [asset volume, close price]ta.obv(data);# output (array)# [0, 30000, 55600, 23600]Volume-Weighted Average Pricedata=[[127.21,89329],[127.17,16137],[127.16,23945]];# [average price, volume (quantity)]length=2;# default = len(length)ta.vwap(data,length);# output (array)# [127.204, 127.164]Fractalsdata=[[7,6],[8,6],[9,6],[8,5],[7,4],[6,3],[7,4],[8,5]];# [high, low]ta.fractals(data);# output (array, same length as input)# [[false, false],[false,false],[true,false],[false,false],[false,false],[false,true],[false,false],[false,false]]# [upper fractal, lower fractal]Crossover (golden cross)fastdata=[3,4,5,4,3];# short period gets spliced when longerslowdata=[4,3,2,3,4];ta.cross(fastdata,slowdata);# output (array)# [{index: 1, cross True}, {index: 4, cross: False}]# cross is true when fastdata is greater than the slowdataMomentumdata=[1,1.1,1.2,1.24,1.34];length=4;# default = 10percentage=false;# default = false (true returns percentage)ta.mom(data,length,percentage);# output (array)# [0.24, 0.24]HalfTrend# experimental (untested) function (may change in the future), ported from:# https://www.tradingview.com/script/U1SJ8ubc-HalfTrend/# data = [high, close, low]data=[[100,97,90],[101,98,94],[103,96,92],[106,100,95],[110,101,100],[112,110,105],[110,100,90],[103,100,97],[95,90,85],[94,80,80],[90,82,81],[85,80,70]];atrlen=6;amplitude=3;deviation=2;ta.halftrend(data,atrlen,amplitude,deviation);# output (array)# [#   [ 115.14, 105, 94.86, 'long' ],#   [ 100.77, 90, 79.22, 'long' ],#   [ 116.32, 105, 93.68, 'long' ],#   [ 101.1, 90, 78.89, 'long' ],#   [ 116.25, 105, 93.75, 'long' ],#   [ 99.77, 90, 80.23, 'long' ]# ]ZigZag# Based on high / lowdata=[[10,9],[12,10],[14,12],[15,13],[16,15],[11,10],[18,15]];# [high, low]percentage=0.25;# default = 0.05ta.zigzag(data,percentage);# output (array)# [9, 10.75, 12.5, 14.25, 16, 10, 18]# Based on closedata=[6,7,8,9,10,12,9,8,5,3,3,3,5,7,8,9,11];percentage=0.05;ta.zigzag(data,percentage);# output (array)# [6, 7.2, 8.4, 9.6, 10.8, 12.0, 10.5, 9.0, 7.5, 6.0, 4.5, 3.0, 4.6, 6.2, 7.8, 9.4, 11.0]Parabolic SARdata=[[82.15,81.29],[81.89,80.64],[83.03,81.31],[83.30,82.65],[83.85,83.07],[83.90,83.11],[83.33,82.49],[84.30,82.3],[84.84,84.15],[85,84.11],[75.9,74.03],[76.58,75.39],[76.98,75.76],[78,77.17],[70.87,70.01]];step=0.02;max=0.2;ta.psar(data,step,max);# output (array)# [81.29,82.15,80.64,80.64,80.7464,80.932616,81.17000672,81.3884061824,81.67956556416,82.0588176964608,85,85,84.7806,84.565588,84.35487624000001]SuperTrenddata=[[3,2,1],[2,2,1],[4,3,1],[2,2,1]];# [high, close, low]length=3;multiplier=0.5;ta.supertrend(data,length,multiplier);# output (array)# [[5.56,1.44],[3.37,0.63]]# [up, down]Elder Ray Indexdata=[6,5,4,7,8,9,6,8];length=7;ta.elderray(data,length);# output (array)# [[2.57,-2.43],[2.29,-2.71]]# [bull, bear]Historical Volatilitydata=[7,6,5,7,8,9,7,6,5];length=8;ta.hv(data,length);# output (array)# [0.642, 0.682]Relative Vigor Index# data = [[open,high,low,close]] (requires at least 4 + length values)data=[[4,6,3,3],[3,5,2,2],[2,5,2,4],[4,6,4,5],[5,7,4,4],[4,6,3,4],[4,7,3,5],[5,7,5,6],[6,8,6,6],[6,9,5,6],[6,8,6,7],[7,9,5,6],[6,7,4,5],[5,6,5,6],[6,8,5,5],[5,7,2,6]];length=8;ta.rvi(data,length);# output (array)# [0.29,0.21,0.15,0.16,0.09,0.05]Relative Vigor Index Signalrvi=[0.29,0.21,0.15,0.16,0.09,0.05];# requires at least 4 valuesta.rvi_signal(rvi);# output (array)# [0.20,0.15,0.12]RSI DivergenceExperimental function:https://github.com/Bitvested/ta.js/issues/18data=[74,83,66,78,69,70,84,73,74,73,83];rsi_length=5;rsi_function=ta.wrsi;# default (the tradingview rsi indicator)ta.rsi_divergence(data,rsi_length,rsi_function);# output (array)# 1 = RSI is in divergence# 0 = RSI is not in divergence# [0, 0, 1, 0, 1, 0] (better to quantify if needed)Universal Divergencedata1=[48,34,43,54,56,64,43];data2=[76,74,43,55,34,32,45,47];ta.divergence(data1,data2);#output(array)#1=RSIisindivergence#0=RSIisnotindivergence#[0,0,1,1,0,1](bettertoquantifyifneeded)OscillatorsAlligator Oscillatordata=[8,7,8,9,7,8,9,6,7,8,6,8,10,8,7,9,8,7,9,6,7,9];# defaults shownjawlength=13;teethlength=8;liplength=5;jawshift=8;teethshift=5;lipshift=3;ta.gator(data,jawlength,teethlength,liplength,jawshift,teethshift,lipshift);# output (array)# [upper gator, lower gator]Chande Momentum Oscillatordata=[1,1.2,1.3,1.3,1.2,1.4];length=4;# default = 9ta.mom_osc(data,length);# output (array)# [0.0, 3.85]Chaikin Oscillatordata=[[2,3,4,6],[5,5,5,4],[5,4,3,7],[4,3,3,4],[6,5,4,6],[7,4,3,6]];# [high, close, low, volume]length1=2;# default = 3length2=4;# default = 10ta.chaikin_osc(data,length1,length2);# output (array)# [-1.667, -0.289, -0.736]Aroon Oscillatordata=[2,5,4,5];length=3;# default = 25ta.aroon_osc(data,length);# output (array)# [50.0, 50.0]Awesome Oscillatordata=[[6,5],[8,6],[7,4],[6,5],[7,6],[9,8]];# [high, low]shortlength=2;# default = 5longlength=5;# default = 35ta.ao(data,shortlength,longlength);# output (array)# [0, 0.9]Accelerator Oscillatordata=[[6,5],[8,6],[7,4],[6,5],[7,6],[9,8]];# [high, low]shortlength=2;# default = 5longlength=4;# default = 35ta.ac(data,shortlength,longlength);# output (array)# [-5.875, -6.125, -6.5]Fisher Transformdata=[8,6,8,9,7,8,9,8,7,8,6,7];# high + low / 2length=9;ta.fisher(data,length);# output (array)# [[-0.318, -0.11], [-0.449, -0.318], [-0.616, -0.449]] # [fisher, trigger]BandsBollinger Bandsdata=[1,2,3,4,5,6];length=5;# default = 14deviations=2;# default = 1ta.bands(data,length,deviations);# output (array)# [[5.828, 3, 0.172], [6.828, 4, 1.172]]# [upper band, middle band, lower band]Keltner Channelsdata=[[3,2,1],[2,2,1],[4,3,1],[2,2,1],[3,3,1]];# [high, close, low]length=5;# default = 14deviations=1;# default = 1ta.keltner(data,length,deviations);# output (array)# [[3.93, 2.06, 0.20]]# [upper band, middle band, lower band]Donchian Channelsdata=[[6,2],[5,2],[5,3],[6,3],[7,4],[6,3]];# [high, low]length=5;# default = 20ta.don(data,length);# output (array)# [[7, 4.5, 2], [7, 4.5, 2]]# [upper band, base line, lower band]Fibonacci Bollinger Bandsdata=[[1,59],[1.1,82],[1.21,27],[1.42,73],[1.32,42]];length=4;deviations=3;ta.fibbands(data,length,deviations);# output (array)# [[highest band -> fibonacci levels -> lowest band]]Envelopedata=[6,7,8,7,6,7,8,7,8,7,8,7,8];length=11,# default = 10percentage=0.05;# default = 0.005ta.envelope(data,length,percentage);# output (array)# [[7.541, 7.182, 6.823], [7.636, 7.273, 6.909]]# [upper band, base line, lower band]StatisticsStandard Deviationdata=[1,2,3];length=3;# default = len(length)ta.std(data,length);# output (float)# 0.81649658092773Variancedata=[6,7,2,3,5,8,6,2];length=7;# default = len(data)ta.variance(data,length);# output (array)# [3.918, 5.061]Normal CDFsample=13;mean=10;stdv=2;ta.ncdf(sample,mean,stdv);# output (float)# 0.9331737996110652zscore=1.5;ta.ncdf(zscore);# output (float)# 0.9331737996110652Inverse Normal Distributiondata=0.4732;ta.normsinv(data);# output (float)# -0.06722824471054376Monte Carlo Simulationdata=[6,4,7,8,5,6];length=2;# default = 50simulations=100;# default = 1000percentile=0.5;# default = -1 (returns all raw simulations)ta.sim(data,length,simulations,percentile)# output (array)# [6, 4, 7, 8, 5, 6, 5.96, 5.7]Percentiledata=[[6,4,7],[5,3,6],[7,5,8]];percentile=0.5;ta.percentile(data,percentile);# output (array)# [6, 4, 7]Correlationdata1=[1,2,3,4,5,2];data2=[1,3,2,4,6,3];ta.cor(data1,data2);# output (float)# 0.8808929232684737Covariancedata1=[12,13,25,39];data2=[67,45,32,21];length=4;ta.covariance(data1,data2,4);# output (array)# [-165.8125]Percentage Differencenewval=0.75;oldval=0.5;ta.dif(newval,oldval);# output (float)# 0.5Expected Returndata=[0.02,-0.01,0.03,0.05,-0.03];# historical return datata.er(data);# output (float)# 0.0119Abnormal Returndata=[0.02,-0.01,0.03,0.05,-0.03];# historical return datalength=3;ta.ar(data,length);# output (array)# [0.037, -0.053]Kelly Criteriondata=[0.01,0.02,-0.01,-0.03,-0.015,0.045,0.005];ta.kelly(data);# output (float)# 0.1443Permutationsdata=[10,10,10];ta.permutations(data);# output (int)# 1000Winratiovardata=[0.01,0.02,-0.01,-0.03,-0.015,0.005];ta.winratio(data);# output (float)# 0.5Average Windata=[0.01,0.02,-0.01,-0.03,-0.015,0.005];ta.avgwin(data);# output (float)# 0.012Average Lossdata=[0.01,0.02,-0.01,-0.03,-0.015,0.005];ta.avgloss(data);# output (float)# -0.018Drawdowndata=[1,2,3,4,2,3];ta.drawdown([1,2,3,4,2,3]);# output (float)# -0.5Mediandata=[4,6,3,1,2,5];length=4;# default = len(data)ta.median(data,length);# output (array)# [3, 2, 2]Recent Highdata=[4,5,6,7,8,9,8,7,8,9,10,3,2,1];lookback=3;# No higher values after 3 periods? resets after each new highta.recent_high(data,lookback);# output (dictionary)# {'index': 10, 'value': 10}Recent Lowdata=[1,4,5,6,4,3,2,3,4,3,5,7,8,8,5];lookback=4;# No lower values after 4 periods? resets after each new lowta.recent_low(data,lookback);# output (dictionary)# {'index': 6, 'value': 2}Median Absolute Deviationdata=[3,7,5,4,3,8,9];length=6;# default = len(data)ta.mad(data,length);# output (array)# [1, 2]Average Absolute Deviationdata=[4,6,8,6,8,9,10,11];length=7;# default = len(data)ta.aad(data,length);# output (array)# [1.673, 1.469]Standard Errordata=[34,54,45,43,57,38,49];size=10;# default = len(data)ta.se(data,size);# output (float)# 2.424Sum Squared Differencesdata=[7,6,5,7,9,8,3,5,4];length=7;# default = len(length)ta.ssd(data,length);# output (array)# [4.87, 4.986, 5.372]Logarithmdata=[5,14,18,28,68,103];ta.log(data);# output (array)# [1.61, 2.64, 2.89, 3.33, 4.22, 4.63]Exponentdata=[1.6,2.63,2.89,3.33,4.22,4.63];ta.exp(data);# output (array)# [4.95, 13.87, 17.99, 27.94, 68.03, 102.51]Normalizedata=[5,4,9,4];margin=0.1;# margin % (default = 0)ta.normalize(data,margin);# output (array)# [0.22, 0.06, 0.86, 0.06]Denormalizedata=[5,4,9,4];# original data || [highest, lowest]norm=[0.22,0.06,0.86,0.06,0.44];# normalized datamargin=0.1;# margin % (default = 0)ta.denormalize(data,norm,margin);# output (array)# [5 ,4, 9, 4, 6.4]Normalize Pairpair1=[10,12,11,13];pair2=[100,130,100,140];ta.normalize_pair(pair1,pair2);# output (array)# [[55, 55], [66, 71.5], [60.5, 54.99], [71.5, 76.99]]Normalize Fromdata=[8,12,10,11];baseline=100;ta.normalize_from(data,baseline);# output (array)# [100, 150, 125, 137.5]Standardizedata=[6,4,6,8,6];ta.standardize(data);# output (array)# [0, -1.581, 0, 1.581, 0]Z-Scoredata=[34,54,45,43,57,38,49];length=5;ta.zscore(data,length);# output (array)# [1.266, -1.331, 0.408]K-means Clusteringdata=[2,3,4,5,3,5,7,8,6,8,6,4,2,6];length=4;ta.kmeans(data,length);# output (array)# [[ 4, 5, 5, 4 ], [ 7, 6, 6, 6 ], [ 8, 8 ], [ 2, 3, 3, 2 ]]Mean Squared Errordata1=[7,8,7,8,6,9];data2=[6,8,8,9,6,8];ta.mse(data1,data2);# output (float)# 0.6666666666666666Cumulativedata=[3,5,7,5,10];length=4;ta.cum(data,length);# output (array)# [20, 27]Chart typesHeikin Ashidata=[[3,4,2,3],[3,6,3,5],[5,5,2,3]];# [open, high, low, close]ta.ha(data);# output (array)# [open, high, low, close]# first 7-10 candles are unreliableRenkodata=[[8,6],[9,7],[9,8]];# [high, low]bricksize=3;ta.ren(data,bricksize);# output (array)# [open, high, low, close]MiscellaneousTimes Updata=[5,6,7,8,7,6,5];length=3;ta.times_up(data,length);# output (array)# [1, 0, 0, 0]Times Downdata=[5,6,7,8,7,6,5];length=3;ta.times_down(data,length);# output (array)# [0, 0, 0, 1]Experimental FunctionsSupport Linedata=[4,3,2,5,7,6,5,4,7,8,5,4,6,7,5];start={"index":2,"value":2};# default = recent_low(data, 25)support=ta.support(data,start);# output (dictionary)# ['calculate'] = function(x) // calculates line at position x from start['index'] (= 0)# ['slope'] = delta y per x# ['lowest'] = lowest (start) value at x = 0# ['index'] = (start) index of lowest value# to get the line at the current candle / chart periodcurrent=support['calculate'](len(data)-support['index']);Resistance Linedata=[5,7,5,5,4,6,5,4,6,5,4,3,2,4,3,2,1];start={"index":1,"value":7};# default = recent_high(data, 25)resistance=ta.resistance(data,start);# output (dictionary)# ['calculate'] = function(x) // calculates line at position x from start['index'] (= 0)# ['slope'] = delta y per x# ['highest'] = highest (start) value# ['index'] = (start) index of highest value# to get the line at the current candle / chart periodcurrent=resistance['calculate'](len(data)-resistance['index']);ContributingPull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.Please make sure to update tests as appropriate.LicenseMIT