**作為一名投資者,我希望能查看觀察名單中股票的K線圖,以便進行更深入的技術分析和趨勢判斷。**
預期的工作流程:
1.用戶在 stock.watchlist 視圖中點擊"更新K線數據"按鈕。
2.用戶點擊"顯示K線圖"按鈕。
3.系統從 stock.kline 模型中檢索該股票近一年的數據。
4.後端使用 'mplfinance', 'matplotlib', 'pandas' 生成K線圖的圖片。
5.系統打開一個新的彈窗或頁面,顯示生成的K線圖。
6.
參考程式
**050 K線圖**
- https://github.com/jumpingchu/Stock-Chart/blob/master/0050%20K%E7%B7%9A%E5%9C%96.py
def update_kline_data(self):
for record in self:
try:
stock = twstock.Stock(record.stock_code)
end_date = datetime.now().date()
start_date = end_date - timedelta(days=365)
# 獲取近一年的數據
kline_data = stock.fetch_from(start_date.year, start_date.month)
for data in kline_data:
if start_date <= data.date.date() <= end_date:
kline = self.env['stock.kline'].search([
('watchlist_id', '=', record.id),
('date', '=', data.date.date())
])
kline_values = {
'open_price': data.open,
'close_price': data.close,
'high_price': data.high,
'low_price': data.low,
'volume': data.capacity
}
if kline:
kline.write(kline_values)
else:
kline_values.update({
'watchlist_id': record.id,
'date': data.date.date(),
})
self.env['stock.kline'].create(kline_values)
record.last_update = datetime.now()
_logger.info(f"成功更新股票 {record.stock_code} 的K線數據")
except Exception as e:
_logger.error(f"更新股票 {record.stock_code} K線數據時發生錯誤: {str(e)}")
def show_kline_chart(self):
self.ensure_one()
kline_data = self.kline_ids.sorted(key=lambda r: r.date)
# 將數據轉換為 pandas DataFrame
df = pd.DataFrame({
'Date': pd.to_datetime(kline_data.mapped('date')),
'Open': kline_data.mapped('open_price'),
'High': kline_data.mapped('high_price'),
'Low': kline_data.mapped('low_price'),
'Close': kline_data.mapped('close_price'),
'Volume': kline_data.mapped('volume')
})
df.set_index('Date', inplace=True)
# 確保索引是 DatetimeIndex 類型
df.index = pd.to_datetime(df.index)
# 設置 K 線圖樣式
mc = mpf.make_marketcolors(up='r', down='g', inherit=True)
s = mpf.make_mpf_style(marketcolors=mc)
# 創建一個 BytesIO 對象來保存圖片
buf = io.BytesIO()
# 繪製 K 線圖
mpf.plot(df, type='candle', style=s, title=f'{self.name} ({self.stock_code}) K線圖',
volume=True, figsize=(10, 8), savefig=dict(fname=buf, format='png'))
# 將圖片保存為附件
buf.seek(0)
attachment = self.env['ir.attachment'].create({
'name': f'{self.name}_{self.stock_code}_kline_chart.png',
'datas': base64.b64encode(buf.getvalue()),
'res_model': self._name,
'res_id': self.id,
})
# 返回一個動作來顯示附件
return {
'type': 'ir.actions.act_url',
'url': f'/web/content/{attachment.id}?download=true',
'target': 'new',
}
在本章中,我們實現了Odoo系統中結合 twstock 與 mplfinance 等Python套件,生成股票的K線圖,並展示於系統中。重點在於展示如何透過Odoo與外部Python庫的整合,快速實現技術分析功能,並且讓用戶能夠透過直觀的K線圖來判斷趨勢。
資料更新:
twstock
庫自動抓取觀察名單中股票的歷史數據,並將其保存到 stock.kline
模型中。生成K線圖:
mplfinance
和 pandas
庫將存儲的K線數據轉換成DataFrame,並生成圖表。彈性與擴展性:
這些整合不僅實現了用戶故事中的需求,還展示了Python與Odoo協作的強大能力。只要Python能用的套件,Odoo都能有效地支持並擴展,這大幅提高了開發效率與功能的彈性。