
仮想通貨bot 勉強記録⑦
~未約定の注文をキャンセルする~
前回までのあらすじ
PyBybitを使って、新規注文を出すところまで出来ました。
今回は未約定の注文をキャンセルします。
キャンセルするために、前回作ったコードで新規注文を出しておきましょう。
import pybybit
from rich import print as pp
import time
apis = [
'プライベートキー',
'シークレットキー'
]
bybit = pybybit.API(*apis, testnet=True)
#新規注文
def limitorder_sample():
r = bybit.rest.inverse.private_order_create(
side='Buy',
symbol='BTCUSD',
order_type='Limit',
qty=10, price=7000,
time_in_force='PostOnly')
pp(r.json())
limitorder_sample()
せっかくだし、3個くらい新規注文を出します。
上のコードを3回実行してもいいんですが、あまりスマートではないので、for文を使ってみます。
関数名の次の行に、以下のコードを入力するだけです。
for 変数 in range(回数):
できたコードがこちら
import pybybit
from rich import print as pp
import time
apis = [
'プライベートキー',
'シークレットキー'
]
bybit = pybybit.API(*apis, testnet=True)
#新規注文3回
def limitorder_sample():
for r in range(3):
r = bybit.rest.inverse.private_order_create(
side='Buy',
symbol='BTCUSD',
order_type='Limit',
qty=10, price=7000,
time_in_force='PostOnly')
pp(r.json())
limitorder_sample()
()で指定した回数だけ繰り返し処理を行ってくれます。とりあえず3にしてみましょう。
無事3個の注文が発行されました!
ではこの注文をキャンセルしていきます。
まずはBybitのAPIを見に行きます。
キャンセルコマンドを発見
パラメータですが、シンボルとorder_idかorder_link_idのどちらかが必須みたいです。
ということは、自分の注文のIDを把握する必要がありますね、、、
キャンセルコードを作る前に注文IDを確認するコードを書かないといけないっぽい。
仕方ないのでまたAPI仕様書を確認します。
それらしきコードを発見
必須パラメータはシンボルだけっぽいですね。ですが、今回は未約定の注文を取得したいので、order_statusのパラメータをNewに指定します。
import pybybit
from rich import print as pp
import time
apis = [
'プライベートキー',
'シークレットキー'
]
bybit = pybybit.API(*apis, testnet=True)
#注文履歴取得
def get_order():
g_o = bybit.rest.inverse.private_order_list(
symbol='BTCUSD',
order_status="New")
pp(g_o.json())
get_order()
実行すると、statusがNewの注文履歴のみ表示されます。
今回知りたいのはorder_idのみなので、order_idのみ抜き取ります
import pybybit
from rich import print as pp
import time
apis = [
'プライベートキー',
'シークレットキー'
]
bybit = pybybit.API(*apis, testnet=True)
#注文履歴取得
def get_order():
g_o = bybit.rest.inverse.private_order_list(
symbol='BTCUSD',
order_status="New").json()
g_o =g_o["result"]["data"]
for o in g_o:
pp(o["order_id"])
get_order()
for文を使いました(ドヤ顔)(2時間くらいかかった)
↓の記事を参考にしてます。
for文の解説:
取得した注文履歴のjson形式のデータは以下の並びになっています。
result内のdata配列が注文履歴の順番を表しています。欲しいのは、
変数['result']['data'][注文の順番(ここを繰り返し)]['order_id']
なので、[注文の順番]の部分をfor文で繰り返しています。
実行するとidのみが表示されます。
これでIDが分かったので、private_order_cancel関数のパラメータにIDを入れれば、任意の注文をキャンセルできます。
import pybybit
from rich import print as pp
import time
apis = [
'プライベートキー',
'シークレットキー'
]
bybit = pybybit.API(*apis, testnet=True)
#オーダーキャンセル
def order_cancel():
bybit.rest.inverse.private_order_cancel(
symbol='BTCUSD',
order_id="IDを入力")
order_cancel()
ちゃんとキャンセルできてます。
ID手入力だとなんとなくテンションが上がらないので、最新の注文をキャンセルしてみます。
import pybybit
from rich import print as pp
import time
apis = [
'プライベートキー',
'シークレットキー'
]
bybit = pybybit.API(*apis, testnet=True)
#オーダーキャンセル
def order_cancel():
#注文履歴取得
g_o = bybit.rest.inverse.private_order_list(
symbol='BTCUSD',
order_status="New").json()
bybit.rest.inverse.private_order_cancel(
symbol='BTCUSD',
order_id = g_o["result"]["data"][0]["order_id"])
order_cancel()
order_id=の部分で、注文履歴関数で取得した最新のIDを入力します。
実行してみると、ちゃんと最新注文がキャンセルされていました。
今回はここまでです。
・注文履歴の取得
・for文の使い方
・オーダーキャンセルのやり方
を学習しました。