見出し画像

Bitcoinの自動売買をレンタルサーバーで実現する!

あけましておめでとうございます!大変ご無沙汰しています!

本日は、Bitcoinの自動売買を実現させようという企画です。
Bitcoin、めちゃくちゃ高騰していますね!ただ、私は2年前の仮想通貨バブル崩壊の時を思い出してしまいます。
持ち続けていいのか、今から買い入りしてもいいのか、それとも今のうちに売り抜けた方がいいのか、悩ましいところです。
そんなあなたに、自動売買という選択肢をあげたい!
自動売買の良さは、感情を一切排して取引を行うことができます。例えば、毎日、0時に1000円ずつ買い付けを行えば、ドルコスト平均法を使うことができます。また、自ら売り買いのタイミングを設定して、売ったり買ったりすることも可能です。

今回の記事は、自動売買の最初の一歩ということで、定期買い付けプログラムを実装することを目指します。
自分でサーバーを構築したり、PCを1日中起動しっぱなしにしたり、そういうことはなく、誰でも190円/月で可能な方法を提示しようと思います!

今回、実現するために、Bitbank様が提供しているpython用apiを利用します。使い方が分からない方は、過去記事を読んでください!

Bitcoinの自動売買ツールをPythonを使って作る

それでは、やっていきましょう!

今回実現させたいこと

今回実現させたいことは、以下です。

1時間に1回程度Bitcoinの価格をチェックして、
自動で売買を行えるようにする

例えば、毎日同じ時間に株価をチェックして、条件を満たしていたら定期購入するみたいなプログラムを書いてもいいですし、
自分の作ったオレオレアルゴリズムで売買するのも可能です。
アルゴリズムの作り方については過去記事でお願いします。

これを、レンタルサーバーを使って簡単に実現させるのが今回の目的です!

※ 今回の記事はいわゆるHFT(High Frequency Trading : 高頻度売買)とは違いますので注意してください。

今回の実現条件

今回解説する環境を説明しておきます。

PC
PCのスペックはそんなに気にしなくても良いです。(私はMacを使っているので、Windowsの環境はそれほど分からないかもしれません。)
レンタルサーバー
レンタルサーバーとしてXreaをレンタルして利用します。無料版でも多分できますが、説明に利用するのは有料版月額191円のコストがかかります。
取引所
Bitbankを利用します。詳しくは過去記事参照

方法

今回はLinuxのCRON(クーロン)という機能を使います。
CRONとは、予め設定したプログラムを定期的に実行するための機能です。すなわち今回行う方法はこうです。

手順 1: Bitbankで取引するためのプログラムを書く
手順 2: 該当プログラムをCRONで1時間おきに動くように設定する
手順 3: 1時間に1回プログラムが起動して注文をする

これを実現すれば、1時間に1回プログラムが起動して、買うか売るか判断して、売買することができそうですよね?

ちなみにレンタルサーバーを使う理由は、PC(サーバー)の電源がついてないと、1時間に1回プログラムを起動ができないからですね。
もちろん、家にデスクトップがあって、24時間ついているっていう人はレンタルする必要はありません。MacでもCRONは使えます。(ただし、24時間PCをつけっぱなしにした時の電気代は、レンタルサーバーより遥かに高いので気をつけてください。経験談です。。)

さて、ここまで読んで、自分でできそう!って人は、自分で実装してみてください!
ここから先は、自分で調べて実装するのがめんどい!って人のためになるべく簡単な実装方法を書いていきます。
※ あくまで簡単な方法ですので、pythonが普通に書ける方には退屈な内容かもしれません。

1. Bitbankで取引するためのプログラムを書く

ここまで読んでくださった方は、過去記事は読んでくれたという前提で書いていきますね!もしまだ読んでいなくて、pythonの導入や、bitbankのapiの使い方が分からないという方がいたら、是非過去記事の無料部分だけでも読んでください!

1.1. 注文するメソッド
まずは注文するためのメソッドを定義しましょう。
目指すのは、下のように書けば、買い付け注文が行えるbuy_order()および、sell_order()を定義することです。

import python_bitbankcc

pub_set = BitBankPubAPI()
prv_set = BitBankPrvAPI()

buy_order(yen,value,pub_set,prv_set)
sell_order(btc,value,pub_set,prv_set)

buy_orderに「いくら買うか」と「価格」を渡すと買い付けを行えるというメソッドを作りましょう!

buy_orderはこんな感じで書けます。

import python_bitbankcc

def buy_order(yen:int,value:float,prv_set:python_bitbankcc.private):
   num = str(yen / value)
   print("buy : %s %s %s" %(str(value), str(yen),num))
   hist = prv_set.order( 'btc_jpy', value, num, 'buy', 'limit')
   print("Success Trade!! : " + str(hist['order_id']))
   return hist

valueの価格でyen分のbtcの買い注文を入れるメソッドになります!重要なのは、以下の部分、

prv_set.order( 'btc_jpy', value, num, 'buy', 'limit')

で、apiを使った買い注文を出しています。この時、買うBitcoinの数量を渡さないといけないので、(yen / value)で計算をしています。
limitは指値のことを指しています。(成行の時はmarketです)
※ 残金が足りない場合はエラーが出ます。

'buy'は当然買い注文を表しています。売りの時は'sell'を指定してください。売り注文はこんな感じのコードになります。

def sell_order(btc:float,value:float,prv_set:python_bitbankcc.private):
   print("sell : %s %s" %(str(value) , str(btc)))
   hist = prv_set.order('btc_jpy',value,str(btc),'sell','limit')
   print("Success Trade!! : " + str(hist['order_id']))
   return hist

こちらのメソッドはvalueの価格で、btc分のBitcoinを売り注文を入れるメソッドになります!
prv_set.order()の返り値はorder_idが返ってきます。このorder_idは結構重要なので、しっかりreturnしておきましょう。

さて、これで下準備は整いました!あとはこのメソッドを使って売り買いするだけですね!っとその前に一応練習をしておきましょう。

1.2. 練習問題(注文)

さて、では、実際に注文を投げてみましょう!ここでは、2,000,000万円で1000円分の買い注文してみましょう。(2020/12/29現在の価格は2,774,643円なので、約定はしません。価格を確認して、約定しない値段を確認してください。)

import python_bitbankcc

def buy_order(yen:int,value:float,prv_set:python_bitbankcc.private):
   number = str(yen / value)
   print("buy : %s %s %s" %(str(value), str(yen),number))
   hist = prv_set.order( 'btc_jpy', value, number, 'buy', 'limit')
   print("Success Trade!! : " + str(hist['order_id']))
   return hist

# APIキー,シークレットの設定
API_KEY = 'BITBANK_API_KEY'
API_SECRET = 'BITBANK_API_SECRET'
# privte API classのオブジェクトを取得
prv_set = python_bitbankcc.private(API_KEY, API_SECRET)
pub_set = BitBankPubAPI()
  
hist = buy_order(yen = 1000,value = 2000000,prv_set=prv_set)

Bitbankのbtc-jpyペアのページをみてみましょう。うまくいっていれば、こんな感じで注文が入っているはずです。

画像1

これで、注文ができました!念のため、右の方のキャンセルボタンを押してキャンセルしておいてください。
ちなみに以下のコードを実行すれば、注文をキャンセルすることができます。ここで、先ほどのorder_idを使うわけですね。

prv_set.cancel_order('btc_jpy', hist["order_id"])

1.3. 現在価格で注文を入れる

現在の価格での注文は以下のようなプログラムになります。

import python_bitbankcc

def buy_order(yen:int,value:float,prv_set:python_bitbankcc.private):
   number = str(yen / value)
   print("buy : %s %s %s" %(str(value), str(yen),number))
   hist = prv_set.order( 'btc_jpy', value, number, 'buy', 'limit')
   print("Success Trade!! : " + str(hist['order_id']))
   return hist

# APIキー,シークレットの設定
API_KEY = 'BITBANK_API_KEY'
API_SECRET = 'BITBANK_API_SECRET'
# privte API classのオブジェクトを取得
prv_set = python_bitbankcc.private(API_KEY, API_SECRET)
pub_set = BitBankPubAPI()

value = float(pub_set.get_ticker('btc_jpy')['sell'])
hist = buy_order(yen = 1000,value = value,prv_set=prv_set)

#prv_set.cancel_order('btc_jpy', hist["order_id"])

試す場合はキャンセルのコメントアウトを外してくださいね!約定してしまうので。

1.4. 注文を入れたらメールを送る

注文をしたら、注文をしたということが自分でわかるようにしておきたいですよね?そこで、注文をした際に、自分のメールアドレスにメールをするように設定しておきましょう。

まずはpipを使って必要なライブラリーをインストールしましょう。

pip install smtplib 

以下のコードを使うことで、自分のメールアドレスにメールを送ることができます。

import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
import ssl
def create_message(position,hist):
   body = "%s \n 取引ID : %s\n ポジション : %s\n 取引価格 : %s\n 取引量 : %s" %(position,hist['order_id'],hist['side'],hist['price'],hist['start_amount'])
   msg = MIMEText(body)
   msg['Subject'] = 'Bitbank自動売買ツールからの取引記録'
   msg['Date'] = formatdate()
   return msg

def send(msg):
   FROM_ADDRESS = 'メールアドレス'
   TO_ADDRESS = FROM_ADDRESS
   MY_PASSWORD = 'パスワード'
   BCC = ''
   smtpobj = smtplib.SMTP_SSL('smtp.gmail.com', 465, timeout=10)
   smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
   smtpobj.sendmail(FROM_ADDRESS, TO_ADDRESS, msg.as_string())
   smtpobj.close()
   
send(create_message("買い付け", hist))

このsend(create_message("買い付け", hist))を購入したあとに記述しておけば、自分から自分へメールを送ることが可能です。orderを行った後に買いておくと、いつ取引をしたのかを知ることができて便利です!

これでプログラムの準備ができましたね!

2: 該当プログラムをCRONで1時間おきに動くように設定する

1.で作った買い付けプログラムを例えば1日1回12:00に起動すれば、定期買い付けが実現できそうです。
方法としては、もう一つ、プログラムをずっと回し続けておいて、12時間に一回buy_orderを走らせる方法もありますが、今回は最終的にレンタルサーバーで行うのが目標なので、1日1回プログラム自体を起動するという方法をとります。
レンタルサーバーには大抵、一つのプログラムの実行可能時間が決まっているので、ずっと動かしっぱなしみたいなのは許してくれないためですね。

決まった時間に決まったプログラムを動かすという方法に、CRON(クロン、またはクーロン)という機能があります。ご利用のレンタルサーバーで利用可能かどうかは調べてください。Macにもあります。Windowsにはありません。
どうしてもwindowsでやりたい場合はこちらの記事を参照してください。

Windowsでcronみたいな事をやらせる

ただ、最終目標はレンタルサーバーで実装することなので、windowsに関しては割愛します。もし、自分のPCで実現しようとすると、プログラムを起動する時間にPCが起動していないといけません。これはそこそこ電気代がかかるのであまりお勧めしません。

さて、CRONの使い方ですが、こちらの記事を参照してもらえると手っ取り早いです。

【cron】定期的に処理を行う【MacOS】【Linux】

「なるほど分からん」と思った人も多いかもしれないですねw
PCを使い慣れている方は多分上のプログラムと、CRONについて調べてもらったら、実現できると思います。あとは各々のサーバーに合わせて環境設定をしてもらえればできるはずです。
ここで細かく環境設定について解説したいのですが、これは、完全に各々のサーバーに依存してしまうので、説明し難いのです。

ここからは、Xreaというレンタルサーバーを使って実装していきます。XreaはGMOが出しているレンタルサーバーです。
料金はこんな感じです。有料のXREA PlusじゃないとCRONが使えないので、CRONが使えないので、これを使っていきます。月額191円です。ビール一本くらいですねw

画像2

ではここからは、XreaでCRONを使って実現していきます。ここからは以下の手順で進めていきます。
ここから先は基礎的な話になるので、CRONの使い方を理解している人は多分読んでもつまらないと思います!以下を自分で設定できない方だけお進みください!
3. XREAの登録&設定方法
4. pythonのライブラリーをインストール
5. シェルスクリプトとCRONの設定

このコンテンツを読み終わると、XREA上でBitcoinの定期購入が可能となります。もちろん、プログラムを改良していけば、購入に条件をつけることや、売買をすることも可能になります!よろしければご購読ください!

ここから先は

4,534字 / 5画像

¥ 500

この記事が参加している募集

サポートしていただいたお金は、新しいボードゲームやカードゲームをプレイするためのたしにします! プレイした感想は順次紹介していきます!