iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
AI & Data

已 django + channels 來取得即時股價資料的推播系列 第 19

[Day 19] 實戰應用 - 查詢盤後資料(下)

  • 分享至 

  • xImage
  •  

必要條件

聊天室範例要能做到[Day 16] - [Day 17]

目的:
- 查詢商品的最後成交價
- 查詢商品的最後漲幅

1.登入聊天室後,需要告訴遊客查詢規格

# chat/consumers.py
import json
from datetime import datetime
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer

from fugle_marketdata import RestClient

api_key = 'YOUR_API__KEY'
#

class ChatConsumer(WebsocketConsumer):
    def connect(self):
        self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
        self.room_group_name = f"chat_{self.room_name}"
        client = RestClient(api_key=api_key)
        self.stock = client.stock

        # Join room group
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name, self.channel_name
        )

        self.accept()

        message = f"""
歡迎來到 {self.room_name} 股票聊天室,
查詢商品成交價,請輸入 商品代碼 + .close, ex: 2330.close
查詢商品漲跌幅,請輸入 商品代碼 + .changePercent, ex: 2330.changePercent
            """
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name, {"type": "chat.message", "message": message}
        )

    def disconnect(self, close_code):
        # Leave room group
        async_to_sync(self.channel_layer.group_discard)(
            self.room_group_name, self.channel_name
        )

    # Receive message from WebSocket
    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json["message"]
        if message.find('.') > -1:
            symbol, condition = message.split('.')

            if symbol.isdigit() and len(symbol) == 4:
                msg = f'您需入的查詢條件: {message}\n'
                data = self.stock.intraday.quote(symbol=symbol)
                if condition == 'close':
                    msg += f'日期:{data["date"]}\t 成交價格: {data["closePrice"]}\t 成交時間: {datetime.fromtimestamp(data["closeTime"] / 10**6)}'
                elif condition == 'changePercent':
                    msg += f'日期:{data["date"]}\t 最後成交價漲跌幅: {data["changePercent"]}\t 最後更新時間: {datetime.fromtimestamp(data["lastUpdated"] / 10**6)}'
                else:
                    msg += '查詢失敗,請重新輸入條件'
                message = msg
            else:
                message = '查詢失敗,請重新輸入條件'
        else:
            message = '查詢失敗,請重新輸入條件'


        # Send message to room group
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name, {"type": "chat.message", "message": message}
        )

    # Receive message from room group
    def chat_message(self, event):
        message = event["message"]

        # Send message to WebSocket
        self.send(text_data=json.dumps({"message": message}))

預期
https://ithelp.ithome.com.tw/upload/images/20230925/201627244fsA89YAul.png

輸入 2330.close
https://ithelp.ithome.com.tw/upload/images/20230925/20162724xHXGwHpcxW.png

輸入 0050.changePercent
https://ithelp.ithome.com.tw/upload/images/20230925/20162724F0dmiDliDW.png

如之前教學,在建立連接的時候做 api 連接動作,
在 receive 判斷書入的字串有無符合格式,有則繼續做查詢的動作
把查詢回來的資料組成 msg 傳遞給聊天室
如此便達到查詢商品行情之目的

盤中跟盤後的差異為: 盤中的更新時間會隨者時間變動,盤後查詢則為固定時間

牛刀小試

  • 盤中(0900-1330)查詢商品行情

參考

fugle-metadata
fugle 官方文件

使用規範與聲明

透過本服務取得之行情資料僅供參考,成交值及成交量不含零股及鉅額交易,使用者依本資料交易發生交易損失需自行負責。
時報資訊與群馥科技對資料內容錯誤、更新延誤或傳輸中斷不負任何責任。您應對您所為之任何金融或投資決策自行負責。
使用者應遵守臺灣證券交易所股份有限公司交易資訊使用管理辦法、臺灣期貨交易所股份有限公司交易資訊使用管理辦法、財團法人中華民國證券櫃檯買賣中心有價證券交易資訊使用管理辦法、各資訊來源提供者所定之資訊使用相關規範及智慧財產權相關法令,如有盜接、轉接交易資訊,或以其他方式出售、出租、轉讓、再授權交易資訊,或將交易資訊另行取樣並編製指數、其他衍生性商品或將之傳送予第三人,應負違約及侵權之相關民、刑事責任。
使用者須遵守臺灣證券交易所「交易資訊使用管理辦法」等交易資訊管理相關規定,所有資訊以臺灣證券交易所公告資料為準。


上一篇
[Day 18] 實戰應用 - 查詢盤後資料(上)
下一篇
[Day 20] 實戰應用 - 訂閱即時資料(上)
系列文
已 django + channels 來取得即時股價資料的推播30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言