PHP

【v5対応】ByBitのAPIをPHPで基本操作する方法まとめ(成行注文/指値注文/決済/価格/残高)

どうも、こっこです。

今回はByBitのAPIをPHPで各種操作する方法をまとめました。

Pythonや他言語ならライブラリが充実していたり、PHPでもByBitAPIを操作できるライブラリがあるようですが、結局公式のドキュメントを見ながら自分なりにトライアンドエラーを続けて組み立てて行くような古いやり方が好みです。

Webで検索かけてもあまりまとまった記事がなかったので、この記事を見て参考にしてもらえれば幸いです。

ByBitAPIを利用する準備

ByBitで口座開設をする

まだByBitで口座開設をしていない方は以下のボタンをクリックして口座開設を進めてください。

※このボタンからByBit口座開設を行うことで通常の登録よりも
さらに1032USDT相当の特典を受け取ることができます。

ByBitでAPIキーを発行する

ByBitで口座開設が完了しましたらAPIキーを発行します。

リアル、デモ(テストネット)でそれぞれのAPIキーの発行方法を別の記事でまとめてありますので参考にしてください。

ByBitAPIの公式ドキュメントを確認する

ByBitAPIの公式ドキュメントのリンクはこちらです。

https://bybit-exchange.github.io/docs/v5/intro

英語か台湾中国語の2つの言語にみ対応しています。

ベースのアクセスURLと各動作へのエンドポイント、リクエストパラメータやレスポンスパラメータ等各種詳細に記載されています。

共通レスポンスパラメータ

APIで各エンドポイントで処理を行うとJSONレスポンスが返ってきます。

// JSONレスポンス例
{
    "retCode": 0,
    "retMsg": "OK",
    "result": {
    },
    "retExtInfo": {},
    "time": 1671017382656
}
  • retCode ⋯ 0で成功、それ以外でエラー(エラーコード一覧
  • retMsg ⋯ “OK”で成功、エラーはエラーメッセージ表示
  • result ⋯ API各処理でのレスポンスデータ
  • retExtInfo ⋯ ほぼ空欄、必要な場合ここに情報追加
  • time ⋯ レスポンス時のタイムスタンプ(ms)

PHPで基本的な動作をさせる方法

とりあえずすぐに使い始められるように関数にまとめました。

操作が簡単なのでcurlでPOST、GETでそれぞれアクセスするように作成しています。

各関数は動作確認できていますので柔軟に変形して使ってください。

対象通貨の現在の価格を取得する

板から価格を取得する方法です。時間足で価格を取得する場合は別エンドポイント(/v5/market/kline)で取得するのが便利です。

関数

// 対象通貨の価格を取得
function get_symbol_price($api_key, $api_secret, $symbol)
{
    // アクセスするURLとエンドポイント
    //$url = "https://api-demo.bybit.com"; //デモはこっち
    $url = "https://api.bybit.com"; //リアルはこっち
    $endpoint = "/v5/market/tickers";

    // リクエストパラメータの設定
    $timestamp = (string) time() * 1000; // ミリ秒単位のタイムスタンプ
    $recv_window = "5000"; // タイムウィンドウ

    // 任意のクエリ文字列 (queryString) を設定
    $queryString = http_build_query([
        "category" => "spot", //spot,linear,inverse等のカテゴリー変更はここ
        "symbol" => $symbol,
    ]);

    // HMAC-SHA256署名の作成
    $sign_string = $timestamp . $api_key . $recv_window . $queryString;
    $signature = hash_hmac("sha256", $sign_string, $api_secret);

    // cURLセッションの初期化
    $ch = curl_init();

    // cURLオプションの設定
    $url_with_params = $url . $endpoint . "?" . $queryString;
    curl_setopt_array($ch, [
        CURLOPT_URL => $url_with_params,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            "Content-Type: application/json",
            "X-BAPI-API-KEY: " . $api_key,
            "X-BAPI-SIGN: " . $signature,
            "X-BAPI-TIMESTAMP: " . $timestamp,
            "X-BAPI-RECV-WINDOW: " . $recv_window,
        ],
    ]);

    // APIにリクエストを送信してレスポンスを取得
    $response = curl_exec($ch);

    // エラーチェック
    if (curl_errno($ch)) {
        echo "cURL error: " . curl_error($ch);
    }

    // cURLセッションを閉じる
    curl_close($ch);

    // レスポンスをJSONから配列に変換して表示
    $result = json_decode($response, true);
    return $result;
}

引数

  • $api_key ⋯ APIキー
  • $api_secret ⋯ APIシークレットキー
  • $symbol ⋯ 価格取得をしたい通貨名(例:BTCUSD)

※ここでの処理はAPIキー、シークレットキー無しでも価格取得ができるらしい。載せておいても処理が通る。

レスポンス例

{
    "retCode": 0,
    "retMsg": "OK",
    "result": {
        "category": "spot",
        "list": [
            {
                "symbol": "BTCUSDT",
                "bid1Price": "20517.96",
                "bid1Size": "2",
                "ask1Price": "20527.77",
                "ask1Size": "1.862172",
                "lastPrice": "20533.13",
                "prevPrice24h": "20393.48",
                "price24hPcnt": "0.0068",
                "highPrice24h": "21128.12",
                "lowPrice24h": "20318.89",
                "turnover24h": "243765620.65899866",
                "volume24h": "11801.27771",
                "usdIndexPrice": "20784.12009279"
            }
        ]
    },
    "retExtInfo": {},
    "time": 1673859087947
}

残高を取得する

APIキーで連携している口座の残高情報を取得します。APIのリクエストパラメータで通貨名を指定する方法もありますが、レスポンスデータから対象通貨名を検索したほうが柔軟に対応できます。

関数

// 残高を取得
function get_balance($api_key, $api_secret)
{
    // アクセスするURLとエンドポイント
    //$url = "https://api-demo.bybit.com"; //デモはこっち
    $url = "https://api.bybit.com"; //リアルはこっち
    $endpoint = "/v5/account/wallet-balance";

    // リクエストパラメータの設定
    $timestamp = (string) time() * 1000; // ミリ秒単位のタイムスタンプ
    $recv_window = "5000"; // タイムウィンドウ

    // 任意のクエリ文字列 (queryString) を設定
    $queryString = http_build_query([
        "accountType' => 'UNIFIED",
    ]);

    // HMAC-SHA256署名の作成
    $sign_string = $timestamp . $api_key . $recv_window . $queryString;
    $signature = hash_hmac("sha256", $sign_string, $api_secret);

    // cURLセッションの初期化
    $ch = curl_init();

    // cURLオプションの設定
    $url_with_params = $url . $endpoint . "?" . $queryString;
    curl_setopt_array($ch, [
        CURLOPT_URL => $url_with_params,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            "Content-Type: application/json",
            "X-BAPI-API-KEY: " . $api_key,
            "X-BAPI-SIGN: " . $signature,
            "X-BAPI-TIMESTAMP: " . $timestamp,
            "X-BAPI-RECV-WINDOW: " . $recv_window,
        ],
    ]);

    // APIにリクエストを送信してレスポンスを取得
    $response = curl_exec($ch);

    // エラーチェック
    if (curl_errno($ch)) {
        echo "cURL error: " . curl_error($ch);
    }

    // cURLセッションを閉じる
    curl_close($ch);

    // レスポンスをJSONから配列に変換して表示
    $result = json_decode($response, true);
    return $result;
}

引数

  • $api_key ⋯ APIキー
  • $api_secret ⋯ APIシークレットキー

レスポンス例

{
    "retCode": 0,
    "retMsg": "OK",
    "result": {
        "list": [
            {
                "totalEquity": "3.31216591",
                "accountIMRate": "0",
                "totalMarginBalance": "3.00326056",
                "totalInitialMargin": "0",
                "accountType": "UNIFIED",
                "totalAvailableBalance": "3.00326056",
                "accountMMRate": "0",
                "totalPerpUPL": "0",
                "totalWalletBalance": "3.00326056",
                "accountLTV": "0",
                "totalMaintenanceMargin": "0",
                "coin": [
                    {
                        "availableToBorrow": "3",
                        "bonus": "0",
                        "accruedInterest": "0",
                        "availableToWithdraw": "0",
                        "totalOrderIM": "0",
                        "equity": "0",
                        "totalPositionMM": "0",
                        "usdValue": "0",
                        "spotHedgingQty": "0.01592413",
                        "unrealisedPnl": "0",
                        "collateralSwitch": true,
                        "borrowAmount": "0.0",
                        "totalPositionIM": "0",
                        "walletBalance": "0",
                        "cumRealisedPnl": "0",
                        "locked": "0",
                        "marginCollateral": true,
                        "coin": "BTC"
                    }
                ]
            }
        ]
    },
    "retExtInfo": {},
    "time": 1690872862481
}

成行注文を出す

成行で注文を出す方法です。成行なので注文を出す行為が成功したかどうか確認できれば問題ありません。

関数

// 成行で注文を出す
function order_market($api_key, $api_secret, $symbol, $side, $qty)
{
	// アクセスするURLとエンドポイント
    //$url = "https://api-demo.bybit.com"; //デモはこっち
    $url = "https://api.bybit.com"; //リアルはこっち
    $endpoint = "/v5/order/create";

    // リクエストパラメータの設定
	$timestamp = (string) time() * 1000; // ミリ秒単位のタイムスタンプ
	$recv_window = "5000"; // タイムウィンドウ

	// 任意のクエリ文字列 (queryString) を設定
	$params = array(
    	"category" => "spot",
    	"symbol" => $symbol,
    	"side" => $side,
    	"orderType" => "Market",
    	"qty" => $qty,
	);

	// HMAC-SHA256署名の作成
	$json = json_encode($params);
	$sign_string = $timestamp . $api_key . $recv_window . $json;
	$signature = hash_hmac("sha256", $sign_string, $api_secret);

	// cURLセッションの初期化
	$ch = curl_init();

	// cURLオプションの設定
	curl_setopt_array($ch, [
    	CURLOPT_URL => $url . $endpoint,
    	CURLOPT_POST => true,
    	CURLOPT_POSTFIELDS => $json,
    	CURLOPT_RETURNTRANSFER => true,
    	CURLOPT_HTTPHEADER => [
        	"Content-Type: application/json",
        	"X-BAPI-API-KEY: " . $api_key,
        	"X-BAPI-SIGN: " . $signature,
        	"X-BAPI-TIMESTAMP: " . $timestamp,
        	"X-BAPI-RECV-WINDOW: " . $recv_window,
    	],
	]);

	// APIにリクエストを送信してレスポンスを取得
	$response = curl_exec($ch);

	// エラーチェック
	if (curl_errno($ch)) {
    	echo "cURL error: " . curl_error($ch);
	}

	// cURLセッションを閉じる
	curl_close($ch);

	// レスポンスをJSONから配列に変換して表示
	$result = json_decode($response, true);
	return $result;
}

引数

  • $api_key ⋯ APIキー
  • $api_secret ⋯ APIシークレットキー
  • $symbol ⋯ 通貨名
  • $side ⋯ 売買方向(買い:Buy、売り:Sell)
  • $qty ⋯ 注文数量

レスポンス例

{
    "retCode": 0,
    "retMsg": "OK",
    "result": {
        "orderId": "1321003749386327552",
        "orderLinkId": "spot-test-postonly"
    },
    "retExtInfo": {},
    "time": 1672211918471
}

指値注文を出す

指値で注文を出す方法です。注文が約定したかの確認、または注文をキャンセルする場合を見越してレスポンスのorderIdの取得と保管が重要になります。

関数

// 指値で注文を出す
function order_limit($api_key, $api_secret, $symbol, $price, $side, $qty)
{
	// アクセスするURLとエンドポイント
    //$url = "https://api-demo.bybit.com"; //デモはこっち
    $url = "https://api.bybit.com"; //リアルはこっち
	$endpoint = "/v5/order/create";

	// リクエストパラメータの設定
	$params = array(
    	"category" => "spot",
    	"orderType" => "Limit",
    	"symbol" => $symbol,
    	"price" => $price,
    	"side" => $side,
    	"qty" => $qty,
    	"isLeverage" => 0, //レバレッジ取引をするなら1、レバレッジを使用しないなら0
	);

	// リクエストボディをJSON形式にエンコード
	$json = json_encode($params);

	// HMAC-SHA256署名の作成
	$timestamp = (string) round(microtime(true) * 1000); // ミリ秒単位のタイムスタンプ
	$recv_window = "5000"; // タイムウィンドウ

	$sign_string = $timestamp . $api_key . $recv_window . $json;
	$signature = hash_hmac("sha256", $sign_string, $api_secret);

	// cURLセッションの初期化
	$ch = curl_init();

	// cURLオプションの設定
	curl_setopt_array($ch, [
    	CURLOPT_URL => $url . $endpoint,
    	CURLOPT_POST => true,
    	CURLOPT_POSTFIELDS => $json,
    	CURLOPT_RETURNTRANSFER => true,
    	CURLOPT_HTTPHEADER => [
        	"Content-Type: application/json",
        	"X-BAPI-API-KEY: " . $api_key,
        	"X-BAPI-SIGN: " . $signature,
        	"X-BAPI-TIMESTAMP: " . $timestamp,
        	"X-BAPI-RECV-WINDOW: " . $recv_window,
    	],
	]);

	// APIにリクエストを送信してレスポンスを取得
	$response = curl_exec($ch);

	// エラーチェック
	if (curl_errno($ch)) {
    	echo "cURL error: " . curl_error($ch);
	}

	// cURLセッションを閉じる
	curl_close($ch);

	// レスポンスをJSONから配列に変換して表示
	$result = json_decode($response, true);
	return $result;
}

引数

  • $api_key ⋯ APIキー
  • $api_secret ⋯ APIシークレットキー
  • $symbol ⋯ 通貨名
  • $price ⋯ 指値価格
  • $side ⋯ 売買方向(買い:Buy、売り:Sell)
  • $qty ⋯ 注文数量

レスポンス例

{
    "retCode": 0,
    "retMsg": "OK",
    "result": {
        "orderId": "1321003749386327552",
        "orderLinkId": "spot-test-postonly"
    },
    "retExtInfo": {},
    "time": 1672211918471
}

現在の注文状態を確認する

注文を出した後にその注文が約定したのか、または何かしらの方法でキャンセルされた注文なのかを確認する方法です。

関数

// 注文の情報を取得する
function get_order_info($api_key, $api_secret, $symbol, $order_id)
{
	// アクセスするURLとエンドポイント
    //$url = "https://api-demo.bybit.com"; //デモはこっち
    $url = "https://api.bybit.com"; //リアルはこっち
	$endpoint = "/v5/order/realtime";

	// リクエストパラメータの設定
	$timestamp = (string) time() * 1000; // ミリ秒単位のタイムスタンプ
	$recv_window = "5000"; // タイムウィンドウ

	// 任意のクエリ文字列 (queryString) を設定
	$queryString = http_build_query([
		"category" => "spot",
		"symbol" => $symbol,
		"orderId" => $order_id,
	]);

	// HMAC-SHA256署名の作成
	$sign_string = $timestamp . $api_key . $recv_window . $queryString;
	$signature = hash_hmac("sha256", $sign_string, $api_secret);

	// cURLセッションの初期化
	$ch = curl_init();

	// cURLオプションの設定
	$url_with_params = $url . $endpoint . "?" . $queryString;
	curl_setopt_array($ch, [
    	CURLOPT_URL => $url_with_params,
    	CURLOPT_RETURNTRANSFER => true,
    	CURLOPT_HTTPHEADER => [
        	"Content-Type: application/json",
        	"X-BAPI-API-KEY: " . $api_key,
        	"X-BAPI-SIGN: " . $signature,
        	"X-BAPI-TIMESTAMP: " . $timestamp,
        	"X-BAPI-RECV-WINDOW: " . $recv_window,
    	],
	]);

	// APIにリクエストを送信してレスポンスを取得
	$response = curl_exec($ch);

	// エラーチェック
	if (curl_errno($ch)) {
		echo "cURL error: " . curl_error($ch);
	}

	// cURLセッションを閉じる
	curl_close($ch);

	// レスポンスをJSONから配列に変換して表示
	$result = json_decode($response, true);
	return $result;
}

引数

  • $api_key ⋯ APIキー
  • $api_secret ⋯ APIシークレットキー
  • $symbol ⋯ 通貨名
  • $orderId ⋯ 注文を出したときのレスポンスに含まれるID

レスポンス例

{
    "retCode": 0,
    "retMsg": "OK",
    "result": {
        "list": [
            {
                "orderId": "fd4300ae-7847-404e-b947-b46980a4d140",
                "orderLinkId": "test-000005",
                "blockTradeId": "",
                "symbol": "ETHUSDT",
                "price": "1600.00",
                "qty": "0.10",
                "side": "Buy",
                "isLeverage": "",
                "positionIdx": 1,
                "orderStatus": "New",
                "cancelType": "UNKNOWN",
                "rejectReason": "EC_NoError",
                "avgPrice": "0",
                "leavesQty": "0.10",
                "leavesValue": "160",
                "cumExecQty": "0.00",
                "cumExecValue": "0",
                "cumExecFee": "0",
                "timeInForce": "GTC",
                "orderType": "Limit",
                "stopOrderType": "UNKNOWN",
                "orderIv": "",
                "triggerPrice": "0.00",
                "takeProfit": "2500.00",
                "stopLoss": "1500.00",
                "tpTriggerBy": "LastPrice",
                "slTriggerBy": "LastPrice",
                "triggerDirection": 0,
                "triggerBy": "UNKNOWN",
                "lastPriceOnCreated": "",
                "reduceOnly": false,
                "closeOnTrigger": false,
                "smpType": "None",
                "smpGroup": 0,
                "smpOrderId": "",
                "tpslMode": "Full",
                "tpLimitPrice": "",
                "slLimitPrice": "",
                "placeType": "",
                "createdTime": "1684738540559",
                "updatedTime": "1684738540561"
            }
        ],
        "nextPageCursor": "page_args%3Dfd4300ae-7847-404e-b947-b46980a4d140%26symbol%3D6%26",
        "category": "linear"
    },
    "retExtInfo": {},
    "time": 1684765770483
}

注文をキャンセルする

注文を出したときのレスポンスデータに含まれるorderIdを元にその注文をキャンセルする方法です。特に指値注文で多く使いました。

関数

// 注文をキャンセルする
function order_cancel($api_key, $api_secret, $symbol, $order_id)
{
	// アクセスするURLとエンドポイント
    //$url = "https://api-demo.bybit.com"; //デモはこっち
    $url = "https://api.bybit.com"; //リアルはこっち
	$endpoint = "/v5/order/cancel";

	// リクエストパラメータの設定
	$params = array(
		"category" => "spot",
		"symbol" => $symbol,
		"orderId" => $order_id,
	);

	// リクエストボディをJSON形式にエンコード
	$json = json_encode($params);

	// HMAC-SHA256署名の作成
	$timestamp = (string) round(microtime(true) * 1000); // ミリ秒単位のタイムスタンプ
	$recv_window = "5000"; // タイムウィンドウ

	$sign_string = $timestamp . $api_key . $recv_window . $json;
	$signature = hash_hmac("sha256", $sign_string, $api_secret);

	// cURLセッションの初期化
	$ch = curl_init();

	// cURLオプションの設定
	curl_setopt_array($ch, [
    	CURLOPT_URL => $url . $endpoint,
    	CURLOPT_POST => true,
    	CURLOPT_POSTFIELDS => $json,
    	CURLOPT_RETURNTRANSFER => true,
    	CURLOPT_HTTPHEADER => [
        	"Content-Type: application/json",
        	"X-BAPI-API-KEY: " . $api_key,
        	"X-BAPI-SIGN: " . $signature,
        	"X-BAPI-TIMESTAMP: " . $timestamp,
        	"X-BAPI-RECV-WINDOW: " . $recv_window,
    	],
	]);

	// APIにリクエストを送信してレスポンスを取得
	$response = curl_exec($ch);

	// エラーチェック
	if (curl_errno($ch)) {
    	echo "cURL error: " . curl_error($ch);
	}

	// cURLセッションを閉じる
	curl_close($ch);

	// レスポンスをJSONから配列に変換して表示
	$result = json_decode($response, true);
	return $result;
}

引数

  • $api_key ⋯ APIキー
  • $api_secret ⋯ APIシークレットキー
  • $symbol ⋯ 通貨名
  • $orderId ⋯ 注文を出したときのレスポンスに含まれるID

レスポンス例

{
    "retCode": 0,
    "retMsg": "OK",
    "result": {
        "orderId": "c6f055d9-7f21-4079-913d-e6523a9cfffa",
        "orderLinkId": "linear-004"
    },
    "retExtInfo": {},
    "time": 1672217377164
}

まとめ

いかがだったでしょうか?

今回はByBitのAPIをPHPで各種操作をする方法をまとめました。

一つ一つを関数化したので無駄が多いですが、共通処理をまとめてクラス構造化して簡易的なByBitの自動売買システムをいくつか作成してきました。

他にも解説してほしいByBitでのAPI処理がありましたら「お問い合わせ」よりご連絡ください。

ByBitの口座開設がまだ済んでいない方は以下のボタンから口座開設を進めてください。

※このボタンからByBit口座開設を行うことで通常の登録よりも
さらに1032USDT相当の特典を受け取ることができます。

ではまた!