指数移動平均を作る
概要
指数移動平均(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); } }