仮想通貨の自動売買プログラムを作る過程を紹介しています。
ボタンを押すと最終取引価格を含むレスポンスをテキストボックスに出力されるところまで進みましたが、現在表示しているレスポンスには以下ように不必要な情報も多く含まれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "product_code":"FX_BTC_JPY", "timestamp":"2018-03-14T06:27:50.563", "tick_id":7487175, "best_bid":1021400.0, "best_ask":1021500.0, "best_bid_size":0.073, "best_ask_size":0.902, "total_bid_depth":6954.38610369, "total_ask_depth":7379.33790296, "ltp":1021400.0, "volume":296323.63303079, "volume_by_product":273693.89307229 } |
このままだと読みにくいし、もともと取りたかったのは ltp (最終取引価格) だけなので、今回はここから ltp のみを取り出す仕組みを書き込んでいきます。
このレスポンスは JSON という形式で返されています。今後も JSON 形式のレスポンスから必要な情報のみを抜き出す事はありそうなので、JSON 形式のレスポンスを分解する汎用的なコードを追加します。
JSON 形式のレスポンスを分解する方法はいくつかあります。System.Runtime.Serialization.Json とかでもできるけど、Newtonsoft の方がパフォーマンスがよくて便利なのでこれを利用します。
利用する過程はこんな感じです。ひとつずつ見ていきましょう。
- Newtonsoft.Json のインストール
- Using Newtonsoft.Json の追記
- JSON の情報の型を定義する
- JSON 出力から必要な個所の値のみを取得する
1. Newtonsoft.Json のインストール
インストールの仕方は簡単で、ソリューション エクスプローラーの参照から入れるだけ。
[参照] を右クリックして、[Nuget パッケージの管理] をクリック。
上の [参照] をクリック、Newtonsoft_Json を選択して、[インストール]。
確認画面が出るので [OK]
すぐに “正常にインストールされました” と出力に出ました。
2. Using Newtonsoft.Json の追記
「Newtonsoft を使いますよ」とプログラムに定義する必要があります。
定義方法はプログラムの先頭に using xxxxx と並んでいるところに以下一行を追加するだけです。
1 |
using Newtonsoft.Json; |
3. JSON の情報の型を定義する
次に解読する JSON にどういう内容が含まれているのかを定義します。今回の場合だと “product_code” は文字列ですよ、ltp は数値ですよ、とかそういう感じの意味合いです。
これには JSON を C# 形式の定義に変換してくるサイトが便利なので、ここを活用。
上に JSON の文字列を入れて Generate を押すと下に C# 形式で書いてくれます。このままでも使えますが、RootObject だとなんのクラスかわからないので今回は JsonTicker というクラス名にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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; } } |
4. JsonConvert.DesirializeObject<型名> で必要な値だけを取得
これで準備ができたので、以下のように返されるレスポンス (response) から ltp の値だけをテキストボックスに表示します。
1 2 |
var DesirializedResponse = JsonConvert.DeserializeObject<JsonTicker>(response); textBox1.AppendText($"最終取引価格: {DesirializedResponse.ltp}"+ System.Environment.NewLine); |
具体的に比較できるように
以下が変更前:
1 2 3 4 |
client.BaseAddress = endpointUri; var message = await client.SendAsync(request); var response = await message.Content.ReadAsStringAsync(); textBox1.AppendText(response + System.Environment.NewLine); |
以下が変更後:
1 2 3 4 5 |
client.BaseAddress = endpointUri; var message = await client.SendAsync(request); var response = await message.Content.ReadAsStringAsync(); var DesirializedResponse = JsonConvert.DeserializeObject<JsonTicker>(response); textBox1.AppendText($"最終取引価格: {DesirializedResponse.ltp}"+ System.Environment.NewLine); |
自動売買プログラムの作成状況
今回は JSON 形式で返されるレスポンスから必要な情報を抜き取る方法を紹介しました。
- NewtonSoft.Json のインストール
- using NewtonSoft.Json の追記
- レスポンスの型を定義
- JsonConvert.DesirializeObject<型名> で必要な値だけを取得
自動売買プログラムの今の見た目はこんな感じです。ボタンを押すとレスポンスすべてではなく、その中の ltp (最終取引価格) だけがテキストボックスに表示されます。
自動売買プログラムのコードはこんな状態です。今回変更があった個所を色付けしてあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
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 Newtonsoft.Json; namespace BtcFxStep1 { public partial class Form1 : Form { static readonly Uri endpointUri = new Uri("https://api.bitflyer.jp"); //GetCurrentBtcFxPrice() で受け取るレスポンスの型を定義 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; } } //採取取引価格を TextBox に出力する public async Task GetCurrentBtcFxPrice() { var method = "GET"; var path = "/v1/ticker"; var query = "?product_code=FX_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(); var DesirializedResponse = JsonConvert.DeserializeObject<JsonTicker>(response); textBox1.AppendText($"最終取引価格: {DesirializedResponse.ltp}"+ System.Environment.NewLine); } } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Task Job1 = GetCurrentBtcFxPrice(); } } } |
最終取引価格はボタンを押して更新じゃなくて、自動的に最新の情報を表示してくれるようにしたいです。
次はそれを実現していきます。