仮想通貨BOTを作るために、これまでに以下の様な事を検討したり、実際にプログラムを作成したりしてきました。

■検討した事(抜粋)

・仮想通貨BOTの全体像

・BOTのソースの管理方法

・システムトレードの考え方の基礎

■作成したプログラム(抜粋)

・OHLCデータを取得するプログラム

・取引所の注文関連の操作(注文、手仕舞い、約定確認等)をするプログラム

・シグナルを判定するプログラム

さて、ここからはこれまでに検討した内容や、プログラムをパズルの様に組み合わせて、「仮想通貨BOTの全体像」を作成しましょう。

ここからは、プログラムの全体像を考えながら、まとめていく部分ですね。今回のプログラムが完成すれば簡単なバックテストも可能になります。
※バックテスト結果の集計まではしません

プログラムをバラバラに作成して、最終的に一つに組み合わせるというのは、システムエンジニアの現場でもよく行われる事です。さすがにもっともっと大きな規模ですが^^;

仮想通貨BOT(全体像)の検討

これまでに作成したプログラムを組み合わせていきます。

プログラムを組み合わせる上で大事なポイントを挙げておきます。

重要なポイント

・注文、ポジション有無、手仕舞いなどの処理ステータスを管理する「変数」を定義

・シグナル判定処理、データ取得処理などの処理はまとめて「関数化」する

・main関数の中で「ループ」処理を行う(一定時間毎に処理を繰り返す)

処理の流れ

実際に処理の流れを考えていきましょう。

・必要ライブラリ、モジュールの読み込み

・初期化処理(変数の定義、値の設定等)

・ループ(1回分開始)↓

・初期化処理(変数の定義、値の設定等)

・データ取得(APIを使って口座情報や、OHLC情報の取得)※今回の例ではループの外で取得

・シグナルの判定(売買のポイントがあるか?)

・(シグナルが出たら)注文を入れる

・(注文が入っている場合)注文が通ったかを確認

・(注文が通っている場合)約定したかどうかを確認

・(約定している場合)手仕舞いの判定

・(手仕舞いのシグナルが出たら)手仕舞い注文をする

・ループ(1回分終了)↑

ざっくりと言うと、この様な流れでしょうか。

もちろん細かい部分を言えば、手を入れなければならないポイントはたくさんありますが、現状は大まかな処理の流れを考えておけばOKです。

課題

また、今回実装するかどうかに関わらず、以下の様な課題も洗い出しておきましょう。

・購入時の価格はどの様に決めるのか?

・成行/指値は使い分けるのか?

・サーバーエラーが発生した際はどうするか?

・取引所はどこを使うか?

・連続して注文が通らなかった場合はどうするか?

・約定せずに残ったままの注文はどうするか?

この様な課題なども踏まえて、今使わなくとも、後で必要そうな関数は全て作成しておきましょう。

「シグナル判定&売買」の作成!

あんまり考え過ぎてもいけませんので、現状できる範囲でプログラムを作成していきましょう。

と、その前にプログラムを作る上での前提を決めておきましょう。すぐに全ての事は実現できませんので、必要な箇所から実装する形でOKです。

プログラムの着地点

今回は実際に売買などは行わずに、cryptowatchから取得したデータに対して、シグナルの判定をしたり、注文を出したり、という事をシュミレートしていきたいと思います。

そのため、以下の様な制約を設けてプログラムを作ります。

■制約

・注文関連の処理(注文、手仕舞い、約定確認等)はコメント化する

・注文関連のエラーチェックは行わない。そのため、注文が通らなかった場合、約定しなかった場合はそのまま処理を継続する。決済注文の場合も同じ考え方とする。

・cryptowatchからの読み込みはプログラムの一番最初に1回だけ行う。ループの中では行わないため、実際に稼働させるプログラムとは記載が若干異なる。

■前提条件

・bitFlyerの過去のデータをcryptowatch APIから取得する

・2018/3/1~2018/5/31のデータを対象とする

・ローソク足は日足の情報を基にしてシグナル判定を行う

プログラムを部分的に作成する

では実際にプログラムを作成しましょう。

全体的なプログラムを作る前に、部分的にプログラムの解説をします。

これまでに作成している内容もありますので、その部分はおさらいだけしておきます。

ライブラリ、モジュールの読み込み

プログラムの先頭で必要ライブラリ・モジュールの読み込みを行います。

この点はプログラムの内容と照らし合わせて、必要なライブラリ等をimportすればOKです。

変数の定義

trade_infoという変数を定義して、その中で、

・注文のシグナルが出ているか

・ポジションを持っているか

・決済注文のシグナルが出ているか

などを定義します。

※今回は使用しませんが、注文の有無状態を保持する変数も定義しています。

データの取得

今回は口座情報の取得は行いません。

cryptowatchからOHLCデータ(日足)のみ取得を行います。

シグナルの判定

今回は以前作成した、チャネルブレイクアウトのシグナルを使います。

チャネルブレイクアウトでは「ドテン買い、ドテン売り」というテクニックがあります。

ドテン買い・売りというのは

・過去○○期間の高値を超えたら買い、さらに売りポジションを持っている場合は手仕舞い

・過去○○期間の安値を超えたら売り、さらに買いポジションを持っている場合は手仕舞い

という手法になります。

そのため、新規注文の場合と、手仕舞い(決済)のタイミングが同じになります。

注文売買処理

売買処理(注文・手仕舞い)を行う際には、注文が通っているかの確認、約定しているかの確認が必要というお話をしたと思います。

そのため、一定の確率で注文に失敗、注文が通ったけど約定していないなどのケースを盛り込む事にしました。テスト用の関数をいくつか作成して、実際のBOTの処理が多少はイメージできる様に工夫しています。

注文の成功/失敗の有無はどれくらいの確率で発生するかは稼働させてみなければ分かりません。ここでは乱数を発生(テスト用関数名:test_rand_OK)させて約10%の確率で注文に失敗、約定していない処理の流れも作成しています。

以下が買い注文を行う際の処理の流れです。

1)買い注文を行う

2)注文が通ったかどうかを判定

3)注文が通ったら約定しているかどうかを判定

4)約定したら、買いポジションを持つ(trade_info[“position_buy_flag”]=1にする)

■Pythonコード(買い注文関連)

全体処理

最終的に上記の処理を組み合わせていきます。

1回だけで済む処理はループの外で行います。

ローソク足を読み込むたびに実施する処理はループの中で行っていきます。

また、何度も実施する処理は、ある程度の処理をまとめて関数化して呼び出す様にします。

プログラムを組み合わせてBOTの全体像を作ろう!

以下が部分的なプログラムを組み合わせた結果になります。

これまでのコード量と比べると、かなり長~いプログラムになっていますね^^

■Pythonコード(全体像)

■実行結果(抜粋)

まとめ

これまでに比べるとコード量、情報量が増えているのでこんがらがってしまうかもしれませんが、一つ一つの処理はシンプルなものです。

さて、今回シグナルの判定と、実際の売買注文(イメージ)を組み合わせてみました。

実は、ここまでで仮想通貨BOTの全体像は大体完成です。まだ埋まってない処理があるよと思うかもしれませんが、必要な処理を追加したり、削除したりというのは、永遠にやっていかなければならない作業です。

それに開発者からすれば、実際に使用するコードよりも、処理フローを理解する事の方がずっと大切です。処理フローはしっかりと押さえておきましょう。