今回は仮想通貨BOTのプログラムの作り方という大きなテーマについてお話します。
システムの設計技法・コーディングルールというのは数多くあるため、どれが正解とは言えません。ポリシーや目的は人それぞれですので、どの様に作るか?も正解は無数にあります。
ただ、仮想通貨BOTの作成という事であれば、あるべきプログラムの形というのはかなり絞られてくると思います。なぜなら大規模なシステムを作っている方からすれば、仮想通貨BOTのプログラムというのは、ツールの様な規模だからです。※もちろん、やる事が多くなれば一般のシステムと同じくらいの規模になりますが。
ですから、今回は仮想通貨BOTのプログラムの流れについて考えてみましょう。
コンテンツ
仮想通貨BOTではどの様なプログラムが良いのか?
さて、いきなり元も子もない事を言うと、仮想通貨BOTの目的はトレードで利益を出す事ですから、極端な話、利益が出てさえいれば何でもOKです。
もっと言うと、バグが入っているプログラムだけど運用成績が20%のプラス、バグが入っていないけれど運用成績が20%のマイナスであれば、システムトレードの世界で評価されるのは前者となります。(これは極端な例ですからバグは取りましょうね。。。)
品質をなるべく高めるのは当然としても、運用成績が良いのであれば、基本的には自分が作りたい様に作ってOKです。
それに、プログラムを書くのは初めてだという方もいると思うので、最初からあれこれ考え過ぎるよりは、まず作ってみた方が良いというのが個人的な意見です。
ただ、ここを意識しておくと後々で、プログラムを修正するのが楽だよ。というポイント挙げてみます。
BOTのコード書く上での大切なポイント2つ
もったいぶらずに言ってしまうと、まず意識すべきなのは以下の2つだと思います。
■可読性 ・・・ 後でプログラムを読んだ時に分かりやすい事
■拡張性 ・・・ 後々でプログラムの機能を修正、追加しやすい事
この2つを挙げた理由はハッキリしていて、仮想通貨BOTのプログラムというのは、必ず修正や機能拡張が必要になります。※もしくは作り直しが必要
仮想通貨相場のトレンドというのは常に変化し続けるため、仮に今現在有効なアルゴリズムをプログラムに落とし込んだとしても、いつかは使えない(損をしてしまう)プログラムになってしまうからです。※また使える日が来るかもしれませんが
ですから、プログラムに再度手を入れる事を前提で、まずはプログラム作成を行いましょう。
プログラムを作成する上で意識すべき事
では具体的に仮想通貨BOTを作る時にどんな事をすれば、拡張性・可読性が高くなるのでしょうか?例を通して確認しましょう。
可読性を上げるためにはどうすれば良い?
まず、可読性についてはすぐに分かると思いますが、基本的な事だけ挙げると、
・変数名、関数名に分かりやすい名前を付ける
・コメント文として処理の内容を分かりやすく書いておく
・分かりやすいロジックを書く
という事をとりあえず意識しておけばOKかなと思います。
拡張性を上げるためにはどうすれば良い?
こちらはやる事が結構たくさんあります。ただ、以下を意識したプログラムにしておけば、後からでもある程度修正しやすいものになると思います。
・なるべく処理をまとめて関数化しておく
※特に何度も行われる処理は共通関数にする
・main処理から各関数を呼び出す
・データフローを分かりやすくする(トレードに必要な情報全てをまとめられる変数を用意しておく等)
ここを意識しておけば、機能を追加しようと思った時に必要な部分だけ新たな関数として追加すれば良い事になります。main処理を変更する様な修正をなるべくしない様に、最初から作っておくと、後々楽です。
また、必要な情報全てを正確に把握するために、情報をまとめた変数を用意しておきましょう。関数を使えば便利ですが、関数を行ったり来たりすると、どれがどの変数か分かりにくい事があります。そんな時は、一つクラス変数(C言語の構造体の様な使い方ができるので便利)を用意して、その中に必要な情報を詰め込んでおきましょう。
ちょっと分かりにくかったかもしれませんので、もう少し例などを出して説明します。
仮想通貨BOTの処理を考える
例えば、トレンドが上昇していて、長期移動平均線を短期移動平均線を上抜けたら、買いの指値を入れたい。としましょう。
処理の流れとしてざっくりと以下の様な流れを考えます。
1)現在の市場情報を取得する関数
2)トレンドを判断する関数
3)移動平均線を判断する関数
4)指値の価格を決める関数
5)注文をする関数
さらに、各関数の情報を全て集約できる様な変数mst_dataというものを用意したとします。
mst_dataは、市場情報、上昇トレンドor下降トレンド、移動平均線の情報、指値の価格などの情報を持っています。
■mst_data変数のイメージ
mst_data={“market”:0,”trend”:”up”,”m_line”:0,”limit”:0}
BOT処理の流れを追ってみよう
1)市場上昇を取得する関数
市場情報を取得して、戻り値としてmst_data[“market”]に格納します。※この中にさらに細かい情報を持っても全然OKです。
2)トレンドを判断する関数
トレンドが上昇かどうかを判断したら、戻り値として結果をmst_data[“trend”]へと格納します。
3)移動平均線を判断する関数
移動平均線の状態を判断したら、戻り値としてmst_data[“m_line”]へと格納します。
4)指値の価格を決める関数
関数の中で、資産情報などから指値の価格を決めて、戻り値としてmst_data[“limit”]へ格納します。mst_dataにアカウント情報を持たせておいて、その値を引数としてまず渡してあげるのもアリです。
5)注文をする関数
この関数のはとっても簡単です。mst_dataには全ての情報が格納されている訳ですから、この変数の値を基に、判定するロジックを組めば良いだけです。mst_data[“trend”]が”UP”で、mst_data[“m_line”]が”OK”だったら、注文を出す。という風に。その時の指値の値も既に決まっている訳です。
仮想通貨BOTのプログラムを修正する場合
仮に上記の様なプログラムを仮想通貨BOTとして稼働させた。そして利益が出た。としても、これをずっと使い続ける事はできません。上述した様に市場のトレンドは変わってしまうからです。
という事で、一度作成したプログラムを修正してみます。
取引のシグナルとして「移動平均線」の指標をやめて、「チャネルブレイクアウト」の指標を取り入れようと思ったら、移動平均線を判断する関数を削除(もしくはコメントアウト)して、チャネルブレイクアウトを判断するプログラムに書き換えれば良いのです。
一部分だけを変更すれば新しいプログラムができてしまう。つまり拡張性が高くて、修正・追加しやすいプログラムと言えます。
まとめ
今回は実際にプログラムを触る訳ではなく、仮想通貨BOTの処理をイメージする様な内容になりました。
しかし、多くのエンジニアの方は実際のコーディングよりも、この様な処理イメージやコーディング設計の方を大切にするのではないでしょうか。私が知る限り、有能なエンジニアの方ほど事前の処理イメージを大切にします。
今回ご紹介した様に、main処理の中で全てのデータを管理する変数を持って置き、各関数ではその変数の内容を書き換えていくようなイメージでプログラムを作成すると、後々の修正や追加がとっても楽になります。
もちろん、答えは一つではありません。その創造性が問われる所がシステム開発の面白い所です。
なんだかよく分からなくても、色々なプログラムを読んだり書いたりしている内にどんどんスキルは上がっていくはずです!!