C#+WPF 股票K线制作(包含时间/ 开盘价/ 最高价/最低价/ 收盘价 / 成交量)

C#+WPF 股票K线制作

项目最终效果展示
在这里插入图片描述

此项目安全,主要是涉及 AmCharts.Windows.Stock控件的使用,核心代码如下

股票对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WPFamChartsK线制作.Model
{
    /// <summary>
    /// 股票信息
    /// </summary>
    public class StockInfo
    {
        /// <summary>
        /// 时间
        /// </summary>
        public DateTime Date { get; set; }

        /// <summary>
        /// 开盘价
        /// </summary>
        public double Open { get; set; }
        /// <summary>
        /// 最高价
        /// </summary>
        public double High { get; set; }
        /// <summary>
        /// 最低价
        /// </summary>
        public double Low { get; set; }
        /// <summary>
        /// 收盘价
        /// </summary>
        public double Close { get; set; }

        /// <summary>
        /// 成交量
        /// </summary>
        public double Volume { get; set; }


        public string Descipt { get; set; }
    }
}

ViewModel

using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Windows.Input;
using WPFamChartsK线制作.Model;

namespace WPFamChartsK线制作.ViewModel
{
    public class MainWindowViewModel : ViewModel
    {
        public MainWindowViewModel()
        {
          }
        private ObservableCollection<StockInfo> _Data=new ObservableCollection<StockInfo>();
        public ObservableCollection<StockInfo> Data
        {
            get { return this._Data; }
            set
            {
                this._Data = value;
                RaisePropertyChanged(() => Data);
            }
        }


        private string  _StockName;
        public string  StockName
        {
            get { return this._StockName; }
            set
            {
                this._StockName = value;
                RaisePropertyChanged(() => StockName);
            }
        }

        private ICommand _LoadStock;
        public ICommand LoadStockCommand
        {
            get
            {
                if (this._LoadStock == null)
                    this._LoadStock = new RelayCommandBase(LoadStockAction);
                return this._LoadStock;
            }
        }

        private void LoadStockAction(object obj)
        {
            string fileName = "SH600747.TXT";
            LoadStockInfo(fileName);
        }

        //SH600747.TXT
        private void LoadStockInfo(string fileName="SH600747.TXT")
        {

            using (System.IO.Stream resourceStream = new FileStream(fileName, FileMode.Open))
            {
                using (StreamReader reader = new StreamReader(resourceStream, Encoding.GetEncoding("GB2312")))
                {
                    //读每一行
                    var strings = reader.ReadToEnd().Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
                    //获取股票名称
                    StockName = strings[0].Replace("\r", "");

                    var res = new ObservableCollection<StockInfo>();

                    //第一行是股票名称, 第二行是类型名称, 第3行才是股票数据
                    for (int i = 2; i < strings.Length; i++)
                    {
                        string line = strings[i];
                        string[] subLines = line.Split('\t');

                        DateTime date = DateTime.Parse(subLines[0]);
                        Double open = Double.Parse(subLines[1]);
                        Double high = Double.Parse(subLines[2]);
                        Double low = Double.Parse(subLines[3]);
                        Double close = Double.Parse(subLines[4]);
                        Double volumn = Double.Parse(subLines[5]);

                        _Data.Add(
                            new StockInfo
                            {
                                Date = date,
                                Open = open,
                                High = high,
                                Low = low,
                                Close = close,
                                Volume = volumn,
                                Descipt = "暂时没什么提醒"
                            });
                    }
                }
            }
        }
    }
}

XAML前端

<Window x:Class="WPFamChartsK线制作.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ams="http://schemas.amcharts.com/stock/wpf/2009/xaml" 
        
        xmlns:local="clr-namespace:WPFamChartsK线制作"
        mc:Ignorable="d"
        Title="WPF 股票K线图 " Height="450" Width="800">
    <Grid Margin="10,0,10,0">
        <Grid.RowDefinitions>
            <RowDefinition  Height="*" />
            <RowDefinition  Height="Auto"/>
        </Grid.RowDefinitions>
 

        <ams:StockChart Name="stockChart" Grid.Row="0">
            <ams:StockChart.DataSets>
                <ams:DataSet Name="stockSet1" Brush="#7f8da9"
                                ItemsSource="{Binding Data}"
                                DateMemberPath="Date"
                                OpenMemberPath="Open" 
                                HighMemberPath="High"
                                LowMemberPath="Low" 
                                CloseMemberPath="Close"
                                Description="Descipt"
                                ValueMemberPath="Close" 
                                VolumeMemberPath="Volume"
                                />
            </ams:StockChart.DataSets>

            <ams:StockChart.Charts>
                <ams:Chart Title="股票价格" GridHeight="2*">
                    <ams:Chart.Graphs>
                        <ams:Graph GraphType="Candlestick" Title="{Binding StockName}"
                                    NegativeBrush="Green" PositiveBrush="Red" 
                                    LegendItemType="Ohlc" LegendPeriodItemType="Ohlc"
                                    CursorBrush="Blue" CursorSize="6" />
                    </ams:Chart.Graphs>

                    <ams:Chart.DateTimeAxis>
                        <ams:DateTimeAxis ValuesForeground="#90000000" StrokeThickness="0" TickLength="0" 
                                            />
                    </ams:Chart.DateTimeAxis>

                    <ams:Chart.LeftValueAxis>
                        <ams:ValueAxis ValuesForeground="#90000000"
                                StrokeThickness="0" TickLength="0" />
                    </ams:Chart.LeftValueAxis>

                    <ams:Chart.Legend>
                        <ams:Legend
                            PositiveValueForeground="Red" NegativeValueForeground="Green"
                            IsDateVisible="True"/>
                    </ams:Chart.Legend>
                </ams:Chart>

                <!--成交量的Chart-->
                <ams:Chart Title="成交量">
                    <ams:Chart.Graphs>
                        <ams:Graph GraphType="Column" Title="{Binding StockName}"
                                    LegendItemType="Value" LegendPeriodItemType="Value"
                                    DataField="Volume" PeriodValue="Sum"
                                    CursorBrush="Blue" CursorSize="6" />
                    </ams:Chart.Graphs>

                    <ams:Chart.DateTimeAxis>
                        <ams:DateTimeAxis ValuesEnabled="False" StrokeThickness="0" />
                    </ams:Chart.DateTimeAxis>

                    <ams:Chart.LeftValueAxis>
                        <ams:ValueAxis ValuesForeground="#90000000" StrokeThickness="0" TickLength="0" />
                    </ams:Chart.LeftValueAxis>

                    <ams:Chart.Legend>
                        <ams:Legend PositiveValueForeground="Red" NegativeValueForeground="Green" />
                    </ams:Chart.Legend>
                </ams:Chart>
            </ams:StockChart.Charts>

            <ams:StockChart.PeriodSelector>
                <ams:PeriodSelector CustomPeriodLabelText="自定义间隔:" PresetPeriodLabelText="缩放:" Margin="0,5,0,0">
                    <ams:PeriodSelector.PresetPeriods>
                        <ams:PresetPeriodButton Interval="Day" Quantity="10" ToolTipService.ToolTip="10天" Content="10天" />
                        <ams:PresetPeriodButton Interval="Month" Quantity="1" ToolTipService.ToolTip="1个月" Content="1月" />
                        <ams:PresetPeriodButton Interval="Month" Quantity="3" ToolTipService.ToolTip="3个月" Content="3月" />
                        <ams:PresetPeriodButton Interval="Year" Quantity="1" ToolTipService.ToolTip="1年" Content="1年" />
                        <ams:PresetPeriodButton Interval="Year" Quantity="3" ToolTipService.ToolTip="3年" Content="3年" />
                        <ams:PresetPeriodButton Quantity="NaN" ToolTipService.ToolTip="所有数据" Content="最大" />
                    </ams:PeriodSelector.PresetPeriods>
                </ams:PeriodSelector>
            </ams:StockChart.PeriodSelector>



        </ams:StockChart>


        <StackPanel Grid.Row="1">
            <Button Command="{Binding LoadStockCommand}" Content="加载"/>
        </StackPanel>
    </Grid>
</Window>

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值