以前にバイナンス API を使用して取引を行う方法を紹介しましたが、この章では現在のポジションの状態を取得して決済操作を行う方法について説明します。まだバイナンス取引所に登録していない場合は、私の招待リンクを使用して手数料の割引を受けることができます:https://accounts.binance.com/register?ref=DPVSZVI3
取引が成功した後、現在のポジションの情報を取得して解析したいと思います。次に、これらのインターフェースをccxt
でどのように呼び出すかを簡単に紹介します。ccxt
が何かまだ知らない場合は、前の章を見てください。
1. 残高の確認#
balance = exchange.fetch_balance({'type': 'future'})['total']['USDT']
ここでは関数fetch_balance
を使用し、辞書を引数として渡しています。type
がfuture
であることは、先物(契約)アカウントの残高を照会することを示しています。現物アカウントを照会する場合は、spot
に設定します。前の章を見た方はこれを知っているはずです。その後、インデックス['total']
および['USDT']
を追加して USDT の残高を照会します。他の通貨の場合はインデックスを対応するものに変更してください。
2. ポジションの確認#
ポジションを開いて、ポジションを確認したところ、返されたデータは次のとおりです:
position = exchange.fetch_positions([COIN])
引数は確認したいポジション通貨のリストです。例えば[BTC/USDT, ETH/USDT]
のようにします。返された結果を印刷すると、辞書のリストが返されることがわかります:
[
{
'info':
{
'symbol': 'JUPUSDT',
'positionAmt': '6',
'entryPrice': '0.9947',
'breakEvenPrice': '0.99519735',
'markPrice': '0.99363270',
'unRealizedProfit': '-0.00640380',
'liquidationPrice': '0',
'leverage': '1',
'maxNotionalValue': '8000000.0',
'marginType': 'isolated',
'isolatedMargin': '5.96820000',
'isAutoAddMargin': 'false',
'positionSide': 'BOTH',
'notional': '5.96179620',
'isolatedWallet': '5.97460380',
'updateTime': '1713106952248',
'isolated': True, 'adlQuantile': '2'
},
'id': None,
'symbol': 'JUP/USDT:USDT',
'contracts': 6.0,
'contractSize': 1.0,
'unrealizedPnl': -0.0064038,
'leverage': 1.0,
'liquidationPrice': None,
'collateral': 5.9682,
'notional': 5.9617962,
'markPrice': 0.9936327,
'entryPrice': 0.9947,
'timestamp': 1713106952248,
'initialMargin': 5.9617962,
'initialMarginPercentage': 1.0,
'maintenanceMargin': 0.089426943,
'maintenanceMarginPercentage': 0.015,
'marginRatio': 0.015,
'datetime': '2024-04-14T15: 02: 32.248Z',
'marginMode': 'isolated',
'marginType': 'isolated',
'side': 'long',
'hedged': False,
'percentage': -0.1,
'stopLossPrice': None,
'takeProfitPrice': None
}
]
中のキーは多く、必要な重要なものは以下の通りです:
contracts
:契約数contractSize
:各契約のサイズ(レバレッジに関連しているはずです)unrealizedPnl
:浮動損益leverage
:レバレッジの大きさcollateral
:証拠金notional
:ポジションの大きさ(証拠金に浮動損益を加えたもの)markPrice
:市場価格entryPrice
:エントリー価格side
:方向(ロング long、ショート short)
position[0]["key"]
を使用してこれらの値を取得します。キーは取得したいデータのキー名で、二重引用符を付ける必要があります。例えば"side"
のようにします。
3. 決済#
バイナンス API のドキュメントには決済のインターフェースが明示的に示されていませんが、決済は実際には現在のポジションとは反対のポジションを開くことに相当します。たとえば、一定数量の COIN をロング(買い)した場合、決済はその COIN の相応の数量を売ることになります。したがって、反対方向に同じ数量のポジションを開くことで決済ができます(開いた数量とは異なる数量で決済することも可能です。たとえば半分を決済するなど)。
たとえば、まず市場価格でロングポジションを開きます:
exchange.set_leverage(5, "BTC/USDT") # レバレッジ倍率を設定
exchange.create_market_order("BTC/USDT", "buy", 6, params={'reduceOnly': False})
その後、決済を行いたい場合は、前回の開設時に購入した数量を知る必要があります。これには上記のポジション確認インターフェースを使用します:
position = exchange.fetch_positions(["BTC/USDT"])
last_amount = position[0]['contracts'] * position[0]['contractSize']
契約数に各契約のサイズを掛けることで、前回の開設時の数量を得ることができます。その後、反対方向にポジションを開いて決済します。
exchange.create_market_order("BTC/USDT", "sell", last_amount, params={'reduceOnly': True})
また、半分を決済する場合はamount
を0.5*last_amount
に設定できます。決済時には、数量が少なすぎて(<5)取引が成功しないのを防ぐために、True
に設定して減少のみを行うことができます。