C++ & ta_lib - 无法弄清楚如何使用TA_MACD函数
C++ & ta_lib - cannot work out how to use TA_MACD function
这是我的第一个c++程序,我对c也不是很熟悉,所以请对我温柔!
我试图从ta_lib库调用TA_MACD函数,但没有成功。有人能帮我一下吗?
我的代码是:
#include <iostream>
#include "ta_libc.h"
using namespace std;
void go(const TA_Real *array[], TA_Integer fastPeriod, TA_Integer slowPeriod, TA_Integer signalPeriod);
struct Struct_Macd
{
double Macd;
double Signal;
double Histogram;
} MacdResult;
int main(int argc, char**argv)
{
TA_Real close_data[]={1.09999000,1.09995000,1.09996000,1.09995000,1.09994000,1.09993000,1.09994000,1.09996000,
1.09997000,1.09999000,1.10000000,1.09999000,1.10000000,1.09998000,1.09999000,1.09998000,
1.09999000,1.10000000,1.10001000,1.10002000,1.10003000,1.10004000,1.10003000,1.10004000,
1.10003000,1.10004000,1.10003000,1.10004000,1.10005000,1.10006000,1.10007000,1.10008000,
1.10012000,1.10011000,1.10012000,1.10011000,1.10013000,1.10014000,1.10016000,1.10015000,
1.10016000,1.10015000,1.10016000,1.10017000,1.10018000,1.10019000,1.10018000,1.10017000,
1.10018000,1.10017000,1.10018000,1.10017000,1.10016000,1.10014000,1.10013000,1.10015000,
1.10014000,1.10015000,1.10014000,1.10013000,1.10012000,1.10011000,1.10010000,1.10011000,
1.10010000,1.10011000,1.10010000,1.10011000,1.10010000,1.10009000,1.10008000,1.10007000,
1.10008000,1.10007000,1.10008000,1.10007000,1.10008000,1.10007000,1.10006000,1.10004000,
1.10003000,1.10002000,1.10007000,1.10008000,1.10007000,1.10008000,1.10009000,1.10008000,
1.10009000,1.10008000,1.10009000,1.10008000,1.10009000,1.10008000,1.10007000,1.10008000,
1.10007000,1.10006000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,1.10011000,
1.10012000,1.10013000,1.10014000,1.10015000,1.10016000,1.10015000,1.10016000,1.10015000,
1.10016000,1.10015000,1.10016000,1.10015000,1.10016000,1.10015000,1.10016000,1.10017000,
1.10018000,1.10019000,1.10020000,1.10019000,1.10020000,1.10019000,1.10018000,1.10019000,
1.10017000,1.10018000,1.10017000,1.10018000,1.10017000,1.10018000,1.10017000,1.10019000,
1.10018000,1.10019000,1.10018000,1.10019000,1.10018000,1.10019000,1.10017000,1.10018000,
1.10016000,1.10017000,1.10016000,1.10015000,1.10011000,1.10013000,1.10014000,1.10013000,
1.10014000,1.10013000,1.10015000,1.10014000,1.10015000,1.10016000,1.10015000,1.10014000,
1.10013000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,
1.10011000,1.10012000,1.10011000,1.10010000,1.10009000,1.10008000,1.10007000,1.10006000,
1.10007000,1.10006000,1.10007000,1.10008000,1.10007000,1.10008000,1.10007000,1.10006000,
1.10005000,1.10004000,1.10003000,1.10002000,1.10001000,1.10002000,1.10001000,1.10003000,
1.10002000,1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10002000,1.10003000,
1.10002000,1.10003000,1.10004000,1.10005000,1.10006000,1.10014000,1.10009000,1.10008000,
1.10009000,1.10008000,1.10007000,1.10006000,1.10005000,1.10004000,1.10003000,1.10004000,
1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10002000,
1.10001000,1.10000000,1.09999000,1.09998000,1.09997000,1.09998000,1.09997000,1.09999000,
1.09998000,1.10000000,1.09999000,1.10000000,1.09999000,1.10000000,1.09999000,1.09998000,
1.09999000,1.09998000,1.09999000,1.10000000,1.10001000,1.10002000,1.10006000,1.10004000,
1.10002000,1.10003000,1.10004000,1.10003000,1.10001000,1.10000000,1.09998000,1.09999000,
1.09998000,1.09999000,1.09997000};
go(close_data,12,26,9);
return 0;
}
void go(const TA_Real *array[], TA_Integer fastPeriod, TA_Integer slowPeriod, TA_Integer signalPeriod) {
TA_Integer outBegin = 0, outElements = 0;
TA_Real outMacd[];
TA_Real outSignal[];
TA_Real outHistogram[];
TA_RetCode retCode = TA_MACD( (sizeof(array)/sizeof(*array))-1-slowPeriod, (sizeof(array)/sizeof(*array))-1, array, fastPeriod, slowPeriod, signalPeriod, &outBegin, &outElements, outMacd, outSignal, outHistogram );
if(retCode == TA_SUCCESS)
{
int lastElement = outElements-1;
MacdResult.Macd = outMacd[lastElement];
MacdResult.Signal = outSignal[lastElement];
MacdResult.Histogram = outHistogram[lastElement];
cout << "Macd = " << MacdResult.Macd << " Signal = " << MacdResult.Signal << " Histograme = " << MacdResult.Histogram << endl;
}
}
当我使用MinGW编译时,我得到以下错误:
"/C/MinGW/msys/1.0/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make.exe[1]: Entering directory `/c/Users/ypx7647/Documents/NetBeansProjects/TA_MACD Example'
"/C/MinGW/msys/1.0/bin/make.exe" -f nbproject/Makefile-Debug.mk dist/Debug/MinGW-Windows/ta_macd_example.exe
make.exe[2]: Entering directory `/c/Users/ypx7647/Documents/NetBeansProjects/TA_MACD Example'
mkdir -p build/Debug/MinGW-Windows
rm -f "build/Debug/MinGW-Windows/io.o.d"
g++ -c -g -I/C/ta-lib-0.4.0-msvc/ta-lib/c/include -MMD -MP -MF "build/Debug/MinGW-Windows/io.o.d" -o build/Debug/MinGW-Windows/io.o io.cpp
io.cpp: In function `int main(int, char**)':
io.cpp:51: error: cannot convert `TA_Real*' to `const TA_Real**' for argument `1' to `void go(const TA_Real**, TA_Integer, TA_Integer, TA_Integer)'
io.cpp: In function `void go(const TA_Real**, TA_Integer, TA_Integer, TA_Integer)':
io.cpp:57: error: storage size of `outMacd' isn't known
io.cpp:58: error: storage size of `outSignal' isn't known
io.cpp:59: error: storage size of `outHistogram' isn't known
io.cpp:61: error: cannot convert `const TA_Real**' to `const double*' for argument `3' to `TA_RetCode TA_MACD(int, int, const double*, int, int, int, int*, int*, double*, double*, double*)'
make.exe[2]: *** [build/Debug/MinGW-Windows/io.o] Error 1
make.exe[2]: Leaving directory `/c/Users/ypx7647/Documents/NetBeansProjects/TA_MACD Example'
make.exe[1]: *** [.build-conf] Error 2
make.exe[1]: Leaving directory `/c/Users/ypx7647/Documents/NetBeansProjects/TA_MACD Example'
make.exe": *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 10s)
我会第一个承认我不知道我在做什么,所以任何帮助都会很感激。
另外,当我不知道TA_MACD函数返回多少时,我如何设置输出变量的大小?
提前感谢。
使用c++ 11 Std修改后,我现在在这里,仍然有问题。
#include <iostream>
#include <array>
#include "ta_libc.h"
using namespace std;
struct Struct_Macd
{
double Macd;
double Signal;
double Histogram;
} MacdResult;
void go(TA_Real *close, const int array_size, TA_Integer fastPeriod, TA_Integer slowPeriod, TA_Integer signalPeriod)
{
TA_Integer outBegin = 0, outElements = 0;
array<TA_Real, array_size-1> outMacd;
array<TA_Real, array_size-1> outSignal;
array<TA_Real, array_size-1> outHistogram;
TA_RetCode retCode = TA_MACD( array_size-1-slowPeriod, array_size-1, close, fastPeriod, slowPeriod, signalPeriod, &outBegin, &outElements, outMacd, outSignal, outHistogram );
if(retCode == TA_SUCCESS)
{
int lastElement = outElements-1;
MacdResult.Macd = outMacd[lastElement];
MacdResult.Signal = outSignal[lastElement];
MacdResult.Histogram = outHistogram[lastElement];
cout << "Macd = " << MacdResult.Macd << " Signal = " << MacdResult.Signal << " Histograme = " << MacdResult.Histogram << endl;
}
}
int main(int argc, char**argv)
{
array<TA_Real,259> close_data={1.09999000,1.09995000,1.09996000,1.09995000,1.09994000,1.09993000,1.09994000,1.09996000,
1.09997000,1.09999000,1.10000000,1.09999000,1.10000000,1.09998000,1.09999000,1.09998000,
1.09999000,1.10000000,1.10001000,1.10002000,1.10003000,1.10004000,1.10003000,1.10004000,
1.10003000,1.10004000,1.10003000,1.10004000,1.10005000,1.10006000,1.10007000,1.10008000,
1.10012000,1.10011000,1.10012000,1.10011000,1.10013000,1.10014000,1.10016000,1.10015000,
1.10016000,1.10015000,1.10016000,1.10017000,1.10018000,1.10019000,1.10018000,1.10017000,
1.10018000,1.10017000,1.10018000,1.10017000,1.10016000,1.10014000,1.10013000,1.10015000,
1.10014000,1.10015000,1.10014000,1.10013000,1.10012000,1.10011000,1.10010000,1.10011000,
1.10010000,1.10011000,1.10010000,1.10011000,1.10010000,1.10009000,1.10008000,1.10007000,
1.10008000,1.10007000,1.10008000,1.10007000,1.10008000,1.10007000,1.10006000,1.10004000,
1.10003000,1.10002000,1.10007000,1.10008000,1.10007000,1.10008000,1.10009000,1.10008000,
1.10009000,1.10008000,1.10009000,1.10008000,1.10009000,1.10008000,1.10007000,1.10008000,
1.10007000,1.10006000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,1.10011000,
1.10012000,1.10013000,1.10014000,1.10015000,1.10016000,1.10015000,1.10016000,1.10015000,
1.10016000,1.10015000,1.10016000,1.10015000,1.10016000,1.10015000,1.10016000,1.10017000,
1.10018000,1.10019000,1.10020000,1.10019000,1.10020000,1.10019000,1.10018000,1.10019000,
1.10017000,1.10018000,1.10017000,1.10018000,1.10017000,1.10018000,1.10017000,1.10019000,
1.10018000,1.10019000,1.10018000,1.10019000,1.10018000,1.10019000,1.10017000,1.10018000,
1.10016000,1.10017000,1.10016000,1.10015000,1.10011000,1.10013000,1.10014000,1.10013000,
1.10014000,1.10013000,1.10015000,1.10014000,1.10015000,1.10016000,1.10015000,1.10014000,
1.10013000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,
1.10011000,1.10012000,1.10011000,1.10010000,1.10009000,1.10008000,1.10007000,1.10006000,
1.10007000,1.10006000,1.10007000,1.10008000,1.10007000,1.10008000,1.10007000,1.10006000,
1.10005000,1.10004000,1.10003000,1.10002000,1.10001000,1.10002000,1.10001000,1.10003000,
1.10002000,1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10002000,1.10003000,
1.10002000,1.10003000,1.10004000,1.10005000,1.10006000,1.10014000,1.10009000,1.10008000,
1.10009000,1.10008000,1.10007000,1.10006000,1.10005000,1.10004000,1.10003000,1.10004000,
1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10002000,
1.10001000,1.10000000,1.09999000,1.09998000,1.09997000,1.09998000,1.09997000,1.09999000,
1.09998000,1.10000000,1.09999000,1.10000000,1.09999000,1.10000000,1.09999000,1.09998000,
1.09999000,1.09998000,1.09999000,1.10000000,1.10001000,1.10002000,1.10006000,1.10004000,
1.10002000,1.10003000,1.10004000,1.10003000,1.10001000,1.10000000,1.09998000,1.09999000,
1.09998000,1.09999000,1.09997000};
go(close_data,close_data.size(),12,26,9);
return 0;
}
输出:
||=== Build: Debug in Test (compiler: GNU GCC Compiler) ===|
C:Usersypx7647DocumentsC++Testmain.cpp||In function 'void go(TA_Real*, int, TA_Integer, TA_Integer, TA_Integer)':|
C:Usersypx7647DocumentsC++Testmain.cpp|17|error: 'array_size' is not a constant expression|
C:Usersypx7647DocumentsC++Testmain.cpp|17|note: in template argument for type 'unsigned int' |
C:Usersypx7647DocumentsC++Testmain.cpp|17|error: invalid type in declaration before ';' token|
C:Usersypx7647DocumentsC++Testmain.cpp|18|error: 'array_size' is not a constant expression|
C:Usersypx7647DocumentsC++Testmain.cpp|18|note: in template argument for type 'unsigned int' |
C:Usersypx7647DocumentsC++Testmain.cpp|18|error: invalid type in declaration before ';' token|
C:Usersypx7647DocumentsC++Testmain.cpp|19|error: 'array_size' is not a constant expression|
C:Usersypx7647DocumentsC++Testmain.cpp|19|note: in template argument for type 'unsigned int' |
C:Usersypx7647DocumentsC++Testmain.cpp|19|error: invalid type in declaration before ';' token|
C:Usersypx7647DocumentsC++Testmain.cpp|21|error: invalid conversion from 'int' to 'double*' [-fpermissive]|
..........ta-lib-0.4.0-msvcta-libcincludeta_func.h|3242|error: initializing argument 9 of 'TA_RetCode TA_MACD(int, int, const double*, int, int, int, int*, int*, double*, double*, double*)' [-fpermissive]|
C:Usersypx7647DocumentsC++Testmain.cpp|21|error: invalid conversion from 'int' to 'double*' [-fpermissive]|
..........ta-lib-0.4.0-msvcta-libcincludeta_func.h|3242|error: initializing argument 10 of 'TA_RetCode TA_MACD(int, int, const double*, int, int, int, int*, int*, double*, double*, double*)' [-fpermissive]|
C:Usersypx7647DocumentsC++Testmain.cpp|21|error: invalid conversion from 'int' to 'double*' [-fpermissive]|
..........ta-lib-0.4.0-msvcta-libcincludeta_func.h|3242|error: initializing argument 11 of 'TA_RetCode TA_MACD(int, int, const double*, int, int, int, int*, int*, double*, double*, double*)' [-fpermissive]|
C:Usersypx7647DocumentsC++Testmain.cpp|26|error: invalid types 'int[int]' for array subscript|
C:Usersypx7647DocumentsC++Testmain.cpp|27|error: invalid types 'int[int]' for array subscript|
C:Usersypx7647DocumentsC++Testmain.cpp|28|error: invalid types 'int[int]' for array subscript|
C:Usersypx7647DocumentsC++Testmain.cpp||In function 'int main(int, char**)':|
C:Usersypx7647DocumentsC++Testmain.cpp|70|error: cannot convert 'std::array<double, 259u>' to 'TA_Real* {aka double*}' for argument '1' to 'void go(TA_Real*, int, TA_Integer, TA_Integer, TA_Integer)'|
||=== Build failed: 16 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
在做了修改和改编建议后,我的代码现在是:
#include <iostream>
#include <vector>
#include "ta_libc.h"
using namespace std;
struct Struct_Macd
{
double Macd;
double Signal;
double Histogram;
} MacdResult;
void go(const vector<TA_Real> &close, TA_Integer fastPeriod, TA_Integer slowPeriod, TA_Integer signalPeriod)
{
TA_Integer outBegin = 0, outElements = 0;
int beginIndx = close.size()-1-slowPeriod;
int endIndx = close.size()-1;
int array_size = endIndx - beginIndx + 1;
vector<TA_Real> outMacd(array_size, 0.0);
vector<TA_Real> outSignal(array_size, 0.0);
vector<TA_Real> outHistogram(array_size, 0.0);
const TA_Real* close_c_pointer = close.data();
TA_Real* outMacd_c_pointer = outMacd.data();
TA_Real* outSignal_c_pointer = outMacd.data();
TA_Real* outHistogram_c_pointer = outMacd.data();
TA_RetCode retCode = TA_MACD( beginIndx, endIndx, close_c_pointer, fastPeriod, slowPeriod, signalPeriod, &outBegin, &outElements, outMacd_c_pointer, outSignal_c_pointer, outHistogram_c_pointer );
if(retCode == TA_SUCCESS)
{
int lastElement = outElements-1;
MacdResult.Macd = outMacd[lastElement];
MacdResult.Signal = outSignal[lastElement];
MacdResult.Histogram = outHistogram[lastElement];
cout << "Macd = " << MacdResult.Macd << " Signal = " << MacdResult.Signal << " Histograme = " << MacdResult.Histogram << endl;
}
}
int main(int argc, char**argv)
{
vector<TA_Real> close_data {1.09999000,1.09995000,1.09996000,1.09995000,1.09994000,1.09993000,1.09994000,1.09996000,
1.09997000,1.09999000,1.10000000,1.09999000,1.10000000,1.09998000,1.09999000,1.09998000,
1.09999000,1.10000000,1.10001000,1.10002000,1.10003000,1.10004000,1.10003000,1.10004000,
1.10003000,1.10004000,1.10003000,1.10004000,1.10005000,1.10006000,1.10007000,1.10008000,
1.10012000,1.10011000,1.10012000,1.10011000,1.10013000,1.10014000,1.10016000,1.10015000,
1.10016000,1.10015000,1.10016000,1.10017000,1.10018000,1.10019000,1.10018000,1.10017000,
1.10018000,1.10017000,1.10018000,1.10017000,1.10016000,1.10014000,1.10013000,1.10015000,
1.10014000,1.10015000,1.10014000,1.10013000,1.10012000,1.10011000,1.10010000,1.10011000,
1.10010000,1.10011000,1.10010000,1.10011000,1.10010000,1.10009000,1.10008000,1.10007000,
1.10008000,1.10007000,1.10008000,1.10007000,1.10008000,1.10007000,1.10006000,1.10004000,
1.10003000,1.10002000,1.10007000,1.10008000,1.10007000,1.10008000,1.10009000,1.10008000,
1.10009000,1.10008000,1.10009000,1.10008000,1.10009000,1.10008000,1.10007000,1.10008000,
1.10007000,1.10006000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,1.10011000,
1.10012000,1.10013000,1.10014000,1.10015000,1.10016000,1.10015000,1.10016000,1.10015000,
1.10016000,1.10015000,1.10016000,1.10015000,1.10016000,1.10015000,1.10016000,1.10017000,
1.10018000,1.10019000,1.10020000,1.10019000,1.10020000,1.10019000,1.10018000,1.10019000,
1.10017000,1.10018000,1.10017000,1.10018000,1.10017000,1.10018000,1.10017000,1.10019000,
1.10018000,1.10019000,1.10018000,1.10019000,1.10018000,1.10019000,1.10017000,1.10018000,
1.10016000,1.10017000,1.10016000,1.10015000,1.10011000,1.10013000,1.10014000,1.10013000,
1.10014000,1.10013000,1.10015000,1.10014000,1.10015000,1.10016000,1.10015000,1.10014000,
1.10013000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,
1.10011000,1.10012000,1.10011000,1.10010000,1.10009000,1.10008000,1.10007000,1.10006000,
1.10007000,1.10006000,1.10007000,1.10008000,1.10007000,1.10008000,1.10007000,1.10006000,
1.10005000,1.10004000,1.10003000,1.10002000,1.10001000,1.10002000,1.10001000,1.10003000,
1.10002000,1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10002000,1.10003000,
1.10002000,1.10003000,1.10004000,1.10005000,1.10006000,1.10014000,1.10009000,1.10008000,
1.10009000,1.10008000,1.10007000,1.10006000,1.10005000,1.10004000,1.10003000,1.10004000,
1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10002000,
1.10001000,1.10000000,1.09999000,1.09998000,1.09997000,1.09998000,1.09997000,1.09999000,
1.09998000,1.10000000,1.09999000,1.10000000,1.09999000,1.10000000,1.09999000,1.09998000,
1.09999000,1.09998000,1.09999000,1.10000000,1.10001000,1.10002000,1.10006000,1.10004000,
1.10002000,1.10003000,1.10004000,1.10003000,1.10001000,1.10000000,1.09998000,1.09999000,
1.09998000,1.09999000,1.09997000};
go(close_data,12,26,9);
return 0;
}
我想我现在有一个链接错误:
-------------- Build: Debug in Test (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -Wall -fexceptions -std=c++11 -g -I..........ta-lib-0.4.0-msvcta-libcinclude -c C:Usersypx7647DocumentsC++Testmain.cpp -o objDebugmain.o
mingw32-g++.exe -o binDebugTest.exe objDebugmain.o
objDebugmain.o: In function `Z2goRSt6vectorIdSaIdEEiii':
C:/Users/ypx7647/Documents/C++/Test/main.cpp:30: undefined reference to `TA_MACD'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 4 second(s))
1 error(s), 0 warning(s) (0 minute(s), 4 second(s))
到底是什么函数"Z2goRSt6vectorIdSaIdEEiii"????
好了,程序现在编译并链接了,但是输出结果为0。什么好主意吗?
这是我最新的代码:
#include <iostream>
#include <vector>
#include "ta_libc.h"
using namespace std;
struct Struct_Macd
{
double Macd;
double Signal;
double Histogram;
} MacdResult;
void go(const vector<TA_Real> &close, TA_Integer fastPeriod, TA_Integer slowPeriod, TA_Integer signalPeriod)
{
TA_Integer outBegin = 0, outElements = 0;
int beginIndx = close.size()-slowPeriod-1;
int endIndx = close.size();
int array_size = endIndx - beginIndx + 1;
cout << "beginIndx = " << beginIndx << endl << "endIndx = " << endIndx << endl << "array_size = " << array_size << endl;
vector<TA_Real> outMacd(array_size, 0.0);
vector<TA_Real> outSignal(array_size, 0.0);
vector<TA_Real> outHistogram(array_size, 0.0);
const TA_Real* close_c_pointer = close.data();
TA_Real* outMacd_c_pointer = outMacd.data();
TA_Real* outSignal_c_pointer = outMacd.data();
TA_Real* outHistogram_c_pointer = outMacd.data();
TA_RetCode retCode = TA_MACD( beginIndx, endIndx, close_c_pointer, fastPeriod, slowPeriod, signalPeriod, &outBegin, &outElements, outMacd_c_pointer, outSignal_c_pointer, outHistogram_c_pointer );
cout << "retCode = " << retCode << endl;
if(retCode == TA_SUCCESS)
{
cout << "outBegin = " << outBegin << " outElements = " << outElements << endl;
int lastElement = outElements-1;
cout << "outMacd.at(lastElement) = " << outMacd.at(lastElement) << " outSignal.at(lastElement) = " << outSignal.at(lastElement) << " outHistogram.at(lastElement) = " << outHistogram.at(lastElement) << endl;
MacdResult.Macd = outMacd.at(lastElement);
MacdResult.Signal = outSignal.at(lastElement);
MacdResult.Histogram = outHistogram.at(lastElement);
cout << "Macd = " << MacdResult.Macd << " Signal = " << MacdResult.Signal << " Histogram = " << MacdResult.Histogram << endl;
}
}
int main(int argc, char**argv)
{
vector<TA_Real> close_data {1.09999000,1.09995000,1.09996000,1.09995000,1.09994000,1.09993000,1.09994000,1.09996000,
1.09997000,1.09999000,1.10000000,1.09999000,1.10000000,1.09998000,1.09999000,1.09998000,
1.09999000,1.10000000,1.10001000,1.10002000,1.10003000,1.10004000,1.10003000,1.10004000,
1.10003000,1.10004000,1.10003000,1.10004000,1.10005000,1.10006000,1.10007000,1.10008000,
1.10012000,1.10011000,1.10012000,1.10011000,1.10013000,1.10014000,1.10016000,1.10015000,
1.10016000,1.10015000,1.10016000,1.10017000,1.10018000,1.10019000,1.10018000,1.10017000,
1.10018000,1.10017000,1.10018000,1.10017000,1.10016000,1.10014000,1.10013000,1.10015000,
1.10014000,1.10015000,1.10014000,1.10013000,1.10012000,1.10011000,1.10010000,1.10011000,
1.10010000,1.10011000,1.10010000,1.10011000,1.10010000,1.10009000,1.10008000,1.10007000,
1.10008000,1.10007000,1.10008000,1.10007000,1.10008000,1.10007000,1.10006000,1.10004000,
1.10003000,1.10002000,1.10007000,1.10008000,1.10007000,1.10008000,1.10009000,1.10008000,
1.10009000,1.10008000,1.10009000,1.10008000,1.10009000,1.10008000,1.10007000,1.10008000,
1.10007000,1.10006000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,1.10011000,
1.10012000,1.10013000,1.10014000,1.10015000,1.10016000,1.10015000,1.10016000,1.10015000,
1.10016000,1.10015000,1.10016000,1.10015000,1.10016000,1.10015000,1.10016000,1.10017000,
1.10018000,1.10019000,1.10020000,1.10019000,1.10020000,1.10019000,1.10018000,1.10019000,
1.10017000,1.10018000,1.10017000,1.10018000,1.10017000,1.10018000,1.10017000,1.10019000,
1.10018000,1.10019000,1.10018000,1.10019000,1.10018000,1.10019000,1.10017000,1.10018000,
1.10016000,1.10017000,1.10016000,1.10015000,1.10011000,1.10013000,1.10014000,1.10013000,
1.10014000,1.10013000,1.10015000,1.10014000,1.10015000,1.10016000,1.10015000,1.10014000,
1.10013000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,1.10011000,1.10012000,
1.10011000,1.10012000,1.10011000,1.10010000,1.10009000,1.10008000,1.10007000,1.10006000,
1.10007000,1.10006000,1.10007000,1.10008000,1.10007000,1.10008000,1.10007000,1.10006000,
1.10005000,1.10004000,1.10003000,1.10002000,1.10001000,1.10002000,1.10001000,1.10003000,
1.10002000,1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10002000,1.10003000,
1.10002000,1.10003000,1.10004000,1.10005000,1.10006000,1.10014000,1.10009000,1.10008000,
1.10009000,1.10008000,1.10007000,1.10006000,1.10005000,1.10004000,1.10003000,1.10004000,
1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10004000,1.10003000,1.10002000,
1.10001000,1.10000000,1.09999000,1.09998000,1.09997000,1.09998000,1.09997000,1.09999000,
1.09998000,1.10000000,1.09999000,1.10000000,1.09999000,1.10000000,1.09999000,1.09998000,
1.09999000,1.09998000,1.09999000,1.10000000,1.10001000,1.10002000,1.10006000,1.10004000,
1.10002000,1.10003000,1.10004000,1.10003000,1.10001000,1.10000000,1.09998000,1.09999000,
1.09998000,1.09999000,1.09997000};
go(close_data,12,26,9);
return 0;
}
程序输出:
beginIndx = 232
endIndx = 259
array_size = 28
retCode = 0
outBegin = 232 outElements = 28
outMacd.at(lastElement) = 0 outSignal.at(lastElement) = 0 outHistogram.at(lastEl
ement) = 0
Macd = 0 Signal = 0 Histogram = 0
Process returned 0 (0x0) execution time : 0.080 s
@truf发现了一个愚蠢的错误,即e c指针引用不指向单个数组。
这是我最后的代码(太长了,所以这里是一个片段!)帮助那些也有问题的人:
MacdResult.Macd = outMacd.at(lastElement);
MacdResult.Signal = outSignal.at(lastElement);
MacdResult.Histogram = outHistogram.at(lastElement);
有几个问题(至少三个):
- io.cpp:51: error: cannot convert
TA_Real*' to
const TA_Real**'…- 使用简单的'const TA_Real *array'代替'const TA_Real *array[]'
- 不要使用'sizeof(array)/sizeof(*array)'来确定数组长度(它在函数内部不起作用),只需将此长度传递给附加参数:void go(const TA_Real *array[], TA_Integer array_size,…)并调用它:go(close_data, sizeof(close_data)/sizeof(*close_data), 12,26,9);
- io.cpp:57:错误:' outMacd'的存储大小不知道
- 将大小放在括号中,例如:'TA_Real outMacd[array_size]'代替'TA_Real outMacd[]'
- io.cpp:61: error: cannot convert
const TA_Real**' to
const double*'…- 我希望这将自行解决:)
编辑:相应的TA_MACD源(http://sourceforge.net/p/ta-lib/code/HEAD/tree/trunk/ta-lib/c/src/ta_func/ta_MACD.c),我们的变量的大小是(endIdx-startIdx+1)。
EDIT2:嗯,c++ 11让事情变得更糟:)TA_Lib使用的是普通的C接口,所以你需要准确地转换c++对象和C类型。
我建议这样做:
-
使用vector代替array (c++ 11兼容编译器)
#include <array> vector<TA_Real> close_data { 31.09999000,1.09995000,1.09996000, ... }
-
所以你不需要在调用
时传递数组长度go(close_data,12,26,9);
-
编辑函数(vector::data()也需要c++ 11兼容编译器)
void go(const vector<TA_Real> &close, TA_Integer fastPeriod, TA_Integer slowPeriod, TA_Integer signalPeriod) { TA_Integer outBegin = 0, outElements = 0; vector<TA_Real> outMacd(array_size, 0.0); vector<TA_Real> outSignal(array_size, 0.0); vector<TA_Real> outHistogram(array_size, 0.0); TA_RetCode retCode = TA_MACD( array_size-1-slowPeriod, array_size-1, close.data(), fastPeriod, slowPeriod, signalPeriod, outBegin, outElements, outMacd.data(), outSignal.data(), outHistogram.data() ); if(retCode == TA_SUCCESS) { int lastElement = outElements-1; MacdResult.Macd = outMacd[lastElement]; MacdResult.Signal = outSignal[lastElement]; MacdResult.Histogram = outHistogram[lastElement]; cout << "Macd = " << MacdResult.Macd << " Signal = " << MacdResult.Signal << " Histograme = " << MacdResult.Histogram << endl; } }
不幸的是,我无法用编译器重新检查这段代码,所以使用它作为模板,并在出现错误时进行更改。
EDIT3:
到底是什么函数"Z2goRSt6vectorIdSaIdEEiii"????
是的,c++喜欢这样的名字!它是编码的,编译器内部名称的go()函数。你可以看到名称- 'go',参数类型- 'vector', i (integer)等等。
C:/Users/ypx7647/Documents/c++/Test/main.cpp:30:对' TA_MACD'的未定义引用
看起来TA_lib需要在链接器命令行中构建和指定外部库文件。您可以查看ta-lib/README.TXT文件获取说明。
- 。进入:ta-lib/c/make/csr/linux/g++/并在那里运行'make'
- 在编译器命令行中添加lib文件和lib文件的路径:
mingw32-g + + . exe[…-lta_libc_csr.a
另外,我不能检查这个,所以在错误的情况下要有创造性,祝你好运!
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 在std::cout之后使用std::cin时,换行符从何而来
- 为什么以及在何处在C++中使用引用和指针
- 基例如何影响使用递归函数的哪些行
- ta lib - 如何使用 ta-lib 库进行技术分析与C++