Spaces:
Runtime error
Runtime error
/* TA-LIB Copyright (c) 1999-2007, Mario Fortier | |
* All rights reserved. | |
* | |
* Redistribution and use in source and binary forms, with or | |
* without modification, are permitted provided that the following | |
* conditions are met: | |
* | |
* - Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* | |
* - Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in | |
* the documentation and/or other materials provided with the | |
* distribution. | |
* | |
* - Neither name of author nor the names of its contributors | |
* may be used to endorse or promote products derived from this | |
* software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
* REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | |
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | |
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
extern "C" { | |
/* This file defines the interface for calling all the TA functions without | |
* knowing at priori the parameters. | |
* | |
* This capability is particularly useful for an application who needs | |
* to support the complete list of TA functions without having to | |
* re-write new code each time a new function is added to TA-Lib. | |
* | |
* Example 1: | |
* Lets say you are doing a charting software. When the user select | |
* a price bar, a side list offers blindly all the TA functions | |
* that could be applied to a price bar. The user selects one of | |
* these, then a dialog open for allowing to adjust some parameter | |
* (TA-LIB will tell your software which parameter are needed and the | |
* valid range for each). Once all the parameter are set, you can | |
* call blindly the corresponding TA function. The returned | |
* information can then also blindly be drawn on the chart (some | |
* output flags allows to get some hint about how the data shall be | |
* displayed). | |
* The same "abstract" logic apply to all the TA functions. | |
* Some TA Functions works only on volume, or can work indiferently | |
* with any time serie data (the open, close, another indicator...). | |
* All the applicable functions to the currently selected/available | |
* data can be determined through this "virtual" interface. | |
* | |
* Example 2: | |
* Let's say you do not like the direct interface for | |
* calling the TA Functions, you can write a code that | |
* re-generate a different interface. This is already | |
* done even for the 'C' interface (ta_func.h is generated). | |
* | |
* Example 3: | |
* With the abstract interface you can easily generate | |
* glue code. Like generating an interface that integrates | |
* well within Perl... see the project SWIG if you are | |
* interested by such things. | |
* | |
* The abstract interface is used within TA-Lib to perform at least | |
* the following: | |
* - used by gen_code to generate all the glue code. | |
* - used by the Excel interface to call all the TA functions. | |
* - used to generate a XML representation of the TA functions. | |
*/ | |
/* The following functions are used to obtain the name of all the | |
* TA function groups ("Market Strength", "Trend Indicator" etc...). | |
* | |
* On success, it becomes the responsibility of the caller to | |
* call TA_GroupTableFree once the 'table' is no longuer needed. | |
* | |
* Example: | |
* This code snippet will print out the name of all the supported | |
* function group available: | |
* | |
* TA_StringTable *table; | |
* TA_RetCode retCode; | |
* int i; | |
* | |
* retCode = TA_GroupTableAlloc( &table ); | |
* | |
* if( retCode == TA_SUCCESS ) | |
* { | |
* for( i=0; i < table->size; i++ ) | |
* printf( "%s\n", table->string[i] ); | |
* | |
* TA_GroupTableFree( table ); | |
* } | |
*/ | |
TA_RetCode TA_GroupTableAlloc( TA_StringTable **table ); | |
TA_RetCode TA_GroupTableFree ( TA_StringTable *table ); | |
/* The following functions are used to obtain the name of all the | |
* function provided in a certain group. | |
* | |
* On success, it becomes the responsibility of the caller to | |
* call TA_FuncTableFree once the 'table' is no longuer needed. | |
* | |
* Passing NULL as the group string will return ALL the TA functions. | |
* (Note: All TA_Functions have a unique string identifier even when in | |
* seperate group). | |
* | |
* Example: | |
* This code snippet will print out the name of all the supported | |
* function in the "market strength" category: | |
* | |
* TA_StringTable *table; | |
* TA_RetCode retCode; | |
* int i; | |
* | |
* retCode = TA_FuncTableAlloc( "Market Strength", &table ); | |
* | |
* if( retCode == TA_SUCCESS ) | |
* { | |
* for( i=0; i < table->size; i++ ) | |
* printf( "%s\n", table->string[i] ); | |
* | |
* TA_FuncTableFree( table ); | |
* } | |
*/ | |
TA_RetCode TA_FuncTableAlloc( const char *group, TA_StringTable **table ); | |
TA_RetCode TA_FuncTableFree ( TA_StringTable *table ); | |
/* Using the name, you can obtain an handle unique to this function. | |
* This handle is further used for obtaining information on the | |
* parameters needed and also for potentially calling this TA function. | |
* | |
* For convenience, this handle can also be found in | |
* the TA_FuncInfo structure (see below). | |
*/ | |
typedef unsigned int TA_FuncHandle; | |
TA_RetCode TA_GetFuncHandle( const char *name, | |
const TA_FuncHandle **handle ); | |
/* Get some basic information about a function. | |
* | |
* A const pointer will be set on the corresponding TA_FuncInfo structure. | |
* The whole structure are hard coded constants and it can be assumed they | |
* will not change at runtime. | |
* | |
* Example: | |
* Print the number of inputs used by the MA (moving average) function. | |
* | |
* TA_RetCode retCode; | |
* TA_FuncHandle *handle; | |
* const TA_FuncInfo *theInfo; | |
* | |
* retCode = TA_GetFuncHandle( "MA", &handle ); | |
* | |
* if( retCode == TA_SUCCESS ) | |
* { | |
* retCode = TA_GetFuncInfo( handle, &theInfo ); | |
* if( retCode == TA_SUCCESS ) | |
* printf( "Nb Input = %d\n", theInfo->nbInput ); | |
* } | |
* | |
*/ | |
typedef int TA_FuncFlags; | |
typedef struct TA_FuncInfo | |
{ | |
/* Constant information about the function. The | |
* information found in this structure is guarantee | |
* to not change at runtime. | |
*/ | |
const char * name; | |
const char * group; | |
const char * hint; | |
const char * camelCaseName; | |
TA_FuncFlags flags; | |
unsigned int nbInput; | |
unsigned int nbOptInput; | |
unsigned int nbOutput; | |
const TA_FuncHandle *handle; | |
} TA_FuncInfo; | |
TA_RetCode TA_GetFuncInfo( const TA_FuncHandle *handle, | |
const TA_FuncInfo **funcInfo ); | |
/* An alternate way to access all the functions is through the | |
* use of the TA_ForEachFunc(). You can setup a function to be | |
* call back for each TA function in the TA-Lib. | |
* | |
* Example: | |
* This code will print the group and name of all available functions. | |
* | |
* void printFuncInfo( const TA_FuncInfo *funcInfo, void *opaqueData ) | |
* { | |
* printf( "Group=%s Name=%s\n", funcInfo->group, funcInfo->name ); | |
* } | |
* | |
* void displayListOfTAFunctions( void ) | |
* { | |
* TA_ForEachFunc( printFuncInfo, NULL ); | |
* } | |
*/ | |
typedef void (*TA_CallForEachFunc)(const TA_FuncInfo *funcInfo, void *opaqueData ); | |
TA_RetCode TA_ForEachFunc( TA_CallForEachFunc functionToCall, void *opaqueData ); | |
/* The next section includes the data structures and function allowing to | |
* proceed with the call of a Tech. Analysis function. | |
* | |
* At first, it may seems a little bit complicated, but it is worth to take the | |
* effort to learn about it. Once you succeed to interface with TA-Abstract you get | |
* access to the complete library of TA functions at once without further effort. | |
*/ | |
/* Structures representing extended information on a parameter. */ | |
typedef struct TA_RealRange | |
{ | |
TA_Real min; | |
TA_Real max; | |
TA_Integer precision; /* nb of digit after the '.' */ | |
/* The following suggested value are used by Tech. Analysis software | |
* doing parameter "optimization". Can be ignored by most user. | |
*/ | |
TA_Real suggested_start; | |
TA_Real suggested_end; | |
TA_Real suggested_increment; | |
} TA_RealRange; | |
typedef struct TA_IntegerRange | |
{ | |
TA_Integer min; | |
TA_Integer max; | |
/* The following suggested value are used by Tech. Analysis software | |
* doing parameter "optimization". Can be ignored by most user. | |
*/ | |
TA_Integer suggested_start; | |
TA_Integer suggested_end; | |
TA_Integer suggested_increment; | |
} TA_IntegerRange; | |
typedef struct TA_RealDataPair | |
{ | |
/* A TA_Real value and the corresponding string. */ | |
TA_Real value; | |
const char *string; | |
} TA_RealDataPair; | |
typedef struct TA_IntegerDataPair | |
{ | |
/* A TA_Integer value and the corresponding string. */ | |
TA_Integer value; | |
const char *string; | |
} TA_IntegerDataPair; | |
typedef struct TA_RealList | |
{ | |
const TA_RealDataPair *data; | |
unsigned int nbElement; | |
} TA_RealList; | |
typedef struct TA_IntegerList | |
{ | |
const TA_IntegerDataPair *data; | |
unsigned int nbElement; | |
} TA_IntegerList; | |
typedef enum | |
{ | |
TA_Input_Price, | |
TA_Input_Real, | |
TA_Input_Integer | |
} TA_InputParameterType; | |
typedef enum | |
{ | |
TA_OptInput_RealRange, | |
TA_OptInput_RealList, | |
TA_OptInput_IntegerRange, | |
TA_OptInput_IntegerList | |
} TA_OptInputParameterType; | |
typedef enum | |
{ | |
TA_Output_Real, | |
TA_Output_Integer | |
} TA_OutputParameterType; | |
/* When the input is a TA_Input_Price, the following | |
* TA_InputFlags indicates the required components. | |
* These can be combined for functions requiring more | |
* than one component. | |
* | |
* Example: | |
* (TA_IN_PRICE_OPEN|TA_IN_PRICE_HIGH) | |
* Indicates that the functions requires two inputs | |
* that must be specifically the open and the high. | |
*/ | |
typedef int TA_InputFlags; | |
/* The following are flags for optional inputs. | |
* | |
* TA_OPTIN_IS_PERCENT: Input is a percentage. | |
* | |
* TA_OPTIN_IS_DEGREE: Input is a degree (0-360). | |
* | |
* TA_OPTIN_IS_CURRENCY: Input is a currency. | |
* | |
* TA_OPTIN_ADVANCED: | |
* Used for parameters who are rarely changed. | |
* Most application can hide these advanced optional inputs to their | |
* end-user (or make it harder to change). | |
*/ | |
typedef int TA_OptInputFlags; | |
/* The following are flags giving hint on what | |
* could be done with the output. | |
*/ | |
typedef int TA_OutputFlags; | |
/* The following 3 structures will exist for each input, optional | |
* input and output. | |
* | |
* These structures tells you everything you need to know for identifying | |
* the parameters applicable to the function. | |
*/ | |
typedef struct TA_InputParameterInfo | |
{ | |
TA_InputParameterType type; | |
const char *paramName; | |
TA_InputFlags flags; | |
} TA_InputParameterInfo; | |
typedef struct TA_OptInputParameterInfo | |
{ | |
TA_OptInputParameterType type; | |
const char *paramName; | |
TA_OptInputFlags flags; | |
const char *displayName; | |
const void *dataSet; | |
TA_Real defaultValue; | |
const char *hint; | |
const char *helpFile; | |
} TA_OptInputParameterInfo; | |
typedef struct TA_OutputParameterInfo | |
{ | |
TA_OutputParameterType type; | |
const char *paramName; | |
TA_OutputFlags flags; | |
} TA_OutputParameterInfo; | |
/* Functions to get a const ptr on the "TA_XXXXXXParameterInfo". | |
* Max value for the 'paramIndex' can be found in the TA_FuncInfo structure. | |
* The 'handle' can be obtained from TA_GetFuncHandle or from a TA_FuncInfo. | |
* | |
* Short example: | |
* | |
* void displayInputType( const TA_FuncInfo *funcInfo ) | |
* { | |
* unsigned int i; | |
* const TA_InputParameterInfo *paramInfo; | |
* | |
* for( i=0; i < funcInfo->nbInput; i++ ) | |
* { | |
* TA_GetInputParameterInfo( funcInfo->handle, i, ¶mInfo ); | |
* switch( paramInfo->type ) | |
* { | |
* case TA_Input_Price: | |
* printf( "This function needs price bars as input\n" ); | |
* break; | |
* case TA_Input_Real: | |
* printf( "This function needs an array of floats as input\n" ); | |
* break; | |
* (... etc. ...) | |
* } | |
* } | |
* } | |
*/ | |
TA_RetCode TA_GetInputParameterInfo( const TA_FuncHandle *handle, | |
unsigned int paramIndex, | |
const TA_InputParameterInfo **info ); | |
TA_RetCode TA_GetOptInputParameterInfo( const TA_FuncHandle *handle, | |
unsigned int paramIndex, | |
const TA_OptInputParameterInfo **info ); | |
TA_RetCode TA_GetOutputParameterInfo( const TA_FuncHandle *handle, | |
unsigned int paramIndex, | |
const TA_OutputParameterInfo **info ); | |
/* Alloc a structure allowing to build the list of parameters | |
* for doing a call. | |
* | |
* All input and output parameters must be setup. If not, TA_BAD_PARAM | |
* will be returned when TA_CallFunc is called. | |
* | |
* The optional input are not required to be setup. A default value | |
* will always be used in that case. | |
* | |
* If there is an attempts to set a parameter with the wrong function | |
* (and thus the wrong type), TA_BAD_PARAM will be immediatly returned. | |
* | |
* Although this mechanism looks complicated, it is written for being fairly solid. | |
* If you provide a wrong parameter value, or wrong type, or wrong pointer etc. the | |
* library shall return TA_BAD_PARAM or TA_BAD_OBJECT and not hang. | |
*/ | |
typedef struct TA_ParamHolder | |
{ | |
/* Implementation is hidden. */ | |
void *hiddenData; | |
} TA_ParamHolder; | |
TA_RetCode TA_ParamHolderAlloc( const TA_FuncHandle *handle, | |
TA_ParamHolder **allocatedParams ); | |
TA_RetCode TA_ParamHolderFree( TA_ParamHolder *params ); | |
/* Setup the values of the data input parameters. | |
* | |
* paramIndex is zero for the first input. | |
*/ | |
TA_RetCode TA_SetInputParamIntegerPtr( TA_ParamHolder *params, | |
unsigned int paramIndex, | |
const TA_Integer *value ); | |
TA_RetCode TA_SetInputParamRealPtr( TA_ParamHolder *params, | |
unsigned int paramIndex, | |
const TA_Real *value ); | |
TA_RetCode TA_SetInputParamPricePtr( TA_ParamHolder *params, | |
unsigned int paramIndex, | |
const TA_Real *open, | |
const TA_Real *high, | |
const TA_Real *low, | |
const TA_Real *close, | |
const TA_Real *volume, | |
const TA_Real *openInterest ); | |
/* Setup the values of the optional input parameters. | |
* If an optional input is not set, a default value will be used. | |
* | |
* paramIndex is zero for the first optional input. | |
*/ | |
TA_RetCode TA_SetOptInputParamInteger( TA_ParamHolder *params, | |
unsigned int paramIndex, | |
TA_Integer optInValue ); | |
TA_RetCode TA_SetOptInputParamReal( TA_ParamHolder *params, | |
unsigned int paramIndex, | |
TA_Real optInValue ); | |
/* Setup the parameters indicating where to store the output. | |
* | |
* The caller is responsible to allocate sufficient memory. A safe bet is to | |
* always do: nb of output elements == (endIdx-startIdx+1) | |
* | |
* paramIndex is zero for the first output. | |
* | |
*/ | |
TA_RetCode TA_SetOutputParamIntegerPtr( TA_ParamHolder *params, | |
unsigned int paramIndex, | |
TA_Integer *out ); | |
TA_RetCode TA_SetOutputParamRealPtr( TA_ParamHolder *params, | |
unsigned int paramIndex, | |
TA_Real *out ); | |
/* Once the optional parameter are set, it is possible to | |
* get the lookback for this call. This information can be | |
* used to calculate the optimal size for the output buffers. | |
* (See the documentation for method to calculate the output size). | |
*/ | |
TA_RetCode TA_GetLookback( const TA_ParamHolder *params, | |
TA_Integer *lookback ); | |
/* Finally, call the TA function with the parameters. | |
* | |
* The TA function who is going to be called was specified | |
* when the TA_ParamHolderAlloc was done. | |
*/ | |
TA_RetCode TA_CallFunc( const TA_ParamHolder *params, | |
TA_Integer startIdx, | |
TA_Integer endIdx, | |
TA_Integer *outBegIdx, | |
TA_Integer *outNbElement ); | |
/* Return XML representation of all the TA functions. | |
* The returned array is the same as the ta_func_api.xml file. | |
*/ | |
const char *TA_FunctionDescriptionXML( void ); | |
} | |