diff --git a/README.md b/README.md index 049703c..a84c364 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ $ pip install pandas_ta Latest Version -------------- -Best choice! Version: *0.3.03b* +Best choice! Version: *0.3.04b* * Includes all fixes and updates between **pypi** and what is covered in this README. ```sh $ pip install -U git+https://github.com/twopirllc/pandas-ta diff --git a/pandas_ta/momentum/apo.py b/pandas_ta/momentum/apo.py index 60ceaf1..3d0b32f 100644 --- a/pandas_ta/momentum/apo.py +++ b/pandas_ta/momentum/apo.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from pandas_ta import Imports -from pandas_ta.overlap import sma -from pandas_ta.utils import get_offset, verify_series +from pandas_ta.overlap import ma +from pandas_ta.utils import get_offset, tal_ma, verify_series -def apo(close, fast=None, slow=None, offset=None, **kwargs): +def apo(close, fast=None, slow=None, mamode=None, offset=None, **kwargs): """Indicator: Absolute Price Oscillator (APO)""" # Validate Arguments fast = int(fast) if fast and fast > 0 else 12 @@ -12,6 +12,7 @@ def apo(close, fast=None, slow=None, offset=None, **kwargs): if slow < fast: fast, slow = slow, fast close = verify_series(close, max(fast, slow)) + mamode = mamode if isinstance(mamode, str) else "sma" offset = get_offset(offset) if close is None: return @@ -19,10 +20,10 @@ def apo(close, fast=None, slow=None, offset=None, **kwargs): # Calculate Result if Imports["talib"]: from talib import APO - apo = APO(close, fast, slow) + apo = APO(close, fast, slow, tal_ma(mamode)) else: - fastma = sma(close, length=fast) - slowma = sma(close, length=slow) + fastma = ma(mamode, close, length=fast) + slowma = ma(mamode, close, length=slow) apo = fastma - slowma # Offset diff --git a/pandas_ta/momentum/dm.py b/pandas_ta/momentum/dm.py index 0c234c7..3f35d8d 100644 --- a/pandas_ta/momentum/dm.py +++ b/pandas_ta/momentum/dm.py @@ -20,7 +20,8 @@ def dm(high, low, length=None, mamode=None, drift=None, offset=None, **kwargs): if Imports["talib"]: from talib import MINUS_DM, PLUS_DM - pos, neg = PLUS_DM(high, low), MINUS_DM(high, low) + pos = PLUS_DM(high, low, length) + neg = MINUS_DM(high, low, length) else: up = high - high.shift(drift) dn = low.shift(drift) - low diff --git a/pandas_ta/momentum/macd.py b/pandas_ta/momentum/macd.py index 694bd45..1b6cf41 100644 --- a/pandas_ta/momentum/macd.py +++ b/pandas_ta/momentum/macd.py @@ -21,7 +21,7 @@ def macd(close, fast=None, slow=None, signal=None, offset=None, **kwargs): # Calculate Result if Imports["talib"]: from talib import MACD - macd, signalma, histogram = MACD(close, fast, slow) + macd, signalma, histogram = MACD(close, fast, slow, signal) else: fastma = ema(close, length=fast) slowma = ema(close, length=slow) diff --git a/pandas_ta/momentum/ppo.py b/pandas_ta/momentum/ppo.py index a144f58..2c5af15 100644 --- a/pandas_ta/momentum/ppo.py +++ b/pandas_ta/momentum/ppo.py @@ -2,7 +2,7 @@ from pandas import DataFrame from pandas_ta import Imports from pandas_ta.overlap import ma -from pandas_ta.utils import get_offset, verify_series +from pandas_ta.utils import get_offset, tal_ma, verify_series def ppo(close, fast=None, slow=None, signal=None, scalar=None, mamode=None, offset=None, **kwargs): @@ -23,7 +23,7 @@ def ppo(close, fast=None, slow=None, signal=None, scalar=None, mamode=None, offs # Calculate Result if Imports["talib"]: from talib import PPO - ppo = PPO(close, fast, slow) + ppo = PPO(close, fast, slow, tal_ma(mamode)) else: fastma = ma(mamode, close, length=fast) slowma = ma(mamode, close, length=slow) diff --git a/pandas_ta/momentum/uo.py b/pandas_ta/momentum/uo.py index 3da23d7..cca14c2 100644 --- a/pandas_ta/momentum/uo.py +++ b/pandas_ta/momentum/uo.py @@ -25,7 +25,7 @@ def uo(high, low, close, fast=None, medium=None, slow=None, fast_w=None, medium_ # Calculate Result if Imports["talib"]: from talib import ULTOSC - uo = ULTOSC(high, low, close) + uo = ULTOSC(high, low, close, fast, medium, slow) else: tdf = DataFrame({ "high": high, diff --git a/pandas_ta/overlap/t3.py b/pandas_ta/overlap/t3.py index eabec71..fc8ebd8 100644 --- a/pandas_ta/overlap/t3.py +++ b/pandas_ta/overlap/t3.py @@ -17,7 +17,7 @@ def t3(close, length=None, a=None, offset=None, **kwargs): # Calculate Result if Imports["talib"]: from talib import T3 - t3 = T3(close, length) + t3 = T3(close, length, a) else: c1 = -a * a**2 c2 = 3 * a**2 + 3 * a**3 diff --git a/pandas_ta/utils/_core.py b/pandas_ta/utils/_core.py index 14c895e..d4a7883 100644 --- a/pandas_ta/utils/_core.py +++ b/pandas_ta/utils/_core.py @@ -5,6 +5,7 @@ from sys import float_info as sflt from numpy import argmax, argmin from pandas import DataFrame, Series +from pandas_ta import Imports from pandas.api.types import is_datetime64_any_dtype @@ -82,6 +83,23 @@ def signed_series(series: Series, initial: int = None) -> Series: return sign +def tal_ma(name: str) -> int: + """Helper Function that returns the Enum value for TA Lib's MA Type""" + if Imports["talib"] and isinstance(name, str) and len(name) > 1: + from talib import MA_Type + name = name.lower() + if name == "sma": return MA_Type.SMA # 0 + elif name == "ema": return MA_Type.EMA # 1 + elif name == "wma": return MA_Type.WMA # 2 + elif name == "dema": return MA_Type.DEMA # 3 + elif name == "tema": return MA_Type.TEMA # 4 + elif name == "trima": return MA_Type.TRIMA # 5 + elif name == "kama": return MA_Type.KAMA # 6 + elif name == "mama": return MA_Type.MAMA # 7 + elif name == "t3": return MA_Type.T3 # 8 + return 0 # Default: SMA -> 0 + + def unsigned_differences(series: Series, amount: int = None, **kwargs) -> Series: """Unsigned Differences Returns two Series, an unsigned positive and unsigned negative series based diff --git a/pandas_ta/volatility/bbands.py b/pandas_ta/volatility/bbands.py index bfbc489..ad72652 100644 --- a/pandas_ta/volatility/bbands.py +++ b/pandas_ta/volatility/bbands.py @@ -3,7 +3,7 @@ from pandas import DataFrame from pandas_ta import Imports from pandas_ta.overlap import ma from pandas_ta.statistics import stdev -from pandas_ta.utils import get_offset, non_zero_range, verify_series +from pandas_ta.utils import get_offset, non_zero_range, tal_ma, verify_series def bbands(close, length=None, std=None, mamode=None, ddof=0, offset=None, **kwargs): @@ -21,7 +21,7 @@ def bbands(close, length=None, std=None, mamode=None, ddof=0, offset=None, **kwa # Calculate Result if Imports["talib"]: from talib import BBANDS - upper, mid, lower = BBANDS(close, length) + upper, mid, lower = BBANDS(close, length, std, std, tal_ma(mamode)) else: standard_deviation = stdev(close=close, length=length, ddof=ddof) deviations = std * standard_deviation diff --git a/pandas_ta/volatility/natr.py b/pandas_ta/volatility/natr.py index abb1de5..dd6ad1b 100644 --- a/pandas_ta/volatility/natr.py +++ b/pandas_ta/volatility/natr.py @@ -21,7 +21,7 @@ def natr(high, low, close, length=None, mamode=None, scalar=None, drift=None, of # Calculate Result if Imports["talib"]: from talib import NATR - natr = NATR(high, low, close) + natr = NATR(high, low, close, length) else: natr = scalar / close natr *= atr(high=high, low=low, close=close, length=length, mamode=mamode, drift=drift, offset=offset, **kwargs) diff --git a/pandas_ta/volume/adosc.py b/pandas_ta/volume/adosc.py index 0f1ddca..48f443a 100644 --- a/pandas_ta/volume/adosc.py +++ b/pandas_ta/volume/adosc.py @@ -23,7 +23,7 @@ def adosc(high, low, close, volume, open_=None, fast=None, slow=None, offset=Non # Calculate Result if Imports["talib"]: from talib import ADOSC - adosc = ADOSC(high, low, close, volume) + adosc = ADOSC(high, low, close, volume, fast, slow) else: ad_ = ad(high=high, low=low, close=close, volume=volume, open_=open_) fast_ad = ema(close=ad_, length=fast, **kwargs) diff --git a/pandas_ta/volume/mfi.py b/pandas_ta/volume/mfi.py index 72c9313..86a9d92 100644 --- a/pandas_ta/volume/mfi.py +++ b/pandas_ta/volume/mfi.py @@ -21,7 +21,7 @@ def mfi(high, low, close, volume, length=None, drift=None, offset=None, **kwargs # Calculate Result if Imports["talib"]: from talib import MFI - mfi = MFI(high, low, close, volume) + mfi = MFI(high, low, close, volume, length) else: typical_price = hlc3(high=high, low=low, close=close) raw_money_flow = typical_price * volume diff --git a/setup.py b/setup.py index fa4760e..1d44faa 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ setup( "pandas_ta.volatility", "pandas_ta.volume" ], - version=".".join(("0", "3", "03b")), + version=".".join(("0", "3", "04b")), description=long_description, long_description=long_description, author="Kevin Johnson", diff --git a/tests/test_utils.py b/tests/test_utils.py index 06cc553..b1f686f 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -149,12 +149,15 @@ class TestUtilities(TestCase): result = self.utils.df_dates(self.data, ["1999-11-01", "2020-08-15", "2020-08-24", "2020-08-25", "2020-08-26", "2020-08-27"]) self.assertEqual(5, result.shape[0]) + @skip def test_df_month_to_date(self): result = self.utils.df_month_to_date(self.data) + @skip def test_df_quarter_to_date(self): result = self.utils.df_quarter_to_date(self.data) + @skip def test_df_year_to_date(self): result = self.utils.df_year_to_date(self.data) @@ -274,6 +277,18 @@ class TestUtilities(TestCase): npt.assert_array_equal(self.utils.symmetric_triangle(n=5), array_5) npt.assert_array_equal(self.utils.symmetric_triangle(n=5, weighted=True), array_5w) + def test_tal_ma(self): + self.assertEqual(self.utils.tal_ma("sma"), 0) + self.assertEqual(self.utils.tal_ma("Sma"), 0) + self.assertEqual(self.utils.tal_ma("ema"), 1) + self.assertEqual(self.utils.tal_ma("wma"), 2) + self.assertEqual(self.utils.tal_ma("dema"), 3) + self.assertEqual(self.utils.tal_ma("tema"), 4) + self.assertEqual(self.utils.tal_ma("trima"), 5) + self.assertEqual(self.utils.tal_ma("kama"), 6) + self.assertEqual(self.utils.tal_ma("mama"), 7) + self.assertEqual(self.utils.tal_ma("t3"), 8) + def test_zero(self): self.assertEqual(self.utils.zero(-0.0000000000000001), 0) self.assertEqual(self.utils.zero(0), 0)