Pythonで仮想通貨の移動平均線とボリンジャーバンド取得① トレード用ロガー作成

作ると言っても、一から作るのではなく、以下の参考サイトにあるコードをベースに改造していくことにします。ベースにしたのはボリンジャーバンドを使うものですが、仮想通貨でボリンジャーバンドが有効なのかはわかりません。しかし、言語本の例題みたいなのを作るより、実際に動くものを作る方が飽きがこないと思います。
ちなみに、日本人なので仮想通貨と書いていますが、英訳的には暗号通貨となりますね。暗号という響きが悪いからかな〜〜

書かれているコードはモナコインベースとなります。
モナコインの自動トレードが可能なのはzaifとbitbank.cc だけだと思いますが、bitbankが3月末まで手数料無料を延長してますので、bitbankを使っていきます。4月からの手数料によっては、zaifにするかもしれませんけどね。

注意
ここで書かれたコードを使うのは自己責任でお願いします

参考サイト

ベースにしたサイト

参考 Python × ZaifAPI 取引時間をハックするプログラム【ボリンジャーバンド編】テクノロジーであそぼ!

ボリンジャーバンド加味した自動トレードです。これをベースに改造していきます。
※ 2018-02-05 時点では、エラーがあって動いていないようです。

参考 Pythonで自作ロガーを作ってみるTomoProgの技術書

自作ロガーをトレード用のログ出力に改造して使います。
zaif APIで取得したデータ等をcsvにしてトレードのログとして残すようにします。

ライブラリ

参考 python-bitbankccGitHub

bitbankccが提供している、Public & Private API をパイソンで扱うライブラリ

参考 slackwebpython

slackの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_assetJPY資産
order_idオーダーID
tradeBUY,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板売り
macdMACD
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 = ''
MEMO
ログファイルのコードをutf-8-sigとしているのは、Excelで開く時に文字化けしないようにログファイルにBOMを追加するためです。

例外処理用のエラーログを吐くロガー

プログラムの配置場所は、以下とします。

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

Monacoinを投げる
モナゲ(tipmona)ってなに?
そもそもMonacoinってなに?

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください