パート1では価格取得と描画、パート2ではデータベースの作成までおわりました。
今回は、価格差がしきい値を超えていたらエントリーする新規注文処理を作っていきます。
Table of Contents
新規注文用のファイルorder_entry.pyを作成
パート1のmain.pyの中に「価格差がしきい値を超えていたら」printする処理がありました。
1 2 3 4 5 6 |
def animate(i): # ~~~他部分省略 if sikiiti <= kakakusa: message = str(datetime.datetime.now().strftime('%H:%M:%S')) +"\n"+symbol +"\n"+ f'{kakakusa:.3f}' + "%" +"\n"+ "BUY:" + buy_name + str(price[buy_num]) +"\n"+ "SELL:" + sell_name + str(price[sell_num])+"\n" print(message) #ここに新規注文処理 |
エントリーと発動条件は同じです。なので、ここに新規注文処理を追加します。
新規ファイルで「order_entry.py」を新しくつくりましょう。
引数は、symbol,qty,buy_exchange,sell_exchangeです。
とりあえず、bybitで買い、binanceで売るパターンからつくります。
これでガワだけできたのでbybitでエントリーする機能とbinanceでエントリーする機能を作っていきます。
bybit_.pyに新規注文処理を追加する
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 |
from pybit import usdt_perpetual session_unauth = usdt_perpetual.HTTP( endpoint="https://api.bybit.com" ) session_auth = usdt_perpetual.HTTP( endpoint='https://api.bybit.com', api_key="", api_secret="") def price(symbol): res = session_unauth.latest_information_for_symbol( symbol=symbol, ) price = res["result"][0]["last_price"] return price def entry(symbol:str,side:str,qty:str): qty = float(qty) 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 )) |
binance_.pyに新規注文処理を追加する
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 |
from binance.um_futures import UMFutures key = "" secret = "" um_futures_client = UMFutures(key=key, secret=secret) def price(symbol): res = um_futures_client.ticker_price(symbol) return res["price"] def entry(symbol:str,side:str,qty:str): qty = float(qty) if(side=="Buy"): side = "BUY" else: side = "SELL" res = um_futures_client.new_order( symbol=symbol, side=side, type="MARKET", quantity=qty, timeInForce="GTC", ) print(res) |
order_entry.pyで新規注文を呼び出す
1 2 3 4 5 6 7 8 |
import bybit_ import binance_ def entry_order(symbol,qty,buy_exchange,sell_exchange): if buy_exchange == "bybit" and sell_exchange == "binance": print("bybitで買い、binanceで売る") bybit_.entry(symbol,"Buy",qty) binance_.entry(symbol,"Sell",qty) |
これで新規注文部分が完成です。逆サイドも追加しておきます。
1 2 3 4 5 6 7 8 9 |
def entry_order(symbol,qty,buy_exchange,sell_exchange): if buy_exchange == "bybit" and sell_exchange == "binance": print("bybitで買い、binanceで売る") bybit_.entry(symbol,"Buy",qty) binance_.entry(symbol,"Sell",qty) if buy_exchange == "binance" and sell_exchange == "bybit": print("binanceで買い、bybitで売る") bybit_.entry(symbol,"Sell",qty) binance_.entry(symbol,"Buy",qty) |
main.pyで新規注文を呼び出す
これで価格差がしきい値を超えたらエントリーされます。
でもこれだけだと、価格差がしきい値を超えたら何回でもエントリーしてしまいます。
これを防ぐために前回データベースを用意したのですね。
データベースからポジション情報を取得してポジションがあったらエントリーはやめる機能を追加
main.pyで条件分岐させるのか、エントリー直前で条件分岐させるのかどっちでも大丈夫です。
今回はorder_entry.pyを変更していきます。
order_entry.pyを修正
データベースをインポートしてcheck_positionという機能を作っていきます。
まずはデータベースのインスタンスをたてます。グローバルスコープでいいかな。
bybitのポジション数を記憶させていきます。
エントリーしたらQTY(注文サイズ)が記憶されているので、これが0ではない場合、またはデータベースに存在しない場合は「None」が入っているのでこれで条件分岐させます。
1 2 3 4 5 6 7 8 9 |
def is_no_position(symbol): position = bybit_db.position_info(symbol) if position == None: return True qty=float(position["qty"]) if qty==0: return True return False |
これでノーポジならエントリーします。
1 2 3 4 |
def entry_order(symbol,qty,buy_exchange,sell_exchange): if buy_exchange == "bybit" and sell_exchange == "binance": if is_no_position(symbol): print("bybitで買い、binanceで売る") |
エントリーしたらデータベースへポジション情報を保存します。
1 |
bybit_db.update_position_info(symbol,"Buy",qty) |
これでエントリーが呼ばれたときに
- データベースを確認
- ノーポジならエントリー、ポジション保有状態なら何もしない
- エントリーしたらデータベースの更新
がされます。
order_entry.pyコード全文
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 |
import bybit_ import binance_ import db bybit_db = db.Database("Bybit") def is_no_position(symbol): position = bybit_db.position_info(symbol) if position == None: return True qty=float(position["qty"]) if qty==0: return True return False def entry_order(symbol,qty,buy_exchange,sell_exchange): if buy_exchange == "bybit" and sell_exchange == "binance": if is_no_position(symbol): print("bybitで買い、binanceで売る") bybit_.entry(symbol,"Buy",qty) binance_.entry(symbol,"Sell",qty) bybit_db.update_position_info(symbol,"Buy",qty) if buy_exchange == "binance" and sell_exchange == "bybit": if is_no_position(symbol): print("binanceで買い、bybitで売る") bybit_.entry(symbol,"Sell",qty) binance_.entry(symbol,"Buy",qty) bybit_db.update_position_info(symbol,"Sell",qty) |
これでエントリー処理までが完了です。
次回は決済処理を考えます。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…