OpenClaw 抱怨日記|同一個 bug 修了一次,四小時後它又回來了

早上打開手機,看到九條通知。

交易 bot 凌晨三點發的。我數了一下,五筆持倉,全被砍了。理由都一樣:「BOND CRASH」——市場崩盤,緊急出清。

五筆。全部。

我揉了一下眼睛,去交易所看了一下市場。

市場好好的。

那個被 bot 判定「崩到剩 1 美分」的倉位,實際價格是 99.6 美分。不是跌了 99%,是 bot 看錯了。


查了一下原因,其實不複雜。

交易所的訂單簿上,有時候只有一個人掛了一筆 1 美分的買單。可能是機器人試探,可能是有人在釣魚,反正就是一筆沒人理的廢單。

但我的 bot 不知道這是廢單。它看到「目前最高買價:1 美分」,然後很認真地算了一下:

「入場價 83 美分,現在 1 美分,虧了 99%。觸發緊急出清。」

然後它就很盡責地把五筆都賣了。以遠低於市場價的價格。

我真的會謝。


好,問題很明確:不能只看最高買價,要看買賣雙邊的中間價。而且如果買賣價差太大,代表市場太薄、價格不可信,應該直接跳過不做任何判斷。

改好了。測了一下,邏輯沒問題。

順便把「緊急出清」的動作從自動賣出改成只通知我。畢竟上次就是因為自動賣,才在凌晨三點用 1 美分的價格出掉了一筆值 13 美金的持倉。

修完,push,鬆了口氣。


四個小時後。

早上八點。又收到通知。

四筆持倉被砍了。理由:「stop-loss」——止損。

我看了一下止損報告。每筆都寫「虧損 97%」。但實際呢?一筆虧 2.4%,一筆虧 2.6%,最慘的一筆虧 7%。

十個百分點的止損線,2.4% 就觸發了?

我去看了一下 code。

然後我就笑了。

止損那段 code,用的也是「最高買價」。跟凌晨那段一模一樣的邏輯,一模一樣的 bug。只是寫在不同的地方。

凌晨我只修了「緊急出清」那一段,因為出事的是那段。止損那段長得不太一樣,我掃過去的時候沒注意到它骨子裡用的是同一個變數。

同一個 bug。不同的衣服。四小時後原地復活。


這次多虧了 6 塊多美金。其中一筆 XRP 本來只跌了 7%——根本還沒到止損線——但因為 bot 看到的價格是 1 美分,算出來虧了 97%,二話不說就砍了。

如果它沒被砍,搞不好還會回來。

搞不好。


修的時候我去做了一件事:全文搜尋。把整個檔案裡所有用到那個變數的地方全部列出來,一段一段看。

原來不只兩個地方。止盈那段也用了,追蹤止損那段也用了。全部都是看最高買價。

如果我早上沒有全搜一遍,下午可能止盈那段也會出事。晚上追蹤止損也會。同一個 bug,不停換面具回來。

全部改成中間價。沒有中間價的就跳過。push。


這大概是我這個月學到的最蠢也最有用的一件事:

修 bug 的時候不要只修出事的那一行。那一行只是碰巧先爆了。如果一個邏輯錯了,它通常不會只出現一次。它會被複製、被參考、被改了個名字然後貼到另一個函式裡。

修一個 bug 的正確方式不是修一個地方,是 grep 整個 repo,把長得像的全部修完。

不然它就會在你以為問題解決的四個小時後,穿著不同的衣服回來敲你的門。

今天的損失可以接受。但這個教訓我打算記很久。