public override void Calculate(int index) { if (barTime == M1.OpenTime.LastValue) { return; } barTime = MarketSeries.OpenTime.LastValue; int prev = M1.OpenTime.GetIndexByExactTime(MarketSeries.OpenTime.Last(1)); int next = M1.OpenTime.GetIndexByExactTime(barTime); if (prev == -1 || next == -1) { return; } RunningStats tempStats = new RunningStats(); for (int i = prev; i < next; i++) { tempStats.Push(M1.Close[i]); } htfStats = htfStats + tempStats; tempStats = null; //上位の時間足の更新と重なったとき int newIndexHtf = HTF.OpenTime.GetIndexByTime(barTime); if (prevIndexHtf != newIndexHtf) { StatsQ.Enqueue(new RunningStats((long)htfStats.n, htfStats.M1, htfStats.M2, htfStats.M3, htfStats.M4)); if (StatsQ.Count > Period) { while (StatsQ.Count > Period) { StatsQ.Dequeue(); } RunningStats totalStats = new RunningStats(); foreach (RunningStats stats in StatsQ) { totalStats = totalStats + stats; } double ma = totalStats.Mean(); double sd = totalStats.StdDev(); double skew = totalStats.Skewness(); double kurt = totalStats.Kurtosis(); totalStats = null; for (int j = prevIndex; j < index; j++) { MA[j] = ma; UPPER[j] = ma + sd * Variance; LOWER[j] = ma - sd * Variance; } } prevIndex = index; prevIndexHtf = newIndexHtf; htfStats.Clear(); } }
public override void Calculate(int index) { LVL0[index] = 0; if (barTime == M1.OpenTime.LastValue) { return; } barTime = MarketSeries.OpenTime.LastValue; // 1分のバーインデックスを取得する。 // GetIndexByExactTime(時間) は、時刻からバーインデックスを取得する関数。 int prev = M1.OpenTime.GetIndexByExactTime(MarketSeries.OpenTime.Last(1)); int next = M1.OpenTime.GetIndexByExactTime(barTime); if (prev == -1 || next == -1) { return; } // RunningStatsクラスは、平均、偏差平方和、偏差三乗和、偏差四乗和を計算し、 // 標準偏差、歪度、尖度を計算するクラス。また、計算結果のマージも行える。 RunningStats tempStats = new RunningStats(); // 1分足データの統計情報をオンラインで計算する。 for (int i = prev; i < next; i++) { tempStats.Push(M1.Close[i]); } // 上位足の計算結果とマージする。 htfStats = htfStats + tempStats; tempStats = null; //上位の時間足の更新と重なったとき int newIndexHtf = HTF.OpenTime.GetIndexByTime(barTime); if (prevIndexHtf != newIndexHtf) { // 上位足の計算結果をリングバッファに追加する。 StatsQ.Enqueue(new RunningStats((long)htfStats.n, htfStats.M1, htfStats.M2, htfStats.M3, htfStats.M4)); // 指定期間以上バッファがたまったら、 if (StatsQ.Count > Period) { while (StatsQ.Count > Period) { StatsQ.Dequeue(); } // 合計用のRunningStatsクラスを用意。 RunningStats totalStats = new RunningStats(); // 上位足指定期間分の計算結果をマージする。 foreach (RunningStats stats in StatsQ) { totalStats = totalStats + stats; } //上位足指定期間分の統計情報を求める。 double ma = totalStats.Mean(); //平均 double sd = totalStats.StdDev(); //標準偏差 double skew = totalStats.Skewness(); //歪度 double kurt = totalStats.Kurtosis(); //尖度 totalStats = null; for (int j = prevIndex; j < index; j++) { SKEW[j] = skew; KURT[j] = kurt; } } prevIndex = index; prevIndexHtf = newIndexHtf; htfStats.Clear(); } }