1. 程式人生 > >手把手教你搭建一個加密貨幣交易模擬器,不用投錢就能玩

手把手教你搭建一個加密貨幣交易模擬器,不用投錢就能玩

box NPU nec idp reat 監控 最簡 data- 自己

手把手教你搭建一個加密貨幣交易模擬器,不用投錢就能玩

技術分享圖片

大數據文摘,編譯:汪小七、黃文暢、小魚

我雖然不是交易員,但對加密貨幣的交易非常感興趣。然而,我不會在自己什麽都不清楚的時候就盲目投資加密貨幣,所以在進行投資之前,我想先來測試一下自己的交易策略。

技術分享圖片

播音員:今天的道瓊斯指數曲線是華盛頓天際線(林肯紀念堂、華盛頓紀念碑、美國國會大廈)的形狀...(i.e.股市表現奇怪)

而我的想法就是搭建一個加密貨幣交易的模擬器,這樣投資新手不用投錢就可以學習和體驗加密貨幣的交易。在這一系列學習中,我將給大家展示如何去建這樣一個交易模擬器。

首先我們需要將2018年3月7日至2018年3月16日的加密貨幣的交易價格導入到數據庫中。

在這個練習中,我們將用Python搭建一個簡單的加密貨幣交易模擬器,用戶可以在這裏進行加密貨幣的投資,然後觀察自己的加密貨幣資產在接下來的9天將如何變化。

目前,模擬器會給出用戶資產的最佳出倉價,並與其原始投資價格進行比較,然後告訴用戶最終的盈虧狀況。接下來,我將介紹如何添加對流通貨幣的價格監控,如何編寫和測試交易策略,還有如何構建用戶界面等等。

同時你也可以在 Github 庫中看到這個項目。另外,你需要分開下載數據庫,並把它放到你的項目目錄下。

Github庫:https://github.com/jamesfebin/CryptoTradingSimulator、數據庫:https://drive.google.com/file/d/1OHhtrvOe-EWcX_8tipWo6tWYqkkYDkPw/view?usp=sharing。

偽代碼

在編寫代碼之前,明確我們接下來的每個步驟至關重要,否則編程時會陷入困惑。為了清楚起見,我們使用偽代碼進行說明,偽代碼並不是真實的代碼,而是我們用自己的語言寫的思維圖。

步驟1: 歡迎用戶;
步驟2: 在數據庫啟動時,抓取2013年3月7日的加密貨幣價格;
步驟3: 讓用戶選擇一種貨幣並進行投資;
步驟4: 接著,運行模擬器並顯示未來9天裏用戶的加密貨幣價格走勢;
步驟5: 模擬器會給出該加密貨幣的最佳出倉價,並與用戶投資時的資產進行對比,顯示盈虧情況。

我們無需按以上步驟依次進行代碼編寫,可以依據自己的能力從最簡單的步驟開始編寫,隨著模擬器功能的不斷完善,我們編程的能力和信心也逐漸提高,從而才可能完成整個項目。

本文中的代碼開發環境為Python2.7。

首先,我們建一個空的項目文件夾,如:“CryptoSimulator”,然後下載加密貨幣價格的數據庫,放到這個項目文件夾中。

數據庫下載。

接著,再新建一個命名為“run.py”的py文件

技術分享圖片

歡迎頁面

我們將創建一個簡單的“welcome”函數,這個函數並不需要有太多的功能,只要輸出一系列的項目介紹即可,包括程序名稱、程序功能介紹。換句話說,就是向用戶問個好。

def welcome():
print(“Simple Crypto Trading Simulator”)
print(“Hey Yo, you are back in time. It’s Wednesday, March 7, 2018 7:39 AM”)
print(“Here are the crypto currencies you can invest.”)
print(“Fetching prices … ”)

現在我們需要抓取2018年3月7日早上7:39的加密貨幣價格。

因為我們的數據庫是基於sqlite3進行操作,所以在此之前我們還需要下載sqlite3庫並安裝,可以用以下命令實現。

pip install sqlite3

在run.py文件開頭,需要導入sqlite3庫,命令如下。

import sqlite3

現在,我們編寫代碼來抓取起始時刻的價格數據並進行顯示。

數據庫中有以下幾列:時間戳(timestamp)、基準貨幣(first_leg)、計價貨幣(second_leg)、賣出價(ask)、買入價(bid)和交易名稱(the exchange name)。

假如我們當前的貨幣對是“比特幣和美元”(BTC/USD),那麽基準貨幣就是比特幣(BTC),計價貨幣就是美元(USD)。

以下幾行代碼就是用來抓取指定時間的價格數據。

connection = sqlite3.connect(‘./currency_monitor.db’)
cursor = connection.cursor()
query = “SELECT first_leg, ask FROM prices WHERE timestamp=’1520408341.52‘ AND second_leg=’USD’;” cursor.execute(query)
coinAskPrices = cursor.fetchall()

首先,我們遍歷賣出價格列表,刪除重復樣本,將其添加到名為coins{}的字典中,然後輸出。

coins = {}
for coinAskPrice in coinAskPrices:
if coinAskPrice[0] in coins:
continue
coins[coinAskPrice[0]] = {“price”:coinAskPrice[1], “curreny”:coinAskPrice[0]}
print(“{} — ${} \n”.format(coinAskPrice[0], round(coinAskPrice[1],4)))
return coins

如果你看不懂代碼,也別擔心,只需要將整個程序包下載下來,運行,然後修改部分代碼再運行,對比看看結果有什麽不同,循環往復,慢慢你就開始理解代碼的含義了。

現在,我們將上面的幾部分代碼合並成一個獨立的函數fetchCoins(),結果如下:

技術分享圖片

技術分享圖片

現在,價格顯示的功能已經搞定,接下來我們就需要用戶來選擇他們的交易幣種和交易量,這就需要創建一個inputBuy()函數來實現。

def inputBuy():
print(“Select the crypto curreny you want to buy? \n”)
curreny = raw_input(“”).upper()
print(“That’s great. How much quantity you want to buy? \n”)
quantity = float(raw_input(“”))
return curreny, quantity

接著,我們需要找出用戶感興趣的貨幣的價格,這個功能通過查詢coins{}字典就可以實現。

price = coins[currency][‘price’]

然後我們需要把返回的參數傳給模擬器。現在我們可以將上述代碼塊進行整合並放進主函數中。

技術分享圖片

目前為止我們還沒有創建runSimulation()函數,接下來的任務就是創建一個名為“simulator.py”的py文件。

技術分享圖片

在創建runSimulation()函數前,先導入以下這些庫函數。

import sqlite3
import datetime

然後定義runSimulation()函數。

def runSimulation(boughtPrice, quantity, currency):
valueThen = boughtPrice * quantity
bestPrice, timestamp = fetchBestBidPriceFromDB(currency)
bestValue = bestPrice * quantity
priceDifference = (bestValue — valueThen)/float(valueThen) * 100

在這個函數中我們首先要計算出買入時總資產的價格,然後找出3月7日到3月16日之間的最佳出倉價,接著計算兩者之間的差價並顯示盈虧狀況。

下面編寫一個 fetchBestBidPriceFromDB()函數來找出最佳出倉價。

def fetchBestBidPriceFromDB(currency):
connection = sqlite3.connect(‘./currency_monitor.db’)
cursor = connection.cursor()
query = “SELECT max(bid),timestamp from prices WHERE first_leg=’{}’ and second_leg=’USD’ and timestamp> ‘1520408341.52’”.format(currency)
cursor.execute(query)
rows = cursor.fetchone()
return rows[0], rows[1]

在runSimulation()函數中再添加幾行語句,以便輸出查找結果。

print(“The best bid price for {} was ${} at {} \n”.format(currency, bestPrice, time))
if priceDifference>0:
print(“Your total asset value is ${}, it has increase by {}% \n”.format(round(bestValue, 4), round(priceDifference,2)))
else:
print(“Your total asset value is ${}, it has decreased by {} \n”.format(round(bestValue, 4), round(priceDifference,2)))

這裏,再一次對上述代碼塊進行整合,結果如下:

技術分享圖片

現在整個程序已經基本完成了,但是我還想加個特效——就像在電影裏,字幕中的字母會一個一個的蹦出來。

創建一個名為“drama.py”的文件,然後輸入以下代碼:

import time
import sys
def dramaticTyping(string):
for char in string:
sys.stdout.write(char)
sys.stdout.flush()
time.sleep(0.10)

現在,把這個文件導入run.py和simulator.py中,用dramaticTyping函數代替print函數。

搞定!現在我們已經編寫了一個簡易版的加密貨幣交易模擬器。

技術分享圖片

此處應該有掌聲,謝謝!好戲剛剛開始,接下來,我們還有一系列的工作需要完成,比如將加密貨幣交易模擬器與加密貨幣的實時交易整合為API,編寫交易策略的代碼並進行測試,甚至考慮創建一個UI界面等等,敬請期待~

手把手教你搭建一個加密貨幣交易模擬器,不用投錢就能玩