Пример #1
0
        /// <summary>
        /// 1単位分のデータを作成
        /// </summary>
        /// <param name="datePos"></param>
        /// <returns>KabukaRowを返す。1日も開場日がなかったら、null</returns>
        private KabukaRow GetOneRow(int datePos)
        {
            var      calendar   = new ActiveMarket.Calendar();
            var      _kabukaRow = new KabukaRow();
            var      _date      = calendar.Date(datePos);
            DateTime _startDate;
            DateTime _endDate;
            int      _startPos;
            int      _endPos;

            // 開始・終了位置決め
            // 週足の場合は、月曜から金曜
            switch (ChartScale)
            {
            case ChartScales.Weekly:
                // 該当日の週の月曜日
                _startDate = _date.AddDays((int)_date.DayOfWeek * -1 + 1);
                if (_startDate < calendar.Date(Price.Begin()))
                {
                    _startDate = calendar.Date(Price.Begin());
                }
                if (_startDate > calendar.Date(Price.End()))
                {
                    return(null);
                }
                // 該当日の週の金曜日
                _endDate = _startDate.AddDays(4);
                if (_endDate > calendar.Date(Price.End()))
                {
                    _endDate = calendar.Date(Price.End());
                }
                if (_endDate < calendar.Date(Price.Begin()))
                {
                    return(null);
                }
                break;

            case ChartScales.Monthly:
                // 月の1日
                _startDate =
                    DateTime.Parse(_date.Year.ToString() + "/" + _date.Month.ToString() + "/1");
                if (_startDate < calendar.Date(Price.Begin()))
                {
                    _startDate = calendar.Date(Price.Begin());
                }
                if (_startDate > calendar.Date(Price.End()))
                {
                    return(null);
                }
                // 月の末日 (翌月の1日前)
                _endDate =
                    DateTime.Parse(_date.Year.ToString() + "/" + _date.Month.ToString() + "/" +
                                   DateTime.DaysInMonth(_date.Year, _date.Month).ToString());
                if (_endDate > calendar.Date(Price.End()))
                {
                    _endDate = calendar.Date(Price.End());
                }
                if (_endDate < calendar.Date(Price.Begin()))
                {
                    return(null);
                }
                break;

            // デフォルトは日足
            default:
                _startDate = _date;
                _endDate   = _date;
                break;
            }

            // 開場日の開始、終了の位置と高値、安値を決める
            _startPos = calendar.DatePosition(_startDate, 1);
            _endPos   = calendar.DatePosition(_endDate, -1);

            _kabukaRow.EndPos = 0;

            for (var i = _startPos; i <= _endPos; i++)
            {
                if (Price.IsClosed(i) == 0)
                {
                    if (_kabukaRow.EndPos == 0)
                    {
                        _kabukaRow.StartPos  = i;
                        _kabukaRow.StartDate = calendar.Date(i);
                        _kabukaRow.EndPos    = i;
                        _kabukaRow.Open      = Price.Open(i);
                        _kabukaRow.High      = Price.High(i);
                        _kabukaRow.Low       = Price.Low(i);
                    }
                    else
                    {
                        _kabukaRow.EndPos = i;
                        _kabukaRow.High   = Math.Max(_kabukaRow.High, Price.High(i));
                        _kabukaRow.Low    = Math.Min(_kabukaRow.Low, Price.Low(i));
                    }
                }
            }

            if (_kabukaRow.EndPos == 0)
            {
                // 一日も開場日がなかった場合,nullが返される
                return(null);
            }

            _kabukaRow.EndDate = calendar.Date(_kabukaRow.EndPos);
            _kabukaRow.Close   = Price.Close(_kabukaRow.EndPos);

            return(_kabukaRow);
        }
Пример #2
0
        /// <summary>
        /// 株価テーブル作成
        /// </summary>
        /// <param name="plotEnd"></param>
        /// <param name="plotWide"></param>
        public void MakeTable(int plotEnd, int plotWide, ChartScales chartScale, AveSteps aveStep)
        {
            // 株価テーブル作成
            var calendar   = new ActiveMarket.Calendar();
            var _kabukaRow = new KabukaRow();
            int?_datePos   = plotEnd;

            this.PlotWide   = plotWide;
            this.ChartScale = chartScale;
            this.AveStep    = aveStep;
            OwarineList     = new List <Owarine>();

            PriceTable.Clear();

            var cnt = 0;

            while (cnt < this.PlotWide)
            {
                if (_datePos.Value < Price.Begin())
                {
                    break;
                }
                _kabukaRow = GetOneRow(_datePos.Value);
                if (_kabukaRow != null)
                {
                    DataRow row = PriceTable.NewRow();
                    row["StartPos"]  = _kabukaRow.StartPos;
                    row["EndPos"]    = _kabukaRow.EndPos;
                    row["StartDate"] = _kabukaRow.StartDate;
                    row["EndDate"]   = _kabukaRow.EndDate;
                    row["High"]      = _kabukaRow.High;
                    row["Low"]       = _kabukaRow.Low;
                    row["Open"]      = _kabukaRow.Open;
                    row["Close"]     = _kabukaRow.Close;
                    row["Heikin1"]   = 0;
                    row["Heikin2"]   = 0;
                    row["Heikin3"]   = 0;
                    row["Heikin4"]   = 0;
                    row["Heikin5"]   = 0;
                    PriceTable.Rows.Add(row);

                    OwarineList.Add(new Owarine(_kabukaRow.EndPos, _kabukaRow.Close));

                    cnt++;
                }
                _datePos = NextDatePosition(_datePos.Value, Directions.Befor);
                if (!_datePos.HasValue)
                {
                    break;
                }
            }

            // 終値リストの作成(PlotStart以前300件)
            var MaxCount = 300;

            _datePos = OwarineList.Select(n => n.DatePos).Min();
            cnt      = 0;
            for (var i = 0; i < MaxCount; i++)
            {
                _datePos = NextDatePosition(_datePos.Value, Directions.Befor);
                if (!_datePos.HasValue)
                {
                    break;
                }
                OwarineList.Add(new Owarine(_datePos.Value, Price.Close(_datePos.Value)));
            }
            for (var i = 0; i < PtCount; i++)
            {
                for (var j = 0; j < 5; j++)
                {
                    SetHeikin(i, j);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// 株価テーブルを過去、未来へずらす
        /// </summary>
        /// <param name="shift"></param>
        public bool ShiftKabukaTable(int shift)
        {
            var       calendar   = new ActiveMarket.Calendar();
            KabukaRow _kabukaRow = new KabukaRow();
            int?      _datepos;

            if (shift < 0)
            {
                // 過去日付へ1つずらす
                _datepos = NextDatePosition(this.PlotStart.Value, Directions.Befor);
                if (!_datepos.HasValue)
                {
                    return(false);
                }

                var cnt = 0;
                while (cnt < Math.Abs(shift))
                {
                    _kabukaRow = GetOneRow(_datepos.Value);
                    if (_kabukaRow != null)
                    {
                        DataRow row = PriceTable.NewRow();
                        row["StartPos"]  = _kabukaRow.StartPos;
                        row["EndPos"]    = _kabukaRow.EndPos;
                        row["StartDate"] = _kabukaRow.StartDate;
                        row["EndDate"]   = _kabukaRow.EndDate;
                        row["High"]      = _kabukaRow.High;
                        row["Low"]       = _kabukaRow.Low;
                        row["Open"]      = _kabukaRow.Open;
                        row["Close"]     = _kabukaRow.Close;
                        row["Heikin1"]   = 0;
                        row["Heikin2"]   = 0;
                        row["Heikin3"]   = 0;
                        row["Heikin4"]   = 0;
                        row["Heikin5"]   = 0;
                        PriceTable.Rows.RemoveAt(0);
                        PriceTable.Rows.Add(row);

                        // 終値リストを過去日付に1つずらす
                        OwarineList.RemoveAt(0);
                        var _OwarineDatePos = NextDatePosition(
                            ((Owarine)OwarineList[OwarineList.Count - 1]).DatePos, Directions.Befor);
                        if (_OwarineDatePos.HasValue)
                        {
                            OwarineList.Add(new Owarine(_OwarineDatePos.Value, Price.Close(_OwarineDatePos.Value)));
                        }
                        for (var j = 0; j < 5; j++)
                        {
                            SetHeikin(PtCount - 1, j);
                        }

                        cnt++;
                    }
                    _datepos = NextDatePosition(_datepos.Value, Directions.Befor);
                    if (!_datepos.HasValue)
                    {
                        return(true);
                    }
                }
            }
            else
            {
                // 未来日付に1つずらす
                _datepos = NextDatePosition(this.PlotEnd, Directions.After);
                if (!_datepos.HasValue)
                {
                    return(false);
                }

                var cnt = 0;
                while (cnt < Math.Abs(shift))
                {
                    _kabukaRow = GetOneRow(_datepos.Value);
                    if (_kabukaRow != null)
                    {
                        DataRow row = PriceTable.NewRow();
                        row["StartPos"]  = _kabukaRow.StartPos;
                        row["EndPos"]    = _kabukaRow.EndPos;
                        row["StartDate"] = _kabukaRow.StartDate;
                        row["EndDate"]   = _kabukaRow.EndDate;
                        row["High"]      = _kabukaRow.High;
                        row["Low"]       = _kabukaRow.Low;
                        row["Open"]      = _kabukaRow.Open;
                        row["Close"]     = _kabukaRow.Close;
                        row["Heikin1"]   = 0;
                        row["Heikin2"]   = 0;
                        row["Heikin3"]   = 0;
                        row["Heikin4"]   = 0;
                        row["Heikin5"]   = 0;
                        PriceTable.Rows.RemoveAt(PtCount - 1);
                        PriceTable.Rows.InsertAt(row, 0);

                        // 終値を未来日付にずらす
                        OwarineList.RemoveAt(OwarineList.Count - 1);
                        OwarineList.Insert(0, new Owarine(_kabukaRow.EndPos, _kabukaRow.Close));

                        for (var j = 0; j < 5; j++)
                        {
                            SetHeikin(0, j);
                        }


                        cnt++;
                    }
                    _datepos = NextDatePosition(_datepos.Value, Directions.After);
                    if (!_datepos.HasValue)
                    {
                        return(true);
                    }
                }
            }
            return(true);
        }