今回はいつエントリーすればいいのか?
いつ決済すればいいのか?
を考えていきます。
とりあえず価格差が開いたらエントリー。
そこまでは適当につくってみました。
エントリーしたら、決済する必要があります。
取引所の手数料のこともあるので、そのタイミングの見極めが難しいです。
取引所のテイカー注文はおよそ0.1%の手数料が発生するので、乖離率が0.1%を超えたらエントリーすればチャンスがあると思います。
ここからは動かしながらブラッシュアップさせていく必要がありますね。
動かしながらでないとアイデアが生まれません。なにもわからない。
とりあえず決済処理を作っていきます。
Table of Contents
order_entryからorder_に名前を変更
order_entryからorder_に名前を変更させます。
close_orderをつくる
まずはノーポジなら何もしないで呼び出し元に戻します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def close_order(symbol): if is_no_position(symbol): return position = bybit_db.position_info(symbol) qty=position["qty"] if position["side"] == "Buy": bybit_.close(symbol,"Sell",qty) binance_.close(symbol,"Buy",qty) bybit_db.update_position_info(symbol,"Sell","0") elif position["side"] == "Sell": bybit_.close(symbol,"Sell",qty) binance_.close(symbol,"Buy",qty) bybit_db.update_position_info(symbol,"Buy","0") |
ポジション保有状態かつbybitのポジションの売買方向が”Buy”ならbybitでは売り注文、binanceでは買い注文を出します。
ポジション保有状態かつbybitのポジションの売買方向が”Sell”ならbybitでは買い注文、binanceでは売り注文を出します。
決済したらデータベースの変更をします。
main.pyを書き換える
しきい値を超えたらエントリー、しきい値以内に収まったら決済します。
1 2 3 4 5 6 7 |
if entry_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_order(symbol,qty,buy_name,sell_name) if kakakusa <= close_sikiiti: order_.close_order(symbol) |
main.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 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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
import datetime import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import bybit_ import binance_ import order_ # symbol名を入力 SYMBOL = "BTCUSDT" # 注文サイズを入力 QTY = 0.001 # エントリーしきい値を入力 ENTRY_SIKIITI = 0.01 # イグジットしきい値を入力 CLOSE_SIKIITI = 0.01 symbol = SYMBOL qty = QTY entry_sikiiti = ENTRY_SIKIITI close_sikiiti = CLOSE_SIKIITI num = [] x = [] bybit_price_y = [] binance_price_y = [] def animate(i): bybit_price = bybit_.price(symbol) binance_price =binance_.price(symbol) # X軸 x.append(len(num)) num.append(1) # Y軸 bybit_price_y.append(float(bybit_price)) binance_price_y.append(float(binance_price)) # 最大・最小を計算して、割合を計算する price = [bybit_price_y[-1],binance_price_y[-1]] price_min = min(bybit_price_y[-1],binance_price_y[-1]) price_max = max(bybit_price_y[-1],binance_price_y[-1]) kakakusa = round(price_max / price_min - 1,5) * 100 # BUY if price_min == price[0]: buy_name = "bybit" buy_num=0 elif price_min == price[1]: buy_name = "binance" buy_num=1 # SELL if price_max == price[0]: sell_name = "bybit" sell_num=0 elif price_max == price[1]: sell_name = "binance" sell_num=1 if entry_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_order(symbol,qty,buy_name,sell_name) if kakakusa <= close_sikiiti: order_.close_order(symbol) plt.cla() main_text = "Price_Gap: " + f'{kakakusa:.3f}' +"%" plt.title(main_text,color="green") plt.xlabel("Time") plt.ylabel(symbol) plt.plot(x,bybit_price_y ,label="bybit") plt.plot(x,binance_price_y ,label="binance") plt.legend(loc="upper left") plt.tight_layout() if len(x) >= 100: num.clear() x.clear() bybit_price_y.clear() binance_price_y.clear() ani = FuncAnimation(plt.gcf(),animate,interval=1000) plt.tight_layout() plt.show() |
bybit_.pyにcloseを追加
1 2 3 4 5 6 7 8 9 10 11 12 |
def close(symbol:str,side:str,qty:str): qty = float(qty) 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) |
binance_.pyにcloseを追加
ポジションモードは One-way Mode を選択してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def close(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", reduceOnly="true" ) print(res) |
BOTが完成
これでたぶん完成です。
次はテストです。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…