Skip to content

Commit dc52359

Browse files
authored
Merge pull request #132 from mckelvin/merge-to-one-ext
Merge all extensitons into one extension
2 parents caf314f + 23b3dfc commit dc52359

21 files changed

+250663
-267193
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ docs/html
22
docs/.tadoc.org.html
33

44
*.pyc
5-
build
5+
build/
6+
dist/
67
*.so
78
.*
89
*~
10+
*.egg-info/
911

DEVELOPMENT

+12-12
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,34 @@ Here's the full list of make commands (see the Makefile file):
1212
make build # builds and places libs in the project directory; required for testing
1313
make clean # cleans the local build files
1414
make install # installs talib system-wide
15-
make generate: # generates a fresh func.pyx file. Requires talib and TA-Lib to both be installed
15+
make generate: # generates a fresh _func.pxi, _stream.pxi file. Requires talib and TA-Lib to both be installed
1616
make perf # run performance profiling
1717
make test # run tests
1818

1919
The source code is comprised of one python package, located in the talib
20-
directory, which itself has three Cython modules: func, abstract, and
21-
common.
20+
directory, which itself has one Cython module (_ta_lib) which consists of
21+
four parts: _common, _func, _abstract and _stream.
2222

23-
talib/common.pyx
24-
An internal-use module for functionality shared between func and abstract.
23+
talib/_common.pxi
24+
An internal-use file for functionality shared between func and abstract.
2525

26-
talib/func.pyx
27-
This file is generated automatically by tools/generate.py and any changes made
26+
talib/_func.pxi
27+
This file is generated automatically by tools/generate_func.py and any changes made
2828
to it directly will get overwritten!
2929

30-
talib/abstract.pyx
30+
talib/_abstract.pxi
3131
This file contains the code for interfacing with the TA-Lib abstract interface
3232
and wrapping it into a pythonic Function class.
3333

34-
talib/libta_lib.pxd
34+
talib/_ta_lib.pyx
3535
This "Cython header file" defines the C-level functions, variables and types we
3636
need to use in the above pyx files.
3737

38-
talib/stream.pyx
38+
talib/_stream.pxi
3939
This file contains code for interfacing a "streaming" interface to TA-Lib.
4040

41-
tools/generate.py
42-
A script that generates and prints func.pyx to stdout. Gets information
41+
tools/generate_func.py,generate_stream.py
42+
Scripts that generate and print _func.pxi or _stream.pxi to stdout. Gets information
4343
about all functions from the C headers of the installed TA-Lib.
4444

4545
If you are interested in developing new indicator functions or whatnot on

Makefile

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1+
.PHONY: build
2+
13
build:
24
python setup.py build_ext --inplace
35

46
install:
57
python setup.py install
68

7-
generate:
8-
python tools/generate_func.py > talib/func.pyx
9+
talib/_func.pxi: tools/generate_func.py
10+
python tools/generate_func.py > talib/_func.pxi
11+
12+
talib/_stream.pxi: tools/generate_stream.py
13+
python tools/generate_stream.py > talib/_stream.pxi
14+
15+
generate: talib/_func.pxi talib/_stream.pxi
916

1017
clean:
1118
rm -rf build talib/func*.so talib/abstract*.so talib/common*.so talib/stream*.so talib/*.pyc

setup.py

+8-9
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,15 @@
8080
if has_cython:
8181
cmdclass['build_ext'] = build_ext
8282

83-
ext_modules = []
84-
for name in ['common', 'func', 'abstract', 'stream']:
85-
ext = Extension(
86-
'talib.%s' % name,
87-
[('talib/%s.pyx' if has_cython else 'talib/%s.c') % name],
88-
include_dirs = include_dirs,
89-
library_dirs = lib_talib_dirs,
90-
libraries = [lib_talib_name]
83+
ext_modules = [
84+
Extension(
85+
'talib._ta_lib',
86+
['talib/_ta_lib.pyx' if has_cython else 'talib/_ta_lib.c'],
87+
include_dirs=include_dirs,
88+
library_dirs=lib_talib_dirs,
89+
libraries=[lib_talib_name]
9190
)
92-
ext_modules.append(ext)
91+
]
9392

9493
setup(
9594
name = 'TA-Lib',

talib/__init__.py

+12-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11

22
import atexit
33

4-
from . import common
5-
from . import abstract
6-
from . import stream
7-
from .common import MA_Type, __ta_version__
8-
from .common import _ta_set_unstable_period as set_unstable_period
9-
from .common import _ta_get_unstable_period as get_unstable_period
10-
from .func import *
4+
from ._ta_lib import (
5+
_ta_initialize, _ta_shutdown, MA_Type, __ta_version__,
6+
_ta_set_unstable_period as set_unstable_period,
7+
_ta_get_unstable_period as get_unstable_period,
8+
__TA_FUNCTION_NAMES__
9+
)
10+
11+
func = __import__("_ta_lib", globals(), locals(), __TA_FUNCTION_NAMES__, level=1)
12+
for func_name in __TA_FUNCTION_NAMES__:
13+
globals()[func_name] = getattr(func, func_name)
1114

1215
__version__ = '0.4.10'
1316

@@ -18,8 +21,8 @@
1821
# functions are called. Finally, when the python process exits, we shutdown
1922
# the underlying TA-Lib.
2023

21-
common._ta_initialize()
22-
atexit.register(common._ta_shutdown)
24+
_ta_initialize()
25+
atexit.register(_ta_shutdown)
2326

2427
__function_groups__ = {
2528
'Cycle Indicators': [

talib/abstract.pyx renamed to talib/_abstract.pxi

+5-18
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
This file Copyright (c) 2013 Brian A Cappello <briancappello at gmail>
33
'''
44
import math
5-
6-
from . import func as func_c
7-
from .common import _ta_check_success, MA_Type
85
try:
96
from collections import OrderedDict
107
except ImportError: # handle python 2.6 and earlier
@@ -14,11 +11,9 @@ import numpy
1411
import sys
1512

1613
cimport numpy as np
17-
cimport libta_lib as lib
18-
19-
lib.TA_Initialize()
14+
cimport _ta_lib as lib
15+
# NOTE: _ta_check_success, MA_Type is defined in _common.pxi
2016

21-
__FUNCTION_NAMES = set(func_c.__all__)
2217

2318
__INPUT_ARRAYS_DEFAULTS = {'open': None,
2419
'high': None,
@@ -90,11 +85,9 @@ class Function(object):
9085
- FunctionInstance([input_arrays,] [param_args_andor_kwargs]) # calls set_function_args and returns self.outputs
9186
"""
9287

93-
def __init__(self, function_name, *args, **kwargs):
88+
def __init__(self, function_name, func_object, *args, **kwargs):
9489
# make sure the function_name is valid and define all of our variables
9590
self.__name = function_name.upper()
96-
if self.__name not in __FUNCTION_NAMES:
97-
raise Exception('%s not supported by TA-LIB.' % self.__name)
9891
self.__namestr = self.__name
9992
self.__name = str2bytes(self.__name)
10093
self.__info = None
@@ -109,6 +102,7 @@ class Function(object):
109102
# finish initializing: query the TALIB abstract interface and set arguments
110103
self.__initialize_function_info()
111104
self.set_function_args(*args, **kwargs)
105+
self.func_object = func_object
112106

113107
def __initialize_function_info(self):
114108
# function info
@@ -386,7 +380,7 @@ class Function(object):
386380
args.append(value)
387381

388382
# Use the func module to actually call the function.
389-
results = func_c.__getattribute__(self.__namestr)(*args)
383+
results = self.func_object(*args)
390384
if isinstance(results, np.ndarray):
391385
keys = self.__outputs.keys()
392386
if not isinstance(keys, list):
@@ -682,10 +676,3 @@ cdef int __ta_getLookback(lib.TA_ParamHolder *holder):
682676
retCode = lib.TA_GetLookback(holder, &lookback)
683677
_ta_check_success('TA_GetLookback', retCode)
684678
return lookback
685-
686-
# Configure all the available TA-Lib functions to be exported as
687-
# an abstract function wrapper for convenient import.
688-
for name in __FUNCTION_NAMES:
689-
exec "%s = Function('%s')" % (name, name)
690-
691-
__all__ = ['Function'] + list(__FUNCTION_NAMES)

talib/common.pyx renamed to talib/_common.pxi

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
2-
cimport libta_lib as lib
3-
from libta_lib cimport TA_RetCode, TA_FuncUnstId
1+
cimport _ta_lib as lib
2+
from _ta_lib cimport TA_RetCode, TA_FuncUnstId
43

54
__ta_version__ = lib.TA_GetVersionString()
65

talib/func.pyx renamed to talib/_func.pxi

+4-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cimport numpy as np
22
from numpy import nan
33
from cython import boundscheck, wraparound
44

5-
from .common cimport _ta_check_success
5+
# _ta_check_success: defined in _common.pxi
66

77
cdef double NaN = nan
88

@@ -14,10 +14,9 @@ cdef extern from "numpy/arrayobject.h":
1414

1515
np.import_array() # Initialize the NumPy C API
1616

17-
cimport libta_lib as lib
18-
from libta_lib cimport TA_RetCode
17+
cimport _ta_lib as lib
18+
from _ta_lib cimport TA_RetCode
1919

20-
lib.TA_Initialize()
2120

2221
@wraparound(False) # turn off relative indexing from end of lists
2322
@boundscheck(False) # turn off bounds-checking for entire function
@@ -11243,4 +11242,4 @@ def WMA( np.ndarray real not None , int timeperiod=-2**31 ):
1124311242
_ta_check_success("TA_WMA", retCode)
1124411243
return outreal
1124511244

11246-
__all__ = ["ACOS","AD","ADD","ADOSC","ADX","ADXR","APO","AROON","AROONOSC","ASIN","ATAN","ATR","AVGPRICE","BBANDS","BETA","BOP","CCI","CDL2CROWS","CDL3BLACKCROWS","CDL3INSIDE","CDL3LINESTRIKE","CDL3OUTSIDE","CDL3STARSINSOUTH","CDL3WHITESOLDIERS","CDLABANDONEDBABY","CDLADVANCEBLOCK","CDLBELTHOLD","CDLBREAKAWAY","CDLCLOSINGMARUBOZU","CDLCONCEALBABYSWALL","CDLCOUNTERATTACK","CDLDARKCLOUDCOVER","CDLDOJI","CDLDOJISTAR","CDLDRAGONFLYDOJI","CDLENGULFING","CDLEVENINGDOJISTAR","CDLEVENINGSTAR","CDLGAPSIDESIDEWHITE","CDLGRAVESTONEDOJI","CDLHAMMER","CDLHANGINGMAN","CDLHARAMI","CDLHARAMICROSS","CDLHIGHWAVE","CDLHIKKAKE","CDLHIKKAKEMOD","CDLHOMINGPIGEON","CDLIDENTICAL3CROWS","CDLINNECK","CDLINVERTEDHAMMER","CDLKICKING","CDLKICKINGBYLENGTH","CDLLADDERBOTTOM","CDLLONGLEGGEDDOJI","CDLLONGLINE","CDLMARUBOZU","CDLMATCHINGLOW","CDLMATHOLD","CDLMORNINGDOJISTAR","CDLMORNINGSTAR","CDLONNECK","CDLPIERCING","CDLRICKSHAWMAN","CDLRISEFALL3METHODS","CDLSEPARATINGLINES","CDLSHOOTINGSTAR","CDLSHORTLINE","CDLSPINNINGTOP","CDLSTALLEDPATTERN","CDLSTICKSANDWICH","CDLTAKURI","CDLTASUKIGAP","CDLTHRUSTING","CDLTRISTAR","CDLUNIQUE3RIVER","CDLUPSIDEGAP2CROWS","CDLXSIDEGAP3METHODS","CEIL","CMO","CORREL","COS","COSH","DEMA","DIV","DX","EMA","EXP","FLOOR","HT_DCPERIOD","HT_DCPHASE","HT_PHASOR","HT_SINE","HT_TRENDLINE","HT_TRENDMODE","KAMA","LINEARREG","LINEARREG_ANGLE","LINEARREG_INTERCEPT","LINEARREG_SLOPE","LN","LOG10","MA","MACD","MACDEXT","MACDFIX","MAMA","MAVP","MAX","MAXINDEX","MEDPRICE","MFI","MIDPOINT","MIDPRICE","MIN","MININDEX","MINMAX","MINMAXINDEX","MINUS_DI","MINUS_DM","MOM","MULT","NATR","OBV","PLUS_DI","PLUS_DM","PPO","ROC","ROCP","ROCR","ROCR100","RSI","SAR","SAREXT","SIN","SINH","SMA","SQRT","STDDEV","STOCH","STOCHF","STOCHRSI","SUB","SUM","T3","TAN","TANH","TEMA","TRANGE","TRIMA","TRIX","TSF","TYPPRICE","ULTOSC","VAR","WCLPRICE","WILLR","WMA"]
11245+
__TA_FUNCTION_NAMES__ = ["ACOS","AD","ADD","ADOSC","ADX","ADXR","APO","AROON","AROONOSC","ASIN","ATAN","ATR","AVGPRICE","BBANDS","BETA","BOP","CCI","CDL2CROWS","CDL3BLACKCROWS","CDL3INSIDE","CDL3LINESTRIKE","CDL3OUTSIDE","CDL3STARSINSOUTH","CDL3WHITESOLDIERS","CDLABANDONEDBABY","CDLADVANCEBLOCK","CDLBELTHOLD","CDLBREAKAWAY","CDLCLOSINGMARUBOZU","CDLCONCEALBABYSWALL","CDLCOUNTERATTACK","CDLDARKCLOUDCOVER","CDLDOJI","CDLDOJISTAR","CDLDRAGONFLYDOJI","CDLENGULFING","CDLEVENINGDOJISTAR","CDLEVENINGSTAR","CDLGAPSIDESIDEWHITE","CDLGRAVESTONEDOJI","CDLHAMMER","CDLHANGINGMAN","CDLHARAMI","CDLHARAMICROSS","CDLHIGHWAVE","CDLHIKKAKE","CDLHIKKAKEMOD","CDLHOMINGPIGEON","CDLIDENTICAL3CROWS","CDLINNECK","CDLINVERTEDHAMMER","CDLKICKING","CDLKICKINGBYLENGTH","CDLLADDERBOTTOM","CDLLONGLEGGEDDOJI","CDLLONGLINE","CDLMARUBOZU","CDLMATCHINGLOW","CDLMATHOLD","CDLMORNINGDOJISTAR","CDLMORNINGSTAR","CDLONNECK","CDLPIERCING","CDLRICKSHAWMAN","CDLRISEFALL3METHODS","CDLSEPARATINGLINES","CDLSHOOTINGSTAR","CDLSHORTLINE","CDLSPINNINGTOP","CDLSTALLEDPATTERN","CDLSTICKSANDWICH","CDLTAKURI","CDLTASUKIGAP","CDLTHRUSTING","CDLTRISTAR","CDLUNIQUE3RIVER","CDLUPSIDEGAP2CROWS","CDLXSIDEGAP3METHODS","CEIL","CMO","CORREL","COS","COSH","DEMA","DIV","DX","EMA","EXP","FLOOR","HT_DCPERIOD","HT_DCPHASE","HT_PHASOR","HT_SINE","HT_TRENDLINE","HT_TRENDMODE","KAMA","LINEARREG","LINEARREG_ANGLE","LINEARREG_INTERCEPT","LINEARREG_SLOPE","LN","LOG10","MA","MACD","MACDEXT","MACDFIX","MAMA","MAVP","MAX","MAXINDEX","MEDPRICE","MFI","MIDPOINT","MIDPRICE","MIN","MININDEX","MINMAX","MINMAXINDEX","MINUS_DI","MINUS_DM","MOM","MULT","NATR","OBV","PLUS_DI","PLUS_DM","PPO","ROC","ROCP","ROCR","ROCR100","RSI","SAR","SAREXT","SIN","SINH","SMA","SQRT","STDDEV","STOCH","STOCHF","STOCHRSI","SUB","SUM","T3","TAN","TANH","TEMA","TRANGE","TRIMA","TRIX","TSF","TYPPRICE","ULTOSC","VAR","WCLPRICE","WILLR","WMA"]

0 commit comments

Comments
 (0)