2015-10-02 7 views
-2

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

Для этих значений выборки код работает отлично. Но для любых данных форекс от 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

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

 Смежные вопросы

  • Нет связанных вопросов^_^