つまずきCCXT[Bitget, MEXC 先物口座へのアクセス]
本記事では非エンジニアの筆者(大学の講義で2単位だけC言語を履修)が儲かるか爆損するかわからない仮想通貨bot開発のため主にネット情報をもとに日々悪戦苦闘、のたうち回る記録である。コードはPythonを使用。 Pythonは社会人になってから超入門本と入門本2冊で独学し、簡単な文法程度は使える程度。自分の備忘録用としての色が強いのであまり他人が読むのに適した文章ではないかもしれない。
基礎がおろそかなままBotプログラミングにチャレンジしておりますので、今後の成長のためにお気づきの点があればご指摘・ご指導お待ちしております。
本文
今回以下のCCXTを用いたコードでbitgetのbalanceへアクセスを試みた。残高は先物口座に1000ドル弱あることをPCサイト上で確認している。
import ccxt
from pprint import pprint
import json
config = json.load(open('config.json', 'r'))
exchange = ccxt.bitget(config['bitget'])
exchange.fetchBalance()['USDT']
しかしUSDT残高は0と返ってきたので困惑。
{'free': 0.0, 'used': 0.0, 'total': 0.0}
次に先物口座と現物口座でexchange idが分けられている可能性があると考えた。CCXTでは、コード初めに各取引所へのアクセス準備(初心者の私はおまじないみたいなものと認識している。)としてexchange classをインスタンス化する必要がある。そこでCCXTドキュメント Supported Exchannges:
より、先物口座のexchange classをインスタンス化しようとexchange idを探すがbitgetに関しては現物先物で「bitget」統一されている模様。(kucoinなどでは「kucoin」と「kucoinfutures」に分かれている。)どうすれば先物口座へアクセスできるのか?
「cctx bitget future」でググると出てきた解決策っぽいものがこちら
元記事の内容を素人なりに解釈すると
exchange = ccxt.bitget({
"apiKey":api,
"secret":secret,
"options": {'defaultType': 'swap'}
})
のように、要はexchange classのインスタンス化の際に引数に"options": {'defaultType': 'swap'}の情報を渡せばアクセス先を現物口座から先物口座へチェンジできますよということらしい。
そこで早速以下のconfigファイルのbitget欄に"options": {'defaultType': 'swap'}を追加。
#config.json
#空白文字があると読み込みエラーが出るのでコピペのときは注意
{
"bitget":{
"apiKey":"xxx",
"secret":"yyy",
"password":"zzz",
"options":{"defaultType":"swap"}
}
}
そして元コードを実行すると以下の通り、先物口座のUSDT残高を取得することができた。
{'free': 994.56707694, 'used': 0.0, 'total': 994.56707694}
ちなみに今回"options": {'defaultType': 'swap'}で先物口座にアクセスできたが、「swap」はperpetual futures(無期限先物)に対応しており、「future」はdelivery futures(四半期先物?)に対応していると前述のGithubにコメントがある。四半期先物へのアクセスが必要な場合は"options": {'defaultType': 'future'}を入力する必要があるようだ。ただし四半期が存在しない取引所では下記エラーがでる。
NotSupported: bitget future does not have a value in mapping
binanceでも"options": {'defaultType': 'swap'}を試したときは下記のような前述とは異なるエラーが出た。
binance does not support 'swap' type, set exchange.options['defaultType'] to 'spot', 'margin', 'delivery' or 'future'
こちらはご丁寧にswapではなく'spot', 'margin', 'delivery' or 'future'を指定しろとヒントをくれているのでありがたい。ただし他より複雑のようにも思える。marginなんかはcrossとisolateでも区別してそうだ。
おまけ(MEXCバージョン)
また、例えばmexcでもこのoptionsで先物口座へアクセスすることができたので他の取引所でも共通で使用できそうである。今後現物口座と先物口座が同じexchange id内で分かれている場合、このoptions指定で先物口座へのアクセスを試してみると成功するかもしれない。
以下はoptions指定なしの場合でmexcのbalanceを取得する場合のコードと取得結果。現物口座へのアクセスになった。
#config.json
{
"mexc":{
"apiKey":"xxx",
"secret":"yyy",
}
}
#########################################################################
import ccxt
from pprint import pprint
import json
config = json.load(open('config.json', 'r'))
exchange = ccxt.mexc(config['mexc'])
exchange.fetchBalance()['USDT']
#output
{'free': 0.23845546, 'used': 0.0, 'total': 0.23845546}
以下はoptionsを追加したconfigファイルの場合とbalance取得結果。pythonコード部分は上と同じである。先物口座へのアクセスになった。
#config.json
{
"mexc":{
"apiKey":"xxx",
"secret":"yyy",
"options":{"defaultType":"swap"}
}
}
#output
{'free': 621.3331595032, 'used': 0.0, 'total': 621.3331595032}
今回は以上。今後の課題として、binanceは少し口座の別れ方が特殊のような気がしたので、おそらく使用頻度も高くなるだろうと思うし、構成を整理したいと思う。