見出し画像

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