コード例 #1
0
ファイル: CandleUtility.cs プロジェクト: yooce/TradingChart
        /// <summary>
        /// ロウソク足を日足から目的の足に変換します。
        /// </summary>
        /// <param name="daily">日足</param>
        /// <param name="period">ロウソク足の期間</param>
        /// <returns>目的の足のロウソク足のリスト</returns>
        public static List <DataTypes.Candle> ConvertPeriodFromDaily(List <DataTypes.Candle> daily, CandlePeriod period)
        {
            // ソート
            daily.Sort(DataTypes.Candle.Compare);

            // 日足ならそのまま返す
            if (period == CandlePeriod.Dayly)
            {
                return(daily);
            }

            // 器作成
            List <DataTypes.Candle> converteds = new List <DataTypes.Candle>();

            DateTime?prevDateTime = null;

            DataTypes.Candle converted = null;
            foreach (DataTypes.Candle candle in daily)
            {
                // 次のロウソク足へ
                if (IsCandleChange(candle, prevDateTime, period))
                {
                    // ロウソク足追加
                    if (converted != null)
                    {
                        converteds.Add(converted);
                    }

                    // 新規ロウソク足
                    converted          = new DataTypes.Candle();
                    converted.DateTime = candle.DateTime;
                    converted.Open     = candle.Open;
                    converted.High     = candle.Open;
                    converted.Low      = candle.Open;
                    converted.Close    = candle.Open;
                    converted.Volume   = 0;
                }

                // 値設定
                if (candle.High > converted.High)
                {
                    converted.High = candle.High;
                }
                if (candle.Low < converted.Low)
                {
                    converted.Low = candle.Low;
                }
                converted.Close   = candle.Close;
                converted.Volume += candle.Volume;

                // 日時を覚えておく
                prevDateTime = candle.DateTime;
            }

            return(converteds);
        }
コード例 #2
0
ファイル: MainChartArea.cs プロジェクト: yooce/TradingChart
        /// <summary>
        /// カーソルを更新します。
        /// </summary>
        /// <param name="mouse">マウス座標</param>
        /// <param name="result">ヒットテストの結果</param>
        /// <param name="x">x座標</param>
        /// <param name="max_x">最大x座標</param>
        /// <param name="format">価格表示のフォーマット</param>
        public override void UpdateCursors(Point mouse, HitTestResult result, int x, int max_x, string format)
        {
            base.UpdateCursors(mouse, result, x, max_x, format);

            // カーソルラベルX
            CursorLabelX.Text = Candles[x].DateTime.ToShortDateString();
            CursorLabelX.Left = mouse.X - CursorLabelX.Width / 2;
            CursorLabelX.Top  = (int)(AxisY2.ValueToPixelPosition(AxisY2.ScaleView.Position) + 1 + AxisY2.ScrollBar.Size);

            // 価格表示板
            DataTypes.Candle prev = null;
            if (x > 0)
            {
                prev = Candles[x - 1];
            }
            PriceBoard.SetCandle(Candles[x], prev, format);
        }
コード例 #3
0
ファイル: CandleUtility.cs プロジェクト: yooce/TradingChart
        /// <summary>
        /// ロウソク足の切り替えが必要かどうか判定します。
        /// </summary>
        /// <param name="candle">ロウソク足</param>
        /// <param name="prevDateTime">前回のロウソク足の日時</param>
        /// <param name="period">ロウソク足の期間</param>
        /// <returns>ロウソク足の切り替えが必要かどうか</returns>
        private static bool IsCandleChange(DataTypes.Candle candle, DateTime?prevDateTime, CandlePeriod period)
        {
            // 前回日時が無い
            if (prevDateTime == null)
            {
                return(true);
            }

            // 次のDateTime算出
            DateTime nextDateTime = DateTime.MinValue;

            switch (period)
            {
            case CandlePeriod.Dayly:
                nextDateTime = prevDateTime.Value.Date.AddDays(1);
                break;

            case CandlePeriod.Weekly:
                nextDateTime = prevDateTime.Value.Date.AddDays(1);
                while (nextDateTime.DayOfWeek != DayOfWeek.Monday)
                {
                    nextDateTime = nextDateTime.AddDays(1);
                }
                break;

            case CandlePeriod.Monthly:
                nextDateTime = new DateTime(prevDateTime.Value.Year, prevDateTime.Value.Month, 1).AddMonths(1);
                break;

            case CandlePeriod.Yearly:
                nextDateTime = new DateTime(prevDateTime.Value.Year, 1, 1).AddYears(1);
                break;
            }

            // 次のDateTimeを超えているか
            return(candle.DateTime >= nextDateTime);
        }
コード例 #4
0
ファイル: PriceBoard.cs プロジェクト: yooce/TradingChart
        /// <summary>
        /// ロウソク足を設定します。
        /// </summary>
        /// <param name="cur">現在のロウソク足</param>
        /// <param name="prev">前のロウソク足</param>
        /// <param name="format">価格表示のフォーマット</param>
        public void SetCandle(DataTypes.Candle cur, DataTypes.Candle prev, string format)
        {
            // 現在のロウソク足が無い場合は非表示
            if (cur == null)
            {
                Visible = false;
                return;
            }

            // 値設定
            labelOpenValue.Text   = cur.Open.ToString(format);
            labelHighValue.Text   = cur.High.ToString(format);
            labelLowValue.Text    = cur.Low.ToString(format);
            labelCloseValue.Text  = cur.Close.ToString(format);
            labelVolumeValue.Text = cur.Volume.ToString();
            if (prev != null)
            {
                decimal diff   = cur.Close - prev.Close;
                decimal diff_p = (cur.Close / prev.Close - 1) * 100;
                if (diff >= 0)
                {
                    labelUpDown.Text  = "+" + diff.ToString(format);
                    labelUpDownP.Text = "(+" + diff_p.ToString("0.00") + "%)";
                }
                else
                {
                    labelUpDown.Text  = diff.ToString(format);
                    labelUpDownP.Text = "(" + diff_p.ToString("0.00") + "%)";
                }
            }
            else
            {
                labelUpDown.Text  = "-";
                labelUpDownP.Text = "(-%)";
            }

            // 色設定
            if (cur.Close - cur.Open >= 0)
            {
                labelOpenValue.ForeColor   = Palette.PriceUpColor;
                labelHighValue.ForeColor   = Palette.PriceUpColor;
                labelLowValue.ForeColor    = Palette.PriceUpColor;
                labelCloseValue.ForeColor  = Palette.PriceUpColor;
                labelVolumeValue.ForeColor = Palette.PriceUpColor;
                labelUpDown.ForeColor      = Palette.PriceUpColor;
                labelUpDownP.ForeColor     = Palette.PriceUpColor;
            }
            else
            {
                labelOpenValue.ForeColor   = Palette.PriceDownColor;
                labelHighValue.ForeColor   = Palette.PriceDownColor;
                labelLowValue.ForeColor    = Palette.PriceDownColor;
                labelCloseValue.ForeColor  = Palette.PriceDownColor;
                labelVolumeValue.ForeColor = Palette.PriceDownColor;
                labelUpDown.ForeColor      = Palette.PriceDownColor;
                labelUpDownP.ForeColor     = Palette.PriceDownColor;
            }

            // 配置
            labelHigh.AlignLeft(labelOpenValue);
            labelHighValue.AlignLeft(labelHigh);
            labelLow.AlignLeft(labelHighValue);
            labelLowValue.AlignLeft(labelLow);
            labelClose.AlignLeft(labelLowValue);
            labelCloseValue.AlignLeft(labelClose);
            labelUpDown.AlignLeft(labelCloseValue);
            labelUpDownP.AlignLeft(labelUpDown);
            labelVolume.AlignLeft(labelUpDownP);
            labelVolumeValue.AlignLeft(labelVolume);

            // 表示
            Visible = true;
        }