作ると言っても、一から作るのではなく、以下の参考サイトにあるコードをベースに改造していくことにします。ベースにしたのはボリンジャーバンドを使うものですが、仮想通貨でボリンジャーバンドが有効なのかはわかりません。しかし、言語本の例題みたいなのを作るより、実際に動くものを作る方が飽きがこないと思います。
ちなみに、日本人なので仮想通貨と書いていますが、英訳的には暗号通貨となりますね。暗号という響きが悪いからかな〜〜
書かれているコードはモナコインベースとなります。
モナコインの自動トレードが可能なのはzaifとbitbank.cc だけだと思いますが、bitbankが3月末まで手数料無料を延長してますので、bitbankを使っていきます。4月からの手数料によっては、zaifにするかもしれませんけどね。
参考サイト
ベースにしたサイト
参考 Python × ZaifAPI 取引時間をハックするプログラム【ボリンジャーバンド編】テクノロジーであそぼ!ボリンジャーバンド加味した自動トレードです。これをベースに改造していきます。
※ 2018-02-05 時点では、エラーがあって動いていないようです。
自作ロガーをトレード用のログ出力に改造して使います。
zaif APIで取得したデータ等をcsvにしてトレードのログとして残すようにします。
ライブラリ
参考 python-bitbankccGitHubbitbankccが提供している、Public & Private API をパイソンで扱うライブラリ
参考 slackwebpythonslackのWebhookインタフェースを使用してトレードの情報通知をするために使います。自動応答ではありません、通知のみです。
私の開発言語歴
汎用機の特殊な言語を除いて、c言語での開発を遠い遠い昔にやったことがある程度です。
python言語歴は0年ですのでコーディングスタイルが違うとか、もっと簡単な記述があるとか、、、色々とあるかもしれませんが、そこは見て見ないフリをしてね〜〜
ちなみに、以下でpythonを学びました♪
トレードのログを吐くロガー
メインの部分はベースがあるので、先にトレードのロガーを作ります。
csv形式にして、表計算ソフトで使えるようにします。
プログラムの配置場所は、以下とします。
logger/trade_logger.py
使い方
インポート処理
from logger import trade_logger
ログを出力するファイル名とコイン名を指定します。
ファイル名に拡張子は指定しません。ロガーが.csvを付加します。
ログファイル名は、指定名+日時+.csvとなります。
trade_log = trade_logger.TradeLogger("trade", "mona")
ログ出力、パラメータに必要情報を与えます。
trade_log.write(func="■ 現在の情報です",........)
write()のパラメータ一覧(必要なものだけ指定します)
trade_log.write(func='', coin_asset=0, jpy_asset=0, order_id='', trade='', price=0, size=0, last_trade_price=0, market_price=0, mean_line1=0, mean_line2=0, sigma2=0, bid_amount=0, ask_amount=0, msg='')
項目 | 内容 |
---|---|
func | 処理名 |
coin_asset | (コイン名)資産 |
jpy_asset | JPY資産 |
order_id | オーダーID |
trade | BUY,SELL等 |
price | オーダー価格 |
size | オーダーサイズ |
last_trade_price | 最終トレード価格 |
market_price | 市場価格 |
market_bid_price | 買い気配 |
market_ask_price | 売り気配 |
mean_line1 | 移動平均線短期 |
mean_line2 | 移動平均線 |
sigma2 | 標準偏差 |
bid_amount | 買取引量 |
ask_amount | 売取引量 |
bid_depth_amount | 板買い |
ask_depth_amount | 板売り |
macd | MACD |
signal | シグナル |
msg | 備考 |
CSVの出力例としては以下の感じになります。
日付,日時,件名,btc資産,JPY資産,オーダーID,トレード,指定価格,指定数,最終トレード価格,市場価格,平均線1,平均線2,標準偏差,買取引量,売取引量,板買い,板売り,MACD,シグナル,備考
2018/03/16,20:26:12,Zaif:資産、平均、標準偏差,0.0,5000.0,0,,,,866250,873010,872898.75,869904.1826923077,1735.640827707257,7.220599999999999,6.4339999999999975,68.5236,81.7395,975.4216378858546,27.095045496829293,
2018/03/16,20:26:27,Zaif:資産、平均、標準偏差,0.0,5000.0,0,,,,866250,872990,872875.4166666666,869966.1057692308,1730.4042903673503,6.802,6.175699999999997,71.0690,74.3489,1001.4949616790982,54.91434998791536,
コード
# coding=utf-8
"""
トレードロガー(Ver 1.1)
"""
import codecs
import datetime
import csv
class TradeLogger:
"""
トレードロガー
"""
def __init__(self, file_path, coin_name='mona'):
"""
Content:
コンストラクタ
Param:
1. file_path: ファイルパス
2. coin_name: コイン名
"""
now = datetime.datetime.now()
self.__file_path = file_path + now.strftime("%Y%m%d-%H%M%S") + ".csv"
self.__message_title = True
self.write(func='件名',
coin_asset=coin_name + '資産',
jpy_asset='JPY資産',
order_id='オーダーID',
trade='トレード',
price='指定価格',
size='指定数',
last_trade_price='最終トレード価格',
market_price='市場価格',
market_bid_price='買い気配',
market_ask_price='売り気配',
mean_line1='平均線1',
mean_line2='平均線2',
sigma2='標準偏差',
bid_amount='買取引量',
ask_amount='売取引量',
bid_depth_amount='板買い',
ask_depth_amount='板売り',
macd='MACD',
signal='シグナル',
msg='備考')
self.__message_title = False
def write(self,
func='',
coin_asset=0,
jpy_asset=0,
order_id='',
trade='',
price=0,
size=0,
last_trade_price=0,
market_price=0,
market_bid_price=0,
market_ask_price=0,
mean_line1=0,
mean_line2=0,
sigma2=0,
bid_amount=0,
ask_amount=0,
bid_depth_amount=0,
ask_depth_amount=0,
macd=0,
signal=0,
msg=''):
"""
Content:
書き込みメソッド
Param:
1. func: 機能名
2. coin_asset: コイン資産
3. jpy_asset: JPY資産
4. order_id: オーダーID
5. trade: 申請(BUY,SELL,CANCEL)
6. price: 申請価格
7. size: 申請コイン数
8. last_trade_price: 最終トレード価格
9. market_price: 市場価格
10. market_bid_price: 買い気配
11. market_ask_price; 売り気配
12. mean_line1: 平均線1
13. mean_line2: 平均線2
14. sigma2: 標準偏差
15. bid_amount: 買い取引量
16. ask_amount: 売り取引量
17. bid_depth_amount: 板買い
18. ask_depth_amount: 板売り
19. macd: MACD
20. signal; SIGNAL
21. msg: 備考
"""
# ログファイル内容作成
csvlist = []
if self.__message_title:
csvlist.append("日付")
csvlist.append("日時")
else:
now = datetime.datetime.now()
csvlist.append(now.strftime("%Y/%m/%d"))
csvlist.append(now.strftime("%H:%M:%S"))
csvlist.append(func)
csvlist.append(coin_asset)
csvlist.append(jpy_asset)
csvlist.append(order_id)
csvlist.append(trade)
if price == 0:
csvlist.append('')
else:
csvlist.append(price)
if size == 0:
csvlist.append('')
else:
csvlist.append(size)
if last_trade_price == 0:
csvlist.append('')
else:
csvlist.append(last_trade_price)
if market_price == 0:
csvlist.append('')
else:
csvlist.append(market_price)
if market_bid_price == 0:
csvlist.append('')
else:
csvlist.append(market_bid_price)
if market_ask_price == 0:
csvlist.append('')
else:
csvlist.append(market_ask_price)
if mean_line1 == 0:
csvlist.append('')
else:
csvlist.append(mean_line1)
if mean_line2 == 0:
csvlist.append('')
else:
csvlist.append(mean_line2)
if sigma2 == 0:
csvlist.append('')
else:
csvlist.append(sigma2)
csvlist.append(bid_amount)
csvlist.append(ask_amount)
csvlist.append(bid_depth_amount)
csvlist.append(ask_depth_amount)
csvlist.append(macd)
csvlist.append(signal)
csvlist.append(msg)
# ログファイルに書き込む
with codecs.open(self.__file_path, "a", "utf-8-sig") as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(csvlist)
# 初期化
func = ''
coin_asset = 0
jpy_asset = 0
order_id = ''
trade = ''
price = 0
size = 0
last_trade_price=0
market_price = 0
market_bid_price = 0
market_ask_price = 0
mean_line1 = 0
mean_line2 = 0
sigma2 = 0
bid_amount = 0
ask_amount = 0
bid_depth_amount = 0
ask_depth_amount = 0
macd = 0
signal = 0
msg = ''
例外処理用のエラーログを吐くロガー
プログラムの配置場所は、以下とします。
logger/error_logger.py
使い方
インポート処理
from logger import error_logger
ログを出力するファイル名を指定します。
ファイル名に拡張子は指定しません。ロガーが.logを付加します。
ログファイル名は、指定名+日時+.logとなります。
error_log = error_logger.TradeLogger("error")
例外処理で以下のように呼び出します。
except:
error_log.write()
コード
# coding=utf-8
import codecs
import datetime
import sys
import traceback
class ErrorLogger:
"""
自作ロガー
"""
def __init__(self, file_path):
"""
Content:
コンストラクタ
Param:
1. file_path: ファイルパス(最後は拡張子を含まないファイル名)
"""
now = datetime.datetime.now()
self.__file_path = file_path + now.strftime("%Y%m%d-%H%M%S") + ".log"
def write(self):
"""
Content:
書き込みメソッド
"""
# エラーの情報をsysモジュールから取得
info = sys.exc_info()
# tracebackモジュールのformat_tbメソッドで特定の書式に変換
tb_info = traceback.format_tb(info[2])
# ログファイル内容作成
line_text = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S ")
line_text += "Python Error.\n"
for tbi in tb_info:
line_text += tbi + '\n'
line_text += str(info[1]) + '\n'
# ログファイルに書き込む
with codecs.open(self.__file_path, "a", "utf-8") as f:
f.write(line_text)
以上、トレード、エラーのロガーでした。
次回は、実際にトレードするのは怖いので、動作確認するプログラムです。
Monappy: MBDQ39VHypMQwfyR8SshuHvfPNUz321F6B

モナゲ(tipmona)ってなに?
そもそもMonacoinってなに?
コメントを残す