BitMEX自動売買bot(python-CCXT利用)で、ロットをコントロールする

ご挨拶

おはようございます・こんばんは。botトレード初心者のモッチオと申します。
つい先日、AKAGAMIさん販売のドテン君を購入・稼働させていただいて、botトレードデビューした新参でございます。
今回、BitMEX取引所を戦場に、pythonのccxtというライブラリを利用したbotを動かしています。
実はPython初心者でもありますので、内容に不備などありましたら、是非ご指摘いただければと思います。

やりたいこと

例のbotプログラムで、注文数量を固定ではなく、いま買える数量に対して〇%買うようにしたい!のです。

それで、BitMEXから必要な情報を手に入れて、購入する数量(USD)を算出して設定します。
レバレッジは現在のポジションがない場合には設定を取得できない(?)ので、逆にbot側から指定してやります。

いきなりソースコード

まずは、ロットとして指定したい数量を算出するプログラムのソースコードを示します。一つのプログラムとして動作するように書いています。
ので、例のbotプログラムを購入されていない方でも、いくらか有用かな、と思っております。
このプログラムからどの部分を抜き出して例のbotに反映するかは、後ろの方で解説します。
※!レバレッジの設定をする処理が入っています!※
ポジションの発注などはしませんが、スクリプト内の「LEVERAGE」に指定した倍率でレバレッジ設定の上書きを行うので、実行する場合はご注意ください。

#!/usr/bin/python3
import requests
import ccxt

HIGH = 2
LOW  = 3

LOT_RATE  = 0.7 # ロット(割合)
LEVERAGE = 3     #レバレッジ設定 
# ポジション情報取得関数
def position():
  pos = bitmex.private_get_position()[0]
  if pos['currentQty'] > 0:
    side = 'LONG'
  else:
    side = 'SHORT'
  return {'side': side, 'currentQty': round(pos['currentQty']), 'avgEntryPrice': pos['avgEntryPrice']}

#BitMEX操作オブジェクト取得
bitmex = ccxt.bitmex({
  'apiKey': 'ご自分の環境のAPI-KEY',
  'secret': 'ご自分の環境のSecret-KEY',
})

#レバレッジ設定をBitMEXに反映する(設定値を取得するAPIが見つからないため、こちらから設定してしまいます)
bitmex.private_post_position_leverage({"symbol":"XBTUSD", "leverage": str(LEVERAGE)})

#最終価格を取得する
last = bitmex.fetch_ticker('BTC/USD')['last']
 #現在の保有BTC総量を取得 total_btc = bitmex.fetch_balance()['BTC']['total']
#前ポジションの数量(USD)取得
pos = position()
current_position_qty = pos['currentQty'] if pos['side'] == 'LONG' else - pos['currentQty'] if pos['side'] == 'SHORT' else 0
#最大ポジション数量(レバレッジ設定×保有BTC総量×Price最終値×ロット割合)!!実際は成行注文をするので、この値より多少前後します!!
max_position_qty = int(LEVERAGE * total_btc * last)
#新ポジションの数量(USD)の作成(最大ポジション数量×ロット割合)
new_position_qty = int(max_position_qty * LOT_RATE)

print("現ポジションUSD: " + str(current_position_qty))
print("最大ポジションUSD: " + str(max_position_qty))
print("新ポジションUSD: " + str(new_position_qty))

実行すると、

こんな感じで、
・現在のポジションのUSD数量
・最終価格で指定できるポジションの最大数量
・最大数量に割合をかけた、新ポジションの数量
が出力されます。
※BitMEXへは、「LEVERAGE」の値が指定レバレッジとして反映されます。

例のbotプログラムへの組み込み方

いよいよ、例のbotプログラムへの組み込み方です。

定数

pythonプログラム先頭近くにある定数記述部分に「ロット(割合)」と「レバレッジ設定」の定数を加えてください。

HIGH = 2
LOW  = 3
LOT  = 100
SLEEP = 30
# ロット(割合)
LOT_RATE  = 0.7 #レバレッジ設定 
LEVERAGE = 3

レバレッジ設定

繰り返し処理のWhile文の前に、レバレッジ設定処理を入れましょう。

#レバレッジ設定をBitMEXに反映する
bitmex.private_post_position_leverage({"symbol":"XBTUSD", "leverage": str(LEVERAGE)})

while True:

ポジション数量の算出

While文の中で、ちょうどポジション情報や最終価格の取得をしている箇所があるので、その後ろに配置しましょう。

    last = bitmex.fetch_ticker('BTC/USD')['last'] #すでに記述してある最終価格の取得処理 
    loger.info(last)
  
    #現在の保有BTC総量を取得 
    total_btc = bitmex.fetch_balance()['BTC']['total']
    #前ポジションの数量 
    current_position_qty = pos['currentQty'] if pos['side'] == 'LONG' else - pos['currentQty'] if pos['side'] == 'SHORT' else 0
    #最大ポジション数量 (レバレッジ設定×保有BTC総量×Price最終値×ロット割合)!!実際は成行注文をするので、この値より多少前後します!!
    max_position_qty = int(LEVERAGE * total_btc * last)
    #新ポジションの数量 (USD)の作成(最大ポジション数量×ロット割合)
    new_position_qty = int(max_position_qty * LOT_RATE)
    logger.info("新設定用ポジション量指定値(USD):" + str(new_position_qty))

ポジション発注処理

いよいよ実際の発注処理に手を加えます。
実は「ロット(割合)」に0.5以上の値を指定した場合、ドテンする数量を一度の発注で指定するとエラーで弾かれてしまいます。
これは一度に発注する数量が、指定できる最大数量を超えてしまうためです。
そのため、前ポジションで発注している数量を一度清算してから、新ポジションの数量で発注を行います。

※「ロット(割合)」に0.5未満の値しか指定しないよ、という方は「current_position_qty」と「new_position_qty」とを足しこんだ数量を指定して、一度の発注で済ませたほうがいいかもしれません。

    if last > c_high and pos['side'] == 'SHORT':
        if current_position_qty > 0 : market('buy', current_position_qty)
        market('buy', new_position_qty)
        time.sleep(30)
    elif last < c_low and pos['side'] == 'LONG':
        if current_position_qty > 0 : market('sell', current_position_qty)
        market('sell', new_position_qty)
        time.sleep(30)

おしまい(読んでいただき、ありがとうございました)

プログラムソースへの反映が全てうまくいっていれば、発注時には指定できる最大数量の〇割でポジションが形成されるはずです。
念のため、TESTNETで動作を確認されてから、本番環境に組み込まれることを強くお勧めします。

最後まで読んでいただき、ありがとうございました!!

この記事が気に入ったらサポートをしてみませんか?