[Puppeteer] 5秒ローソク足対応 ! python製仮想通貨自動取引bot開発フレームワーク
今回はPuppeteerのwebsocket実装記念(?)として「5秒ローソク足」を実装しましたのでご報告です。
5秒ローソク足
以前、JavaScript+Vue.jsで「”HTMLファイル一つだけシリーズ” bitflyerFX 5秒ローソク足を作成・描画してみる」で5秒間隔のローソク足を作ったので、その応用です。(実装方法は全然違いますが)
websocketによってbitmex取引所から逐次約定履歴が取得できるので、その約定履歴を5秒毎に集計してOHLCVデータとして整形します。
実行結果
---------------------------------
open high low close volume buy sell
timestamp
2019-05-04 03:27:35 5753.0 5753.0 5752.5 5752.5 2259 759 1500
2019-05-04 03:27:40 5752.5 5753.0 5752.5 5753.0 2285 2285 0
2019-05-04 03:27:45 5753.0 5753.0 5752.5 5752.5 93834 40000 53834
2019-05-04 03:27:50 5752.5 5753.0 5752.5 5753.0 26100 900 25200
2019-05-04 03:27:55 5753.0 5753.0 5751.5 5751.5 240427 100 240327
2019-05-04 03:28:00 5751.5 5752.0 5751.5 5751.5 13545 10115 3430
2019-05-04 03:28:05 5751.5 5751.0 5751.0 5751.0 60600 0 60600
2019-05-04 03:28:10 5751.0 5751.0 5750.5 5750.5 56270 0 56270
2019-05-04 03:28:15 5750.5 5750.5 5750.5 5750.5 300090 0 300090
2019-05-04 03:28:20 5750.5 5750.5 5750.0 5750.0 158000 0 158000
2019-05-04 03:28:25 5750.0 5750.0 5749.0 5749.0 59265 2615 56650
2019-05-04 03:28:30 5749.0 5749.0 5749.0 5749.0 150100 0 150100
2019-05-04 03:28:35 5749.0 5749.0 5749.0 5749.0 1200 0 1200
2019-05-04 03:28:40 5749.0 5749.0 5747.5 5747.5 31442 0 31442
2019-05-04 03:28:45 5747.5 5747.5 5746.0 5746.0 56347 500 55847
2019-05-04 03:28:50 5746.0 5746.0 5743.0 5743.0 596368 3000 593368
2019-05-04 03:28:55 5743.0 5743.5 5741.5 5742.0 455875 145 455730
2019-05-04 03:29:00 5742.0 5742.0 5740.0 5740.0 218030 0 218030
2019-05-04 03:29:05 5740.0 5740.0 5732.0 5732.5 77125 1400 75725
2019-05-04 03:29:10 5732.5 5735.0 5732.5 5734.0 228221 0 228221
2019-05-04 03:29:15 5734.0 5734.5 5734.0 5734.0 373075 25911 347164
---------------------------------
open high low close volume buy sell
timestamp
2019-05-04 03:27:35 5753.0 5753.0 5752.5 5752.5 2259 759 1500
2019-05-04 03:27:40 5752.5 5753.0 5752.5 5753.0 2285 2285 0
2019-05-04 03:27:45 5753.0 5753.0 5752.5 5752.5 93834 40000 53834
2019-05-04 03:27:50 5752.5 5753.0 5752.5 5753.0 26100 900 25200
2019-05-04 03:27:55 5753.0 5753.0 5751.5 5751.5 240427 100 240327
2019-05-04 03:28:00 5751.5 5752.0 5751.5 5751.5 13545 10115 3430
2019-05-04 03:28:05 5751.5 5751.0 5751.0 5751.0 60600 0 60600
2019-05-04 03:28:10 5751.0 5751.0 5750.5 5750.5 56270 0 56270
2019-05-04 03:28:15 5750.5 5750.5 5750.5 5750.5 300090 0 300090
2019-05-04 03:28:20 5750.5 5750.5 5750.0 5750.0 158000 0 158000
2019-05-04 03:28:25 5750.0 5750.0 5749.0 5749.0 59265 2615 56650
2019-05-04 03:28:30 5749.0 5749.0 5749.0 5749.0 150100 0 150100
2019-05-04 03:28:35 5749.0 5749.0 5749.0 5749.0 1200 0 1200
2019-05-04 03:28:40 5749.0 5749.0 5747.5 5747.5 31442 0 31442
2019-05-04 03:28:45 5747.5 5747.5 5746.0 5746.0 56347 500 55847
2019-05-04 03:28:50 5746.0 5746.0 5743.0 5743.0 596368 3000 593368
2019-05-04 03:28:55 5743.0 5743.5 5741.5 5742.0 455875 145 455730
2019-05-04 03:29:00 5742.0 5742.0 5740.0 5740.0 218030 0 218030
2019-05-04 03:29:05 5740.0 5740.0 5732.0 5732.5 77125 1400 75725
2019-05-04 03:29:10 5732.5 5735.0 5732.5 5734.0 228221 0 228221
2019-05-04 03:29:15 5734.0 5734.5 5734.0 5734.0 373075 25911 347164
2019-05-04 03:29:20 5734.0 5736.5 5734.0 5736.0 224021 213387 10634
こんな感じに5秒ローソク足を作成します。
時間はUTCタイムで出しています。
特徴
普通のOHLCVとは違って、買いボリュームと売りボリュームもプラスして出力するようにしてみました。(上記のbuy列、sell列がそれぞれのvolumeです)
買い圧力が高いのか、売り圧力が高いのかを判断する材料に使えると思います。
Puppeteerが持っている板情報取得機能を使って、板の厚みもプラスして評価することが可能になるでしょう。
板情報は
orderbook = self._ws.orderbook()
bid = orderbook['bids'][0]['price']
ask = orderbook['asks'][0]['price']
で取得できます。
サンプルプログラム
sample1.py
# -*- coding: utf-8 -*-
# ==========================================
# サンプル Puppet (websocket)
# ==========================================
import datetime
import pandas as pd
from puppeteer import Puppeteer
# ==========================================
# Puppet(傀儡) クラス
# param:
# puppeteer: Puppeteerオブジェクト
# ==========================================
class Puppet(Puppeteer):
# ==========================================================
# 初期化
# param:
# puppeteer: Puppeteerオブジェクト
# ==========================================================
def __init__(self, Puppeteer):
self._exchange = Puppeteer._exchange # 取引所オブジェクト(ccxt.bitmex)
self._logger = Puppeteer._logger # logger
self._config = Puppeteer._config # 定義ファイル
self._ws = Puppeteer._ws # websocket
self._bitmex = Puppeteer._bitmex # ccxt.bimexラッパーオブジェクト
# ==========================================================
# 売買実行
# param:
# ticker: Tick情報
# orderbook: 板情報
# position: ポジション情報
# balance: 資産情報
# candle: ローソク足
# ==========================================================
def run(self, ticker, orderbook, position, balance, candle):
# データ数が少ない時は統計量を出すと処理が異常になるので、一定の量がたまるまで処理を延期
if len(self._ws.candle()) < int(30/self._ws.CANDLE_RANGE):
return None
df = pd.DataFrame(self._ws.candle()[-self._ws.MAX_CANDLE_LEN:],
columns=['timestamp', 'open', 'high', 'low', 'close', 'volume', 'buy', 'sell'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
df = df.set_index('timestamp')
df.index = df.index.tz_localize(None)
print('---------------------------------')
print(df)
sample1.json
{
"//" : "===============================================",
"//" : " システムで利用",
"//" : "===============================================",
"//" : "取引所のapiKey, secretを設定します",
"APIKEY" : "",
"SECRET" : "",
"//" : "bitmex取引所で対応する通貨ペア等を記述",
"SYMBOL" : "BTC/USD",
"INFO_SYMBOL" : "XBTUSD",
"COIN_BASE" : "BTC",
"COIN_QUOTE" : "USD",
"//" : "bitmex取引所の価格の最小幅(0.5ドル)",
"PRICE_UNIT" : 0.5,
"//" : "TestNetを使うか?(使う: true, 使わない: false)",
"USE_TESTNET" : false,
"//" : "ticker, orderbook, position, balance, candle のどれを利用するかを指定する。Falseを指定した場合はそのデータは取得しない",
"USE" : {
"TICKER" : false,
"ORDERBOOK" : false,
"POSITION" : false,
"BALANCE" : false,
"CANDLE" : false
},
"//" : "ローソク足の収集定義。",
"CANDLE" : {
"//" : "ローソク足の足幅を設定する。設定値= 1m, 5m, 1h, 1d",
"TIMEFRAME" : "1m",
"//" : "データ取得開始時刻(UNIXTIME:1ミリ秒)、使用しない場合 もしくは自動の場合は null(None) を指定",
"SINCE" : null,
"//" : "取得件数(未指定:100、MAX:500)",
"LIMIT" : null,
"//" : "True(New->Old)、False(Old->New) 未指定時はFlase",
"REVERSE" : false,
"//" : "True(最新の未確定足を含む)、False(含まない) 未指定はTrue",
"PARTIAL" : false
},
"//" : "板情報の収集定義。",
"ORDERBOOK" : {
"//" : "取得件数(未指定:25、MAX:取引所による?)",
"LIMIT" : null
},
"//" : "websocketを使用するかどうかを指定",
"USE_WEBSOCKET" : true,
"//" : "ログレベルを指定。('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG')",
"LOG_LEVEL" : "INFO",
"//" : "インターバル(botの実行周期)を秒で設定",
"INTERVAL" :5,
"//" : "discord通知用URL",
"DISCORD_WEBHOOK_URL" : "",
"//" : "===============================================",
"//" : " ユーザで自由に定義",
"//" : "===============================================",
"//" : "売買するサイズ",
"LOT_SIZE" :50
}
実行方法はコンソールから
python3 puppeteer.py puppets/sample1/sample1.py puppets/sample1/sample1.json
で実行します。
Puppeteer(傀儡師) bot開発フレームワーク
以下のgitlabより誰でも自由にダウンロードして使用できます。
楽しいbotライフを!
いいなと思ったら応援しよう!
ソフトウェア・エンジニアを40年以上やってます。
「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。
よろしくお願い致します。