用 Python 監(jiān)控 Uniswap 加密貨幣價格
Uniswap是一個基于以太坊的交易所協(xié)議,允許任何人交換ERC20代幣。普遍上講,交易代幣要求買賣雙方創(chuàng)造委托訂單,而Uniswap則是自動創(chuàng)建一個交易市場。Uniswap旨在幫助解決去中心化交易所的流動性問題,是一種去中心化的交易所。
在過去的幾個月里,我在 Uniswap 上新上市的幣上觀察到了一個非常有趣的規(guī)律,尤其是那些被炒作的幣種。在新幣上市后的前 10-15 分鐘內,價格上漲非常高,不過在接下來的幾個小時內大幅下跌,然后在接下來的 24 小時內上漲超過 50%。不要以為你可以在價格低的時候買進,然后10分鐘后高價賣出。因為以太坊網(wǎng)絡擁堵的原因,這段時間的gas費用非常高(數(shù)百美元)。
Superfarm 是之前比較受歡迎的一個新項目,在 Telegram 上擁有超過 86,000 名成員,在 Twitter 上擁有超過 88,000 名關注者。所以我決定來測試一下這個規(guī)律,或者說我決定進行推測。在最初的幾分鐘里,價格飆升至 2 美元左右,然后跌至 1 美元左右,因此我決定投資 0.98 eth(按當前價格計算約 1.5K 美元)。
第二天,如果價格要上漲,我必須觀察價格才能退出我在 Superfarm 代幣上的頭寸。每分鐘檢查價格真的是在浪費時間,所以我決定制作一個腳本來監(jiān)控價格,如果價格達到某個目標,它會通知我。
為了查看 Uniswap 的價格,我使用了 uniswap-python 庫。
- !pip install uniswap-python
如果你想知道我為什么使用它,pip 前面的感嘆號是因為我已經(jīng)在 Jupyter Notebook 中進行了編碼,并且我已經(jīng)從 Notebook 單元安裝了所有必要的 python 庫。
- eth = "0x0000000000000000000000000000000000000000"
- dai = "0x6B175474E89094C44Da98b954EedeAC495271d0F"
- sup = "0xe53EC727dbDEB9E2d5456c3be40cFF031AB40A55"
- address = "0x0000000000000000000000000000000000000000" # if you're not making transactions
- private_key = None # if you're not going to make transactions
- provider = <the url of your provider> # if you use Infura
- will be
- like 'https://mainnet.infura.io/v3/########'
- uniswap_wrapper = Uniswap(address, private_key, version=2, providerprovider=provider) # use Uniswap v2
第一個變量包含我們想要在 Uniswap 上獲得加密貨幣的以太坊地址校驗和。
要獲取加密貨幣的以太坊地址校驗和,您可以使用 Coingecko 首先獲取合約地址:
然后你就可以使用下面網(wǎng)站輕松從合約地址中獲取以太坊地址校驗和。
如果您不太熟悉什么是以太坊地址校驗和,您可以將其視為一個標識符,基于這個加密貨幣標識符 Uniswap 將能夠為您提供價格。
provider(web3 provider)是一個運行 geth 或 parity 節(jié)點的網(wǎng)站,它與以太坊網(wǎng)絡交互。要獲得provider,您可以使用 Infura。如果您使用 Infura,必須注冊然后創(chuàng)建一個新項目,在設置選項卡上您可以看到提供商 URL:
要獲得以 eth 表示的 Superfarm 幣價格:
- sup_price = uniswap_wrapper.get_token_eth_input_price(sup, 10 ** 18)
- print(sup_price / 10**18)
- # 0.000901625376604887
10 ** 18代表Superfarm 幣的數(shù)量,它必須是一個整數(shù)值,如果我們選擇小數(shù)量值將是0(由于近似),所以我們需要一個大數(shù)量。我們將獲得 10 ** 18個 Superfarm 幣的 eth 價格。
如果我們想以美元計算 1 個 Superfarm 幣的價格,我們可以使用 Dai 穩(wěn)定幣(1 Dai ~= 1 美元)。我們可以請求相同數(shù)量的 Superfarm 和 Dai 幣,然后分割它們。
- def get_sup_price_in_dollars():
- sup_price = uniswap_wrapper.get_token_eth_input_price(sup, 10 ** 18)
- dai_price = uniswap_wrapper.get_token_eth_input_price(dai, 10 ** 18)
- return round(sup_price / dai_price, 4)
- print(get_sup_price_in_dollars())
- # 1.357 --> the price in dollars for 1 Superfarm coin
為了在我的桌面上推送通知,我使用了plyer庫:
- !pip install plyer
這是監(jiān)控 Superfarm 價格和自前一個值以來的變化的函數(shù):
- from plyer import notification
- def notify(price: int, new_price: int):
- notification.notify(
- title = 'Superfarm price whatcher',
- message = f"Total value of SUPER = {new_price}, change: {round(new_price - price, 3)}",
- timeout = 10,
- app_icon = '/home/kederrac/Pictures/uniswap.ICO',
- )
如您所見,我還添加了一個應用程序圖標,為了能夠使用應用程序圖標,我還必須將 .png 圖片轉換為 .ico 格式,安裝 dbus-python 庫(如果您使用的是 Windows,則不需要)。
- !pip install dbus-python
現(xiàn)在讓我們把它們放在一起:
- import time
- price = get_sup_price_in_dollars()
- notify(price, price)
- while True:
- new_price = get_sup_price_in_dollars()
- if abs(price - new_price) > 0.05:
- notify(price, new_price)
- price = new_price
- time.sleep(10)
在這里,我每 10 秒調用一次 get_sup_price_in_dollars() 函數(shù)來檢查價格是否發(fā)生變化,如果變化大于 0.05 美元,將推送通知,您可以更改變化的最小值以獲得通知,或者您 可以設置要通知的最低價格目標。
結果如下:
(在 ubuntu 20.04 上)
(在 windows 10 上)
這對于實時價格通知非常有幫助,這種方法的另一優(yōu)點是速度,與必須使用 Coingecko 相比,您將獲得數(shù)分鐘的時間,如果您使用 Uniswap 網(wǎng)絡界面,時間將更快。
在這里你可以看到我一開始所說的規(guī)律: