ビットコインの自動売買アプリの作り方 (うねり取り売買が出来るまで) ③【毎秒ごとに価格取得編】

前回まではボタンを押すと最終取引価格をテキストボックスに出力されるところまで作りました。
今回はボタンを押すと指定された秒(ミリ秒)単位で最終取引価格を取得して、一覧に表示するところまでを作ります。

フォーム画面の作成

ツールボックスから[Label]と[DatagritView]をフォームへドラッグします。

01_DataGridView_Labelを貼り付け

コントロールの配置を変更します。

02_コントロールの配置変更

[button1]の名称をプロパティの[Text]から変更します。
"実行 / 停止"という名称にします。
このボタンをクリックすることで一覧へ最終取引価格を表示/非表示を制御することができます。

03_ボタン名称変更

"実行中" "停止中"の状態を表示するラベルのフォントを変更します。プロパティの[Font]から設定できます。

04_Font変更

テキストボックスは前回までは最終取引価格を表示することに使用してましたが、今回は最終取引価格を表示するサイクルタイムを設定するコントロールとして使用します。
幅を狭くして、単位(ミリ秒)をラベルで表示します。

05_Textの幅変更_Label名称変更

最終取引価格を表示する一覧の設定を行います。DataGridViewを右クリックして、[列の編集...]をクリックします。

06_DataGridViewをクリック

1列目に日時を表示しますので、列名と幅を設定します。
幅:Width "150"
列名:HeaderText "日時"

画像7

2列目に最終取引価格を表示しますので、列名を設定します。
列名:HeaderText "価格"

画像8

列名と幅を調整しました。

画像9

クラス名の下に状態フラグの変数名を宣言します。
bolStatusFlg
 実行中:true
 停止中:false

 public partial class Form1 : Form
 {
     private bool bolStatusFlg = false; // 状態(実行中 / 停止中)フラグ

     public class JsonTicker
     {

Form()メソッド内のコードを書いていきます。
画面が表示された時に実行されます。初期設定や初期値を設定します。

public Form1()
{
   InitializeComponent();
   dataGridView1.ReadOnly = true;  // 一覧を変更不可
   label1.Text = "停止中";         // 初期表示は"停止中"
   label1.ForeColor = Color.Red;   // "停止中"は文字を赤色 
   textBox1.Text = "1000";         // 初期値は1000ミリ秒(1秒)
}

button1_Click()メソッド内にコードを書いていきます。button1がクリックされた時に実行されます。

private void button1_Click(object sender, EventArgs e)
{
   // 状態が"停止中"の場合
   if (bolStatusFlg == false)
   {
       label1.Text = "実行中";         // 状態を"実行中"に設定
       label1.ForeColor = Color.Blue;  // "実行中"は文字を青色
       bolStatusFlg = true;            // 状態フラグを"true"(実行中)に設定
   }
   // 状態が"実行中"の場合
   else
   {
       label1.Text = "停止中";         // 状態を"停止中"に設定
       label1.ForeColor = Color.Red;   // "停止中"は文字を赤色
       bolStatusFlg = false;           // 状態フラグを"false"(停止中)に設定
   }

   Task task1 = GetBtcPrice();
}

GetBtcPrice()メソッド内にコードを書いていきます。一覧表に値を表示させる部分になります。

public async Task GetBtcPrice()
{
   while (bolStatusFlg) // 状態が"true"(実行中)の場合は表示処理を繰り返す
   {
       var method = "GET";
       var path = "/v1/ticker";
       var query = "?product_code=BTC_JPY";

       using (var client = new HttpClient())
       using (var request = new HttpRequestMessage(new HttpMethod(method), path + query))
       {
           client.BaseAddress = endpointUri;
           var message = await client.SendAsync(request);
           var response = await message.Content.ReadAsStringAsync();

           //Console.WriteLine(response);
           var DesirializedResponse = JsonConvert.DeserializeObject<JsonTicker>(response);
           //textBox1.Text = "日時:" + DesirializedResponse.timestamp + " 価格:" + DesirializedResponse.ltp;

           // 一覧に「日時」と「価格」を表示。価格はカンマ編集を行う("#,0")。
           dataGridView1.Rows.Insert(0, DesirializedResponse.timestamp, DesirializedResponse.ltp.ToString("#,0"));
       }

       //テキストで設定された値をサイクルタイムとして設定(ミリ秒)
       await Task.Delay(int.Parse(textBox1.Text));
   }
}

テキストボックスに値が入力された時のイベントKeyPress()イベントを作成します。テキストを選択し、プロパティのイベントを選択し、KeyPressをダブルクリックします。

14_KeyPressをダブルクリック

KeyPress()イベントが作成されます。

15_KeyPressをダブルクリックコード

テキストボックスからフォーカスが外れた時のイベントLeave()イベントを作成します。テキストを選択し、プロパティのイベントを選択し、Leaveをダブルクリックします。

16_Leaveをダブルクリック

Leave()イベントが作成されます。

17_Leaveをダブルクリックコード

KeyPress()メソッドとLeave()メソッド内にコードを書いていきます。

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
   //0~9と、バックスペース以外の時は、イベントをキャンセルする
   if ((e.KeyChar < '0' || '9' < e.KeyChar) && e.KeyChar != '\b')
   {
       e.Handled = true;
   }
}

private void Form1_Leave(object sender, EventArgs e)
{
   textBox1.Text = "1000"; // 空の場合は1000ミリ秒(1秒)
}

コードの全てになります。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace BtcTrade
{
   public partial class Form1 : Form
   {
       private bool bolStatusFlg = false; // 状態(実行中 / 停止中)フラグ

       public class JsonTicker
       {
           public string product_code { get; set; }
           public DateTime timestamp { get; set; }
           public int tick_id { get; set; }
           public double best_bid { get; set; }
           public double best_ask { get; set; }
           public double best_bid_size { get; set; }
           public double best_ask_size { get; set; }
           public double total_bid_depth { get; set; }
           public double total_ask_depth { get; set; }
           public double ltp { get; set; }
           public double volume { get; set; }
           public double volume_by_product { get; set; }
       }

       static readonly Uri endpointUri = new Uri("https://api.bitflyer.com");

       public async Task GetBtcPrice()
       {
           while (bolStatusFlg) // 状態が"true"(実行中)の場合は表示処理を繰り返す
           {
               var method = "GET";
               var path = "/v1/ticker";
               var query = "?product_code=BTC_JPY";

               using (var client = new HttpClient())
               using (var request = new HttpRequestMessage(new HttpMethod(method), path + query))
               {
                   client.BaseAddress = endpointUri;
                   var message = await client.SendAsync(request);
                   var response = await message.Content.ReadAsStringAsync();

                   //Console.WriteLine(response);
                   var DesirializedResponse = JsonConvert.DeserializeObject<JsonTicker>(response);
                   //textBox1.Text = "日時:" + DesirializedResponse.timestamp + " 価格:" + DesirializedResponse.ltp;

                   // 一覧に「日時」と「価格」を表示。価格はカンマ編集を行う("#,0")。
                   dataGridView1.Rows.Insert(0, DesirializedResponse.timestamp, DesirializedResponse.ltp.ToString("#,0"));
               }

               //テキストで設定された値をサイクルタイムとして設定(ミリ秒)
               await Task.Delay(int.Parse(textBox1.Text));
           }
       }

       public Form1()
       {
           InitializeComponent();
           dataGridView1.ReadOnly = true;  // 一覧を変更不可
           label1.Text = "停止中";         // 初期表示は"停止中"
           label1.ForeColor = Color.Red;   // "停止中"は文字を赤色 
           textBox1.Text = "1000";         // 初期値は1000ミリ秒(1秒)
       }

       private void button1_Click(object sender, EventArgs e)
       {
           // 状態が"停止中"の場合
           if (bolStatusFlg == false)
           {
               label1.Text = "実行中";         // 状態を"実行中"に設定
               label1.ForeColor = Color.Blue;  // "実行中"は文字を青色
               bolStatusFlg = true;            // 状態フラグを"true"(実行中)に設定
           }
           // 状態が"実行中"の場合
           else
           {
               label1.Text = "停止中";         // 状態を"停止中"に設定
               label1.ForeColor = Color.Red;   // "停止中"は文字を赤色
               bolStatusFlg = false;           // 状態フラグを"false"(停止中)に設定
           }

           Task task1 = GetBtcPrice();
       }

       private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
       {
           //0~9と、バックスペース以外の時は、イベントをキャンセルする
           if ((e.KeyChar < '0' || '9' < e.KeyChar) && e.KeyChar != '\b')
           {
               e.Handled = true;
           }
       }

       private void Form1_Leave(object sender, EventArgs e)
       {
           textBox1.Text = "1000"; // 空の場合は1000ミリ秒(1秒)
       }
   }
}

リビルドします。

20_リビルド

リビルドした結果になります。

21_リビルドの実行結果

実行ボタンをクリックします。

22_実行ボタンをクリック

フォーム画面が起動します。

23_フォーム画面起動

[実行 / 停止]ボタンをクリックすることで、最終取引価格を取得した日時と価格が表示されたり、停止されたりします。サイクルタイムを変更することで設定されたタイムに従って一覧に値が表示されます。

24_フォーム画面起動_実行中


この記事が気に入ったらサポートをしてみませんか?