/// <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); }
/// <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); }
/// <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); }
/// <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; }