iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

Bitcoin Trading Bot Design - Code review

雖然這個作業有切了各個模組,但因為時間不夠我只有實作了比較重要的trading_moduletrading_bot_lib,今天就來review這兩個模組的Code。

trading_bot_lib

這個是包含演算法和執行交易的模組。

優點:

  • 明確的資料結構:使用 Rust 的結構(struct)和 Serde 定義了三個明確的資料結構:Exchange、TradeDecision 和 PriceUpdate。這有助於瞭解系統中的核心概念。
  • 可序列化與可反序列化:利用 serde 的 Serialize 和 Deserialize traits,這確保了這些結構可以很容易地轉換為 JSON 或其他格式,適合與其他模組或外部系統的互動。
  • 建構函式(Constructors):每個結構都有 new 方法,這是良好的做法,提供了一個明確和一致的方式來建立新的結構實例。
  • 封裝:在 TradeDecision 中,所有的欄位都是私有的,並提供了方法來訪問它們。這是良好的OOP實踐,確保了資料的封裝和整合性。

建議:

  • Enum for Action:在 TradeDecision 結構中,action 是一個 String,可能的值是 "buy" 或 "sell"。這可能導致錯誤的值被分配給它。考慮使用 Rust 的 enum 代替,這樣只有定義的值可以被分配:
pub enum TradeAction {
    Buy,
    Sell,
}

之後在 TradeDecision 中使用:

pub struct TradeDecision {
    exchange_name: String,
    action: TradeAction,
    price: f64,
    quantity: f64,
}
  • More Doc Comments:考慮為模組中的每個公開結構、方法和函式增加文件註解。這不僅幫助其他開發者理解和使用,而且可以使用 Rust 的 cargo doc 工具自動生成文件。
  • Price as a Decimal?:f64 通常不是在金融或交易應用程序中代表價格或金錢的最佳選擇,因為它可能會有浮點數精度問題。考慮使用專門為金錢設計的 decimal crate 或其他解決方案。
  • Error Handling:建構函式和方法似乎沒有處理任何可能的錯誤。考慮添加錯誤處理或使用 Result<T, E> 作為返回值,以處理可能出現的異常情況。

trading_module

這個是聽取Redis pub/sub的並執行交易的模組。

優點:

  • 異步處理:利用 Rust 的 async/await 功能,確保非同步的數據流和交易操作,非常適合這種需要快速反應的系統。
  • 清晰的訊息訂閱:透過 Redis Pub/Sub 來訂閱 arbitrage_decision 頻道的訊息,當有交易決策時可以立即做出反應。
  • 簡單的交易執行:根據決策,有明確的 buy_bitcoin 和 sell_bitcoin 函數來執行交易。

建議:

  • Enum for Trade Actions:在先前的 trading_bot_lib 中建議的那樣,將 action 作為 enum 使用會更加安全。
  • Error Handling:雖然有返回 Result,但考慮在每個可能失敗的點上提供更具體的錯誤訊息。這將有助於在正式環境中進行故障檢查。
  • 覆用HTTP客戶端:在 buy_bitcoin 和 sell_bitcoin 函數中,每次都創建一個新的 reqwest::Client。可以覆用客戶端以提高效率,特別是在大量交易的情況下。
  • Configuration Management:目前 Redis 的連接參數和交易 API 的URL都是HardCode的。在正式環境中,這些值可能會變化,或者可能在不同環境中使用不同的值。可以使用某種配置管理工具或環境變量來管理這些值。
  • Error Responses from Trade API:buy_bitcoin 和 sell_bitcoin 函數都假定 API 會返回一個訊息。但是,API 可能會返回具體的錯誤訊息或代碼,這在交易環境中是很常見的。確保解析可能的錯誤回應並處理它們。
  • Trade Result Structure:可以使用明確的結構來代表交易結果,而不是單純的字串。這提供更多的靈活性,並使解析和處理交易結果更容易。
  • Graceful Shutdown:當應用程式需要關閉時,該如何優雅地終止交易和清理資源。
  • More Modular Code:雖然 listen_for_decisions 已經有結構性,但它還可以進一步模組化,特別是處理決策的部分。
  • Logging:為交易操作和可能的錯誤加入日誌。這將在正式環境中非常有用。
  • Concurrency Control:當多個交易決策同時進行時如何控制并發性。確保系統不會超購或超賣。

上一篇
[Day 22] 作業4:Bitcoin Trading Bot Design - 專案 review
下一篇
[Day 24] Take Home Assignment 之開始實戰啦
系列文
從實戰中學習:Take Home Assignment review & refactor30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言