生成Python中加密货币价格的ASCII图
#编程 #python #lambda #cryptocurrency

您是否曾经想以一种有趣且互动的方式来形象化加密货币的历史价格?好吧,别无所求!在本文中,我们将探讨如何使用Python生成加密货币价格的ASCII图。

免责声明:

本文的作者以任何方式都不隶属于 binance 。该代码的编写是为了检索和可视化数据,作者发现这些数据在不需要API密钥的情况下是有用且易于访问的。作者对使用此代码可能引起的任何错误或问题概不负责。

例子

$ python3 ascii-currency-graphs.py --pair BTCEUR --start-date 2023-03-14 --end-date 2023-04-01
2023-03-14T01:00:00 ########################################### 22985.84
2023-03-15T01:00:00 ########################################### 23026.80
2023-03-16T01:00:00 ############################################ 23665.73
2023-03-17T01:00:00 ################################################ 25789.77
2023-03-18T01:00:00 ############################################### 25373.59
2023-03-19T01:00:00 ################################################## 26474.44
2023-03-20T01:00:00 ################################################# 26082.53
2023-03-21T01:00:00 ################################################# 26324.74
2023-03-22T01:00:00 ############################################### 25342.45
2023-03-23T01:00:00 ################################################# 26260.20
2023-03-24T01:00:00 ################################################ 25746.57
2023-03-25T01:00:00 ################################################ 25735.12
2023-03-26T01:00:00 ################################################# 26076.46
2023-03-27T02:00:00 ############################################### 25267.76
2023-03-28T02:00:00 ############################################### 25189.56
2023-03-29T02:00:00 ################################################# 26188.76
2023-03-30T02:00:00 ################################################ 25798.34
2023-03-31T02:00:00 ################################################# 26332.77

代码

import argparse
import datetime
import requests


def iso_date(date_string):
    """Convert ISO-formatted date string to timestamp."""
    try:
        date = datetime.datetime.strptime(date_string, '%Y-%m-%d')
        timestamp = int(date.timestamp() * 1000)
        return timestamp
    except ValueError:
        raise argparse.ArgumentTypeError(
            f"Invalid date format: {date_string}. Date should be in the format YYYY-MM-DD."
        )


def get_crypto_prices(start_timestamp, end_timestamp, pair):
    """Retrieve historical prices for the specified trading pair and date range."""
    start_date = datetime.date.fromtimestamp(start_timestamp / 1000)
    end_date = datetime.date.fromtimestamp(end_timestamp / 1000)

    symbol = pair.replace(':', '').replace('_', '').upper()
    url = f"https://api.binance.com/api/v3/klines?symbol={symbol}&interval=1d&startTime={start_timestamp}&endTime={end_timestamp}"
    response = requests.get(url)

    if response.status_code == 200:
        prices = response.json()
        return [(datetime.datetime.fromtimestamp(int(price[0]) / 1000).isoformat(), float(price[4])) for price in prices]
    else:
        print(f"Failed to retrieve prices for {pair} from {start_date} - {end_date}")
        return []


def generate_ascii_graph(data):
    """Generate an ASCII graph of cryptocurrency prices."""
    max_price = max(data, key=lambda x: x[1])[1]

    for date, price in data:
        bar = '#' * int(price / max_price * 50)
        print(f"{date} {bar} {price:.2f}")


def list_cryptocurrencies():
    """List all possible cryptocurrencies supported by the Binance API."""
    url = 'https://api.binance.com/api/v3/exchangeInfo'
    response = requests.get(url)

    if response.status_code == 200:
        data = response.json()
        symbols = data['symbols']
        currencies = set()

        for symbol in symbols:
            base_currency = symbol['baseAsset']
            quote_currency = symbol['quoteAsset']
            currencies.add(base_currency)
            currencies.add(quote_currency)

        print("Available cryptocurrencies on Binance:")
        for currency in sorted(currencies):
            print(currency)
    else:
        print("Failed to retrieve list of cryptocurrencies from Binance.")


if __name__ == '__main__':
    # Parse command-line arguments
    parser = argparse.ArgumentParser(description="Generate an ASCII graph of cryptocurrency prices for a given date range")
    parser.add_argument("--pair", help="Trading pair for the historical data in the format 'BTC:USDT' or 'BTCUSDT'", default='BTCUSDT')
    parser.add_argument("--list", help="List all possible cryptocurrencies supported by the Binance API", action='store_true')
    parser.add_argument("--start-date", type=iso_date, help="Start date (in YYYY-MM-DD format) for the historical data", default=int((datetime.datetime.now() - datetime.timedelta(days=1)).timestamp() * 1000))
    parser.add_argument("--end-date", type=iso_date, help="End date (in YYYY-MM-DD format) for the historical data", default=int(datetime.datetime.now().timestamp() * 1000))
    args = parser.parse_args()

    if args.list:
        list_cryptocurrencies()
    else:
        # Retrieve and process cryptocurrency prices
        prices = get_crypto_prices(args.start_date, args.end_date, args.pair)
        if prices:
            generate_ascii_graph(prices)

此代码做什么?

此Python代码从Binance API中检索了指定的加密货币交易对的历史价格,并生成了指定日期范围的价格图。它还允许您列出Binance API支持的所有可能的加密货币。您可以轻松地从命令行运行此代码,并可以很好地可视化加密货币价格。

如何将其添加到.bashrc或Motd再生器中?

如果您喜欢冒险,则可以将此代码添加到.bashrc或Motd Recennerator,以获取乐趣和利润!只需将代码复制并粘贴到Shell脚本中,然后将脚本添加到您的.bashrc或Motd再生器中。现在,每次您打开终端或登录到服务器时,您都会对加密货币价格进行新的可视化!

代码如何工作?

解析命令行参数

该代码使用Python的内置argparse模块来解析命令行参数。 parser.add_argument()方法用于定义脚本接受的不同参数。例如,--pair参数用于指定历史数据的交易对,而--start-date--end-date参数用于指定历史数据的日期范围。 --list参数用于列出Binance API支持的所有可能的加密货币。

检索历史数据

get_crypto_prices()功能检索了特定的加密货币交易对和日期范围的历史价格。它使用requests模块向二元API提出HTTP请求,然后解析JSON响应以提取历史价格。该功能返回一个元组列表,每个元组都包含一个日期和价格。

生成ASCII图

generate_ascii_graph()功能列出了包含日期和价格的元组,并生成了价格图。它首先使用lambda函数来确定数据集中的最高价格,该函数调用key lambda x: x[1]参数调用max函数。这指定我们希望根据数据集中每个元组的第二个元素获得最高价格。然后,它通过数据循环并为每个数据点生成条形图,条的长度与价格相对于最高价格成正比。

列出所有由Binance支持的加密货币

list_cryptocurrencies()函数检索了Binance API支持的所有可能加密货币的列表。它使HTTP获得了Binance API的请求,并解析JSON响应以提取符号列表。然后,它从每个符号中提取基本货币,并将其添加到一组唯一的货币中。最后,它按字母顺序打印出一组唯一的货币。

Lambda解释说

此代码的一个有趣部分是使用lambda函数来获取数据集中的最高价格。 lambda函数是一个小的匿名函数,可以具有许多参数,但只能具有一个表达式。在此代码中,我们使用lambda函数通过调用key lambda x: x[1]参数来调用max函数来获取数据集中的最高价格。这指定我们希望根据数据集中每个元组的第二个元素获得最高价格。如果您有兴趣了解有关Lambda功能的更多信息,请查看official Python documentation

示例用法

这是此代码的一些示例用法方案(在2023; - )):

):

  • 从过去一周开始获得BTCUSDT的历史价格并产生ASCII图:
python ascii-currency-graphs.py --pair BTCUSDT --start-date 2023-03-26 --end-date 2023-04-02
  • 从过去的一年中获取EthBTC的历史价格并产生ASCII图:
python ascii-currency-graphs.py --pair ETHBTC --start-date 2022-04-02`
  • 列出了Binance API支持的所有可能的加密货币:
python ascii-currency-graphs.py --list

结论

在本文中,我们学会了如何使用Python生成ASCII的加密货币价格图。我们探索了代码的不同部分以及如何从命令行使用它。我们还了解了Lambda功能以及如何在Python中使用它们。现在,出去并以时尚的方式可视化那些加密货币价格!