以前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)となる不具合があったので修正しました。