黃金儀表板|XAUUSD 資料更新與 Fail-soft 介面
黃金儀表板是一個以市場研究為導向的 XAUUSD Web 儀表板,將價格、不同時間週期的 K 線、黃金新聞、市場背景與技術分析整理在同一個介面中。
這次分享的重點不是如何畫出圖表,而是當某一個資料來源暫時變慢或失敗時,如何只處理受影響的區塊,並保留其他仍然可以閱讀的內容。
Beta 測試中,持續改善資料更新、錯誤狀態、快取策略與多語言介面。
專案頁面:https://copi-tools.com/zh-hant/gold-dashboard/
最初的想法很直覺:使用計時器定期取得新資料,再把舊的 HTML 替換掉。
但是,當頁面同時包含價格、K 線、新聞、市場分析與交易者觀點時,整頁更新會產生幾個問題:
因此,我希望讓每個資料區塊獨立更新,同時在新資料尚未確認有效以前,不要破壞目前仍然可讀的畫面。
這個專案主要分成以下幾層:
資料流程大致如下:
gold-bars API。gold-analysis API。前端更新時,不能在確認新資料以前就先清空目前的內容。
目前採用的處理順序是:
這個順序可以避免暫時性的網路錯誤,直接變成空白卡片。
「資料比較舊」和「完全沒有資料」是不同的狀態。
例如,幾分鐘前成功取得的 K 線資料,可能仍然比空白圖表更有參考價值。因此,介面需要區分以下狀態:
保留快取資料不代表要假裝它是即時資料。畫面上仍然需要標示更新時間或目前狀態。
如果 API 失敗後每幾秒立刻重試,可能增加伺服器負擔,也會讓上游服務的問題更加嚴重。
因此,更新控制器需要記錄每個區塊的重試次數,逐漸增加重試間隔;成功更新後,再將重試計數歸零。當同一個區塊已經在載入中時,也不能因為另一個計時器觸發而重複發送 request。
使用者可能正在查看較早的 K 線,而不是最新價格。如果每次更新都重新載入完整歷史資料,圖表的縮放、捲動位置與使用者目前查看的區域可能被重設。
目前的方向是:
這樣可以讓背景更新與使用者正在閱讀的內容互相配合。
我把每個可更新區塊視為一個獨立的資料資源,並為它保留簡單的狀態:
idle:等待下一次更新loading:正在取得資料success:已取得並通過驗證stale:目前顯示的是較舊但仍可使用的內容failed:最新請求失敗,等待重試paused:區塊目前不可見,暫停背景更新更新成功時,只替換該區塊的內容;更新失敗時,保留最後一次正常結果,記錄錯誤,並顯示「更新延遲」或「使用快取資料」等簡短訊息。
這種 fail-soft 設計的重點不是讓所有資料看起來都像即時更新,而是讓使用者知道目前哪些資料有效、哪些資料可能較舊,以及哪一個區塊正在等待更新。
價格與目前 K 線可能需要較頻繁更新,新聞與市場背景則可以使用較長的週期。每個區塊需要獨立的計時器與快取策略,不能只設定一個全頁更新時間。
第一次載入由 WordPress 輸出有意義的 HTML,JavaScript 載入後再加入互動與 fragment 更新。兩者需要使用一致的狀態標籤與資料格式,避免首次顯示和後續更新出現不同的錯誤處理方式。
Update delayed、Using cached data 和 Currently unavailable 不只是後端錯誤代碼,也會直接出現在使用者介面中。因此,英文、繁體中文與越南文介面需要使用一致的狀態意義,再分別處理文字翻譯。
目前仍有幾個部分需要改善:
黃金儀表板是市場資訊整理與技術研究介面,不是交易訊號工具,也不執行自動下單。價格、新聞與分析資料可能存在延遲或缺漏,內容不構成投資建議,也不保證任何交易結果。
局部更新不只是把整頁更新拆成幾個 request。它還需要處理資料驗證、快取、重試、使用者目前的圖表位置,以及部分資料來源失敗時的畫面狀態。
在這個專案中,我把 MQL5、VPS Python、WordPress REST API 與前端 JavaScript 的責任分開,讓每個資料區塊可以獨立更新與失敗。核心原則是:替換畫面前先驗證,暫時失敗時保留最後一次正常狀態,並清楚告知使用者資料是否可能較舊。
如果你也在開發需要串接多個資料來源的 dashboard,想請教大家通常如何處理以下問題: