Ошибка расчета RSI или ошибка в MetaTrader 4?

Я создаю простую функцию для расчета индекса относительной силы ( RSI ). Я следую инструкциям с этого сайта http://stockcharts.com/school/doku.php?st=stochastic+rsi&ID = chart_school: technical_indicators: relative_strength_index_rsi

Для этих примеров значений код работает отлично. Но для любых данных Forex из 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 %f\n", dRSI, 70.5328);
}
else
{
printf("... Test Failed %f. Expected %f\n", dRSI, 70.5328);
}
}

Но когда я пытаюсь использовать данные Forex, результат полностью отличается от ожидаемого 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 %f\n", dRSI, dExpected);
}
else
{
printf("... Test Failed %f. Expected %f\n", dRSI, dExpected);
}
}

Это вывод:

    Test Passsed 70.532789. Expected 70.532800
Test Failed 49.264706. Expected 58.479200

Мне интересно, если MetaTrader4 рассчитывает RSI по-другому?

Есть идеи?

-1

Решение

Нашел решение. Я забыл сгладить следующие элементы в серии.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]