MQL4でCMOを計算する


以前iMAやiBands関数と同じような使い方でRCIを取得できる、iRCI関数を作って記事にしたところ、同じようにCMOを取得したいとのコメントをいただいたので記事にしました。
MQL4でRCIを計算する

iCMO

double iCMO(const string symbol, int timeframe, int period, int index)
{
    double up = 0.0;
    double down = 0.0;
    double diff = 0.0;

    for(int i = index + period - 1; i >= index; i--) { 
        diff = iClose(symbol, timeframe, i) - iClose(symbol, timeframe, i + 1); 
        if(diff > 0){ 
            up += diff; 
        } else if(diff < 0) {
            down -= diff;
        }
    }

    if (up + down == 0) {
        return(0);
    }

    return(100 * (up - down) / (up + down));
}


上が参考にしたCMOインジケーター、下がiCMO関数で計算したCMOです。
どちらも同じ結果になります。

追記

終値の変動がperiod回連続で起こらなかった場合にエラー(Zero divide)となる不具合があったので修正しました。