動かしててエラーが出るとプログラムはクラッシュします。
クラッシュすると、プログラムは停止してしまいます。
なのでエラーがでてもプログラムを止めないようにエラー時の処理を加えておく必要があるのです。
それを例外処理といいます。
Table of Contents
いつエラーがでるの?
まずはエラーがでそうなところを見つけます。
対策しなければいけないのが、HTTPリクエストです。
取引所のサーバーがあっぷあっぷになったときにエラーがでる可能性が高いです。
なので取引所とAPI通信する場合はすべて例外処理を含めます。
bybit_.pyに例外処理を施す
1 2 3 4 5 6 7 8 9 10 |
def price(symbol): try: res = session_unauth.latest_information_for_symbol( symbol=symbol, ) price = res["result"][0]["last_price"] return price except Exception as e: print(e) return 0 |
例外処理は try文で書きます。失敗したらexcept文の処理が走ります。
価格取得に失敗したら0を返すようにしておいて、priceが0ならアービトラージトレードをストップさせます。
エントリー、クローズもそうしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
from pybit import usdt_perpetual key = "" secret = "" testnet = "https://api-testnet.bybit.com" mainnet = "https://api.bybit.com" session_unauth = usdt_perpetual.HTTP( endpoint=testnet ) session_auth = usdt_perpetual.HTTP( endpoint=testnet, api_key=key, api_secret=secret) def price(symbol): try: res = session_unauth.latest_information_for_symbol( symbol=symbol, ) price = res["result"][0]["last_price"] return price except Exception as e: print(e) return 0 def entry(symbol:str,side:str,qty:str): qty = float(qty) try: print(session_auth.place_active_order( symbol=symbol, side=side, order_type="Market", qty=qty, time_in_force="GoodTillCancel", reduce_only=False, close_on_trigger=False )) except Exception as e: print(e) return 0 def close(symbol:str,side:str,qty:str): qty = float(qty) try: res = session_auth.place_active_order( symbol=symbol, side=side, order_type="Market", qty=qty, time_in_force="GoodTillCancel", reduce_only=True, close_on_trigger=False ) print(res) except Exception as e: print(e) return 0 |
binance_.pyに例外処理を施す
bybitと同じようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
from binance.um_futures import UMFutures key = "" secret = "" testnet = "https://testnet.binancefuture.com/" um_futures_client = UMFutures(key=key, secret=secret,base_url=testnet) def price(symbol): try: res = um_futures_client.ticker_price(symbol) return res["price"] except Exception as e: print(e) return 0 def entry(symbol:str,side:str,qty:str): qty = float(qty) if(side=="Buy"): side = "BUY" else: side = "SELL" try: res = um_futures_client.new_order( symbol=symbol, side=side, type="MARKET", quantity=qty ) print(res) except Exception as e: print(e) return 0 def close(symbol:str,side:str,qty:str): qty = float(qty) if(side=="Buy"): side = "BUY" else: side = "SELL" try: res = um_futures_client.new_order( symbol=symbol, side=side, type="MARKET", quantity=qty, reduceOnly="true" ) print(res) except Exception as e: print(e) return 0 |
main.pyの価格を取得部分を修正
1 2 3 4 5 |
bybit_price = bybit_.price(symbol) binance_price = binance_.price(symbol) if bybit_price == 0 or binance_price == 0: return |
もしも価格取得が失敗(戻り値が0)ならその時点で呼び出し元に戻るようにしました。
これで価格取得成功した時にのみトレードされます。
おつかれさまでした。
これでアービトラージBOTの完成です。
あとはしきい値を調整したり、取引所を増やすことでチャンスを狙っていきましょう。
コードはgithubに置いてあります。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…