PanRollingチャートギャラリーから、時系列データを取得するC# WPFアプリケーション
C# WPFを使用して、PanRollingチャートギャラリーから、株価の時系列データを取得するサンプルプログラムを紹介します。
実行するパソコンには、予め、PanRollingチャートギャラリー(体験版を使用しています)をインストールしてある必要があります。
PanRollingチャートギャラリーを操作するcomを利用する手順
アプリケーションが、PanRollingチャートギャラリーから、株価データを取得するためには、comを使用する必要があります。そのため、利用するパソコンに、あらかじめ、PanRollingチャートギャラリーが、インストールされている必要があります。
実際に購入してから、自分に、C#から使うだけのスキルが無いことが明確になると、寂しい気持ちになるので、体験版を使って動作を確認していきます。
PanRollingチャートギャラリーの体験版は、「 Pan Rolling相場アプリケーション試用版」としてダウンロードできます。
Pan Active Market DatabaseをC#で使用するための参照設定
- WPFアプリケーションを作成する
- 参照を追加する
- [プロジェクト] - [参照の追加] - [COM] タブ を選択
- Pan Active Market Database 1.3にチェック
- ActiveMarket という参照が追加される。
使用されている COM DLL は、amarket.dll です。
実行結果
左上のTextBlockに、株式コードを入れて、GetDataボタンを押すと、別の銘柄の時系列データが取得できますが、株式コードを確認するコードは入れていないので、データが存在しない株式コードを入力して、ボタンを押すとエラーが発生します。
ListViewを格納するレイアウトコンテナは、DockPanelを使っています。StackPanelを使うと、Windowの高さを超えて、ListViewが生成されるので、スクロールバーが表示されません。けっかとして、Windowに表示できない下の方のデータを確認することができません。
xamlコードでは、日付の表示形式を指定して、更に、ロケールを指定しています。
<GridViewColumn Header="日付"
Width="100"
DisplayMemberBinding="{Binding trading_date, StringFormat={}{0:d}, ConverterCulture=ja-JP}" />
コード
メインウインドウ
MainWindow.xaml
<Window x:Class="PanChart_GetStockData.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="株価時系列データ" Height="450" Width="600">
<DockPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBox Name="stock_code" Height="23" Width="80"/>
<TextBox Name="stock_name" Height="23" Width="300"/>
<TextBox Name="stock_date" Height="23" Width="200"/>
</StackPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal"
HorizontalAlignment="Right" >
<Button Name="button1" Height="23" Width="75" Click="button1_Click" >Get Data</Button>
</StackPanel>
<ListView Margin="10" Name="Chronological_List" ScrollViewer.VerticalScrollBarVisibility="Auto">
<ListView.View>
<GridView>
<GridViewColumn Header="日付"
Width="100"
DisplayMemberBinding="{Binding trading_date, StringFormat={}{0:d}, ConverterCulture=ja-JP}" />
<GridViewColumn Header="始値"
Width="80"
DisplayMemberBinding="{Binding open_price}" />
<GridViewColumn Header="高値"
Width="80"
DisplayMemberBinding="{Binding high_price}" />
<GridViewColumn Header="安値"
Width="80"
DisplayMemberBinding="{Binding low_price}" />
<GridViewColumn Header="終値"
Width="80"
DisplayMemberBinding="{Binding closing_price}" />
<GridViewColumn Header="出来高"
Width="100"
DisplayMemberBinding="{Binding trading_volume}" />
</GridView>
</ListView.View>
</ListView>
</DockPanel>
</Window>
Window表示を操作するコードは、MainWindow.xaml.cs内で記述しています。
分離コード
MainWindow.xaml.cs
using System.Windows;
namespace PanChart_GetStockData
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
StockPrices price = new StockPrices();
public MainWindow()
{
InitializeComponent();
Chronological_List.ItemsSource = price._StockPrices;
StockDataUpdate("1001");
stock_code.Text = "1001";
}
private void button1_Click(object sender, RoutedEventArgs e)
{
// 時系列データを変更する
StockDataUpdate(stock_code.Text);
}
public void StockDataUpdate(string stock_code)
{
// 時系列データを変更する
// 変更前の株式コードと変更後の株式コードが同じ場合は処理をしない。
if (price.stock_code != stock_code)
{
// 時系列データをクリアする
price.clear();
// 株式コードを設定
price.stock_code = stock_code;
// 株式データが存在する期間を表示
stock_date.Text = price.GetPositionRange();
// 銘柄名を表示
stock_name.Text = price.GetName();
// 時系列データを表示
price.GetPraice();
}
}
}
}
ActiveMarket.Calendarクラスの日付位置は、ヘルプでは、Long型と記載されていますが、実際には、int型です。これは、実行環境のWindowsが、64bit版である、あるいは、プロジェクトが64bitアプリケーションであることに由来していると思われます。(確認はしていません。)
データクラス
StockPrice.cs
using System;
namespace PanChart_GetStockData
{
class StockPrice
{
public DateTime trading_date { get; set; } // 日付
public Double open_price { get; set; } // 始値
public Double high_price { get; set; } // 高値
public Double low_price { get; set; } // 安値
public Double closing_price { get; set; } // 終値
public Double trading_volume { get; set; } // 出来高
// 日付を日付位置に変換するクラス
ActiveMarket.Calendar DatePos = new ActiveMarket.Calendar();
public StockPrice(DateTime date, Double open, Double high,
Double low, Double close, Double volume)
{
trading_date = date;
open_price = open;
high_price = high;
low_price = low;
closing_price = close;
trading_volume = volume;
}
public StockPrice(int date, Double open, Double high,
Double low, Double close, Double volume)
{
trading_date = DatePos.Date(date);
open_price = open;
high_price = high;
low_price = low;
closing_price = close;
trading_volume = volume;
}
public StockPrice(object date, object open, object high,
object low, object close, object volume)
{
trading_date = Convert.ToDateTime(date);
open_price = Convert.ToDouble(open);
high_price = Convert.ToDouble(high);
low_price = Convert.ToDouble(low);
closing_price = Convert.ToDouble(close);
trading_volume = Convert.ToDouble(volume);
}
}
}
ObservableCollection型クラスは、変更通知が実装されたList系コンテナです。UIに表示するデータを扱う場合は、List型ではなく、ObservableCollection型を使用することをおすすめします。
株価を取得し、データを格納するコード
StockPrices.cs
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace PanChart_GetStockData
{
class StockPrices
{
int date_position; // 日付位置を格納するオブジェクト
int bigin_date_position; // 株価でデータの日付位置の最小値
int end_date_position; // 株価でデータの日付位置の最大値
// 株式コード stock_code
public string stock_code { get; set; }
// 株式企業名 stock_name
string stock_name { get; set; }
// 株価 ObservableCollection型の配列
public ObservableCollection<StockPrice> _StockPrices = new ObservableCollection<StockPrice>();
// 日付を日付位置に変換するクラス
ActiveMarket.Calendar DatePos = new ActiveMarket.Calendar();
// 株価を取得するクラス
ActiveMarket.Prices StockPrice = new ActiveMarket.Prices();
public string GetPositionRange()
{
// 読み込みたい株価の株式コードを設定し、株価コードで指定した株価データを読み込む
StockPrice.Read(stock_code);
// 株価データ内の日付位置を取得する
bigin_date_position = StockPrice.Begin();
end_date_position = StockPrice.End();
// 株価データの日付の範囲をテキストとして返す。
return DatePos.Date((int)bigin_date_position).ToString("d") + " - " + DatePos.Date((int)end_date_position).ToString("d");
}
public string GetName()
{
// 銘柄名を返す
return StockPrice.Name();
}
public void GetPraice()
{
DateTime trading_date; // 日付
Double open_price; // 始値
Double high_price; // 高値
Double low_price; // 安値
Double closing_price; // 終値
Double trading_volume; // 出来高
// 株価データをObservableCollection型のクラスに格納する
for (int i = bigin_date_position; i < end_date_position; i++)
{
// 現在の日付位置にデータが存在するか確認する。
if (StockPrice.IsClosed(i) == 0)
{
// 株価データを取得する
trading_date = DatePos.Date(i); // 日付
open_price = StockPrice.Open(i); // 始値
high_price = StockPrice.High(i); // 高値
low_price = StockPrice.Low(i); // 安値
closing_price = StockPrice.Close(i); // 終値
trading_volume = StockPrice.Volume(i); // 出来高
// 株価データを追加する。
_StockPrices.Add(new StockPrice(trading_date, open_price, high_price, low_price, closing_price, trading_volume));
}
}
}
public void clear()
{
// 時系列データをクリアする
_StockPrices.Clear();
}
}
}