示例#1
0
        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();
            }
        }
示例#2
0
        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();
            }
        }