// 移動平均クラス
var MovingAverage = {
createArray: function (data, delayFlag) {
/// 移動平均データの配列を作成します。
/// webサービスより取得したローソク足データ
var range1;
var range2;
var type = $('#datatype').val();
var ma5DataList = $.extend(true, [], data);
var ma25DataList = $.extend(true, [], data);
var datelen;
switch (type) {
case '1':
range1 = 6;
range2 = 12;
ma5DataList.splice(0, range1);
datelen = 12;
break;
case '2':
range1 = 5;
range2 = 25;
datelen = 8;
break;
case '3':
range1 = 13;
range2 = 26;
datelen = 8;
break;
default:
range1 = 12;
range2 = 24;
datelen = 8;
break;
}
// 分足で現在時刻より後の移動平均は出さないため
var date = new Date();
if (delayFlag === '2') {
date.setMinutes(date.getMinutes() - 20).toString();
}
var currentTime = Utility.getStringTime(date).substr(0, datelen);
var dataObj = {
Average5: MovingAverage.calc(range1, ma5DataList, currentTime),
Average25: MovingAverage.calc(range2, ma25DataList, currentTime)
};
return dataObj;
},
calc: function (range, data, currentTime) {
/// 移動平均を計算します。
/// 範囲
/// webサービスより取得したローソク足データ
/// 現在時刻(ディレイの場合は20分前)
var type = $('#datatype').val();
var maAry = []; // 結果を入れる配列
var ary = []; // 計算用の一時的な配列
var sum = 0;
for (var i = 0; len = data.length, i < len; i++) {
// 現在時刻以降なら終了
if (data[i].Date > currentTime) {
break;
}
// 一時的な配列に値を詰め、合計していく
if (data[i].EndValue !== '') {
ary.push(data[i].EndValue);
sum += parseFloat(data[i].EndValue);
} else {
var len = ary.length;
if (len > 0) {
ary.push(ary[len - 1]);
sum += parseFloat(ary[len - 1]);
}
}
// 本数分の合計が終わったら結果用の配列に詰める。
if (ary.length >= range) {
var resultObj = {};
resultObj.Value = Math.round((sum / range) * 100) / 100;
resultObj.Date = Utility.convertMilitime(data[i].Date, type);
maAry.push(resultObj);
// 次のループのため、計算に不要になった値は引いて配列からも消す。
sum -= ary[0];
ary.shift();
}
}
return maAry;
}
}