Qiita Conference 2025

Qiita史上最多!豪華12名のゲストが登壇

特別講演ゲスト(敬称略)

ymrl、成瀬允宣、鹿野壮、伊藤淳一、uhyo、徳丸浩、ミノ駆動、みのるん、桜庭洋之、tenntenn、けんちょん、こにふぁー

4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

仮想通貨現物アビトラ機会検知機(CCXTからの引用)

Posted at

趣旨

CCXTにおいてあったアビトラ検知用のコードを少しだけ改造してみやすくしてみました。
コード自体は元ページのものを見た方がいいかも知れません。

取引所間のシンボルの違いによってあまり使い物にならないと思いますが、botいじってる感万歳の結果が表示されるのでぜひやってみてください。

python arbitrage.py
import ccxt
import sys


def style(s, style):
    return style + s + '\033[0m'

def green(s):
    return style(s, '\033[92m')

def yellow(s):
    return style(s, '\033[93m')

def red(s):
    return style(s, '\033[91m')

def dump(*args):
    print(' '.join([str(arg) for arg in args]))

def fetch_prices(exchange, symbols):
    prices = {}
    for symbol in symbols:
        try:
            ticker = exchange.fetch_ticker(symbol)
            prices[symbol] = ticker['last']
        except Exception as e:
            print(f"Could not fetch price for {symbol} on {exchange.id}: {str(e)}")
    return prices

def calculate_arbitrage(exchanges, arbitrableSymbols):
    investment_amount_usd = 10000  # Assume an investment amount of $10,000 USD
    for symbol in arbitrableSymbols:
        prices = [(exchange.id, fetch_prices(exchange, [symbol]).get(symbol, None)) for exchange in exchanges.values() if symbol in exchange.symbols]
        prices = [price for price in prices if price[1] is not None]
        if len(prices) > 1:
            max_price = max(prices, key=lambda x: x[1])
            min_price = min(prices, key=lambda x: x[1])
            if max_price[1] > min_price[1]:
                amount_to_buy = investment_amount_usd / min_price[1]
                potential_revenue = amount_to_buy * max_price[1]
                potential_profit = potential_revenue - investment_amount_usd
                dump(green(f"Arbitrage Opportunity for {symbol}: Buy at {min_price[0]} for ${min_price[1]}, Sell at {max_price[0]} for ${max_price[1]}, Potential Profit: ${potential_profit:.2f}"))

def main():
    if len(sys.argv) > 1:
        ids = sys.argv[1:]
        exchanges = {}

        for id in ids:
            exchange = getattr(ccxt, id)()
            exchanges[id] = exchange
            try:
                exchange.load_markets()
                dump(green(f"{id} loaded {len(exchange.symbols)} markets"))
            except Exception as e:
                dump(red(f"Failed to load markets for {id}: {str(e)}"))
                continue

        allSymbols = [symbol for id in ids for symbol in exchanges[id].symbols if hasattr(exchanges[id], 'symbols')]
        uniqueSymbols = list(set(allSymbols))
        arbitrableSymbols = sorted([symbol for symbol in uniqueSymbols if allSymbols.count(symbol) > 1])

        calculate_arbitrage(exchanges, arbitrableSymbols)
    else:
        dump("Usage: python script.py exchange1 exchange2 exchange3 ...")

if __name__ == '__main__':
    main()

以下のコマンドで実行します。

python arbitrage_pairs.py binance bybit bitget gate bingx okx
4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Conference 2025 will be held!: 4/23(wed) - 4/25(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

ymrl、Masanobu Naruse, Takeshi Kano, Junichi Ito, uhyo, Hiroshi Tokumaru, MinoDriven, Minorun, Hiroyuki Sakuraba, tenntenn, drken, konifar

View event details
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?