見出し画像

BitMEXにおける発注サイズの計算

チャネルブレイクアウト戦略botを微修正しましたので、変更内容を簡単に解説しておきます。

最近になって新たにXRPUSDもリストされましたので、スクリプトの汎用性が高まるようにコードを少し書き直して、無期限契約か限月契約かを問わずレバレッジ設定ができるようにしました。

もともとXBTUSDを前提としたスクリプトですが、おまけ機能として他のコントラクトも固定ロット指定で動かせるようにしてありました。またETHUSDについてはアナウンスはしていないものの、以前からレバレッジ設定ができました。

今回の変更はその機能拡張になります。

無期限契約のETHUSDとXRPUSDにおける LOT = 100 は 法定通貨100USDに近似した価値でもなければ100ETHでも100XRPでもありません。あくまで契約単位掛ける100の意です。

BitMEXの無期限契約について詳しくは、FcukOKsanさんのnoteがたいへん参考になります。この契約を理解するために何度も読ませていただきました。ありがとうございます。

- - -

アップデートしたコードから、関連部分の抜粋です。

LOT = 0
LEVERAGE = 1.0

def fetch_balance(last_price):
    """残高を取得しlotをセットする"""

    """略"""

    total_BTC = balance_dict['marginBalance'] * 0.00000001

    # ETHUSD contract is worth 0.001 mXBT per $1 price
    # XRPUSD contract is worth 0.0002 XBT per $1 price

    MULTIPLIER = (
        0.000001 if 'ETHUSD' == MARKET_ID else  ''' *2 '''
        0.0002 if 'XRPUSD' == MARKET_ID else
        1.0                                     ''' *3 '''
    )

    if 'XBT' in MARKET_ID:
        order_lot = (
            LOT if LOT else
            total_BTC * last_price
            * LEVERAGE                          ''' *1 '''
        )
    else:
        order_lot = (
            LOT if LOT else
            total_BTC / last_price / MULTIPLIER
            * LEVERAGE                      ''' *2, *3 '''
        )

    order_lot = int(order_lot)

    """続く"""

XBTベースの契約は1USDが1契約単位です。BTC証拠金残高に当該契約の現在価格を乗じたUSD建の証拠金残高に対して、何倍で建てるかを計算します(*1)。

発注サイズ = BTC証拠金残高 / (1/契約の現在価格) * レバレッジ
      = BTC証拠金残高 * 契約の現在価格 * レバレッジ

order_lot = total_BTC * last_price * LEVERAGE

-

画像1

画像2

ETHUSDとXRPUSDでは、BitMEXが示す契約1USD当たりのBTC数量を係数として、それを契約の現在価格に乗じると1契約単位のBTC数量を求めることができます(*2)。

契約のBTC数量 = 契約の現在価格 * 1USD当たりのBTC数量
発注サイズ = BTC証拠金残高 / (契約の現在価格 * 係数) * レバレッジ
      = BTC証拠金残高 / 契約の現在価格 / 係数 * レバレッジ

order_lot = total_BTC / last_price / MULTIPLIER * LEVERAGE

-

画像3

その他の対BTCペアの有期限契約は各通貨1枚が1契約単位ですから、証拠金残高と建玉量の比率がそのままレバレッジになります(*3)。

係数 = 1.0
発注サイズ = BTC証拠金残高 / 契約の現在価格 / 係数 * レバレッジ

MULTIPLIER = 1.0
order_lot = total_BTC / last_price / MULTIPLIER * LEVERAGE

-

    """続き"""

    if 'XBT' in MARKET_ID:
        leverage = (
            order_lot
            / total_BTC / last_price
        )
    else:
        leverage = (
            order_lot
            / total_BTC * last_price * MULTIPLIER
        )
    logger.info(
        f'leverage: {leverage:.2f}, '
        f'order_lot: {order_lot}'
    )

return total_BTC, order_lot

建玉サイズからレバレッジを逆算して表示と記録をします。こうすることで固定ロットでも設定の誤りに気づきやすくしています。

建て過ぎにご注意ください。皆さんがよいトレンドに乗れますように。

RESOLUTION = '1d' FIRST_PERIOD_STICKS = 14 SECOND_PERIOD_STICKS = 3 MARKET_ID = 'ETHUSD' OC_MODE = True