2014年10月05日

チャート表示 株の値動の経過を表すチャートを表示

イメージ

Chart.png

上の画像のようなプログラムを作ります。
上部にあるコンボボックスで表示対象を選択し、下部にそのチャートを表示します。

株式コードの取得


コンボボックスのアイテムとして使用する株式コードが必要です。
ローカルファイル等で保持してもよいのですが、前回作成したWebServiceから取得してみました。

チャートの描画

チャート用のデータを登録等が不要で無料で提供しているところは見つけられませんでした。
前日分のデータは上記方法で取得できるので、毎日取得してストックしておき、そのデータを基にチャートを作ることも可能ですが、チャートになるぐらいのデータを貯めるのは大変です。

そこで、Yahoo Financeから取得する方法を考えてみました。こういうのもスクレイピングというのでしょうか。

YahooのFinance (http://finance.yahoo.co.jp/)ページで株式コードを入力し株価検索ボタンを押すと当該企業の詳細情報が表示されます。
「チャート」というリンクを押下するとチャートを表示する画面に遷移します。
この画面のHTMLを観ると期間やタイプなどの設定をクエリ文字に指定してチャート図を表示していることが分かります。
チャート図はリンクになっていてそのリンク先が画像になっているのでこれを利用してみます。

サンプルコード

画面側のXAMLはこんな感じです。
コンボボックスと画像表示領域です。
<Window x:Class="StockChart.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid > <Grid.RowDefinitions> <RowDefinition Height="40"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid Background="#FFE1E6AC"> <ComboBox x:Name="cbCode" Margin="30,10,100,5" /> </Grid> <Grid Grid.Row="1" > <Image x:Name="img" Margin="20"/> </Grid> </Grid> </Window>

コードビハインド側はこんな感じ
using System;
using System.Linq;
using System.Net;
using System.Text;
using System.Windows;
using System.Windows.Media.Imaging;

namespace StockChart
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // 画面表示時にコンボ用のデータを取得&設定
            this.Loaded += (_, __) =>
            {
                var client = new WebClient();

                byte[] buffer = client.DownloadData("http://k-db.com/?p=all&download=csv");

                string str = Encoding.Default.GetString(buffer);

                string[] rows = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

                rows.ToList().ForEach(row=>
                    {
                        var array = row.Split(',');
                        if(array[0].Length == 6)
                        {
                            cbCode.Items.Add(string.Concat(array[0],"   ",array[1]));
                        }
                    });
            };
            // コンボで選択変更時のハンドラ
            this.cbCode.SelectionChanged += (_, __) =>
            {
                // 証券コードと市場コード
                var code = cbCode.SelectedItem.ToString().Substring(0,4);
                var market = cbCode.SelectedItem.ToString().Substring(5,1);
                // このリンク先が当該チャート画像
                var path = string.Format("http://chart.yahoo.co.jp/?code={0}.{1}&tm=3m&type=c&log=off&size=m&over=m65,m130,s&add=v&comp=", code, market);
                // 画像表示
                this.img.Source = new BitmapImage(new Uri(path));
            };
        }
    }
}


posted by RR at 23:11 | Comment(0) | サンプルプログラム  | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。