仮想通貨の自動売買プログラムを作る⑤:成行で買う処理を追加

仮想通貨の自動売買プログラムを作る過程を紹介しています。

はじめて仮想通貨の自動売買プログラムを作った過程 [Bitflyer/BTC-FX/C#]

ここまでは自動売買プログラムの画面など、基本的な部分を作ってきましたが、今回からやっと実際の取引をしていきます。

最初に描いたとおり、以下が今回プログラムで実現したいことです。

  1. 成行で買い注文を入れる
  2. 一定の儲けが出たら利確して、さらにそこで成行入れる

今回はこの最初の成行注文を入れるところからです。

細かいアルゴリズムについて考える

今回は以下のような感じで処理をするプログラムとします。

  1. 成行注文を入れる (枚数は変更できるようにする)
  2. 成行注文が確約した値段を確認する
  3. 確約した値段 + x で指値注文を入れる (x は後で変えられるようにする)
  4. 指値注文が通るのを待つ。完了したら再度 1. から繰り返す。

実際のところ、特殊注文の IFD を使えばいくつか省略することもできますが、成行注文だと確約する値段が多少ずれたりして 1 万円プラスで終わった!って思ったのに 9730 円だったりします。(逆に 10300円だったりする場合もあります)

大した問題ではないんですが、せっかく自動売買プログラムを書くのでちゃんと確約した値段+x で売り注文を入れるようにしていきます。

成行注文を入れるための C# コード

では成行注文を入れるためのコードを追加していきます。

成行注文の枚数は後で変えられるようにしますが、とりあえず処理をみるために 0.001 を成行で買うためのコードを追加します。

Lightning API Playground から成り行き注文は POST /v1/me/sendchildorder の命令に以下の BODY を指定することで実現できることを確認。

これの C# のサンプルコードを参考に、自分の自動売買プログラムに変更を加えていく。というかこれはほぼコピペで行ける。

先頭に足りてなかった using System.Security.Cryptography を追加。(API キーを暗号化するために以下が必要)

とりあえずテスト用に残してある Button1 をクリックすると該当コードが実行されるにようにするために、これから追加する関数 MakeMarketOrder() の呼び出しを追加。

そして MakeMarketOrder() の定義。ここはほぼコピペ。Console.WriteLine のだった部分を TextBox1 に出力するように変更しただけ。

※最初の 2 行で指定している apiKey と apiSecret は隠すために変更してあります。

この時点で自動売買プログラムを実行してボタンを押すレスポンスがちゃんと返ってくることを確認。

bitFlyerAPIMakeOrderAsMarket001

実際に bitFlyer Lightning にログインして、建玉にも追加されていることを確認。

bitFlyerAPIMakeOrderAsMarket002

成行注文の枚数を指定できるようにする

成行注文の枚数を 0.001 から変更できるようにしたいので、フォーム上に成行注文の枚数を指定できる場所と、そこに指定された枚数の成行注文を入れるようにコードを変更していきます。

フォームの編集

これまでやってきたのとツールボックスから必要なコントロールを持ってきて、フォームの見た目を更新します。

枚数を指定するには TextBox より NumericUpDown の方が便利なのでこれを使用。成行注文を入れる Button と Label も追加します。あと、せっかくなので GroupBox も使ってちゃんと枠も作っていきます。

まずは GroupBox をドラッグして、以下のプロパティを変更します。Button1 が真ん中で邪魔だったので端っこにずらしました。(Name のプロパティ値が上の方にあるので、スクショには含まれていません)

  • Name: GroupBoxMarketOrder
  • Font: MS UI Gothic, 12pt
  • Text: 成行注文

bitFlyerAPIMakeOrderAsMarket003_

この GroupBox の枠の中にラベルとテキストボックスとボタンを配置。

それぞれ以下のプロパティを変更

  • Label
    • Name: labelMarketOrder
    • Text: 注文枚数
  • NumericUpDown
    • DecimalPlaces: 3
    • Increment: 0.001
    • Name: numericUpDownMarketOrder
    • Value: 0.001
  • Button
    • Name: buttonMarketOrder
    • Text 発注

見た目は後でいくらでも変更できるのでとりあえずはこれで良し。

bitFlyerAPIMakeOrderAsMarket004

フォームの内容に合うようにコードを編集

フォームに合わせてコードを以下2つに対応するように変更する。

  1. Button1 がクリックされた時に呼ばれる関数を buttonMarketOrder にうつす
  2. 成行注文の枚数を 0.001 固定からフォームに指定されている枚数に変更

1. は簡単。button1_Click で呼んでいる関数を buttonMarketOrder_Click で呼ぶように変更すればいいだけ。ついでに Task の名前を変えておく。(追加したボタンをダブルクリックしたら、buttonMarketOrder_Click の枠が自動的にできるのでそこにコピー)

2. は以下の body に書いている 0.001 をフォームの値に変更する。

これも 0.001 の部分を numericUpDownMarketOrder.Value で指定されている値を持ってくるようにすれば対応できる。

関数に汎用性を持たせる

成行注文を MakeMarketOrder の中でレスポンスの処理をするのではなく、MakeMarketOrder 関数の戻り値をレスポンスにして、呼び出し側でレスポンスのハンドリングをするように変更。

レスポンスは STRING 値なので関数の定義方法を以下のように変更。

ついでにレスポンスをちゃんと受け取っているかのエラーハンドリングを追加。関数が STRING を返すようになったので、エラーの場合には ERROR_NO_RESPONSE を返す。

エラーがなかったら、そのままレスポンスを返す。

レスポンスの JSON の分解などのハンドリングは呼び出し側に任せる。

自動売買プログラムの作成状況

ひとまず今回は成行注文を入れるところまで。

今の自動売買プログラムの見た目はこんな感じ。

bitFlyerAPIMakeOrderAsMarket004

以下がコードの全容。APIKEY と Secret は “xxxxxx” 変更しているので、コピーする場合にはそこを変更するのをお忘れなく。(この時点でコピーする人はいないと思うが・・)

さて、次は成行注文の確約した値段 + x を売値として注文を入れる処理を追加します。(ほぼ単純な指値注文)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする