错误计算RSI或错误在MetaTrader 4
Bug calculating RSI or bug in MetaTrader 4?
我正在创建一个简单的函数,以计算相对强度指数( RSI
)。我是按照这个网站的说明http://stockcharts.com/school/doku.php?st=stochastic+rsi&id=chart_school:technical_indicators:relative_strength_index_rsi
对于这些样例值,代码可以完美地工作。但是对于MetaTrader 4中的任何外汇数据,MetaTrader中的期望值是不同的。
这是我使用的简化代码:
double CalculateRSISimple(std::vector<ROWDATA>& aData, int nPos, int RSIPeriod)
{
double dTotalGain = 0;
double dTotalLoss = 0;
double dRS = 0;
double dRSI = 0;
int nOffset = 0;
int nPrevOffset = 0;
for (int n = RSIPeriod-1; n >= 0; n--)
{
nOffset = nPos - n;
nPrevOffset = nOffset - 1;
double dDiff = aData[nOffset].dClose - aData[nPrevOffset].dClose;
if (dDiff > 0)
{
dTotalGain += dDiff;
}
else
{
dTotalLoss -= dDiff;
}
}
double dAveGain = dTotalGain / double(RSIPeriod);
double dAveLoss = dTotalLoss / double(RSIPeriod);
dRS = dAveGain / dAveLoss;
dRSI = 100.0 - (100.0 / (1 + dRS));
return dRSI;
}
它可以完美地使用这个示例数据:
void TestRSI_1()
{
// TEST
std::vector<ROWDATA> vRowData;
ROWDATA rowTemp;
rowTemp.dClose = 44.338900;
vRowData.push_back(rowTemp);
rowTemp.dClose = 44.090200;
vRowData.push_back(rowTemp);
rowTemp.dClose = 44.149700;
vRowData.push_back(rowTemp);
rowTemp.dClose = 43.612400;
vRowData.push_back(rowTemp);
rowTemp.dClose = 44.327800;
vRowData.push_back(rowTemp);
rowTemp.dClose = 44.826400;
vRowData.push_back(rowTemp);
rowTemp.dClose = 45.095500;
vRowData.push_back(rowTemp);
rowTemp.dClose = 45.424500;
vRowData.push_back(rowTemp);
rowTemp.dClose = 45.843300;
vRowData.push_back(rowTemp);
rowTemp.dClose = 46.082600;
vRowData.push_back(rowTemp);
rowTemp.dClose = 45.893100;
vRowData.push_back(rowTemp);
rowTemp.dClose = 46.032800;
vRowData.push_back(rowTemp);
rowTemp.dClose = 45.614000;
vRowData.push_back(rowTemp);
rowTemp.dClose = 46.282000;
vRowData.push_back(rowTemp);
rowTemp.dClose = 46.282000;
vRowData.push_back(rowTemp);
double dRSI = CalculateRSISimple(vRowData, 14, 14);
if (fabs(dRSI - 70.5328) < 0.0001)
{
printf("... Test Passsed %f. Expected %fn", dRSI, 70.5328);
}
else
{
printf("... Test Failed %f. Expected %fn", dRSI, 70.5328);
}
}
但是当我尝试使用外汇数据时,结果与MetaTrader 4的预期完全不同:
void TestRSI_3()
{
// TEST
std::vector<ROWDATA> vRowData;
ROWDATA rowTemp;
rowTemp.dClose = 1.11919; // 0:00
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11932;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11879;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11847;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11867;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11845;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11836;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11817;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11826;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11823;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11842;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11859;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11874;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11876;
vRowData.push_back(rowTemp);
rowTemp.dClose = 1.11915;
vRowData.push_back(rowTemp);
double dRSI = CalculateRSISimple(vRowData, 14, 14);
double dExpected = 58.4792;
if (fabs(dRSI - dExpected) < 0.0001)
{
printf("... Test Passsed %f. Expected %fn", dRSI, dExpected);
}
else
{
printf("... Test Failed %f. Expected %fn", dRSI, dExpected);
}
}
输出:
Test Passsed 70.532789. Expected 70.532800
Test Failed 49.264706. Expected 58.479200
我想知道MetaTrader4是否以不同的方式计算 RSI
?
任何想法?
找到解决方案。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误计算RSI或错误在MetaTrader 4