BitMEXの自動取引botを作りたいのでCCXTの使い方を勉強する。めっちゃ基本的なところから。
長らく放置してました。
やる気だけはあるので、いろいろと勉強しています。
とかいいつつ無駄に試行錯誤してたんですが。
こんなnoteがあり、無料部分だけで基本的なところはわかりやすく学習できるということに気付いて悲しんでいます。
しかもよく見たら注文してたの先物市場だったし。
まあ車輪の再開発の過程を記録したということでひとつ。
以降は茶番です
参考資料
有料note(未読)
ccxtでocoとかトレーリングストップとかできんのかな?
と思って検索したら、そんな内容の有料noteが出てきました。
できることがわかればそれでいいので読んでないです。
もう少しちゃんと調べていれば無駄な回り道をせずに済んだのに
ccxtの大本
ccxt/bitmex.py at master · ccxt/ccxt · GitHub
コードの大本?が載ってます。
これだけ見てもよくわかりませんが、とりあえず関数と引数は確認できます。
サンプル
素直にサンプル探せばええんや、と思って検索したら出てきました。
ccxt/bitmex-create-order.py at master · ccxt/ccxt · GitHub
これを参考にいろいろやってみます。
あとから見てみると、なぜサンプルが先物市場なんだっていう
実践(基本編)
共通部分
以降のソースは、こんな感じのコードが冒頭に来ますが共通なので省いてます。
適宜補完してください。
import ccxt
from pprint import pprint
import json
bm_keys_json = open('config/mexkeys.json', 'r')
bm_key = json.load(bm_keys_json)
bm = ccxt.bitmex(bm_key)
apiキーはconfigフォルダを作成してそこに置いておきます。
{
"apiKey":"〜〜〜",
"secret":"〜〜〜"
}
create_order
まずはチュートリアルレベルの内容から。
symbol、type、side、amount、price、paramsを設定して注文を出します。
とりあえずサンプルと同じような感じで設定してみました。
symbol = 'XBTU18'
type = 'StopLimit'
side = 'buy'
amount = 1.0
price = 6000.0
params = { 'stopPx': 5999.0, }
order = bm.create_order(symbol, type, side, amount, price, params)
pprint(order)
おっ?
なんかできてますね。
symbolはfetch_markets
で確認できた適当なマーケットを設定しています。
mrkts = bitmex.fetch_markets()
for mrkt in mrkts:
print(mrkt["id"])
XBTUSDとかXBT7D_U105とかいろいろあるけど何なんでしょう。
あとで調べるとします。
type、sideはまあいいとして、amountってなんでしょう。
試しに2にしてみたら、2列目の数量が変化しました。
と思って改めて画面を見たら、注文を出すところに数量という文字がありました。
単位はUSD。
ここで指定したUSDぶんの通貨を買うってことですね、なるほど。
edit_order
def edit_order(self, id, symbol, type, side, amount=None, price=None, params={}):
create_orderにidが追加された感じかな。
symbolとか変えられるの? まじで?
とりあえずやってみます。
symbol = 'XBTZ18'
type = ''
side = 'sell'
amount = 2.0
price = 6003.0
params = {'stopPx':5998.0}
o = bm.fetch_orders()[0]
if len(o) > 0:
order = bm.edit_order(o['id'], symbol, type, side, amount, price, params)
pprint(order)
先頭の注文に対して変更を加えます。
fetch_ordersで取れる注文は変更を加えると一番最後に行くらしく、連続起動すると指定する注文がどんどん入れ替わっていくので注意。
試して得られた知見は以下。
- symbol、type、sideはそもそも関数の中で使ってない。
- 変更できないし検索に使っているわけでもないので何を指定してもOKというか指定しなくてもOK。
- 必須項目だから何かしら指定は必要だけど。
- stopPxを別の値に変更はできない。
- 別のParamsを設定してみようとしたけど設定されなかった。
- 注文タイプによって変更可能なパラメーターがあったりするかもしれないけどよくわからない。
- 一応関数内で使ってるっぽいので渡せるっぽい……? 要検証。
- 要するに、基本的には数量と指値を変更するだけっぽい。
cancel_orders
idを指定するだけですね。
symbolとparamsは何に使うんだろう。
o = bm.fetch_orders()[0]
if len(o) > 0:
order = bm.cancel_order(o['id'])
pprint(order)
キャンセルした注文はキャンセル状態になるのがブラウザで確認できます。
キャンセルすると、画面上ではクリアボタンが表示された状態になります。
これは画面上からキャンセルボタンを押したときも同じですね。
画面を更新するとアクティブな注文から姿を消します。
当然ながら、注文履歴にはしっかり残りますね。
fetch_ordersでもキャンセルした注文が取得できます。
復習
とりあえず基本的なところは操作できるようになった気がします。
というわけで、放置してた疑問を調べていきます。
マーケットの意味
ぐぐりました。
先物じゃねえか。
いや、まあそりゃそうか。
うーん、普通のFXはどこなんでしょう。
普通に考えたらmarketsにも表示されているXBTUSDなんでしょうけど、エラーになるんですよねこれ。
とか思いながら調べたら冒頭のnoteに辿り着いて嘆いているのが今です。
どえらい時間を無駄にしてしまった……。
あらためてcreate_order
さて、そんなわけでcreate_orderをやり直してみます。
symbolは'BTC/USD'
になるみたいです。
さらにいろいろ調べてたら、こんなのを見つけました。
orderのPOSTのところで、指定すべきパラメータが確認できます。
便利。
これによると、基本的なtypeと指定パラメータはこんな感じらしいです。
- market・・・amountのみ指定。成行。
- limit・・・amount、priceのみ指定。指値。
- stop・・・amount、stopPxのみ指定。ストップ成行。
- stopLimit・・・amount、price、stopPxのみ指定。ストップ指値。
- typeは
stopLimit
かStopLimit
じゃないとエラーになる。
- typeは
ここに特殊注文のやり方も載ってるので、次はこれに挑戦してみようと思います。