iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

前一回的內容需要更正部分程式碼

Debug

  • 然後我發現前面把行情塞 Redis 的時候,製造了一個問題
  • 原本的寫法直接用 str() 把 python dict 直接硬幹成字串,如下方註解處
if 'event' in msg_dict and msg_dict['event'] == 'data':
    print(f'data: {msg_dict}')
    # self.redis_client.publish('mtx', str(msg_dict['data']))
    self.redis_client.publish('mtx', json.dumps(msg_dict['data']))
  • 然後就會長成「外面雙引號字串,包裡面的 python dict」奇怪格式
  • "{'symbol': 'MXFJ4', 'type': 'FUTURE_AH', 'exchange': 'TAIFEX', 'trades': [{'price': 22864, 'size': 1, 'bid': 22864, 'ask': 22866}], 'total': {'tradeVolume': 63567, 'totalBidMatch': 47142, 'totalAskMatch': 46315}, 'time': 1727433578458000, 'serial': 77643}"
  • 正確 publish 到 channel 的內容,要寫成 json.dumps(msg_dict['data'] 而非 str(msg_dict['data'])
'{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727433572066000, "serial": 77625}'

繼續開發

我們已經成功地將行情塞進 Redis 的頻道裡。 還差一步就可以產出檔案。

不間斷收聽

  • 因為行情是連續不中斷的,而我現在想要每隔五分鐘,就分一個檔案。
  • 然而行情不等人喔,所以如果只用一個 process 去監聽頻道,換算 timestamp 之後判斷,介於 09:00.000 ~ 09:04.999 這段時間屬於第一個檔案、09:05.000 ~ 09:09.999 這段時間屬於第二個檔案。 免不了提早上線開始監聽。
  • 目前想到的做法:
    1. 預期後續這個行為會被移植到容器中,定時呼叫生檔案,每隔五分鐘產出一個 Writer。
    2. 是在產生 Writer 的實例後,在建構子中,透過查看當下時間,算出下一個五分鐘換手點。
    3. 假設拿到的時間是 2024-09-27 22:04:03 被叫起來,那換手點就是 22:05:00,要換成時戳!(預設時戳是十位整數、六位小數),手動乘以 10^6 之後,都變成整數,方便比大小。
    4. 開始收聽行情,如果拿到的時戳大於等於記錄起始點,再把東西加到 list 變數中。

開發手法說明

  1. 如上面提到,先寫一個 Writer class 出來
  2. 先取得剛被叫起來的時間、換算下一個上車點時間,以昨天的晚上九點、九點五分為例
    >>> d1 = dt.datetime(2024, 9, 27, 21, 0)
    >>> d2 = dt.datetime(2024, 9, 27, 21, 5)
    >>> d1.timestamp()
    1727442000.0
    >>> d2.timestamp()
    1727442300.0
    >>> 1727442000.0/300
    5758140.0
    >>> 1727442300.0/300
    5758141.0
    
    • 可以看出上車點秒數(十位整數)都是 300 的倍數
    • 所以時間換算的公式就是,時戳除以 300 後,加 1,乘回 300。
  3. 因為今天沒有行情,所以會用昨天的行情,手動塞一些東西進到 Redis
  4. 打開 redis-cli,手動塞一些東西
    • 如下:
127.0.0.1:6379> publish mtx '{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727539322181337, "serial": 77625}'
(integer) 2
127.0.0.1:6379> publish mtx '{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727536322181337, "serial": 77625}'
(integer) 2
127.0.0.1:6379> publish mtx '{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727536422181337, "serial": 77625}'
(integer) 2
127.0.0.1:6379> publish mtx '{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727536522181337, "serial": 77625}'
(integer) 2
127.0.0.1:6379> publish mtx '{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727536622181337, "serial": 77625}'
(integer) 2
127.0.0.1:6379> publish mtx '{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727536622183137, "serial": 77625}'
(integer) 2
127.0.0.1:6379> publish mtx '{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727536722183137, "serial": 77625}'
(integer) 2
127.0.0.1:6379> publish mtx '{"symbol": "MXFJ4", "type": "FUTURE_AH", "exchange": "TAIFEX", "trades": [{"price": 22868, "size": 1, "bid": 22866, "ask": 22868}], "total": {"tradeVolume": 63553, "totalBidMatch": 47132, "totalAskMatch": 46308}, "time": 1727536822183137, "serial": 77625}'
(integer) 2
127.0.0.1:6379>

https://ithelp.ithome.com.tw/upload/images/20240928/20130149Z820bd69qo.png

結論

  • 今天先開發到這邊,明天繼續完成寫檔案的作業
  • 昨天台指期夜盤殺低,不過我的空單在睡覺前就出掉空手了,星期一應該可以把警報器做好!!

上一篇
【Day 13】 Timestamp 的處理與轉換
下一篇
【Day 15】 完成 Writer / 從 Redis 讀資料寫成檔案
系列文
從一萬元開始交易:收割韭菜三十天,量化交易工具製作32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言