指数移動平均を作る


概要

指数移動平均(ema)の作成方法を説明します。単純移動平均を作るの理解を前提にしています。

emaの計算方法は下記です。

初日の計算 単純移動平均の値を採用
2日目以降の計算 EMA(n)=EMA(n-1)+α×{レート(0)-EMA(n-1)}
n:対象期間 α(平滑化定数)=2/(n+1)レート(0):当日の価格
引用: ヒロセ通商 指数平滑移動平均線

emaメソッド

インジケーターバッファーにemaを求めるメソッドが定義されています。 参照:ema

{
        indicatorName: "tutor.EMA"
        ,indicatorType:INDICATOR_TYPE.ITEM
        , init: function () {
            var params=this.params,
                props = {
                    strokeStyle: params.lineColor,
                    lineWidth: params.lineWidth,
                    lineDash: params.lineDash
                };
            this.emaLineBuffer = this.addLineBuffer(props);
            this.setIndicatorShortName("EMA")
                .setBufferInfo(this.emaLineBuffer, "ema");
        }
        , calc: function (index, times, opens, highs, lows, closes, spreads) {
           var emaPeriod=this.params.emaPeriod;
           var emaBuffer=this.emaLineBuffer;
           closes.ema(emaBuffer,emaPeriod,index);//1
        }
        , params: [
            {emaPeriod:25},
            {lineColor:"green"},
            {lineWidth:2},
            {lineDash:[3,3]}
        ]
}
1
インジケーターバッファーのemaメソッドは、emaの値を計算し、出力先のインジケーターバッファーに値を格納します。 参照:ema
emaメソッドを使用せずにcalcメソッドを実装すると下記のようになります。
calc:function(index,times,opens,highs,lows,closes,spreads){
        var emaPeriod=this.params.emaPeriod;
        var emaBuffer=this.emaLineBuffer;
        if(index==emaPeriod-1){//初回は単純移動平均
            closes.sma(emaBuffer,emaPeriod,index); 
        }else{//2回目以降
            var prevEma = emaBuffer.get(index - 1);//前回のEMA
            var currentClose = closes.get(index);//今回の計算対象
            var alpha = 2 / (emaPeriod + 1);//α(平滑化定数)
            var emaVal = prevEma + alpha * (currentClose-prevEma);
            emaVal=Math.round(emaVal);
            emaBuffer.set(index, emaVal);
        }
}