突然ですが、ccxtを利用していると以下のメソッドがエラーになって返ってくることがあります。地味にいらいらしたので解決法をまとめます。
exchange.create_order("DOGE/USDT", 'market', 'buy', 33)
exchangeのインスタンスを生成する際にoptionsをつけて取引所毎の特有の仕様に対応することができるようになっているので、こちらの方法での対応を記載します。
こちらは最も一般的な生成法
exchange = ccxt.bitget({
'apiKey': api_key,
'secret': secret_key,
})
こちらはoptionsを指定して生成した際のサンプル
exchange = ccxt.bitget({
'apiKey': api_key,
'secret': secret_key,
'options': {
'adjustForTimeDifference': True, # exchange-specific option
}
})
あるいは以下のように後付けでoptionsをセットしていくこともできます。createMarketBuyOrderRequiresPriceをFalseにすると直感的にわかりやすくなります。
exchange.options['createMarketBuyOrderRequiresPrice'] = False
取引所によってはMarketBuyOrderを拒絶していてLimitOrderしか受け付けないところがあるので、その制約をccxt側でOFFにするオプションです。
このオプションをOFFにした場合に必要となる引数はコストという概念になります。DOGE/USDTを例に出すとUSDTの部分にいくら持ってくるかがコストですね。なので300ドル分DOGEを買いたいと思えばcostは300とします。
usd_amount = 300
last_price = exchange.fetch_ticker(symbol)['last']
amount = round(usd_amount / last_price, 2)
cost = amount * last_price
exchange.create_order("DOGE/USDT", 'market', 'buy', cost)
詳細な売買条件はparamsに入れて引き渡すことが多いので条件を付け足す時は以下のように記載します。
params = {'type':'margin', 'isIsolated': 'TRUE'} # --------------┑
v
exchange.create_order('BTC/USDT', 'limit', 'buy', amount, price, params)
以下のようなIF文でそもそも利用したい取引所がMarketOrder専用のメソッドを受け入れてくれるかどうかを判別することもできます。結構便利です。
if exchange.has['createMarketOrder']:
他にもcreateMarketBuyOrderRequiresPriceをFlaseにしないでもLast_priceを拾ってきてすぐLimit orderを出すようにすれば対応ができたり、色々解決策はあるみたいです。
僕はcreateMarketBuyOrderRequiresPriceをFalseにするだけの今回紹介した手法が気に入ってます。