さて、実際に稼働用BOTのプログラムのコーディングをしてみましょう。

検討(ちょっと設計)の部分とは分けました。なので、この記事では心おきなくコーディングについてバリバリと解説していきますね^^笑

稼働用BOTのプログラム作成準備

プログラムを作る前の検討や簡単な設計については、前回までの記事で完了しています。実際にコーディングに入る上での準備・検討すべき点を改めて挙げてみます。

元にするプログラムは?

売買シグナルや注文処理をイメージするために作成したプログラムがありますので、そちらをまず参考にすると分かりやすいと思います。

シグナル判定と売買を処理を行う仮想通貨BOTを作ろう!

今回のプログラムの追加点

・CryptowatchAPIへのリクエスト処理は、ループの中(一定期間毎)で行う

・OHLCの情報は対象日時の終値、もしくは、最新の終値(OHLCの配列[-2])を基準にしてシグナル判定する
※対象日時の終値について:日足を元にしてシグナル判定を行う場合、本日が「2018/3/20」であれば、OHLCの日付が「201803-20 00:00:00」となっているデータを最新データと定義する
※なぜOHLCの配列[-2]が最新なのか?:配列[-1]は現在作成中のOHLCデータになります。終値が出ないので、1つ前のローソク足=[-2]を最新とします。

・売買時の情報を変数に格納する(購入価格、購入日時等)

・Jupyterやspyderではなく、プログラムファイル「○○.py」というプログラムを作成して実行する

今回のプログラムの条件(制約等含む)

・注文をした時のエラー(注文が通らない、約定しない)などは考慮しない

・今回は実際の注文はせず、注文をシュミレートした処理とする

・処理開始日は2018/3/20、処理終了日は2018/3/31と仮定してプログラム実行します。

・実際の日付を元に稼働させるのではなく、2018/3/20を開始日と仮定して、ループするたびに日付を+1日します。(実際に稼働させる場合は最新の終値(OHLC配列[-2])を設定すべきです)

・ローソク足は「日足」を対象にする

稼働用BOTの処理の流れ

検討段階でも処理の流れは記載しましたが、一部制約を追加しているので、今回のサンプルコードに合わせて、改めて処理の流れを書きますね。

処理の流れ(概要)

まずは大まかな処理の流れを考えてみます。

1)ライブラリ読み込み、初期化

2)ループ開始

3)ループ内の初期化

4)CryptowatchAPIにリクエスト(OHLCデータ取得)

5)売買シグナルの判定(新規注文、手仕舞い注文)

6)シグナルが出ている場合は新規注文

7)シグナルが出ている場合は手仕舞い注文

8)次のループへ

処理の流れ(詳細)

処理の流れの概要で挙げたものについて、もう少し細かく見ていきましょう。

1)ライブラリ読み込み、初期化

ライブラリもこれまでのBOT作成と同様に読み込んできたものを読み込みます。

また、(既に検討済みの)BOTの処理をコントロールする変数定義を忘れずに。

2)ループ開始

ループを開始する時は条件を指定しなければなりません。

稼働用BOTの場合は、検討の時と同じ様に「While True:」で無限ループできます。※手動で処理終了にする事はできます。

■While文のサンプル

ちなみに、While Trueの中でbreakをしなければ無限ループになります。AnacondaPromptなどであれば手動で停止できますので、無限ループでも全然OKです。

3)ループ内の初期化

ループ内で使用する変数はここで初期化しましょう。

4)CryptowatchAPIにリクエスト(OHLCデータ取得)

これまでに何度も行っている処理ですが、CryptowatchAPIからOHLCデータを取得します。

今回はループ内でOHLCデータの取得を行いますので、CryptowatchAPIへのリクエストもループ内で行う事になります。

5)売買シグナルの判定(新規注文、手仕舞い注文)

今回は(これまでと同じ)チャネルブレイクアウトの判定を行います。

尚、ドテン買い、売りをしてみたいと思いますので、新規注文の場合も手仕舞い注文の場合も判定箇所は同じになります。
※新規注文と手仕舞いのタイミングは普通は別になります。また、買いと売りでもタイミングがずれる事はよくあります。

例えば、過去20期間の高値を上に抜けたら、新規買い注文を入れ、売りポジションを持っている場合は手仕舞いします。既に買い注文を持っている場合は、買い増しする事になります。

6)シグナルが出ている場合は新規注文

売買シグナルの判定により、新規注文シグナルが出た場合は新規注文を入れます。

過去20期間の高値を上抜け⇒買い

過去20期間の安値を下抜け⇒売り

のポジションになります。

7)シグナルが出ている&ポジションを持っている場合は手仕舞い注文

売買シグナルの判定により、手仕舞いシグナルが出た場合は決済注文を入れます。
※上述している通り、新規注文と同じタイミングでシグナルが発生します。

過去20期間の高値を上抜け⇒売りポジションを持っている場合は手仕舞い

過去20期間の安値を下抜け⇒買いポジションを持っている場合は手仕舞い

となります。

8)次のループへ

次のループに行く前に少し休憩時間を入れましょう。

これを「スリープを入れる」などといいます。

以下がサンプルです。sleepモジュールの読み込みさえ完了すれば、使い方は簡単です。

■Pythonコード

プログラムを作ろう

では検討を踏まえて、実際にプログラムを作成してみましょう。

ただ、今回は、実際の日付で実行する訳ではなく処理対象日を2018/3/20と仮定して、ループを回します。
2018/3/21、2018/3/22、・・・と日付を1日ずつ足しています。

※日付を今日日付にしたり、常に最新のデータをCryptowatchAPIから取得するなどすれば実際に稼働させられるコードになります。

■Pythonコード

■実行結果

■コードと結果解説

今回実行した結果は、実際その日(2018/3/20~3/31)にBOTを稼働させた場合と同じ結果となっているはずです。

各処理の詳細については、全体のコードの前で記載しているのでそちらを参考にして下さい。

■実際に動かす場合の注意点

実際に動かす場合には以下の点を変更する必要があります。
※最新データを常に確認する方法です。

・注文を入れるコードを追加

・無限ループにする(「While True:」を使う)

・参照するOHLCは最新のもの(OHLCの配列[-2])を見れば良い
※OHLCの配列[-1]のデータは現在作成中のOHLCとなり、終値が出ないため対象外

・Cryptowatch APIから取得するデータは直近データにする(beforeの指定はいらない)

・Cryptowatch APIのリクエスト制限に注意(実行し過ぎるとリクエストブロックになる可能性があります)

・注文エラー時の処理を追加する(今回は注文エラーは発生しない前提で実施しています)

まとめ

今回は実際に稼働させるBOTのサンプルを作成しました。

本当に稼働させるためには注文の処理を組み込むなど、もう少し手を入れる必要がありますが、そこはこれまでにお伝えしている内容を把握されていれば簡単なはずです。
※もし、分からない箇所がある。という場合には、これまでの内容を改めて復習してみて下さい。

シグナルの変更などは頻繁に発生すると思いますが、稼働するBOTのフローやコードというのは基本的には大きくは変わりません。

一度、しっかりと軸となる様なコードを用意しておけば、その後の変更も非常に楽です。