C# WPFプログラミングの迷い道

C# WPFで株式投資ツールの作成に挑戦する!

PanRollingチャートギャラリーから、時系列データを取得するC# WPFアプリケーション

C# WPFを使用して、PanRollingチャートギャラリーから、株価の時系列データを取得するサンプルプログラムを紹介します。

 

実行するパソコンには、予め、PanRollingチャートギャラリー(体験版を使用しています)をインストールしてある必要があります。

PanRollingチャートギャラリーを操作するcomを利用する手順

アプリケーションが、PanRollingチャートギャラリーから、株価データを取得するためには、comを使用する必要があります。そのため、利用するパソコンに、あらかじめ、PanRollingチャートギャラリーが、インストールされている必要があります。

実際に購入してから、自分に、C#から使うだけのスキルが無いことが明確になると、寂しい気持ちになるので、体験版を使って動作を確認していきます。

PanRollingチャートギャラリーの体験版は、「 Pan Rolling相場アプリケーション試用版」としてダウンロードできます。

Pan Active Market DatabaseをC#で使用するための参照設定

  1. WPFアプリケーションを作成する
  2. 参照を追加する
  3. [プロジェクト] - [参照の追加] - [COM] タブ を選択
  4. Pan Active Market Database 1.3にチェック
  5. ActiveMarket という参照が追加される。

使用されている COM DLL は、amarket.dll です。

Pan Active Market Database 1.3にチェック

Pan Active Market Database 1.3にチェック

実行結果

左上のTextBlockに、株式コードを入れて、GetDataボタンを押すと、別の銘柄の時系列データが取得できますが、株式コードを確認するコードは入れていないので、データが存在しない株式コードを入力して、ボタンを押すとエラーが発生します。

ListViewを格納するレイアウトコンテナは、DockPanelを使っています。StackPanelを使うと、Windowの高さを超えて、ListViewが生成されるので、スクロールバーが表示されません。けっかとして、Windowに表示できない下の方のデータを確認することができません。

f:id:kukekko:20200913162438p:plain

時系列データを取得するアプリケーション

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

 

kukekko.hateblo.jp

 

 

kukekko.hateblo.jp