BitMEX 落ちづらいBot にするために。
こんにちわ。美味しいお肉に囲まれて幸せなブラックかふぇです。肉を食べると幸せな気分になりますよね。不思議と。
さて、Bot運用されている方も増えてきた?のかと思い、落ちづらいBotを作るための工夫を少しまとめて行きたいと思います。
まずは、落ちるBotサンプルコード。
import ccxt
import json
import requests
bitmex_keys = json.load(open('config.json', 'r'))
bitmex = ccxt.bitmex({
'apiKey': bitmex_keys['key'], #ご自身のものに変更ください 'secret': bitmex_keys['secret'], #ご自身のものに変更ください })
order_size = float(bitmex_keys['order_size'])
period = float(bitmex_keys['period'])
#print(bitmex.fetch_ticker('BTC/USD')['last'])
while True:
#Open Order
orders = bitmex.fetch_open_orders()
print(orders)
currentQty = bitmex.private_get_position()[0]['currentQty']
print(currentQty)
res = json.loads(requests.get("https://www.bitmex.com/api/v1/trade/bucketed?symbol=XBTUSD&binSize=1m&partial=true&count=3&reverse=true").text)
length = len(res)
print(res)
このままだと5分も持ちません。
おそらく、下記のようなエラーが出てしまいます。
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ccxt/bas
e/exchange.py", line 349, in fetch
response.raise_for_status()
File "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests
/models.py", line 935, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://www.bitmex.com/api/v1/order?filter=%7B%
22open%22%3Atrue%7D
エラーの内容は、BitMEXサーバーとの通信で、クライアント(Bot)から Bad Request があった =>これ、Timeout 処理していないので、北斗百裂拳をBitMEXに食らわして、接続制限にかかったパターンですね。
接続制限対策=>time.sleep(10) 10秒待つみたいな。
time.sleep(10) 追加
import ccxt
import json
import requests
import time
bitmex_keys = json.load(open('config.json', 'r'))
bitmex = ccxt.bitmex({
'apiKey': bitmex_keys['key'], #ご自身のものに変更ください 'secret': bitmex_keys['secret'], #ご自身のものに変更ください })
order_size = float(bitmex_keys['order_size'])
period = float(bitmex_keys['period'])
#print(bitmex.fetch_ticker('BTC/USD')['last'])
while True:
#Open Order
orders = bitmex.fetch_open_orders()
print(orders)
currentQty = bitmex.private_get_position()[0]['currentQty']
print(currentQty)
res = json.loads(requests.get("https://www.bitmex.com/api/v1/trade/bucketed?symbol=XBTUSD&binSize=1m&partial=true&count=3&reverse=true").text)
length = len(res)
print(res)
time.sleep(10)
よし、これでバッチリ!いやいや、これだけだと、サーバーの混雑状況によっては、10分と持ちません。
サーバーと接続して、データを取得する、以下の部分がエラーを出します。
orders = bitmex.fetch_open_orders()
currentQty = bitmex.private_get_position()[0]['currentQty']
res = json.loads(requests.get("https://www.bitmex.com/api/v1/trade/bucketed?symbol=XBTUSD&binSize=1m&partial=true&count=3&reverse=true").text)
そこで、登場、try - except を使った、例外処理。
try:
実行したい処理(例外が発生するかも)
except エラー名:
例外発生時に行う処理
これを行うことで、例外が発生しても大丈夫!
import ccxt
import json
import requests
import time
bitmex_keys = json.load(open('config.json', 'r'))
bitmex = ccxt.bitmex({
'apiKey': bitmex_keys['key'], #ご自身のものに変更ください 'secret': bitmex_keys['secret'], #ご自身のものに変更ください })
order_size = float(bitmex_keys['order_size'])
period = float(bitmex_keys['period'])
#print(bitmex.fetch_ticker('BTC/USD')['last'])
while True:
try:
orders = bitmex.fetch_open_orders()
print(orders)
currentQty = bitmex.private_get_position()[0]['currentQty']
print(currentQty)
res = json.loads(requests.get("https://www.bitmex.com/api/v1/trade/bucketed?symbol=XBTUSD&binSize=1m&partial=true&count=3&reverse=true").text)
length = len(res)
print(res)
except Exception as e:
print(e)
time.sleep(10)
よしよし、なんか例外処理できてるぞ!よしよし、今度こそ、永久に動くはず!
残念ながら、これでもおそらく、半日持たずに落ちます。サーバーの混雑状況によりますが、だらだらと長いエラーメッセージに、ちょろっと、
During handling of the above exception, another exception occurred:
と出ることがあります。例外処理をしていたら、他でも例外が発生したよみたいなことを言われます。。。
どうやら、同時多発エラーは捌けないようです。そこで、
import ccxt
import json
import requests
import time
bitmex_keys = json.load(open('config.json', 'r'))
bitmex = ccxt.bitmex({
'apiKey': bitmex_keys['key'], #ご自身のものに変更ください 'secret': bitmex_keys['secret'], #ご自身のものに変更ください })
#bitmex.urls['api'] = bitmex.urls['test']
order_size = float(bitmex_keys['order_size'])
period = float(bitmex_keys['period'])
#print(bitmex.fetch_ticker('BTC/USD')['last'])
while True:
#Open Order
try:
orders = bitmex.fetch_open_orders()
except Exception as e:
print(e)
print(orders)
try:
currentQty = bitmex.private_get_position()[0]['currentQty']
except Exception as e:
print(e)
print(currentQty)
try:
res = json.loads(requests.get("https://www.bitmex.com/api/v1/trade/bucketed?symbol=XBTUSD&binSize=1m&partial=true&count=3&reverse=true").text)
length = len(res)
except Exception as e:
print(e)
print(res)
time.sleep(10)
よし、今度こそ!自動売買のBotの場合、落ちる原因のほとんどは、通信するところなので、これで大分落ちなくなります。がそれでも、落ちますw
そうなると、さらなるエラー対策が必要になります!
そうそうないですが。。
そんな時は、discord で質問してください。
有料ページの一番下に招待リンクがあります!
BTCアドレス 3BMEXWoSg5i9zegtEZ3QTEAUDeAV7rKXde