/* 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. */ #ifndef TA_ABSTRACT_H #define TA_ABSTRACT_H #ifndef TA_COMMON_H #include "ta_common.h" #endif #ifdef __cplusplus extern "C" { #endif /* 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; #define TA_FUNC_FLG_OVERLAP 0x01000000 /* Output scale same as input data. */ #define TA_FUNC_FLG_VOLUME 0x04000000 /* Output shall be over the volume data. */ #define TA_FUNC_FLG_UNST_PER 0x08000000 /* Indicate if this function have an unstable * initial period. Some additional code exist * for these functions for allowing to set that * unstable period. See Documentation. */ #define TA_FUNC_FLG_CANDLESTICK 0x10000000 /* Output shall be a candlestick */ 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; #define TA_IN_PRICE_OPEN 0x00000001 #define TA_IN_PRICE_HIGH 0x00000002 #define TA_IN_PRICE_LOW 0x00000004 #define TA_IN_PRICE_CLOSE 0x00000008 #define TA_IN_PRICE_VOLUME 0x00000010 #define TA_IN_PRICE_OPENINTEREST 0x00000020 #define TA_IN_PRICE_TIMESTAMP 0x00000040 /* 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; #define TA_OPTIN_IS_PERCENT 0x00100000 /* Input is a percentage. */ #define TA_OPTIN_IS_DEGREE 0x00200000 /* Input is a degree (0-360). */ #define TA_OPTIN_IS_CURRENCY 0x00400000 /* Input is a currency. */ #define TA_OPTIN_ADVANCED 0x01000000 /* The following are flags giving hint on what * could be done with the output. */ typedef int TA_OutputFlags; #define TA_OUT_LINE 0x00000001 /* Suggest to display as a connected line. */ #define TA_OUT_DOT_LINE 0x00000002 /* Suggest to display as a 'dotted' line. */ #define TA_OUT_DASH_LINE 0x00000004 /* Suggest to display as a 'dashed' line. */ #define TA_OUT_DOT 0x00000008 /* Suggest to display with dots only. */ #define TA_OUT_HISTO 0x00000010 /* Suggest to display as an histogram. */ #define TA_OUT_PATTERN_BOOL 0x00000020 /* Indicates if pattern exists (!=0) or not (0) */ #define TA_OUT_PATTERN_BULL_BEAR 0x00000040 /* =0 no pattern, > 0 bullish, < 0 bearish */ #define TA_OUT_PATTERN_STRENGTH 0x00000080 /* =0 neutral, ]0..100] getting bullish, ]100..200] bullish, [-100..0[ getting bearish, [-200..100[ bearish */ #define TA_OUT_POSITIVE 0x00000100 /* Output can be positive */ #define TA_OUT_NEGATIVE 0x00000200 /* Output can be negative */ #define TA_OUT_ZERO 0x00000400 /* Output can be zero */ #define TA_OUT_UPPER_LIMIT 0x00000800 /* Indicates that the values represent an upper limit. */ #define TA_OUT_LOWER_LIMIT 0x00001000 /* Indicates that the values represent a lower limit. */ /* 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 ); #ifdef __cplusplus } #endif #endif