前言
前幾天讀到一篇微信公眾號的文章熬了一晚上溉旋,小白用Python寫了一個股票提醒系統(tǒng)救军,看了評論之后感覺意猶未盡,隨心血來潮寫下這篇文章毒嫡,以紀念此刻的心情癌蚁。
架構(gòu)篇
基本上按照作者的思路可以順利的完成整個股票提醒系統(tǒng),本文在原作者的基礎(chǔ)上增加了如下內(nèi)容:
- 查詢多支股票實時價格信息
- 增加微信信息通知兜畸、提醒以及告警
- 通過微信更新所選股票的買入下限閾值和賣出上限閾值
實現(xiàn)篇
實時獲取股票價格
這部分內(nèi)容與作者的基本一致努释,沒啥好說的。
郵件系統(tǒng)
這部分內(nèi)容膳叨,我按照我之前寫過的腳本運行洽洁,其代碼如下:
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
'''
@author: Haffner2010
@contact: myprojtest@example.com
@Software: Pycharm + Python3.6
@OS:Windows 7 64 bit
@Site:http://www.reibang.com/u/e031670b216b
@file: EmailAutoSend.py
@time: 2018/4/1 20:03
@desc:
'''
#MIME郵件格式分析及信息提取http://www.pythonclub.org/python-files/mime-type
# SMTP模塊
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def MySMTP(UserInfo,Message):
SmtpServer=UserInfo['server']
user=UserInfo['username']
port=UserInfo['port']
Receiver=UserInfo['receiver']
# print(type(str(Receiver)))
sender=user # 發(fā)件人和登錄賬戶名是同一個地址
password=UserInfo['password']
Message['From'] = sender
Message['To'] = Receiver
# Message['To'] = ";".join(Receiver)
# Message['Subject'] = Header(Subject, 'utf-8')
if port==25:
smtp=smtplib.SMTP(SmtpServer,port)
elif(port==465 or port==994):
smtp = smtplib.SMTP_SSL(SmtpServer, port) # 使用SSL加密登錄,詳見http://help.163.com/09/1223/14/5R7P3QI100753VB8.html
else:
print('SMTP協(xié)議端口號有誤菲嘴,請核對信息!')
smtp.helo(SmtpServer)
smtp.ehlo(SmtpServer)
# smtp.starttls() # 啟動安全傳輸模式
smtp.login(user, password)
smtp.sendmail(sender, Receiver, Message.as_string())
print('Mail sent successfully!')
smtp.quit()
# 一些基本賬戶信息的定義
myaccinfo={
'username':'your_account@example.com', # 登錄賬戶
'password' : 'Auth Code', # 此為授權(quán)碼,非登錄密碼
'receiver':'your_account@example.com',
'server' : 'smtp.example.com', # 郵箱服務(wù)器地址
'port':25 # 登錄端口號
}
if __name__=="__main__":
# 郵件信息
subject = 'subject'
# 純文本郵件定義龄坪,郵件正文內(nèi)容
msg = MIMEText('main body text', 'plain', 'utf-8')
# 定義發(fā)送人昭雌,接收人,以及描述信息(主題)
msg['Subject'] = Header(subject, 'utf-8')
MySMTP(myaccinfo,msg)
其中健田,基本賬戶信息中需要修改為自己郵箱的用戶名和密碼烛卧,以及郵箱登陸可以通過POP3、SMTP和IMAP來查看相關(guān)服務(wù)妓局,并按照要求修改如下信息:
# 一些基本賬戶信息的定義
myaccinfo={
'username':'your_account@example.com', # 登錄賬戶
'password' : 'Auth Code', # 此為授權(quán)碼总放,非登錄密碼
'receiver':'your_account@example.com',
'server' : 'smtp.example.com', # 郵箱服務(wù)器地址
'port':25 # 登錄端口號
}
郵件自動發(fā)送的代碼,可以參考廖大的文章SMTP發(fā)送郵件加以了解好爬。
郵件自動發(fā)送的源碼已上傳到我的GitHub上AutoEmailSend.py
關(guān)于郵件發(fā)送局雄,最近看到一個不錯的項目zmail,但我沒用過存炮,只是看介紹好像不錯的樣子炬搭。。
預(yù)警系統(tǒng)
預(yù)警系統(tǒng)穆桂,首先就要設(shè)置好預(yù)警值宫盔,我們以五大行為例,進行相關(guān)設(shè)置:
stock_code=['601288','601328','601988','601398','601939']
stock=Stock(q,stock_code)
setting={
'農(nóng)業(yè)銀行':[3.45,3.5],
'交通銀行':[5.4,5.7],
'中國銀行':[3.4,3.5],
'工商銀行':[5.3,5.4],
'建設(shè)銀行':[6.5,6.9]
} # 設(shè)置股票的期望買入下線和賣出上限
stock_code為五大行的股票代碼享完,setting字典為我們期望買入以及賣出的價格區(qū)間灼芭。
死循環(huán)監(jiān)控數(shù)據(jù)
在部分代碼在原作者的基礎(chǔ)上進行修改,代碼如下:
while True:
now_dt = datetime.datetime.now() # 當前股價查詢時間
if not start_dt < now_dt < stop_dt:
title = f'Current Time {now_dt} is not between {start_dt} and {stop_dt},we will stop!'
print(title)
bot.file_helper.send(title)
# 郵件信息
subject = 'Stop Running!'
# 純文本郵件定義般又,郵件正文內(nèi)容
msg = MIMEText(title, 'plain', 'utf-8')
# 定義發(fā)送人彼绷,接收人,以及描述信息(主題)
msg['Subject'] = Header(subject, 'utf-8')
MySMTP(myaccinfo, msg)
stock.stop_run() # 不在開市范圍內(nèi)倒源,停止執(zhí)行
break
if not q.empty():
cur_price_dict = q.get()
print(cur_price_dict)
print(f'Current stock price:{cur_price_dict}')
for item in cur_price_dict:
cur_price = float(cur_price_dict[item])
if cur_price > setting[item][1]:
title = f'股票[{item}]:當前價格{cur_price}苛预,高于max:{setting[item][1]}'
print(title)
bot.file_helper.send(title)
# 郵件信息
subject = '高閾值警告!'
# 純文本郵件定義笋熬,郵件正文內(nèi)容
msg = MIMEText(title, 'plain', 'utf-8')
# 定義發(fā)送人热某,接收人,以及描述信息(主題)
msg['Subject'] = Header(subject, 'utf-8')
MySMTP(myaccinfo, msg)
time.sleep(3)
if cur_price < setting[item][0]:
title = f'股票[{item}]:當前價格{cur_price}胳螟,低于min:{setting[item][0]}'
print(title)
bot.file_helper.send(title)
# 郵件信息
subject = '低閾值警告昔馋!'
# 純文本郵件定義,郵件正文內(nèi)容
msg = MIMEText(title, 'plain', 'utf-8')
# 定義發(fā)送人糖耸,接收人秘遏,以及描述信息(主題)
msg['Subject'] = Header(subject, 'utf-8')
MySMTP(myaccinfo, msg)
time.sleep(3)
第一個if not語句表示如果不在開市時間范圍內(nèi)則停止運行,退出程序嘉竟。
第二個if not語句中的for循環(huán)用來實時查詢當前價格與買入價和賣出價的關(guān)系邦危,高于賣出價或者低于買入價都通過郵件以及微信文件傳輸助手進行提醒洋侨。
setting區(qū)間閾值更新
本部分在原作者的基礎(chǔ)上進行增加,用了wxpy提供的API倦蚪,方便實時修改setting
# 消息接收監(jiān)聽器希坚,通過接收文件傳輸助手的信息獲取個人最新配置
@bot.register(chats=file_helper, except_self=False)
def print_others(message):
# 輸出監(jiān)聽到的消息
print(message) # 此處的消息每次只能修改一只股票信息,對于實際應(yīng)用來說已經(jīng)足夠
msg_price = re.search('(.*?) : (.*?) \(Text\)', str(message)).group(2)
print(msg_price)
try: # 格式code:high_pri,low_pri
code, low_pri, high_pri = re.split('[:, ]', msg_price)
print(code, low_pri, high_pri)
name = ts.get_realtime_quotes(code)[['name']].values[0][0]
setting.update({name:[float(low_pri),float(high_pri)]})
print(setting)
except:
print('nothing')
# return msg_price # 本來想通過return給外部函數(shù)接收以便修改setting的數(shù)據(jù)的陵且,結(jié)果不知道如何使用裁僧,只能在register里面處理setting
關(guān)于return的內(nèi)容如果有哪位大神知道還請告知,多謝慕购!
整個股票提醒系統(tǒng)的源碼見share.py
看看效果
剛開始設(shè)置了三家銀行的高閾值低于當前價聊疲,微信端收到如下告警信息:
接下來提高農(nóng)行的高閾值告警值,新的微信告警信息如下:
后記
大多數(shù)內(nèi)容均來源于網(wǎng)絡(luò)沪悲,如果構(gòu)成侵權(quán)請聯(lián)系刪除获洲。如果有什么不懂的可以一起交流,我也是初學者哈~~~