Bot

仮想通貨botの開発記録#55(2024/2/12)「C級Botterへのステップ⑤売買注文の出し方&注文の自動化&レバレッジの設定」

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

参考にしたのは【Botter Advent Calendar2023】仮想通貨で月に1万円を稼ぐC級Botterになろうです。

Yodaka

今回は例題3に取り組みました。

例題1:fetchOrderBookを使って任意の取引所(現物)のETH-USDT価格を取得しましょう
例題2: 今、0.01ethを任意のperpがある取引所でロングしているとします。例えば、Kucoin futuresのETH-USDTMにポジションがあるとします。
 fetchPositions fetch_balance を用いて、ロング/ショートをどの程度持っているか表示し、フリーなUSDTバランスをprintで表示させましょう。
例題 3: createOrderを用いて0.01 ethを購入し、10秒後に売却しましょう。レバは3倍とし、market orderを使用しましょう。

Yodaka

今回のポイントは以下の通り。

  • kucoin先物取引を利用する
    kucoinfutures
  • トークンと価格を指定して購入する
    →ETH=0.01
  • 10秒後に売却する
    timeモジュールの利用
  • 成り行き注文(merket order)をする
    create_order()メソッドの利用
  • レバレッジの設定をする
    params={'leverage': 3}create_order()に組み込む

1.購入と売却を行う

import ccxt
import time

api_key = '***'
secret = '***'
password = '***'

# KuCoin先物取引所のオブジェクトを作成
exchange = ccxt.kucoinfutures({
    'apiKey': api_key,
    'secret': secret,
    'password': password,
})

symbol = 'ETH/USDT:USDT'  # KuCoin先物でのETH/USDTシンボル


# 0.01 ETHを市場価格で購入
buy_order = exchange.create_order(symbol, 'market', 'buy', 1)
print("購入オーダー:", buy_order)

# 10秒待機
time.sleep(10)

# 同じ量のETHを市場価格で売却
sell_order = exchange.create_order(symbol, 'market', 'sell', 1)
print("売却オーダー:", sell_order)

timeモジュールのsleep関数

Yodaka

timeモジュールについてもおさらいしておきます。

import timeはPythonプログラムに時間に関連する機能を提供するためにtimeモジュールをインポートしています。timeモジュールは、時間の測定、操作、および変換を行うためのさまざまな関数を含んでいます。このモジュールを使用すると、プログラム内で一時停止を作成したり、現在の時刻を取得したり、時間の計算を行ったりできます。

このコードでは、time.sleep(10)の呼び出しは、プログラムの実行を10秒間一時停止します。この一時停止は、ETHを購入した後、そのポジションを売却する前に市場の状況が変化するのを待つために使用しています。

この待機期間は、特定の取引戦略の一部として設定することができます。実際の取引環境では市場の動きを予測するためにより複雑なロジックが必要になることがあります。


関連記事
仮想通貨botの開発を本格的に始めてみる#39(2023/12/20)「MMBotの開発④MMBotとは?/マーケットメイキング(MM)戦略のコスト分析」

続きを見る

注文量を一括で指定する

Yodaka

取引所ごとに最小注文量が異なります。

Kucoin先物取引では最小注文量10.01ETHに相当するため、以下のコードでは「amount = 1」と指定しています。

import ccxt
import time

# KuCoin APIキー情報の設定
api_key = 'YOUR_API_KEY'
secret = 'YOUR_SECRET'
password = 'YOUR_PASSWORD'

# KuCoin先物取引所オブジェクトの作成
exchange = ccxt.kucoinfutures({
    'apiKey': api_key,
    'secret': secret,
    'password': password,
})

symbol = 'ETH/USDT:USDT'  # KuCoin先物でのETH/USDTシンボル

# 最小契約数に相当する量を指定(この値は例であり、実際の最小契約数に基づいて調整する必要がある)
amount = 1  # 1契約の量

# 市場価格でETHを購入
buy_order = exchange.create_order(symbol, 'market', 'buy', amount)
print("購入オーダー:", buy_order)

# 10秒待機
time.sleep(10)

# 市場価格で同じ量のETHを売却
sell_order = exchange.create_order(symbol, 'market', 'sell', amount)
print("売却オーダー:", sell_order)

2.エラーフラグを立てる

Yodaka

上記のコードでも一応売買注文は通るのですが、元の記事で「価格が指定の範囲内にない場合はエラーフラグを立てること」が推奨されていました。そこで「ETHの価格が800~3000」の間にない場合は取引を中止するように書き換えました。

import ccxt
import time

api_key = '***'
secret = '***'
password = '***'

# KuCoin先物取引所オブジェクトの作成
exchange = ccxt.kucoinfutures({
    'apiKey': api_key,
    'secret': secret,
    'password': password,
})

symbol = 'ETH/USDT:USDT'  # KuCoin先物でのETH/USDTシンボル

# エラーフラグを初期化
priceOutOfRange = False

# 現在のETHの市場価格を取得
ticker = exchange.fetch_ticker(symbol)
last_price = ticker['last']  # 最後の取引価格

# 価格が指定された範囲内にあるかどうかをチェック
if last_price < 800 or last_price > 3000:
    priceOutOfRange = True
    print("エラー: 価格が指定された範囲(800~3000)外です。現在の価格:", last_price)
else:
    print("現在の価格は指定された範囲内です:", last_price)

# エラーフラグが立っている場合は、取引を中止
if not priceOutOfRange:
    # 最小契約数に相当する量を指定
    amount = 1  # 1契約の量
    
    # 市場価格でETHを購入
    buy_order = exchange.create_order(symbol, 'market', 'buy', amount,params={'leverage': 3})
    print("購入オーダー:", buy_order)
    
    # 10秒待機
    time.sleep(10)
    
    # 市場価格で同じ量のETHを売却
    sell_order = exchange.create_order(symbol, 'market', 'sell', amount,params={'leverage': 3})
    print("売却オーダー:", sell_order)
else:
    print("価格が範囲外のため取引を中止します。")
Yodaka

実行結果は以下の通り。指定の範囲内の価格であることを確認した上で成り行き注文で売買を行うことができました。

Yodaka

残る課題は「レバレッジの設定」ですね。この段階では手動で設定しています。この点はまだやり方が分かっていないので、KucoinのAPI仕様書やCCXTのDocsを読み込みます。

マーケットデータの条件に応じてレバレッジを自動で変更できるようにプログラムを組みたいので、引き続き勉強です。

https://docs.ccxt.com/#/exchanges/kucoinfutures?id=createorder
#注文を出す時の設定の原型
kucoinfutures.createOrder (symbol, type, side, amount[, price, params])

3.レバレッジの設定

Yodaka

create_orderにparams={'leverage': 3}を設定することで、レバレッジの設定をしています。

import ccxt
import time

api_key = '***'
secret = '***'
password = '***'

# KuCoin先物取引所オブジェクトの作成
exchange = ccxt.kucoinfutures({
    'apiKey': api_key,
    'secret': secret,
    'password': password,
})

symbol = 'ETH/USDT:USDT'  # KuCoin先物でのETH/USDTシンボル

# エラーフラグを初期化
priceOutOfRange = False

# 現在のETHの市場価格を取得
ticker = exchange.fetch_ticker(symbol)
last_price = ticker['last']  # 最後の取引価格

# 価格が指定された範囲内にあるかどうかをチェック
if last_price < 800 or last_price > 3000:
    priceOutOfRange = True
    print("エラー: 価格が指定された範囲(800~3000)外です。現在の価格:", last_price)
else:
    print("現在の価格は指定された範囲内です:", last_price)

# エラーフラグが立っている場合は、取引を中止
if not priceOutOfRange:
    # 最小契約数に相当する量を指定
    amount = 1  # 1契約の量
    
    # 市場価格でETHを購入
    buy_order = exchange.create_order(symbol, 'market', 'buy', amount, params={'leverage': 3})
    print("購入オーダー:", buy_order)
    
    # 10秒待機
    time.sleep(10)
    
    # 市場価格で同じ量のETHを売却
    sell_order = exchange.create_order(symbol, 'market', 'sell', amount, params={'leverage': 3})
    print("売却オーダー:", sell_order)
else:
    print("価格が範囲外のため取引を中止します。")
Yodaka

実行結果は以下の通り。取引所の画面でもレバレッジが3倍になっていることを確認することができました。

まとめ

今回は「マーケットデータの取得」「買い注文」「売り注文」「取引を行う価格の範囲指定」「レバレッジの設定」を行いました。

また、「timeモジュール」のおさらいもしました。

最近は

①目的をはっきりさせる
②プログラムで何をさせたいのかを定義する
③必要なモジュール・関数を探す(公式Docsで検索をかける)
④コードを書いて一つずつ検証する
⑤エラーハンドリングを行う

という流れに慣れてきました。

とにかく自分で手を動かしてコードを書く時間を増やすことと目的に応じたキーワード検索を繰り返すことが大事ですね。

さらに、この流れの中で分からないことをすぐにChatGPT4に尋ねるということも行うようにしています。

Yodaka

この3点を意識しながら、今後もこの調子で開発と学習を進めます。

【宿題】

・別の取引所でも先物取引のコードを書く
・取引履歴のログを外部データとして出力する(取引データの検証用)
・アービトラージ入門から着想を得た戦略をコードに書き起こす

関連記事
仮想通貨botの開発記録#51(2024/2/3)「仮想通貨Botterの必読書シリーズ②アービトラージ入門」

続きを見る

-Bot